blob: 2f3fefa8d96b046ee0ffbf40336afbd8f77af2e4 [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;
Jon Skeetc298c892009-05-30 10:07:09 +010035using System;
Jon Skeet68036862008-10-22 13:30:34 +010036
37namespace Google.ProtocolBuffers {
38 [TestFixture]
39 public class DynamicMessageTest {
40
41 private ReflectionTester reflectionTester;
42 private ReflectionTester extensionsReflectionTester;
Jon Skeet25a28582009-02-18 16:06:22 +000043 private ReflectionTester packedReflectionTester;
Jon Skeet68036862008-10-22 13:30:34 +010044
45 [SetUp]
46 public void SetUp() {
47 reflectionTester = ReflectionTester.CreateTestAllTypesInstance();
48 extensionsReflectionTester = ReflectionTester.CreateTestAllExtensionsInstance();
Jon Skeet25a28582009-02-18 16:06:22 +000049 packedReflectionTester = ReflectionTester.CreateTestPackedTypesInstance();
Jon Skeet68036862008-10-22 13:30:34 +010050 }
51
52 [Test]
53 public void DynamicMessageAccessors() {
54 IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
55 reflectionTester.SetAllFieldsViaReflection(builder);
56 IMessage message = builder.WeakBuild();
57 reflectionTester.AssertAllFieldsSetViaReflection(message);
58 }
59
60 [Test]
Jon Skeetc298c892009-05-30 10:07:09 +010061 public void DoubleBuildError() {
62 DynamicMessage.Builder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
63 builder.Build();
64 try {
65 builder.Build();
66 Assert.Fail("Should have thrown exception.");
67 } catch (InvalidOperationException e) {
68 // Success.
69 }
70 }
71
72 [Test]
Jon Skeet642a8142009-01-27 12:25:21 +000073 public void DynamicMessageSettersRejectNull() {
74 IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
75 reflectionTester.AssertReflectionSettersRejectNull(builder);
76 }
77
78 [Test]
Jon Skeet68036862008-10-22 13:30:34 +010079 public void DynamicMessageExtensionAccessors() {
Jon Skeet642a8142009-01-27 12:25:21 +000080 // We don't need to extensively test DynamicMessage's handling of
81 // extensions because, frankly, it doesn't do anything special with them.
82 // It treats them just like any other fields.
83 IBuilder builder = DynamicMessage.CreateBuilder(TestAllExtensions.Descriptor);
84 extensionsReflectionTester.SetAllFieldsViaReflection(builder);
85 IMessage message = builder.WeakBuild();
86 extensionsReflectionTester.AssertAllFieldsSetViaReflection(message);
87 }
88
89 [Test]
90 public void DynamicMessageExtensionSettersRejectNull() {
91 IBuilder builder = DynamicMessage.CreateBuilder(TestAllExtensions.Descriptor);
92 extensionsReflectionTester.AssertReflectionSettersRejectNull(builder);
93 }
Jon Skeet68036862008-10-22 13:30:34 +010094
95 [Test]
96 public void DynamicMessageRepeatedSetters() {
97 IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
98 reflectionTester.SetAllFieldsViaReflection(builder);
99 reflectionTester.ModifyRepeatedFieldsViaReflection(builder);
100 IMessage message = builder.WeakBuild();
101 reflectionTester.AssertRepeatedFieldsModifiedViaReflection(message);
102 }
103
104 [Test]
Jon Skeet642a8142009-01-27 12:25:21 +0000105 public void DynamicMessageRepeatedSettersRejectNull() {
106 IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
107 reflectionTester.AssertReflectionRepeatedSettersRejectNull(builder);
108 }
109
110 [Test]
Jon Skeet68036862008-10-22 13:30:34 +0100111 public void DynamicMessageDefaults() {
112 reflectionTester.AssertClearViaReflection(DynamicMessage.GetDefaultInstance(TestAllTypes.Descriptor));
113 reflectionTester.AssertClearViaReflection(DynamicMessage.CreateBuilder(TestAllTypes.Descriptor).Build());
114 }
115
116 [Test]
117 public void DynamicMessageSerializedSize() {
118 TestAllTypes message = TestUtil.GetAllSet();
119
120 IBuilder dynamicBuilder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
121 reflectionTester.SetAllFieldsViaReflection(dynamicBuilder);
122 IMessage dynamicMessage = dynamicBuilder.WeakBuild();
123
124 Assert.AreEqual(message.SerializedSize, dynamicMessage.SerializedSize);
125 }
126
127 [Test]
128 public void DynamicMessageSerialization() {
129 IBuilder builder = DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
130 reflectionTester.SetAllFieldsViaReflection(builder);
131 IMessage message = builder.WeakBuild();
132
133 ByteString rawBytes = message.ToByteString();
134 TestAllTypes message2 = TestAllTypes.ParseFrom(rawBytes);
135
136 TestUtil.AssertAllFieldsSet(message2);
137
138 // In fact, the serialized forms should be exactly the same, byte-for-byte.
139 Assert.AreEqual(TestUtil.GetAllSet().ToByteString(), rawBytes);
140 }
141
142 [Test]
143 public void DynamicMessageParsing() {
144 TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
145 TestUtil.SetAllFields(builder);
146 TestAllTypes message = builder.Build();
147
148 ByteString rawBytes = message.ToByteString();
149
150 IMessage message2 = DynamicMessage.ParseFrom(TestAllTypes.Descriptor, rawBytes);
151 reflectionTester.AssertAllFieldsSetViaReflection(message2);
152 }
153
154 [Test]
Jon Skeet25a28582009-02-18 16:06:22 +0000155 public void DynamicMessagePackedSerialization() {
156 IBuilder builder = DynamicMessage.CreateBuilder(TestPackedTypes.Descriptor);
157 packedReflectionTester.SetPackedFieldsViaReflection(builder);
158 IMessage message = builder.WeakBuild();
159
160 ByteString rawBytes = message.ToByteString();
161 TestPackedTypes message2 = TestPackedTypes.ParseFrom(rawBytes);
162
163 TestUtil.AssertPackedFieldsSet(message2);
164
165 // In fact, the serialized forms should be exactly the same, byte-for-byte.
166 Assert.AreEqual(TestUtil.GetPackedSet().ToByteString(), rawBytes);
167 }
168
169 [Test]
170 public void testDynamicMessagePackedParsing() {
171 TestPackedTypes.Builder builder = TestPackedTypes.CreateBuilder();
172 TestUtil.SetPackedFields(builder);
173 TestPackedTypes message = builder.Build();
174
175 ByteString rawBytes = message.ToByteString();
176
177 IMessage message2 = DynamicMessage.ParseFrom(TestPackedTypes.Descriptor, rawBytes);
178 packedReflectionTester.AssertPackedFieldsSetViaReflection(message2);
179 }
180
181 [Test]
Jon Skeet68036862008-10-22 13:30:34 +0100182 public void DynamicMessageCopy() {
183 TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();
184 TestUtil.SetAllFields(builder);
185 TestAllTypes message = builder.Build();
186
187 DynamicMessage copy = DynamicMessage.CreateBuilder(message).Build();
188 reflectionTester.AssertAllFieldsSetViaReflection(copy);
189 }
Jon Skeete81a9d72009-02-24 16:50:56 +0000190
191 [Test]
192 public void ToBuilder() {
193 DynamicMessage.Builder builder =
194 DynamicMessage.CreateBuilder(TestAllTypes.Descriptor);
195 reflectionTester.SetAllFieldsViaReflection(builder);
196 int unknownFieldNum = 9;
197 ulong unknownFieldVal = 90;
198 builder.SetUnknownFields(UnknownFieldSet.CreateBuilder()
199 .AddField(unknownFieldNum,
200 UnknownField.CreateBuilder().AddVarint(unknownFieldVal).Build())
201 .Build());
202 DynamicMessage message = builder.Build();
203
204 DynamicMessage derived = message.ToBuilder().Build();
205 reflectionTester.AssertAllFieldsSetViaReflection(derived);
206
207 IList<ulong> values = derived.UnknownFields.FieldDictionary[unknownFieldNum].VarintList;
208 Assert.AreEqual(1, values.Count);
209 Assert.AreEqual(unknownFieldVal, values[0]);
210 }
Jon Skeet68036862008-10-22 13:30:34 +0100211 }
212}