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:
Danny Weinberg 2020-06-04 11:04:36 -07:00
parent eec24e4ee8
commit 061bf86a9c
3 changed files with 48 additions and 0 deletions

View File

@ -747,6 +747,9 @@ class Message(ABC):
self._unknown_fields += parsed.raw
continue
# Got some data over the wire
self._serialized_on_wire = True
meta = self._betterproto.meta_by_field_name[field_name]
value: Any

View File

@ -1,5 +1,11 @@
syntax = "proto3";
package repeated;
message Test {
repeated string names = 1;
}
service ExampleService {
rpc DoThing (Test) returns (Test);
}

View 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']