|
|
|
@ -33,6 +33,7 @@ |
|
|
|
|
using Google.Protobuf.Reflection; |
|
|
|
|
using UnitTest.Issues.TestProtos; |
|
|
|
|
using NUnit.Framework; |
|
|
|
|
using System.IO; |
|
|
|
|
using static UnitTest.Issues.TestProtos.OneofMerging.Types; |
|
|
|
|
|
|
|
|
|
namespace Google.Protobuf |
|
|
|
@ -90,5 +91,26 @@ namespace Google.Protobuf |
|
|
|
|
merged.MergeFrom(message2); |
|
|
|
|
Assert.AreEqual(expected, merged); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Check that a tag immediately followed by end of limit can still be read. |
|
|
|
|
[Test] |
|
|
|
|
public void CodedInputStream_LimitReachedRightAfterTag() |
|
|
|
|
{ |
|
|
|
|
MemoryStream ms = new MemoryStream(); |
|
|
|
|
var cos = new CodedOutputStream(ms); |
|
|
|
|
cos.WriteTag(11, WireFormat.WireType.Varint); |
|
|
|
|
Assert.AreEqual(1, cos.Position); |
|
|
|
|
cos.WriteString("some extra padding"); // ensure is currentLimit distinct from the end of the buffer. |
|
|
|
|
cos.Flush(); |
|
|
|
|
|
|
|
|
|
var cis = new CodedInputStream(ms.ToArray()); |
|
|
|
|
cis.PushLimit(1); // make sure we reach the limit right after reading the tag. |
|
|
|
|
|
|
|
|
|
// we still must read the tag correctly, even though the tag is at the very end of our limited input |
|
|
|
|
// (which is a corner case and will most likely result in an error when trying to read value of the field |
|
|
|
|
// decribed by this tag, but it would be a logical error not to read the tag that's actually present). |
|
|
|
|
// See https://github.com/protocolbuffers/protobuf/pull/7289 |
|
|
|
|
cis.AssertNextTag(WireFormat.MakeTag(11, WireFormat.WireType.Varint)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|