blob: 08ce3973afe95ceb6896f9027d60cc14666263ea [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2020 The ChromiumOS Authors
Alex Kleine191ed62020-02-27 15:59:55 -07002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Tests for message_util."""
6
Alex Kleine191ed62020-02-27 15:59:55 -07007import os
8
9from chromite.api import message_util
10from chromite.api.gen.chromite.api import build_api_test_pb2
11from chromite.lib import cros_test_lib
12
13
Alex Kleine191ed62020-02-27 15:59:55 -070014class JsonSerializerTest(cros_test_lib.TestCase):
Alex Klein1699fab2022-09-08 08:46:06 -060015 """Tests for the JSON serializer."""
Alex Kleine191ed62020-02-27 15:59:55 -070016
Alex Klein1699fab2022-09-08 08:46:06 -060017 def test_serialization(self):
18 """Test json format serialization/deserialization."""
19 serializer = message_util.JsonSerializer()
Alex Kleine191ed62020-02-27 15:59:55 -070020
Alex Klein1699fab2022-09-08 08:46:06 -060021 # Build a message.
22 msg = build_api_test_pb2.TestRequestMessage()
23 msg.id = "foo"
Alex Kleine191ed62020-02-27 15:59:55 -070024
Alex Klein1699fab2022-09-08 08:46:06 -060025 # Round trip the message contents through the serializer.
26 serialized = serializer.serialize(msg)
27 deserialized = build_api_test_pb2.TestRequestMessage()
28 serializer.deserialize(serialized, deserialized)
Alex Kleine191ed62020-02-27 15:59:55 -070029
Alex Klein1699fab2022-09-08 08:46:06 -060030 # Create an identical message manually.
31 source = '{"id":"foo"}'
32 deserialized2 = build_api_test_pb2.TestRequestMessage()
33 serializer.deserialize(source, deserialized2)
Alex Kleine191ed62020-02-27 15:59:55 -070034
Alex Klein1699fab2022-09-08 08:46:06 -060035 # Make sure the round tripped data is equal, and matches the manually
36 # constructed version.
37 self.assertEqual(deserialized, msg)
38 self.assertEqual(deserialized, deserialized2)
Alex Kleine191ed62020-02-27 15:59:55 -070039
40
41class BinarySerializerTest(cros_test_lib.TestCase):
Alex Klein1699fab2022-09-08 08:46:06 -060042 """Tests for the binary serializer."""
Alex Kleine191ed62020-02-27 15:59:55 -070043
Alex Klein1699fab2022-09-08 08:46:06 -060044 def test_serialization(self):
45 """Test binary format serialization/deserialization."""
46 serializer = message_util.BinarySerializer()
Alex Kleine191ed62020-02-27 15:59:55 -070047
Alex Klein1699fab2022-09-08 08:46:06 -060048 # Build a message.
49 msg = build_api_test_pb2.TestRequestMessage()
50 msg.id = "foo"
Alex Kleine191ed62020-02-27 15:59:55 -070051
Alex Klein1699fab2022-09-08 08:46:06 -060052 # Round trip the message contents through the serializer.
53 serialized = serializer.serialize(msg)
54 deserialized = build_api_test_pb2.TestRequestMessage()
55 serializer.deserialize(serialized, deserialized)
Alex Kleine191ed62020-02-27 15:59:55 -070056
Alex Klein1699fab2022-09-08 08:46:06 -060057 # Make sure the round tripped data is unchanged.
58 self.assertEqual(msg, deserialized)
Alex Kleine191ed62020-02-27 15:59:55 -070059
60
61class MessageHandlerTest(cros_test_lib.TempDirTestCase):
Alex Klein1699fab2022-09-08 08:46:06 -060062 """MessageHandler tests."""
Alex Kleine191ed62020-02-27 15:59:55 -070063
Alex Klein1699fab2022-09-08 08:46:06 -060064 def test_binary_serialization(self):
65 """Test binary serialization/deserialization."""
66 msg_path = os.path.join(self.tempdir, "proto")
Alex Kleine191ed62020-02-27 15:59:55 -070067
Alex Klein54c891a2023-01-24 10:45:41 -070068 # Use the message handler configured in the module to avoid config
69 # drift.
Alex Klein1699fab2022-09-08 08:46:06 -060070 handler = message_util.get_message_handler(
71 msg_path, message_util.FORMAT_BINARY
72 )
Alex Kleine191ed62020-02-27 15:59:55 -070073
Alex Klein1699fab2022-09-08 08:46:06 -060074 msg = build_api_test_pb2.TestRequestMessage()
75 msg.id = "foo"
Alex Kleine191ed62020-02-27 15:59:55 -070076
Alex Klein1699fab2022-09-08 08:46:06 -060077 # Round trip the data.
78 self.assertNotExists(msg_path)
79 handler.write_from(msg)
80 self.assertExists(msg_path)
Alex Kleine191ed62020-02-27 15:59:55 -070081
Alex Klein1699fab2022-09-08 08:46:06 -060082 deserialized = build_api_test_pb2.TestRequestMessage()
83 handler.read_into(deserialized)
Alex Kleine191ed62020-02-27 15:59:55 -070084
Alex Klein1699fab2022-09-08 08:46:06 -060085 # Make sure the data has not mutated.
86 self.assertEqual(msg, deserialized)
Alex Kleine191ed62020-02-27 15:59:55 -070087
Alex Klein1699fab2022-09-08 08:46:06 -060088 def test_json_serialization(self):
89 """Test json serialization/deserialization."""
90 msg_path = os.path.join(self.tempdir, "proto")
Alex Kleine191ed62020-02-27 15:59:55 -070091
Alex Klein54c891a2023-01-24 10:45:41 -070092 # Use the message handler configured in the module to avoid config
93 # drift.
Alex Klein1699fab2022-09-08 08:46:06 -060094 handler = message_util.get_message_handler(
95 msg_path, message_util.FORMAT_JSON
96 )
Alex Kleine191ed62020-02-27 15:59:55 -070097
Alex Klein1699fab2022-09-08 08:46:06 -060098 msg = build_api_test_pb2.TestRequestMessage()
99 msg.id = "foo"
Alex Kleine191ed62020-02-27 15:59:55 -0700100
Alex Klein1699fab2022-09-08 08:46:06 -0600101 # Round trip the data.
102 self.assertNotExists(msg_path)
103 handler.write_from(msg)
104 self.assertExists(msg_path)
Alex Kleine191ed62020-02-27 15:59:55 -0700105
Alex Klein1699fab2022-09-08 08:46:06 -0600106 deserialized = build_api_test_pb2.TestRequestMessage()
107 handler.read_into(deserialized)
Alex Kleine191ed62020-02-27 15:59:55 -0700108
Alex Klein1699fab2022-09-08 08:46:06 -0600109 # Make sure the data has not mutated.
110 self.assertEqual(msg, deserialized)