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 | |
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')
-rw-r--r-- | src/ProtocolBuffers.Test/CodedInputStreamTest.cs | 66 | ||||
-rw-r--r-- | src/ProtocolBuffers.Test/DynamicMessageTest.cs | 13 | ||||
-rw-r--r-- | src/ProtocolBuffers.Test/GeneratedMessageTest.cs | 14 |
3 files changed, 91 insertions, 2 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 diff --git a/src/ProtocolBuffers.Test/DynamicMessageTest.cs b/src/ProtocolBuffers.Test/DynamicMessageTest.cs index edcce38e..2f3fefa8 100644 --- a/src/ProtocolBuffers.Test/DynamicMessageTest.cs +++ b/src/ProtocolBuffers.Test/DynamicMessageTest.cs @@ -32,6 +32,7 @@ using Google.ProtocolBuffers.TestProtos; // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using NUnit.Framework; +using System; namespace Google.ProtocolBuffers { [TestFixture] @@ -57,6 +58,18 @@ namespace Google.ProtocolBuffers { } [Test] + public void DoubleBuildError() { + DynamicMessage.Builder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor); + builder.Build(); + try { + builder.Build(); + Assert.Fail("Should have thrown exception."); + } catch (InvalidOperationException e) { + // Success. + } + } + + [Test] public void DynamicMessageSettersRejectNull() { IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor); reflectionTester.AssertReflectionSettersRejectNull(builder); diff --git a/src/ProtocolBuffers.Test/GeneratedMessageTest.cs b/src/ProtocolBuffers.Test/GeneratedMessageTest.cs index 3abf5bff..1980bbc1 100644 --- a/src/ProtocolBuffers.Test/GeneratedMessageTest.cs +++ b/src/ProtocolBuffers.Test/GeneratedMessageTest.cs @@ -91,6 +91,18 @@ namespace Google.ProtocolBuffers { } [Test] + public void DoubleBuildError() { + TestAllTypes.Builder builder = new TestAllTypes.Builder(); + builder.Build(); + try { + builder.Build(); + Assert.Fail("Should have thrown exception."); + } catch (InvalidOperationException e) { + // Success. + } + } + + [Test] public void DefaultInstance() { Assert.AreSame(TestAllTypes.DefaultInstance, TestAllTypes.DefaultInstance.DefaultInstanceForType); Assert.AreSame(TestAllTypes.DefaultInstance, TestAllTypes.CreateBuilder().DefaultInstanceForType); @@ -367,7 +379,7 @@ namespace Google.ProtocolBuffers { } [Test] - public void TestOptimizedForSizeMergeUsesAllFieldsFromTarget() { + public void OptimizedForSizeMergeUsesAllFieldsFromTarget() { TestOptimizedForSize withFieldSet = new TestOptimizedForSize.Builder { I = 10 }.Build(); TestOptimizedForSize.Builder builder = new TestOptimizedForSize.Builder(); builder.MergeFrom(withFieldSet); |