improve test coverage

pull/7351/head
Jan Tattermusch 5 years ago
parent b2d5ceb1f7
commit 238fd35f1d
  1. 16
      csharp/src/Google.Protobuf.Test/ExtensionSetTest.cs
  2. 20
      csharp/src/Google.Protobuf.Test/GeneratedMessageTest.Proto2.cs
  3. 15
      csharp/src/Google.Protobuf.Test/MessageParsingHelpers.cs
  4. 8
      csharp/src/Google.Protobuf.Test/UnknownFieldSetTest.cs
  5. 91
      csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs

@ -1,4 +1,4 @@
using Google.Protobuf.TestProtos.Proto2; using Google.Protobuf.TestProtos.Proto2;
using NUnit.Framework; using NUnit.Framework;
using static Google.Protobuf.TestProtos.Proto2.UnittestExtensions; using static Google.Protobuf.TestProtos.Proto2.UnittestExtensions;
@ -34,12 +34,14 @@ namespace Google.Protobuf
message.SetExtension(OptionalBoolExtension, true); message.SetExtension(OptionalBoolExtension, true);
var serialized = message.ToByteArray(); var serialized = message.ToByteArray();
var other = TestAllExtensions.Parser MessageParsingHelpers.AssertReadingMessage(
.WithExtensionRegistry(new ExtensionRegistry() { OptionalBoolExtension }) TestAllExtensions.Parser.WithExtensionRegistry(new ExtensionRegistry() { OptionalBoolExtension }),
.ParseFrom(serialized); serialized,
other =>
Assert.AreEqual(message, other); {
Assert.AreEqual(message.CalculateSize(), other.CalculateSize()); Assert.AreEqual(message, other);
Assert.AreEqual(message.CalculateSize(), other.CalculateSize());
});
} }
[Test] [Test]

@ -269,8 +269,8 @@ namespace Google.Protobuf
[Test] [Test]
public void RequiredFieldsNoThrow() public void RequiredFieldsNoThrow()
{ {
Assert.DoesNotThrow(() => TestRequired.Parser.ParseFrom(new byte[0])); Assert.DoesNotThrow(() => MessageParsingHelpers.AssertReadingMessage(TestRequired.Parser, new byte[0], m => { }));
Assert.DoesNotThrow(() => (TestRequired.Parser as MessageParser).ParseFrom(new byte[0])); Assert.DoesNotThrow(() => MessageParsingHelpers.AssertReadingMessage(TestRequired.Parser as MessageParser, new byte[0], m => { }));
} }
[Test] [Test]
@ -344,9 +344,7 @@ namespace Google.Protobuf
} }
}; };
byte[] bytes = message.ToByteArray(); MessageParsingHelpers.AssertRoundtrip(Proto2.TestAllTypes.Parser, message);
TestAllTypes parsed = Proto2.TestAllTypes.Parser.ParseFrom(bytes);
Assert.AreEqual(message, parsed);
} }
[Test] [Test]
@ -361,9 +359,9 @@ namespace Google.Protobuf
new RepeatedGroup_extension { A = 30 } new RepeatedGroup_extension { A = 30 }
}); });
byte[] bytes = message.ToByteArray(); MessageParsingHelpers.AssertRoundtrip(
TestAllExtensions extendable_parsed = TestAllExtensions.Parser.WithExtensionRegistry(new ExtensionRegistry() { UnittestExtensions.OptionalGroupExtension, UnittestExtensions.RepeatedGroupExtension }).ParseFrom(bytes); TestAllExtensions.Parser.WithExtensionRegistry(new ExtensionRegistry() { UnittestExtensions.OptionalGroupExtension, UnittestExtensions.RepeatedGroupExtension }),
Assert.AreEqual(message, extendable_parsed); message);
} }
[Test] [Test]
@ -372,9 +370,9 @@ namespace Google.Protobuf
var message = new TestGroupExtension(); var message = new TestGroupExtension();
message.SetExtension(TestNestedExtension.Extensions.OptionalGroupExtension, new TestNestedExtension.Types.OptionalGroup_extension { A = 10 }); message.SetExtension(TestNestedExtension.Extensions.OptionalGroupExtension, new TestNestedExtension.Types.OptionalGroup_extension { A = 10 });
byte[] bytes = message.ToByteArray(); MessageParsingHelpers.AssertRoundtrip(
TestGroupExtension extendable_parsed = TestGroupExtension.Parser.WithExtensionRegistry(new ExtensionRegistry() { TestNestedExtension.Extensions.OptionalGroupExtension }).ParseFrom(bytes); TestGroupExtension.Parser.WithExtensionRegistry(new ExtensionRegistry() { TestNestedExtension.Extensions.OptionalGroupExtension }),
Assert.AreEqual(message, extendable_parsed); message);
} }
} }
} }

