Set serialized_on_wire when message contains only lists
This fixes a bug where serialized_on_wire was not set when a message contained only repeated values (eg in a list or map). The fix here is to just set it to true in the `parse` method as soon as we receive any valid data. This also adds a test to expose the behavior.
This commit is contained in:
		| @@ -747,6 +747,9 @@ class Message(ABC): | |||||||
|                 self._unknown_fields += parsed.raw |                 self._unknown_fields += parsed.raw | ||||||
|                 continue |                 continue | ||||||
|  |  | ||||||
|  |             # Got some data over the wire | ||||||
|  |             self._serialized_on_wire = True | ||||||
|  |  | ||||||
|             meta = self._betterproto.meta_by_field_name[field_name] |             meta = self._betterproto.meta_by_field_name[field_name] | ||||||
|  |  | ||||||
|             value: Any |             value: Any | ||||||
|   | |||||||
| @@ -1,5 +1,11 @@ | |||||||
| syntax = "proto3"; | syntax = "proto3"; | ||||||
|  |  | ||||||
|  | package repeated; | ||||||
|  |  | ||||||
| message Test { | message Test { | ||||||
|     repeated string names = 1; |     repeated string names = 1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | service ExampleService { | ||||||
|  |   rpc DoThing (Test) returns (Test); | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										39
									
								
								betterproto/tests/inputs/repeated/test_repeated.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								betterproto/tests/inputs/repeated/test_repeated.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | |||||||
|  | from typing import Dict | ||||||
|  |  | ||||||
|  | import grpclib.const | ||||||
|  | import grpclib.server | ||||||
|  | import pytest | ||||||
|  | from grpclib.testing import ChannelFor | ||||||
|  |  | ||||||
|  | import betterproto | ||||||
|  | from betterproto.tests.output_betterproto.repeated.repeated import ( | ||||||
|  |     ExampleServiceStub, | ||||||
|  |     Test, | ||||||
|  | ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ExampleService: | ||||||
|  |     async def DoThing( | ||||||
|  |         self, stream: "grpclib.server.Stream[Test, Test]" | ||||||
|  |     ): | ||||||
|  |         request = await stream.recv_message() | ||||||
|  |         await stream.send_message(request) | ||||||
|  |  | ||||||
|  |     def __mapping__(self) -> Dict[str, grpclib.const.Handler]: | ||||||
|  |         return { | ||||||
|  |             "/repeated.ExampleService/DoThing": grpclib.const.Handler( | ||||||
|  |                 self.DoThing, | ||||||
|  |                 grpclib.const.Cardinality.UNARY_UNARY, | ||||||
|  |                 Test, | ||||||
|  |                 Test, | ||||||
|  |             ), | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @pytest.mark.asyncio | ||||||
|  | async def test_sets_serialized_on_wire() -> None: | ||||||
|  |     async with ChannelFor([ExampleService()]) as channel: | ||||||
|  |         stub = ExampleServiceStub(channel) | ||||||
|  |         response = await stub.do_thing(names=['a', 'b', 'c']) | ||||||
|  |         assert betterproto.serialized_on_wire(response) | ||||||
|  |         assert response.names == ['a', 'b', 'c'] | ||||||
		Reference in New Issue
	
	Block a user