blob: edcce38ea06b9e9872bfc96013ff0a6a05569607 [file] [log] [blame]
Jon Skeete81a9d72009-02-24 16:50:56 +00001using System.Collections.Generic;
Jon Skeet60c059b2008-10-23 21:17:56 +01002using Google.ProtocolBuffers.TestProtos;
Jon Skeet68036862008-10-22 13:30:34 +01003// Protocol Buffers - Google's data interchange format
Jon Skeet60c059b2008-10-23 21:17:56 +01004// Copyright 2008 Google Inc. All rights reserved.
5// http://github.com/jskeet/dotnet-protobufs/
6// Original C++/Java/Python code:
Jon Skeet68036862008-10-22 13:30:34 +01007// http://code.google.com/p/protobuf/
8//
Jon Skeet60c059b2008-10-23 21:17:56 +01009// Redistribution and use in source and binary forms, with or without
10// modification, are permitted provided that the following conditions are
11// met:
Jon Skeet68036862008-10-22 13:30:34 +010012//
Jon Skeet60c059b2008-10-23 21:17:56 +010013// * Redistributions of source code must retain the above copyright
14// notice, this list of conditions and the following disclaimer.
15// * Redistributions in binary form must reproduce the above
16// copyright notice, this list of conditions and the following disclaimer
17// in the documentation and/or other materials provided with the
18// distribution.
19// * Neither the name of Google Inc. nor the names of its
20// contributors may be used to endorse or promote products derived from
21// this software without specific prior written permission.
Jon Skeet68036862008-10-22 13:30:34 +010022//
Jon Skeet60c059b2008-10-23 21:17:56 +010023// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Jon Skeet68036862008-10-22 13:30:34 +010034using NUnit.Framework;
35
36namespace Google.ProtocolBuffers {
37 [TestFixture]
38 public class DynamicMessageTest {
39
40 private ReflectionTester reflectionTester;
41 private ReflectionTester extensionsReflectionTester;
Jon Skeet25a28582009-02-18 16:06:22 +000042 private ReflectionTester packedReflectionTester;
Jon Skeet68036862008-10-22 13:30:34 +010043
44 [SetUp]
45 public void SetUp() {
46 reflectionTester = ReflectionTester.CreateTestAllTypesInstance();
47 extensionsReflectionTester = ReflectionTester.CreateTestAllExtensionsInstance();
Jon Skeet25a28582009-02-18 16:06:22 +000048 packedReflectionTester = ReflectionTester.CreateTestPackedTypesInstance();
Jon Skeet68036862008-10-22 13:30:34 +010049 }
50
51 [Test]
52 public void DynamicMessageAccessors() {
53 IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
54 reflectionTester.SetAllFieldsViaReflection(builder);
55 IMessage message = builder.WeakBuild();
56 reflectionTester.AssertAllFieldsSetViaReflection(message);
57 }
58
59 [Test]
Jon Skeet642a8142009-01-27 12:25:21 +000060 public void DynamicMessageSettersRejectNull() {
61 IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
62 reflectionTester.AssertReflectionSettersRejectNull(builder);
63 }
64
65 [Test]
Jon Skeet68036862008-10-22 13:30:34 +010066 public void DynamicMessageExtensionAccessors() {
Jon Skeet642a8142009-01-27 12:25:21 +000067 // We don't need to extensively test DynamicMessage's handling of
68 // extensions because, frankly, it doesn't do anything special with them.
69 // It treats them just like any other fields.
70 IBuilder builder = DynamicMessage.CreateBuilder(TestAllExtensions.Descriptor);
71 extensionsReflectionTester.SetAllFieldsViaReflection(builder);
72 IMessage message = builder.WeakBuild();
73 extensionsReflectionTester.AssertAllFieldsSetViaReflection(message);
74 }
75
76 [Test]
77 public void DynamicMessageExtensionSettersRejectNull() {
78 IBuilder builder = DynamicMessage.CreateBuilder(TestAllExtensions.Descriptor);
79 extensionsReflectionTester.AssertReflectionSettersRejectNull(builder);
80 }
Jon Skeet68036862008-10-22 13:30:34 +010081
82 [Test]
83 public void DynamicMessageRepeatedSetters() {
84 IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
85 reflectionTester.SetAllFieldsViaReflection(builder);
86 reflectionTester.ModifyRepeatedFieldsViaReflection(builder);
87 IMessage message = builder.WeakBuild();
88 reflectionTester.AssertRepeatedFieldsModifiedViaReflection(message);
89 }
90
91 [Test]
Jon Skeet642a8142009-01-27 12:25:21 +000092 public void DynamicMessageRepeatedSettersRejectNull() {
93 IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
94 reflectionTester.AssertReflectionRepeatedSettersRejectNull(builder);
95 }
96
97 [Test]
Jon Skeet68036862008-10-22 13:30:34 +010098 public void DynamicMessageDefaults() {
99 reflectionTester.AssertClearViaReflection(DynamicMessage.GetDefaultInstance(TestAllTypes.Descriptor));
100 reflectionTester.AssertClearViaReflection(DynamicMessage.CreateBuilder(TestAllTypes.Descriptor).Build());
101 }
102
103 [Test]
104 public void DynamicMessageSerializedSize() {
105 TestAllTypes message = TestUtil.GetAllSet();
106
107 IBuilder dynamicBuilder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
108 reflectionTester.SetAllFieldsViaReflection(dynamicBuilder);
109 IMessage dynamicMessage = dynamicBuilder.WeakBuild();
110
111 Assert.AreEqual(message.SerializedSize, dynamicMessage.SerializedSize);
112 }
113
114 [Test]
115 public void DynamicMessageSerialization() {
116 IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
117 reflectionTester.SetAllFieldsViaReflection(builder);
118 IMessage message = builder.WeakBuild();
119
120 ByteString rawBytes = message.ToByteString();
121 TestAllTypes message2 = TestAllTypes.ParseFrom(rawBytes);
122
123 TestUtil.AssertAllFieldsSet(message2);
124
125 // In fact, the serialized forms should be exactly the same, byte-for-byte.
126 Assert.AreEqual(TestUtil.GetAllSet().ToByteString(), rawBytes);
127 }
128
129 [Test]
130 public void DynamicMessageParsing() {
131 TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
132 TestUtil.SetAllFields(builder);
133 TestAllTypes message = builder.Build();
134
135 ByteString rawBytes = message.ToByteString();
136
137 IMessage message2 = DynamicMessage.ParseFrom(TestAllTypes.Descriptor, rawBytes);
138 reflectionTester.AssertAllFieldsSetViaReflection(message2);
139 }
140
141 [Test]
Jon Skeet25a28582009-02-18 16:06:22 +0000142 public void DynamicMessagePackedSerialization() {
143 IBuilder builder = DynamicMessage.CreateBuilder(TestPackedTypes.Descriptor);
144 packedReflectionTester.SetPackedFieldsViaReflection(builder);
145 IMessage message = builder.WeakBuild();
146
147 ByteString rawBytes = message.ToByteString();
148 TestPackedTypes message2 = TestPackedTypes.ParseFrom(rawBytes);
149
150 TestUtil.AssertPackedFieldsSet(message2);
151
152 // In fact, the serialized forms should be exactly the same, byte-for-byte.
153 Assert.AreEqual(TestUtil.GetPackedSet().ToByteString(), rawBytes);
154 }
155
156 [Test]
157 public void testDynamicMessagePackedParsing() {
158 TestPackedTypes.Builder builder = TestPackedTypes.CreateBuilder();
159 TestUtil.SetPackedFields(builder);
160 TestPackedTypes message = builder.Build();
161
162 ByteString rawBytes = message.ToByteString();
163
164 IMessage message2 = DynamicMessage.ParseFrom(TestPackedTypes.Descriptor, rawBytes);
165 packedReflectionTester.AssertPackedFieldsSetViaReflection(message2);
166 }
167
168 [Test]
Jon Skeet68036862008-10-22 13:30:34 +0100169 public void DynamicMessageCopy() {
170 TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
171 TestUtil.SetAllFields(builder);
172 TestAllTypes message = builder.Build();
173
174 DynamicMessage copy = DynamicMessage.CreateBuilder(message).Build();
175 reflectionTester.AssertAllFieldsSetViaReflection(copy);
176 }
Jon Skeete81a9d72009-02-24 16:50:56 +0000177
178 [Test]
179 public void ToBuilder() {
180 DynamicMessage.Builder builder =
181 DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
182 reflectionTester.SetAllFieldsViaReflection(builder);
183 int unknownFieldNum = 9;
184 ulong unknownFieldVal = 90;
185 builder.SetUnknownFields(UnknownFieldSet.CreateBuilder()
186 .AddField(unknownFieldNum,
187 UnknownField.CreateBuilder().AddVarint(unknownFieldVal).Build())
188 .Build());
189 DynamicMessage message = builder.Build();
190
191 DynamicMessage derived = message.ToBuilder().Build();
192 reflectionTester.AssertAllFieldsSetViaReflection(derived);
193
194 IList<ulong> values = derived.UnknownFields.FieldDictionary[unknownFieldNum].VarintList;
195 Assert.AreEqual(1, values.Count);
196 Assert.AreEqual(unknownFieldVal, values[0]);
197 }
Jon Skeet68036862008-10-22 13:30:34 +0100198 }
199}