diff options
author | Jon Skeet <skeet@pobox.com> | 2009-05-30 10:07:09 +0100 |
---|---|---|
committer | Jon Skeet <skeet@pobox.com> | 2009-05-30 10:07:09 +0100 |
commit | c298c89229a4f3d2ec19f431de2f46cc597142af (patch) | |
tree | e48efb73e063a2b6204596ad791c04fe0883d460 /src/ProtocolBuffers.Test/CodedInputStreamTest.cs | |
parent | a6afb7cd486ae67973a415bb8ff6fa3d723623fb (diff) | |
download | protobuf-c298c89229a4f3d2ec19f431de2f46cc597142af.tar.gz protobuf-c298c89229a4f3d2ec19f431de2f46cc597142af.tar.bz2 protobuf-c298c89229a4f3d2ec19f431de2f46cc597142af.zip |
New tests, double build errors, and a few miscellaneous fixes
Diffstat (limited to 'src/ProtocolBuffers.Test/CodedInputStreamTest.cs')
-rw-r--r-- | src/ProtocolBuffers.Test/CodedInputStreamTest.cs | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/src/ProtocolBuffers.Test/CodedInputStreamTest.cs b/src/ProtocolBuffers.Test/CodedInputStreamTest.cs index ce4a6683..2ad8c45b 100644 --- a/src/ProtocolBuffers.Test/CodedInputStreamTest.cs +++ b/src/ProtocolBuffers.Test/CodedInputStreamTest.cs @@ -61,6 +61,7 @@ namespace Google.ProtocolBuffers { input = CodedInputStream.CreateInstance(data); Assert.AreEqual(value, input.ReadRawVarint64()); + Assert.IsTrue(input.IsAtEnd); // Try different block sizes. for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2) { @@ -69,7 +70,18 @@ namespace Google.ProtocolBuffers { input = CodedInputStream.CreateInstance(new SmallBlockInputStream(data, bufferSize)); Assert.AreEqual(value, input.ReadRawVarint64()); + Assert.IsTrue(input.IsAtEnd); } + + // Try reading directly from a MemoryStream. We want to verify that it + // doesn't read past the end of the input, so write an extra byte - this + // lets us test the position at the end. + MemoryStream memoryStream = new MemoryStream(); + memoryStream.Write(data, 0, data.Length); + memoryStream.WriteByte(0); + memoryStream.Position = 0; + Assert.AreEqual((uint)value, CodedInputStream.ReadRawVarint32(memoryStream)); + Assert.AreEqual(data.Length, memoryStream.Position); } /// <summary> @@ -77,7 +89,7 @@ namespace Google.ProtocolBuffers { /// expects them to fail with an InvalidProtocolBufferException whose /// description matches the given one. /// </summary> - private void AssertReadVarintFailure(InvalidProtocolBufferException expected, byte[] data) { + private static void AssertReadVarintFailure(InvalidProtocolBufferException expected, byte[] data) { CodedInputStream input = CodedInputStream.CreateInstance(data); try { input.ReadRawVarint32(); @@ -93,6 +105,14 @@ namespace Google.ProtocolBuffers { } catch (InvalidProtocolBufferException e) { Assert.AreEqual(expected.Message, e.Message); } + + // Make sure we get the same error when reading directly from a Stream. + try { + CodedInputStream.ReadRawVarint32(new MemoryStream(data)); + Assert.Fail("Should have thrown an exception."); + } catch (InvalidProtocolBufferException e) { + Assert.AreEqual(expected.Message, e.Message); + } } [Test] @@ -139,12 +159,14 @@ namespace Google.ProtocolBuffers { private static void AssertReadLittleEndian32(byte[] data, uint value) { CodedInputStream input = CodedInputStream.CreateInstance(data); Assert.AreEqual(value, input.ReadRawLittleEndian32()); + Assert.IsTrue(input.IsAtEnd); // Try different block sizes. for (int blockSize = 1; blockSize <= 16; blockSize *= 2) { input = CodedInputStream.CreateInstance( new SmallBlockInputStream(data, blockSize)); Assert.AreEqual(value, input.ReadRawLittleEndian32()); + Assert.IsTrue(input.IsAtEnd); } } @@ -155,12 +177,14 @@ namespace Google.ProtocolBuffers { private static void AssertReadLittleEndian64(byte[] data, ulong value) { CodedInputStream input = CodedInputStream.CreateInstance(data); Assert.AreEqual(value, input.ReadRawLittleEndian64()); + Assert.IsTrue(input.IsAtEnd); // Try different block sizes. for (int blockSize = 1; blockSize <= 16; blockSize *= 2) { input = CodedInputStream.CreateInstance( new SmallBlockInputStream(data, blockSize)); Assert.AreEqual(value, input.ReadRawLittleEndian64()); + Assert.IsTrue(input.IsAtEnd); } } @@ -239,6 +263,21 @@ namespace Google.ProtocolBuffers { } } + /// <summary> + /// Test that a bug in SkipRawBytes has been fixed: if the skip + /// skips exactly up to a limit, this should bnot break things + /// </summary> + [Test] + public void SkipRawBytesBug() { + byte[] rawBytes = new byte[] { 1, 2 }; + CodedInputStream input = CodedInputStream.CreateInstance(rawBytes); + + int limit = input.PushLimit(1); + input.SkipRawBytes(1); + input.PopLimit(limit); + Assert.AreEqual(2, input.ReadRawByte()); + } + public void ReadHugeBlob() { // Allocate and initialize a 1MB blob. byte[] blob = new byte[1 << 20]; @@ -348,6 +387,31 @@ namespace Google.ProtocolBuffers { } } + [Test] + public void ResetSizeCounter() { + CodedInputStream input = CodedInputStream.CreateInstance( + new SmallBlockInputStream(new byte[256], 8)); + input.SetSizeLimit(16); + input.ReadRawBytes(16); + + try { + input.ReadRawByte(); + Assert.Fail("Should have thrown an exception!"); + } catch (InvalidProtocolBufferException e) { + // Success. + } + + input.ResetSizeCounter(); + input.ReadRawByte(); // No exception thrown. + + try { + input.ReadRawBytes(16); // Hits limit again. + Assert.Fail("Should have thrown an exception!"); + } catch (InvalidProtocolBufferException e) { + // Success. + } + } + /// <summary> /// Tests that if we read an string that contains invalid UTF-8, no exception /// is thrown. Instead, the invalid bytes are replaced with the Unicode |