@ -54,6 +54,21 @@ namespace Google.Protobuf
assert(parsedStream); assert(parsedStream);
} }
public static void AssertReadingMessage(MessageParser parser, byte[] bytes, Action<IMessage> assert)
{
var parsedStream = parser.ParseFrom(bytes);
// Load content as single segment
var parsedBuffer = parser.ParseFrom(new ReadOnlySequence<byte>(bytes));
assert(parsedBuffer);
// Load content as multiple segments
parsedBuffer = parser.ParseFrom(ReadOnlySequenceFactory.CreateWithContent(bytes));
assert(parsedBuffer);
assert(parsedStream);
}
public static void AssertReadingMessageThrows<TMessage, TException>(MessageParser<TMessage> parser, byte[] bytes) public static void AssertReadingMessageThrows<TMessage, TException>(MessageParser<TMessage> parser, byte[] bytes)
where TMessage : IMessage<TMessage> where TMessage : IMessage<TMessage>
where TException : Exception where TException : Exception

@ -161,10 +161,10 @@ namespace Google.Protobuf
MessageParser discardingParser2 = retainingParser2.WithDiscardUnknownFields(true); MessageParser discardingParser2 = retainingParser2.WithDiscardUnknownFields(true);
// Test parse from byte[] // Test parse from byte[]
assertFull(retainingParser1.ParseFrom(data)); MessageParsingHelpers.AssertReadingMessage(retainingParser1, data, m => assertFull(m));
assertFull(retainingParser2.ParseFrom(data)); MessageParsingHelpers.AssertReadingMessage(retainingParser2, data, m => assertFull(m));
assertEmpty(discardingParser1.ParseFrom(data)); MessageParsingHelpers.AssertReadingMessage(discardingParser1, data, m => assertEmpty(m));
assertEmpty(discardingParser2.ParseFrom(data)); MessageParsingHelpers.AssertReadingMessage(discardingParser2, data, m => assertEmpty(m));
// Test parse from byte[] with offset // Test parse from byte[] with offset
assertFull(retainingParser1.ParseFrom(data, 0, data.Length)); assertFull(retainingParser1.ParseFrom(data, 0, data.Length));

