public void DuplicateKeys_LastEntryWins()
        {
            var memoryStream = new MemoryStream();
            var output       = new CodedOutputStream(memoryStream);

            var key    = 10;
            var value1 = 20;
            var value2 = 30;

            // First entry
            output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);
            output.WriteLength(4);
            output.WriteTag(1, WireFormat.WireType.Varint);
            output.WriteInt32(key);
            output.WriteTag(2, WireFormat.WireType.Varint);
            output.WriteInt32(value1);

            // Second entry - same key, different value
            output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);
            output.WriteLength(4);
            output.WriteTag(1, WireFormat.WireType.Varint);
            output.WriteInt32(key);
            output.WriteTag(2, WireFormat.WireType.Varint);
            output.WriteInt32(value2);
            output.Flush();

            MessageParsingHelpers.AssertReadingMessage(
                TestMap.Parser,
                memoryStream.ToArray(),
                parsed =>
            {
                Assert.AreEqual(value2, parsed.MapInt32Int32[key]);
            });
        }
        public void MapFieldOrderIsIrrelevant()
        {
            var memoryStream = new MemoryStream();
            var output       = new CodedOutputStream(memoryStream);

            output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);

            var key   = 10;
            var value = 20;

            // Each field can be represented in a single byte, with a single byte tag.
            // Total message size: 4 bytes.
            output.WriteLength(4);
            output.WriteTag(2, WireFormat.WireType.Varint);
            output.WriteInt32(value);
            output.WriteTag(1, WireFormat.WireType.Varint);
            output.WriteInt32(key);
            output.Flush();

            MessageParsingHelpers.AssertReadingMessage(
                TestMap.Parser,
                memoryStream.ToArray(),
                parsed =>
            {
                Assert.AreEqual(value, parsed.MapInt32Int32[key]);
            });
        }
        public void MapWithOnlyValue()
        {
            // Hand-craft the stream to contain a single entry with just a value.
            var memoryStream = new MemoryStream();
            var output       = new CodedOutputStream(memoryStream);

            output.WriteTag(TestMap.MapInt32ForeignMessageFieldNumber, WireFormat.WireType.LengthDelimited);
            var nestedMessage = new ForeignMessage {
                C = 20
            };

            // Size of the entry (tag, size written by WriteMessage, data written by WriteMessage)
            output.WriteLength(2 + nestedMessage.CalculateSize());
            output.WriteTag(2, WireFormat.WireType.LengthDelimited);
            output.WriteMessage(nestedMessage);
            output.Flush();

            MessageParsingHelpers.AssertReadingMessage(
                TestMap.Parser,
                memoryStream.ToArray(),
                parsed =>
            {
                Assert.AreEqual(nestedMessage, parsed.MapInt32ForeignMessage[0]);
            });
        }
        public void MapIgnoresExtraFieldsWithinEntryMessages()
        {
            // Hand-craft the stream to contain a single entry with three fields
            var memoryStream = new MemoryStream();
            var output       = new CodedOutputStream(memoryStream);

            output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);

            var key   = 10; // Field 1
            var value = 20; // Field 2
            var extra = 30; // Field 3

            // Each field can be represented in a single byte, with a single byte tag.
            // Total message size: 6 bytes.
            output.WriteLength(6);
            output.WriteTag(1, WireFormat.WireType.Varint);
            output.WriteInt32(key);
            output.WriteTag(2, WireFormat.WireType.Varint);
            output.WriteInt32(value);
            output.WriteTag(3, WireFormat.WireType.Varint);
            output.WriteInt32(extra);
            output.Flush();

            MessageParsingHelpers.AssertReadingMessage(
                TestMap.Parser,
                memoryStream.ToArray(),
                parsed =>
            {
                Assert.AreEqual(value, parsed.MapInt32Int32[key]);
            });
        }
        public void MapNonContiguousEntries()
        {
            var memoryStream = new MemoryStream();
            var output       = new CodedOutputStream(memoryStream);

            // Message structure:
            // Entry for MapInt32Int32
            // Entry for MapStringString
            // Entry for MapInt32Int32

            // First entry
            var key1   = 10;
            var value1 = 20;

            output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);
            output.WriteLength(4);
            output.WriteTag(1, WireFormat.WireType.Varint);
            output.WriteInt32(key1);
            output.WriteTag(2, WireFormat.WireType.Varint);
            output.WriteInt32(value1);

            // Second entry
            var key2   = "a";
            var value2 = "b";

            output.WriteTag(TestMap.MapStringStringFieldNumber, WireFormat.WireType.LengthDelimited);
            output.WriteLength(6); // 3 bytes per entry: tag, size, character
            output.WriteTag(1, WireFormat.WireType.LengthDelimited);
            output.WriteString(key2);
            output.WriteTag(2, WireFormat.WireType.LengthDelimited);
            output.WriteString(value2);

            // Third entry
            var key3   = 15;
            var value3 = 25;

            output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);
            output.WriteLength(4);
            output.WriteTag(1, WireFormat.WireType.Varint);
            output.WriteInt32(key3);
            output.WriteTag(2, WireFormat.WireType.Varint);
            output.WriteInt32(value3);

            output.Flush();

            MessageParsingHelpers.AssertReadingMessage(
                TestMap.Parser,
                memoryStream.ToArray(),
                parsed =>
            {
                var expected = new TestMap
                {
                    MapInt32Int32   = { { key1, value1 }, { key3, value3 } },
                    MapStringString = { { key2, value2 } }
                };
                Assert.AreEqual(expected, parsed);
            });
        }
        public void DiscardUnknownFields_AllTypes()
        {
            // Simple way of ensuring we can skip all kinds of fields.
            var data  = SampleMessages.CreateFullTestAllTypes().ToByteArray();
            var empty = Empty.Parser.ParseFrom(data);

            MessageParsingHelpers.AssertReadingMessage(
                Empty.Parser,
                data,
                parsed =>
            {
                // TODO(jieluo): Add test back when DiscardUnknownFields API is supported.
                // Assert.AreNotEqual(new Empty(), empty);
            });
        }
        public void TestDiscardUnknownFields(IMessage message)
        {
            var goldenEmptyMessage = new TestEmptyMessage();

            byte[] data     = message.ToByteArray();
            int    fullSize = message.CalculateSize();

            void AssertEmpty(IMessage msg)
            {
                Assert.AreEqual(0, msg.CalculateSize());
                Assert.AreEqual(goldenEmptyMessage, msg);
            }

            void AssertFull(IMessage msg) => Assert.AreEqual(fullSize, msg.CalculateSize());

            // Test the behavior of the parsers with and without discarding, both generic and non-generic.
            MessageParser <TestEmptyMessage> retainingParser1 = TestEmptyMessage.Parser;
            MessageParser retainingParser2 = retainingParser1;
            MessageParser <TestEmptyMessage> discardingParser1 = retainingParser1.WithDiscardUnknownFields(true);
            MessageParser discardingParser2 = retainingParser2.WithDiscardUnknownFields(true);

            // Test parse from byte[]
            MessageParsingHelpers.AssertReadingMessage(retainingParser1, data, m => AssertFull(m));
            MessageParsingHelpers.AssertReadingMessage(retainingParser2, data, m => AssertFull(m));
            MessageParsingHelpers.AssertReadingMessage(discardingParser1, data, m => AssertEmpty(m));
            MessageParsingHelpers.AssertReadingMessage(discardingParser2, data, m => AssertEmpty(m));

            // Test parse from byte[] with offset
            AssertFull(retainingParser1.ParseFrom(data, 0, data.Length));
            AssertFull(retainingParser2.ParseFrom(data, 0, data.Length));
            AssertEmpty(discardingParser1.ParseFrom(data, 0, data.Length));
            AssertEmpty(discardingParser2.ParseFrom(data, 0, data.Length));

            // Test parse from CodedInputStream
            AssertFull(retainingParser1.ParseFrom(new CodedInputStream(data)));
            AssertFull(retainingParser2.ParseFrom(new CodedInputStream(data)));
            AssertEmpty(discardingParser1.ParseFrom(new CodedInputStream(data)));
            AssertEmpty(discardingParser2.ParseFrom(new CodedInputStream(data)));

            // Test parse from Stream
            AssertFull(retainingParser1.ParseFrom(new MemoryStream(data)));
            AssertFull(retainingParser2.ParseFrom(new MemoryStream(data)));
            AssertEmpty(discardingParser1.ParseFrom(new MemoryStream(data)));
            AssertEmpty(discardingParser2.ParseFrom(new MemoryStream(data)));
        }
