|
|
|
@ -595,6 +595,95 @@ namespace Google.Protobuf.Collections |
|
|
|
|
Assert.AreEqual(((SampleEnum)(-5)), values[5]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
public void TestPackedRepeatedFieldCollectionNonDivisibleLength() |
|
|
|
|
{ |
|
|
|
|
uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited); |
|
|
|
|
var codec = FieldCodec.ForFixed32(tag); |
|
|
|
|
var stream = new MemoryStream(); |
|
|
|
|
var output = new CodedOutputStream(stream); |
|
|
|
|
output.WriteTag(tag); |
|
|
|
|
output.WriteString("A long string"); |
|
|
|
|
output.WriteTag(codec.Tag); |
|
|
|
|
output.WriteRawVarint32((uint)codec.FixedSize - 1); // Length not divisible by FixedSize |
|
|
|
|
output.WriteFixed32(uint.MaxValue); |
|
|
|
|
output.Flush(); |
|
|
|
|
stream.Position = 0; |
|
|
|
|
|
|
|
|
|
var input = new CodedInputStream(stream); |
|
|
|
|
input.ReadTag(); |
|
|
|
|
input.ReadString(); |
|
|
|
|
input.ReadTag(); |
|
|
|
|
var field = new RepeatedField<uint>(); |
|
|
|
|
Assert.Throws<InvalidProtocolBufferException>(() => field.AddEntriesFrom(input, codec)); |
|
|
|
|
|
|
|
|
|
// Collection was not pre-initialized |
|
|
|
|
Assert.AreEqual(0, field.Count); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
public void TestPackedRepeatedFieldCollectionNotAllocatedWhenLengthExceedsBuffer() |
|
|
|
|
{ |
|
|
|
|
uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited); |
|
|
|
|
var codec = FieldCodec.ForFixed32(tag); |
|
|
|
|
var stream = new MemoryStream(); |
|
|
|
|
var output = new CodedOutputStream(stream); |
|
|
|
|
output.WriteTag(tag); |
|
|
|
|
output.WriteString("A long string"); |
|
|
|
|
output.WriteTag(codec.Tag); |
|
|
|
|
output.WriteRawVarint32((uint)codec.FixedSize); |
|
|
|
|
// Note that there is no content for the packed field. |
|
|
|
|
// The field length exceeds the remaining length of content. |
|
|
|
|
output.Flush(); |
|
|
|
|
stream.Position = 0; |
|
|
|
|
|
|
|
|
|
var input = new CodedInputStream(stream); |
|
|
|
|
input.ReadTag(); |
|
|
|
|
input.ReadString(); |
|
|
|
|
input.ReadTag(); |
|
|
|
|
var field = new RepeatedField<uint>(); |
|
|
|
|
Assert.Throws<InvalidProtocolBufferException>(() => field.AddEntriesFrom(input, codec)); |
|
|
|
|
|
|
|
|
|
// Collection was not pre-initialized |
|
|
|
|
Assert.AreEqual(0, field.Count); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
[Test] |
|
|
|
|
public void TestPackedRepeatedFieldCollectionNotAllocatedWhenLengthExceedsRemainingData() |
|
|
|
|
{ |
|
|
|
|
uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited); |
|
|
|
|
var codec = FieldCodec.ForFixed32(tag); |
|
|
|
|
var stream = new MemoryStream(); |
|
|
|
|
var output = new CodedOutputStream(stream); |
|
|
|
|
output.WriteTag(tag); |
|
|
|
|
output.WriteString("A long string"); |
|
|
|
|
output.WriteTag(codec.Tag); |
|
|
|
|
output.WriteRawVarint32((uint)codec.FixedSize); |
|
|
|
|
// Note that there is no content for the packed field. |
|
|
|
|
// The field length exceeds the remaining length of the buffer. |
|
|
|
|
output.Flush(); |
|
|
|
|
stream.Position = 0; |
|
|
|
|
|
|
|
|
|
var sequence = ReadOnlySequenceFactory.CreateWithContent(stream.ToArray()); |
|
|
|
|
ParseContext.Initialize(sequence, out ParseContext ctx); |
|
|
|
|
|
|
|
|
|
ctx.ReadTag(); |
|
|
|
|
ctx.ReadString(); |
|
|
|
|
ctx.ReadTag(); |
|
|
|
|
var field = new RepeatedField<uint>(); |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
field.AddEntriesFrom(ref ctx, codec); |
|
|
|
|
Assert.Fail(); |
|
|
|
|
} |
|
|
|
|
catch (InvalidProtocolBufferException) |
|
|
|
|
{ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Collection was not pre-initialized |
|
|
|
|
Assert.AreEqual(0, field.Count); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Fairly perfunctory tests for the non-generic IList implementation |
|
|
|
|
[Test] |
|
|
|
|
public void IList_Indexer() |
|
|
|
|