aboutsummaryrefslogtreecommitdiff
path: root/src/ProtocolBuffers.Test
diff options
context:
space:
mode:
authorJon Skeet <skeet@pobox.com>2009-05-30 10:07:09 +0100
committerJon Skeet <skeet@pobox.com>2009-05-30 10:07:09 +0100
commitc298c89229a4f3d2ec19f431de2f46cc597142af (patch)
treee48efb73e063a2b6204596ad791c04fe0883d460 /src/ProtocolBuffers.Test
parenta6afb7cd486ae67973a415bb8ff6fa3d723623fb (diff)
downloadprotobuf-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.cs66
-rw-r--r--src/ProtocolBuffers.Test/DynamicMessageTest.cs13
-rw-r--r--src/ProtocolBuffers.Test/GeneratedMessageTest.cs14
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);