MessageTest.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Google.ProtocolBuffers.Descriptors;
  5. using Google.ProtocolBuffers.TestProtos;
  6. using NUnit.Framework;
  7. namespace Google.ProtocolBuffers {
  8. /// <summary>
  9. /// Miscellaneous tests for message operations that apply to both
  10. /// generated and dynamic messages.
  11. /// </summary>
  12. [TestFixture]
  13. public class MessageTest {
  14. // =================================================================
  15. // Message-merging tests.
  16. private static readonly TestAllTypes MergeSource = new TestAllTypes.Builder {
  17. OptionalInt32 = 1,
  18. OptionalString = "foo",
  19. OptionalForeignMessage = ForeignMessage.DefaultInstance,
  20. }.AddRepeatedString("bar").Build();
  21. private static readonly TestAllTypes MergeDest = new TestAllTypes.Builder {
  22. OptionalInt64 = 2,
  23. OptionalString = "baz",
  24. OptionalForeignMessage = new ForeignMessage.Builder { C=3 }.Build(),
  25. }.AddRepeatedString("qux").Build();
  26. private const string MergeResultText =
  27. "optional_int32: 1\n" +
  28. "optional_int64: 2\n" +
  29. "optional_string: \"foo\"\n" +
  30. "optional_foreign_message {\n" +
  31. " c: 3\n" +
  32. "}\n" +
  33. "repeated_string: \"qux\"\n" +
  34. "repeated_string: \"bar\"\n";
  35. [Test]
  36. public void MergeFrom() {
  37. TestAllTypes result = TestAllTypes.CreateBuilder(MergeDest).MergeFrom(MergeSource).Build();
  38. Assert.AreEqual(MergeResultText, result.ToString());
  39. }
  40. /// <summary>
  41. /// Test merging a DynamicMessage into a GeneratedMessage.
  42. /// As long as they have the same descriptor, this should work, but it is an
  43. /// entirely different code path.
  44. /// </summary>
  45. [Test]
  46. public void MergeFromDynamic() {
  47. TestAllTypes result = (TestAllTypes) TestAllTypes.CreateBuilder(MergeDest)
  48. .MergeFrom(DynamicMessage.CreateBuilder(MergeSource).Build())
  49. .Build();
  50. Assert.AreEqual(MergeResultText, result.ToString());
  51. }
  52. /** Test merging two DynamicMessages. */
  53. public void testDynamicMergeFrom() {
  54. DynamicMessage result = (DynamicMessage) DynamicMessage.CreateBuilder(MergeDest)
  55. .MergeFrom((DynamicMessage) DynamicMessage.CreateBuilder(MergeSource).Build())
  56. .Build();
  57. Assert.AreEqual(MergeResultText, result.ToString());
  58. }
  59. // =================================================================
  60. // Required-field-related tests.
  61. private static readonly TestRequired TestRequiredUninitialized = TestRequired.DefaultInstance;
  62. private static readonly TestRequired TestRequiredInitialized = new TestRequired.Builder {
  63. A = 1, B = 2, C = 3
  64. }.Build();
  65. [Test]
  66. public void Initialization() {
  67. TestRequired.Builder builder = TestRequired.CreateBuilder();
  68. Assert.IsFalse(builder.IsInitialized);
  69. builder.A = 1;
  70. Assert.IsFalse(builder.IsInitialized);
  71. builder.B = 1;
  72. Assert.IsFalse(builder.IsInitialized);
  73. builder.C = 1;
  74. Assert.IsTrue(builder.IsInitialized);
  75. }
  76. [Test]
  77. public void RequiredForeign() {
  78. TestRequiredForeign.Builder builder = TestRequiredForeign.CreateBuilder();
  79. Assert.IsTrue(builder.IsInitialized);
  80. builder.SetOptionalMessage(TestRequiredUninitialized);
  81. Assert.IsFalse(builder.IsInitialized);
  82. builder.SetOptionalMessage(TestRequiredInitialized);
  83. Assert.IsTrue(builder.IsInitialized);
  84. builder.AddRepeatedMessage(TestRequiredUninitialized);
  85. Assert.IsFalse(builder.IsInitialized);
  86. builder.SetRepeatedMessage(0, TestRequiredInitialized);
  87. Assert.IsTrue(builder.IsInitialized);
  88. }
  89. [Test]
  90. public void RequiredExtension() {
  91. TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();
  92. Assert.IsTrue(builder.IsInitialized);
  93. builder.SetExtension(TestRequired.Types.Single, TestRequiredUninitialized);
  94. Assert.IsFalse(builder.IsInitialized);
  95. builder.SetExtension(TestRequired.Types.Single, TestRequiredInitialized);
  96. Assert.IsTrue(builder.IsInitialized);
  97. builder.AddExtension(TestRequired.Types.Multi, TestRequiredUninitialized);
  98. Assert.IsFalse(builder.IsInitialized);
  99. builder.SetExtension(TestRequired.Types.Multi, 0, TestRequiredInitialized);
  100. Assert.IsTrue(builder.IsInitialized);
  101. }
  102. [Test]
  103. public void RequiredDynamic() {
  104. MessageDescriptor descriptor = TestRequired.Descriptor;
  105. DynamicMessage.Builder builder = DynamicMessage.CreateBuilder(descriptor);
  106. Assert.IsFalse(builder.IsInitialized);
  107. builder[descriptor.FindDescriptor<FieldDescriptor>("a")] = 1;
  108. Assert.IsFalse(builder.IsInitialized);
  109. builder[descriptor.FindDescriptor<FieldDescriptor>("b")] = 1;
  110. Assert.IsFalse(builder.IsInitialized);
  111. builder[descriptor.FindDescriptor<FieldDescriptor>("c")] = 1;
  112. Assert.IsTrue(builder.IsInitialized);
  113. }
  114. [Test]
  115. public void RequiredDynamicForeign() {
  116. MessageDescriptor descriptor = TestRequiredForeign.Descriptor;
  117. DynamicMessage.Builder builder = DynamicMessage.CreateBuilder(descriptor);
  118. Assert.IsTrue(builder.IsInitialized);
  119. builder[descriptor.FindDescriptor<FieldDescriptor>("optional_message")] = TestRequiredUninitialized;
  120. Assert.IsFalse(builder.IsInitialized);
  121. builder[descriptor.FindDescriptor<FieldDescriptor>("optional_message")] = TestRequiredInitialized;
  122. Assert.IsTrue(builder.IsInitialized);
  123. builder.AddRepeatedField(descriptor.FindDescriptor<FieldDescriptor>("repeated_message"), TestRequiredUninitialized);
  124. Assert.IsFalse(builder.IsInitialized);
  125. builder.SetRepeatedField(descriptor.FindDescriptor<FieldDescriptor>("repeated_message"), 0, TestRequiredInitialized);
  126. Assert.IsTrue(builder.IsInitialized);
  127. }
  128. [Test]
  129. public void UninitializedException() {
  130. try {
  131. TestRequired.CreateBuilder().Build();
  132. Assert.Fail("Should have thrown an exception.");
  133. } catch (UninitializedMessageException e) {
  134. Assert.AreEqual("Message missing required fields: a, b, c", e.Message);
  135. }
  136. }
  137. [Test]
  138. public void BuildPartial() {
  139. // We're mostly testing that no exception is thrown.
  140. TestRequired message = TestRequired.CreateBuilder().BuildPartial();
  141. Assert.IsFalse(message.IsInitialized);
  142. }
  143. [Test]
  144. public void NestedUninitializedException() {
  145. try {
  146. TestRequiredForeign.CreateBuilder()
  147. .SetOptionalMessage(TestRequiredUninitialized)
  148. .AddRepeatedMessage(TestRequiredUninitialized)
  149. .AddRepeatedMessage(TestRequiredUninitialized)
  150. .Build();
  151. Assert.Fail("Should have thrown an exception.");
  152. } catch (UninitializedMessageException e) {
  153. Assert.AreEqual(
  154. "Message missing required fields: " +
  155. "optional_message.a, " +
  156. "optional_message.b, " +
  157. "optional_message.c, " +
  158. "repeated_message[0].a, " +
  159. "repeated_message[0].b, " +
  160. "repeated_message[0].c, " +
  161. "repeated_message[1].a, " +
  162. "repeated_message[1].b, " +
  163. "repeated_message[1].c",
  164. e.Message);
  165. }
  166. }
  167. [Test]
  168. public void BuildNestedPartial() {
  169. // We're mostly testing that no exception is thrown.
  170. TestRequiredForeign message =
  171. TestRequiredForeign.CreateBuilder()
  172. .SetOptionalMessage(TestRequiredUninitialized)
  173. .AddRepeatedMessage(TestRequiredUninitialized)
  174. .AddRepeatedMessage(TestRequiredUninitialized)
  175. .BuildPartial();
  176. Assert.IsFalse(message.IsInitialized);
  177. }
  178. [Test]
  179. public void ParseUnititialized() {
  180. try {
  181. TestRequired.ParseFrom(ByteString.Empty);
  182. Assert.Fail("Should have thrown an exception.");
  183. } catch (InvalidProtocolBufferException e) {
  184. Assert.AreEqual("Message missing required fields: a, b, c", e.Message);
  185. }
  186. }
  187. [Test]
  188. public void ParseNestedUnititialized() {
  189. ByteString data =
  190. TestRequiredForeign.CreateBuilder()
  191. .SetOptionalMessage(TestRequiredUninitialized)
  192. .AddRepeatedMessage(TestRequiredUninitialized)
  193. .AddRepeatedMessage(TestRequiredUninitialized)
  194. .BuildPartial().ToByteString();
  195. try {
  196. TestRequiredForeign.ParseFrom(data);
  197. Assert.Fail("Should have thrown an exception.");
  198. } catch (InvalidProtocolBufferException e) {
  199. Assert.AreEqual(
  200. "Message missing required fields: " +
  201. "optional_message.a, " +
  202. "optional_message.b, " +
  203. "optional_message.c, " +
  204. "repeated_message[0].a, " +
  205. "repeated_message[0].b, " +
  206. "repeated_message[0].c, " +
  207. "repeated_message[1].a, " +
  208. "repeated_message[1].b, " +
  209. "repeated_message[1].c",
  210. e.Message);
  211. }
  212. }
  213. [Test]
  214. public void DynamicUninitializedException() {
  215. try {
  216. DynamicMessage.CreateBuilder(TestRequired.Descriptor).Build();
  217. Assert.Fail("Should have thrown an exception.");
  218. } catch (UninitializedMessageException e) {
  219. Assert.AreEqual("Message missing required fields: a, b, c", e.Message);
  220. }
  221. }
  222. [Test]
  223. public void DynamicBuildPartial() {
  224. // We're mostly testing that no exception is thrown.
  225. DynamicMessage message = DynamicMessage.CreateBuilder(TestRequired.Descriptor).BuildPartial();
  226. Assert.IsFalse(message.Initialized);
  227. }
  228. [Test]
  229. public void DynamicParseUnititialized() {
  230. try {
  231. MessageDescriptor descriptor = TestRequired.Descriptor;
  232. DynamicMessage.ParseFrom(descriptor, ByteString.Empty);
  233. Assert.Fail("Should have thrown an exception.");
  234. } catch (InvalidProtocolBufferException e) {
  235. Assert.AreEqual("Message missing required fields: a, b, c", e.Message);
  236. }
  237. }
  238. }
  239. }