@ -71,18 +71,18 @@ namespace Google.Protobuf.WellKnownTypes
Uint64Field = 4 Uint64Field = 4
}; };
var bytes = message.ToByteArray(); MessageParsingHelpers.AssertRoundtrip(TestWellKnownTypes.Parser, message, parsed =>
var parsed = TestWellKnownTypes.Parser.ParseFrom(bytes); {
Assert.AreEqual("x", parsed.StringField);
Assert.AreEqual("x", parsed.StringField); Assert.AreEqual(ByteString.CopyFrom(1, 2, 3), parsed.BytesField);
Assert.AreEqual(ByteString.CopyFrom(1, 2, 3), parsed.BytesField); Assert.AreEqual(true, parsed.BoolField);
Assert.AreEqual(true, parsed.BoolField); Assert.AreEqual(12.5f, parsed.FloatField);
Assert.AreEqual(12.5f, parsed.FloatField); Assert.AreEqual(12.25d, parsed.DoubleField);
Assert.AreEqual(12.25d, parsed.DoubleField); Assert.AreEqual(1, parsed.Int32Field);
Assert.AreEqual(1, parsed.Int32Field); Assert.AreEqual(2L, parsed.Int64Field);
Assert.AreEqual(2L, parsed.Int64Field); Assert.AreEqual(3U, parsed.Uint32Field);
Assert.AreEqual(3U, parsed.Uint32Field); Assert.AreEqual(4UL, parsed.Uint64Field);
Assert.AreEqual(4UL, parsed.Uint64Field); });
} }
[Test] [Test]
@ -101,18 +101,18 @@ namespace Google.Protobuf.WellKnownTypes
Uint64Field = 0 Uint64Field = 0
}; };
var bytes = message.ToByteArray(); MessageParsingHelpers.AssertRoundtrip(TestWellKnownTypes.Parser, message, parsed =>
var parsed = TestWellKnownTypes.Parser.ParseFrom(bytes); {
Assert.AreEqual("", parsed.StringField);
Assert.AreEqual("", parsed.StringField); Assert.AreEqual(ByteString.Empty, parsed.BytesField);
Assert.AreEqual(ByteString.Empty, parsed.BytesField); Assert.AreEqual(false, parsed.BoolField);
Assert.AreEqual(false, parsed.BoolField); Assert.AreEqual(0f, parsed.FloatField);
Assert.AreEqual(0f, parsed.FloatField); Assert.AreEqual(0d, parsed.DoubleField);
Assert.AreEqual(0d, parsed.DoubleField); Assert.AreEqual(0, parsed.Int32Field);
Assert.AreEqual(0, parsed.Int32Field); Assert.AreEqual(0L, parsed.Int64Field);
Assert.AreEqual(0L, parsed.Int64Field); Assert.AreEqual(0U, parsed.Uint32Field);
Assert.AreEqual(0U, parsed.Uint32Field); Assert.AreEqual(0UL, parsed.Uint64Field);
Assert.AreEqual(0UL, parsed.Uint64Field); });
} }
[Test] [Test]
@ -140,12 +140,11 @@ namespace Google.Protobuf.WellKnownTypes
Uint32Field = { uint.MaxValue, uint.MinValue, 0U }, Uint32Field = { uint.MaxValue, uint.MinValue, 0U },
Uint64Field = { ulong.MaxValue, ulong.MinValue, 0UL }, Uint64Field = { ulong.MaxValue, ulong.MinValue, 0UL },
}; };
var bytes = message.ToByteArray();
var parsed = RepeatedWellKnownTypes.Parser.ParseFrom(bytes);
Assert.AreEqual(message, parsed);
// Just to test a single value for sanity... // Just to test a single value for sanity...
Assert.AreEqual("Second", message.StringField[1]); Assert.AreEqual("Second", message.StringField[1]);
MessageParsingHelpers.AssertRoundtrip(RepeatedWellKnownTypes.Parser, message);
} }
[Test] [Test]
@ -194,12 +193,10 @@ namespace Google.Protobuf.WellKnownTypes
Uint64Field = { { 18, ulong.MaxValue }, { 19, ulong.MinValue }, { 20, 0UL } }, Uint64Field = { { 18, ulong.MaxValue }, { 19, ulong.MinValue }, { 20, 0UL } },
}; };
var bytes = message.ToByteArray();
var parsed = MapWellKnownTypes.Parser.ParseFrom(bytes);
Assert.AreEqual(message, parsed);
// Just to test a single value for sanity... // Just to test a single value for sanity...
Assert.AreEqual("Second", message.StringField[12]); Assert.AreEqual("Second", message.StringField[12]);
MessageParsingHelpers.AssertRoundtrip(MapWellKnownTypes.Parser, message);
} }
[Test] [Test]
@ -288,10 +285,10 @@ namespace Google.Protobuf.WellKnownTypes
private void AssertOneofRoundTrip(OneofWellKnownTypes message) private void AssertOneofRoundTrip(OneofWellKnownTypes message)
{ {
// Normal roundtrip, but explicitly checking the case... // Normal roundtrip, but explicitly checking the case...
var bytes = message.ToByteArray(); MessageParsingHelpers.AssertRoundtrip(OneofWellKnownTypes.Parser, message, parsed =>
var parsed = OneofWellKnownTypes.Parser.ParseFrom(bytes); {
Assert.AreEqual(message, parsed); Assert.AreEqual(message.OneofFieldCase, parsed.OneofFieldCase);
Assert.AreEqual(message.OneofFieldCase, parsed.OneofFieldCase); });
} }
[Test] [Test]
@ -406,8 +403,10 @@ namespace Google.Protobuf.WellKnownTypes
Assert.AreEqual(8, stream.Length); // tag (1 byte) + length (1 byte) + message (6 bytes) Assert.AreEqual(8, stream.Length); // tag (1 byte) + length (1 byte) + message (6 bytes)
stream.Position = 0; stream.Position = 0;
var message = TestWellKnownTypes.Parser.ParseFrom(stream); MessageParsingHelpers.AssertReadingMessage(
Assert.AreEqual(65536, message.Int32Field); TestWellKnownTypes.Parser,
stream.ToArray(),
message => Assert.AreEqual(65536, message.Int32Field));
} }
[Test] [Test]
@ -431,8 +430,10 @@ namespace Google.Protobuf.WellKnownTypes
Assert.Less(stream.Length, 8); // tag (1 byte) + length (1 byte) + message Assert.Less(stream.Length, 8); // tag (1 byte) + length (1 byte) + message
stream.Position = 0; stream.Position = 0;
var message = TestWellKnownTypes.Parser.ParseFrom(stream); MessageParsingHelpers.AssertReadingMessage(
Assert.AreEqual(6, message.Int32Field); TestWellKnownTypes.Parser,
stream.ToArray(),
message => Assert.AreEqual(6, message.Int32Field));
} }
[Test] [Test]
@ -456,8 +457,10 @@ namespace Google.Protobuf.WellKnownTypes
Assert.AreEqual(13, stream.Length); // tag (1 byte) + length (1 byte) + message (11 bytes) Assert.AreEqual(13, stream.Length); // tag (1 byte) + length (1 byte) + message (11 bytes)
stream.Position = 0; stream.Position = 0;
var message = TestWellKnownTypes.Parser.ParseFrom(stream); MessageParsingHelpers.AssertReadingMessage(
Assert.AreEqual(0xfffffffffffffL, message.Int64Field); TestWellKnownTypes.Parser,
stream.ToArray(),
message => Assert.AreEqual(0xfffffffffffffL, message.Int64Field));
} }
[Test] [Test]
@ -481,8 +484,10 @@ namespace Google.Protobuf.WellKnownTypes
Assert.Less(stream.Length, 12); // tag (1 byte) + length (1 byte) + message Assert.Less(stream.Length, 12); // tag (1 byte) + length (1 byte) + message
stream.Position = 0; stream.Position = 0;
var message = TestWellKnownTypes.Parser.ParseFrom(stream); MessageParsingHelpers.AssertReadingMessage(
Assert.AreEqual(6L, message.Int64Field); TestWellKnownTypes.Parser,
stream.ToArray(),
message => Assert.AreEqual(6L, message.Int64Field));
} }
[Test] [Test]

Loading…
Cancel
Save