84 """Tests for basic encode/decode of a message that carries a DCCL ID."""
89 def _make_msg(self, d=3.14, i=42):
90 msg = _pb2.NormalMsg()
95 def test_encode_returns_bytes(self):
97 encoded = self.
codec.encode(msg)
98 self.assertIsInstance(encoded, bytes)
99 self.assertGreater(len(encoded), 0)
101 def test_decode_round_trip(self):
103 encoded = self.
codec.encode(original)
104 decoded = self.
codec.decode(encoded)
105 self.assertAlmostEqual(decoded.d, 1.23, places=2)
106 self.assertEqual(decoded.i, 100)
108 def test_encode_decode_boundary_values(self):
110 encoded = self.
codec.encode(msg)
111 decoded = self.
codec.decode(encoded)
112 self.assertAlmostEqual(decoded.d, -100.0, places=2)
113 self.assertEqual(decoded.i, -20)
115 def test_id_returns_correct_id(self):
117 encoded = self.
codec.encode(msg)
118 self.assertEqual(self.
codec.id(encoded), 201)
120 def test_size_returns_positive_integer(self):
122 self.assertGreater(self.
codec.size(msg), 0)
125@unittest.skipIf(_pb2 is None, "test_pb2 not available (run via CMake)")
127 """Tests for decode_with_full_name on a message that carries a DCCL ID."""
132 def _make_msg(self, d=7.5, i=10):
133 msg = _pb2.NormalMsg()
138 def test_decode_with_full_name_round_trip(self):
140 encoded = self.
codec.encode(original)
141 decoded = self.
codec.decode_with_full_name(
142 encoded,
"dccl.test.python.NormalMsg"
144 self.assertAlmostEqual(decoded.d, 7.5, places=2)
145 self.assertEqual(decoded.i, 10)
147 def test_decode_with_full_name_matches_decode(self):
149 encoded = self.
codec.encode(original)
150 via_decode = self.
codec.decode(encoded)
151 via_full_name = self.
codec.decode_with_full_name(
152 encoded,
"dccl.test.python.NormalMsg"
154 self.assertAlmostEqual(via_decode.d, via_full_name.d, places=5)
155 self.assertEqual(via_decode.i, via_full_name.i)
157 def test_decode_with_full_name_unloaded_type_raises(self):
159 encoded = self.
codec.encode(original)
160 with self.assertRaises(dccl.DcclException):
161 self.
codec.decode_with_full_name(encoded,
"dccl.test.python.NoSuchMsg")
164 """Encoding NormalMsg (ID=201) then requesting decode as AnotherMsg
165 (ID=202) should raise because the embedded ID does not match."""
167 encoded = self.
codec.encode(original)
168 with self.assertRaises(dccl.DcclException):
169 self.
codec.decode_with_full_name(encoded,
"dccl.test.python.AnotherMsg")
172@unittest.skipIf(_pb2 is None, "test_pb2 not available (run via CMake)")
174 """Tests for decode_with_full_name on a message with omit_id=true."""
179 def _make_omit_msg(self, d=5.0, i=1):
180 msg = _pb2.OmitIdMsg()
185 def test_encode_omit_id_returns_bytes(self):
187 encoded = self.
codec.encode(msg)
188 self.assertIsInstance(encoded, bytes)
189 self.assertGreater(len(encoded), 0)
191 def test_decode_with_full_name_omit_id_round_trip(self):
193 encoded = self.
codec.encode(original)
194 decoded = self.
codec.decode_with_full_name(
195 encoded,
"dccl.test.python.OmitIdMsg"
197 self.assertAlmostEqual(decoded.d, 5.0, places=2)
198 self.assertEqual(decoded.i, 1)
200 def test_decode_with_full_name_omit_id_various_values(self):
201 for d_val, i_val
in [(-99.99, -20), (0.0, 0), (99.99, 3000)]:
202 with self.subTest(d=d_val, i=i_val):
204 encoded = self.
codec.encode(original)
205 decoded = self.
codec.decode_with_full_name(
206 encoded,
"dccl.test.python.OmitIdMsg"
208 self.assertAlmostEqual(decoded.d, d_val, places=2)
209 self.assertEqual(decoded.i, i_val)
212 """codec.decode() should raise for an omit_id message because there is
213 no embedded ID to look up."""
215 encoded = self.
codec.encode(msg)
216 with self.assertRaises(dccl.DcclException):
217 self.
codec.decode(encoded)
220@unittest.skipIf(_pb2 is None, "test_pb2 not available (run via CMake)")