Beispiel #8
0
        public void TestMergeCodedInput()
        {
            var message = new TestAllExtensions();

            message.SetExtension(OptionalBoolExtension, true);
            var serialized = message.ToByteArray();

            MessageParsingHelpers.AssertReadingMessage(
                TestAllExtensions.Parser.WithExtensionRegistry(new ExtensionRegistry()
            {
                OptionalBoolExtension
            }),
                serialized,
                other =>
            {
                Assert.AreEqual(message, other);
                Assert.AreEqual(message.CalculateSize(), other.CalculateSize());
            });
        }
        public void MapWithEmptyEntry()
        {
            var message = new TestMap
            {
                MapInt32Bytes = { { 0, ByteString.Empty } }
            };

            byte[] bytes = message.ToByteArray();
            Assert.AreEqual(2, bytes.Length); // Tag for field entry (1 byte), length of entry (0; 1 byte)

            MessageParsingHelpers.AssertReadingMessage(
                TestMap.Parser,
                bytes,
                parsed =>
            {
                Assert.AreEqual(1, parsed.MapInt32Bytes.Count);
                Assert.AreEqual(ByteString.Empty, parsed.MapInt32Bytes[0]);
            });
        }
        public void DiscardUnknownFields_RealDataStillRead()
        {
            var message           = SampleMessages.CreateFullTestAllTypes();
            var stream            = new MemoryStream();
            var output            = new CodedOutputStream(stream);
            var unusedFieldNumber = 23456;

            Assert.IsFalse(TestAllTypes.Descriptor.Fields.InDeclarationOrder().Select(x => x.FieldNumber).Contains(unusedFieldNumber));
            output.WriteTag(unusedFieldNumber, WireFormat.WireType.LengthDelimited);
            output.WriteString("ignore me");
            message.WriteTo(output);
            output.Flush();

            MessageParsingHelpers.AssertReadingMessage(
                TestAllTypes.Parser,
                stream.ToArray(),
                parsed =>
            {
                // TODO(jieluo): Add test back when DiscardUnknownFields API is supported.
                // Assert.AreEqual(message, parsed);
            });
        }
        public void MapWithOnlyKey_MessageValue()
        {
            // Hand-craft the stream to contain a single entry with just a key.
            var memoryStream = new MemoryStream();
            var output       = new CodedOutputStream(memoryStream);

            output.WriteTag(TestMap.MapInt32ForeignMessageFieldNumber, WireFormat.WireType.LengthDelimited);
            int key = 10;

            output.WriteLength(1 + CodedOutputStream.ComputeInt32Size(key));
            output.WriteTag(1, WireFormat.WireType.Varint);
            output.WriteInt32(key);
            output.Flush();

            MessageParsingHelpers.AssertReadingMessage(
                TestMap.Parser,
                memoryStream.ToArray(),
                parsed =>
            {
                Assert.AreEqual(new ForeignMessage(), parsed.MapInt32ForeignMessage[key]);
            });
        }
Beispiel #12
0
 public void RequiredFieldsNoThrow()
 {
     Assert.DoesNotThrow(() => MessageParsingHelpers.AssertReadingMessage(TestRequired.Parser, new byte[0], m => { }));
     Assert.DoesNotThrow(() => MessageParsingHelpers.AssertReadingMessage(TestRequired.Parser as MessageParser, new byte[0], m => { }));
 }