| OLD | NEW |
| 1 // Protocol Buffers - Google's data interchange format | 1 // Protocol Buffers - Google's data interchange format |
| 2 // Copyright 2008 Google Inc. All rights reserved. | 2 // Copyright 2008 Google Inc. All rights reserved. |
| 3 // https://developers.google.com/protocol-buffers/ | 3 // https://developers.google.com/protocol-buffers/ |
| 4 // | 4 // |
| 5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
| 6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
| 7 // met: | 7 // met: |
| 8 // | 8 // |
| 9 // * Redistributions of source code must retain the above copyright | 9 // * Redistributions of source code must retain the above copyright |
| 10 // notice, this list of conditions and the following disclaimer. | 10 // notice, this list of conditions and the following disclaimer. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 import com.google.protobuf.BoolValue; | 34 import com.google.protobuf.BoolValue; |
| 35 import com.google.protobuf.ByteString; | 35 import com.google.protobuf.ByteString; |
| 36 import com.google.protobuf.BytesValue; | 36 import com.google.protobuf.BytesValue; |
| 37 import com.google.protobuf.DoubleValue; | 37 import com.google.protobuf.DoubleValue; |
| 38 import com.google.protobuf.FloatValue; | 38 import com.google.protobuf.FloatValue; |
| 39 import com.google.protobuf.Int32Value; | 39 import com.google.protobuf.Int32Value; |
| 40 import com.google.protobuf.Int64Value; | 40 import com.google.protobuf.Int64Value; |
| 41 import com.google.protobuf.InvalidProtocolBufferException; | 41 import com.google.protobuf.InvalidProtocolBufferException; |
| 42 import com.google.protobuf.ListValue; | 42 import com.google.protobuf.ListValue; |
| 43 import com.google.protobuf.Message; | 43 import com.google.protobuf.Message; |
| 44 import com.google.protobuf.NullValue; | |
| 45 import com.google.protobuf.StringValue; | 44 import com.google.protobuf.StringValue; |
| 46 import com.google.protobuf.Struct; | 45 import com.google.protobuf.Struct; |
| 47 import com.google.protobuf.UInt32Value; | 46 import com.google.protobuf.UInt32Value; |
| 48 import com.google.protobuf.UInt64Value; | 47 import com.google.protobuf.UInt64Value; |
| 49 import com.google.protobuf.Value; | 48 import com.google.protobuf.Value; |
| 50 import com.google.protobuf.util.JsonFormat.TypeRegistry; | 49 import com.google.protobuf.util.JsonFormat.TypeRegistry; |
| 51 import com.google.protobuf.util.JsonTestProto.TestAllTypes; | 50 import com.google.protobuf.util.JsonTestProto.TestAllTypes; |
| 52 import com.google.protobuf.util.JsonTestProto.TestAllTypes.NestedEnum; | 51 import com.google.protobuf.util.JsonTestProto.TestAllTypes.NestedEnum; |
| 53 import com.google.protobuf.util.JsonTestProto.TestAllTypes.NestedMessage; | 52 import com.google.protobuf.util.JsonTestProto.TestAllTypes.NestedMessage; |
| 54 import com.google.protobuf.util.JsonTestProto.TestAny; | 53 import com.google.protobuf.util.JsonTestProto.TestAny; |
| 55 import com.google.protobuf.util.JsonTestProto.TestCustomJsonName; | 54 import com.google.protobuf.util.JsonTestProto.TestCustomJsonName; |
| 56 import com.google.protobuf.util.JsonTestProto.TestDuration; | 55 import com.google.protobuf.util.JsonTestProto.TestDuration; |
| 57 import com.google.protobuf.util.JsonTestProto.TestFieldMask; | 56 import com.google.protobuf.util.JsonTestProto.TestFieldMask; |
| 58 import com.google.protobuf.util.JsonTestProto.TestMap; | 57 import com.google.protobuf.util.JsonTestProto.TestMap; |
| 59 import com.google.protobuf.util.JsonTestProto.TestOneof; | 58 import com.google.protobuf.util.JsonTestProto.TestOneof; |
| 60 import com.google.protobuf.util.JsonTestProto.TestRecursive; | |
| 61 import com.google.protobuf.util.JsonTestProto.TestStruct; | 59 import com.google.protobuf.util.JsonTestProto.TestStruct; |
| 62 import com.google.protobuf.util.JsonTestProto.TestTimestamp; | 60 import com.google.protobuf.util.JsonTestProto.TestTimestamp; |
| 63 import com.google.protobuf.util.JsonTestProto.TestWrappers; | 61 import com.google.protobuf.util.JsonTestProto.TestWrappers; |
| 62 |
| 63 import junit.framework.TestCase; |
| 64 |
| 64 import java.io.IOException; | 65 import java.io.IOException; |
| 65 import java.math.BigDecimal; | 66 import java.math.BigDecimal; |
| 66 import java.math.BigInteger; | 67 import java.math.BigInteger; |
| 67 import java.util.HashMap; | |
| 68 import java.util.Map; | |
| 69 import junit.framework.TestCase; | |
| 70 | 68 |
| 71 public class JsonFormatTest extends TestCase { | 69 public class JsonFormatTest extends TestCase { |
| 72 private void setAllFields(TestAllTypes.Builder builder) { | 70 private void setAllFields(TestAllTypes.Builder builder) { |
| 73 builder.setOptionalInt32(1234); | 71 builder.setOptionalInt32(1234); |
| 74 builder.setOptionalInt64(1234567890123456789L); | 72 builder.setOptionalInt64(1234567890123456789L); |
| 75 builder.setOptionalUint32(5678); | 73 builder.setOptionalUint32(5678); |
| 76 builder.setOptionalUint64(2345678901234567890L); | 74 builder.setOptionalUint64(2345678901234567890L); |
| 77 builder.setOptionalSint32(9012); | 75 builder.setOptionalSint32(9012); |
| 78 builder.setOptionalSint64(3456789012345678901L); | 76 builder.setOptionalSint64(3456789012345678901L); |
| 79 builder.setOptionalFixed32(3456); | 77 builder.setOptionalFixed32(3456); |
| 80 builder.setOptionalFixed64(4567890123456789012L); | 78 builder.setOptionalFixed64(4567890123456789012L); |
| 81 builder.setOptionalSfixed32(7890); | 79 builder.setOptionalSfixed32(7890); |
| 82 builder.setOptionalSfixed64(5678901234567890123L); | 80 builder.setOptionalSfixed64(5678901234567890123L); |
| 83 builder.setOptionalFloat(1.5f); | 81 builder.setOptionalFloat(1.5f); |
| 84 builder.setOptionalDouble(1.25); | 82 builder.setOptionalDouble(1.25); |
| 85 builder.setOptionalBool(true); | 83 builder.setOptionalBool(true); |
| 86 builder.setOptionalString("Hello world!"); | 84 builder.setOptionalString("Hello world!"); |
| 87 builder.setOptionalBytes(ByteString.copyFrom(new byte[] {0, 1, 2})); | 85 builder.setOptionalBytes(ByteString.copyFrom(new byte[]{0, 1, 2})); |
| 88 builder.setOptionalNestedEnum(NestedEnum.BAR); | 86 builder.setOptionalNestedEnum(NestedEnum.BAR); |
| 89 builder.getOptionalNestedMessageBuilder().setValue(100); | 87 builder.getOptionalNestedMessageBuilder().setValue(100); |
| 90 | 88 |
| 91 builder.addRepeatedInt32(1234); | 89 builder.addRepeatedInt32(1234); |
| 92 builder.addRepeatedInt64(1234567890123456789L); | 90 builder.addRepeatedInt64(1234567890123456789L); |
| 93 builder.addRepeatedUint32(5678); | 91 builder.addRepeatedUint32(5678); |
| 94 builder.addRepeatedUint64(2345678901234567890L); | 92 builder.addRepeatedUint64(2345678901234567890L); |
| 95 builder.addRepeatedSint32(9012); | 93 builder.addRepeatedSint32(9012); |
| 96 builder.addRepeatedSint64(3456789012345678901L); | 94 builder.addRepeatedSint64(3456789012345678901L); |
| 97 builder.addRepeatedFixed32(3456); | 95 builder.addRepeatedFixed32(3456); |
| 98 builder.addRepeatedFixed64(4567890123456789012L); | 96 builder.addRepeatedFixed64(4567890123456789012L); |
| 99 builder.addRepeatedSfixed32(7890); | 97 builder.addRepeatedSfixed32(7890); |
| 100 builder.addRepeatedSfixed64(5678901234567890123L); | 98 builder.addRepeatedSfixed64(5678901234567890123L); |
| 101 builder.addRepeatedFloat(1.5f); | 99 builder.addRepeatedFloat(1.5f); |
| 102 builder.addRepeatedDouble(1.25); | 100 builder.addRepeatedDouble(1.25); |
| 103 builder.addRepeatedBool(true); | 101 builder.addRepeatedBool(true); |
| 104 builder.addRepeatedString("Hello world!"); | 102 builder.addRepeatedString("Hello world!"); |
| 105 builder.addRepeatedBytes(ByteString.copyFrom(new byte[] {0, 1, 2})); | 103 builder.addRepeatedBytes(ByteString.copyFrom(new byte[]{0, 1, 2})); |
| 106 builder.addRepeatedNestedEnum(NestedEnum.BAR); | 104 builder.addRepeatedNestedEnum(NestedEnum.BAR); |
| 107 builder.addRepeatedNestedMessageBuilder().setValue(100); | 105 builder.addRepeatedNestedMessageBuilder().setValue(100); |
| 108 | 106 |
| 109 builder.addRepeatedInt32(234); | 107 builder.addRepeatedInt32(234); |
| 110 builder.addRepeatedInt64(234567890123456789L); | 108 builder.addRepeatedInt64(234567890123456789L); |
| 111 builder.addRepeatedUint32(678); | 109 builder.addRepeatedUint32(678); |
| 112 builder.addRepeatedUint64(345678901234567890L); | 110 builder.addRepeatedUint64(345678901234567890L); |
| 113 builder.addRepeatedSint32(012); | 111 builder.addRepeatedSint32(012); |
| 114 builder.addRepeatedSint64(456789012345678901L); | 112 builder.addRepeatedSint64(456789012345678901L); |
| 115 builder.addRepeatedFixed32(456); | 113 builder.addRepeatedFixed32(456); |
| 116 builder.addRepeatedFixed64(567890123456789012L); | 114 builder.addRepeatedFixed64(567890123456789012L); |
| 117 builder.addRepeatedSfixed32(890); | 115 builder.addRepeatedSfixed32(890); |
| 118 builder.addRepeatedSfixed64(678901234567890123L); | 116 builder.addRepeatedSfixed64(678901234567890123L); |
| 119 builder.addRepeatedFloat(11.5f); | 117 builder.addRepeatedFloat(11.5f); |
| 120 builder.addRepeatedDouble(11.25); | 118 builder.addRepeatedDouble(11.25); |
| 121 builder.addRepeatedBool(true); | 119 builder.addRepeatedBool(true); |
| 122 builder.addRepeatedString("ello world!"); | 120 builder.addRepeatedString("ello world!"); |
| 123 builder.addRepeatedBytes(ByteString.copyFrom(new byte[] {1, 2})); | 121 builder.addRepeatedBytes(ByteString.copyFrom(new byte[]{1, 2})); |
| 124 builder.addRepeatedNestedEnum(NestedEnum.BAZ); | 122 builder.addRepeatedNestedEnum(NestedEnum.BAZ); |
| 125 builder.addRepeatedNestedMessageBuilder().setValue(200); | 123 builder.addRepeatedNestedMessageBuilder().setValue(200); |
| 126 } | 124 } |
| 127 | 125 |
| 128 private void assertRoundTripEquals(Message message) throws Exception { | 126 private void assertRoundTripEquals(Message message) throws Exception { |
| 129 assertRoundTripEquals(message, TypeRegistry.getEmptyTypeRegistry()); | 127 assertRoundTripEquals(message, TypeRegistry.getEmptyTypeRegistry()); |
| 130 } | 128 } |
| 131 | 129 |
| 132 private void assertRoundTripEquals(Message message, TypeRegistry registry) thr
ows Exception { | 130 private void assertRoundTripEquals(Message message, TypeRegistry registry) thr
ows Exception { |
| 133 JsonFormat.Printer printer = JsonFormat.printer().usingTypeRegistry(registry
); | 131 JsonFormat.Printer printer = JsonFormat.printer().usingTypeRegistry(registry
); |
| 134 JsonFormat.Parser parser = JsonFormat.parser().usingTypeRegistry(registry); | 132 JsonFormat.Parser parser = JsonFormat.parser().usingTypeRegistry(registry); |
| 135 Message.Builder builder = message.newBuilderForType(); | 133 Message.Builder builder = message.newBuilderForType(); |
| 136 parser.merge(printer.print(message), builder); | 134 parser.merge(printer.print(message), builder); |
| 137 Message parsedMessage = builder.build(); | 135 Message parsedMessage = builder.build(); |
| 138 assertEquals(message.toString(), parsedMessage.toString()); | 136 assertEquals(message.toString(), parsedMessage.toString()); |
| 139 } | 137 } |
| 140 | 138 |
| 141 private String toJsonString(Message message) throws IOException { | 139 private String toJsonString(Message message) throws IOException { |
| 142 return JsonFormat.printer().print(message); | 140 return JsonFormat.printer().print(message); |
| 143 } | 141 } |
| 144 private String toCompactJsonString(Message message) throws IOException { | |
| 145 return JsonFormat.printer().omittingInsignificantWhitespace().print(message)
; | |
| 146 } | |
| 147 | 142 |
| 148 private void mergeFromJson(String json, Message.Builder builder) throws IOExce
ption { | 143 private void mergeFromJson(String json, Message.Builder builder) throws IOExce
ption { |
| 149 JsonFormat.parser().merge(json, builder); | 144 JsonFormat.parser().merge(json, builder); |
| 150 } | 145 } |
| 151 | 146 |
| 152 public void testAllFields() throws Exception { | 147 public void testAllFields() throws Exception { |
| 153 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 148 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
| 154 setAllFields(builder); | 149 setAllFields(builder); |
| 155 TestAllTypes message = builder.build(); | 150 TestAllTypes message = builder.build(); |
| 156 | 151 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 + " \"value\": 200\n" | 191 + " \"value\": 200\n" |
| 197 + " }],\n" | 192 + " }],\n" |
| 198 + " \"repeatedNestedEnum\": [\"BAR\", \"BAZ\"]\n" | 193 + " \"repeatedNestedEnum\": [\"BAR\", \"BAZ\"]\n" |
| 199 + "}", | 194 + "}", |
| 200 toJsonString(message)); | 195 toJsonString(message)); |
| 201 | 196 |
| 202 assertRoundTripEquals(message); | 197 assertRoundTripEquals(message); |
| 203 } | 198 } |
| 204 | 199 |
| 205 public void testUnknownEnumValues() throws Exception { | 200 public void testUnknownEnumValues() throws Exception { |
| 206 TestAllTypes message = | 201 TestAllTypes message = TestAllTypes.newBuilder() |
| 207 TestAllTypes.newBuilder() | 202 .setOptionalNestedEnumValue(12345) |
| 208 .setOptionalNestedEnumValue(12345) | 203 .addRepeatedNestedEnumValue(12345) |
| 209 .addRepeatedNestedEnumValue(12345) | 204 .addRepeatedNestedEnumValue(0) |
| 210 .addRepeatedNestedEnumValue(0) | 205 .build(); |
| 211 .build(); | |
| 212 assertEquals( | 206 assertEquals( |
| 213 "{\n" | 207 "{\n" |
| 214 + " \"optionalNestedEnum\": 12345,\n" | 208 + " \"optionalNestedEnum\": 12345,\n" |
| 215 + " \"repeatedNestedEnum\": [12345, \"FOO\"]\n" | 209 + " \"repeatedNestedEnum\": [12345, \"FOO\"]\n" |
| 216 + "}", | 210 + "}", toJsonString(message)); |
| 217 toJsonString(message)); | |
| 218 assertRoundTripEquals(message); | 211 assertRoundTripEquals(message); |
| 219 | 212 |
| 220 TestMap.Builder mapBuilder = TestMap.newBuilder(); | 213 TestMap.Builder mapBuilder = TestMap.newBuilder(); |
| 221 mapBuilder.putInt32ToEnumMapValue(1, 0); | 214 mapBuilder.getMutableInt32ToEnumMapValue().put(1, 0); |
| 222 Map<Integer, Integer> mapWithInvalidValues = new HashMap<Integer, Integer>()
; | 215 mapBuilder.getMutableInt32ToEnumMapValue().put(2, 12345); |
| 223 mapWithInvalidValues.put(2, 12345); | |
| 224 mapBuilder.putAllInt32ToEnumMapValue(mapWithInvalidValues); | |
| 225 TestMap mapMessage = mapBuilder.build(); | 216 TestMap mapMessage = mapBuilder.build(); |
| 226 assertEquals( | 217 assertEquals( |
| 227 "{\n" | 218 "{\n" |
| 228 + " \"int32ToEnumMap\": {\n" | 219 + " \"int32ToEnumMap\": {\n" |
| 229 + " \"1\": \"FOO\",\n" | 220 + " \"1\": \"FOO\",\n" |
| 230 + " \"2\": 12345\n" | 221 + " \"2\": 12345\n" |
| 231 + " }\n" | 222 + " }\n" |
| 232 + "}", | 223 + "}", |
| 233 toJsonString(mapMessage)); | 224 toJsonString(mapMessage)); |
| 234 assertRoundTripEquals(mapMessage); | 225 assertRoundTripEquals(mapMessage); |
| 235 } | 226 } |
| 236 | 227 |
| 237 public void testSpecialFloatValues() throws Exception { | 228 public void testSpecialFloatValues() throws Exception { |
| 238 TestAllTypes message = | 229 TestAllTypes message = TestAllTypes.newBuilder() |
| 239 TestAllTypes.newBuilder() | 230 .addRepeatedFloat(Float.NaN) |
| 240 .addRepeatedFloat(Float.NaN) | 231 .addRepeatedFloat(Float.POSITIVE_INFINITY) |
| 241 .addRepeatedFloat(Float.POSITIVE_INFINITY) | 232 .addRepeatedFloat(Float.NEGATIVE_INFINITY) |
| 242 .addRepeatedFloat(Float.NEGATIVE_INFINITY) | 233 .addRepeatedDouble(Double.NaN) |
| 243 .addRepeatedDouble(Double.NaN) | 234 .addRepeatedDouble(Double.POSITIVE_INFINITY) |
| 244 .addRepeatedDouble(Double.POSITIVE_INFINITY) | 235 .addRepeatedDouble(Double.NEGATIVE_INFINITY) |
| 245 .addRepeatedDouble(Double.NEGATIVE_INFINITY) | 236 .build(); |
| 246 .build(); | |
| 247 assertEquals( | 237 assertEquals( |
| 248 "{\n" | 238 "{\n" |
| 249 + " \"repeatedFloat\": [\"NaN\", \"Infinity\", \"-Infinity\"],\n" | 239 + " \"repeatedFloat\": [\"NaN\", \"Infinity\", \"-Infinity\"],\n" |
| 250 + " \"repeatedDouble\": [\"NaN\", \"Infinity\", \"-Infinity\"]\n" | 240 + " \"repeatedDouble\": [\"NaN\", \"Infinity\", \"-Infinity\"]\n" |
| 251 + "}", | 241 + "}", toJsonString(message)); |
| 252 toJsonString(message)); | |
| 253 | 242 |
| 254 assertRoundTripEquals(message); | 243 assertRoundTripEquals(message); |
| 255 } | 244 } |
| 256 | 245 |
| 257 public void testParserAcceptStringForNumbericField() throws Exception { | 246 public void testParserAcceptStringForNumbericField() throws Exception { |
| 258 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 247 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
| 259 mergeFromJson( | 248 mergeFromJson( |
| 260 "{\n" | 249 "{\n" |
| 261 + " \"optionalInt32\": \"1234\",\n" | 250 + " \"optionalInt32\": \"1234\",\n" |
| 262 + " \"optionalUint32\": \"5678\",\n" | 251 + " \"optionalUint32\": \"5678\",\n" |
| 263 + " \"optionalSint32\": \"9012\",\n" | 252 + " \"optionalSint32\": \"9012\",\n" |
| 264 + " \"optionalFixed32\": \"3456\",\n" | 253 + " \"optionalFixed32\": \"3456\",\n" |
| 265 + " \"optionalSfixed32\": \"7890\",\n" | 254 + " \"optionalSfixed32\": \"7890\",\n" |
| 266 + " \"optionalFloat\": \"1.5\",\n" | 255 + " \"optionalFloat\": \"1.5\",\n" |
| 267 + " \"optionalDouble\": \"1.25\",\n" | 256 + " \"optionalDouble\": \"1.25\",\n" |
| 268 + " \"optionalBool\": \"true\"\n" | 257 + " \"optionalBool\": \"true\"\n" |
| 269 + "}", | 258 + "}", builder); |
| 270 builder); | |
| 271 TestAllTypes message = builder.build(); | 259 TestAllTypes message = builder.build(); |
| 272 assertEquals(1234, message.getOptionalInt32()); | 260 assertEquals(1234, message.getOptionalInt32()); |
| 273 assertEquals(5678, message.getOptionalUint32()); | 261 assertEquals(5678, message.getOptionalUint32()); |
| 274 assertEquals(9012, message.getOptionalSint32()); | 262 assertEquals(9012, message.getOptionalSint32()); |
| 275 assertEquals(3456, message.getOptionalFixed32()); | 263 assertEquals(3456, message.getOptionalFixed32()); |
| 276 assertEquals(7890, message.getOptionalSfixed32()); | 264 assertEquals(7890, message.getOptionalSfixed32()); |
| 277 assertEquals(1.5f, message.getOptionalFloat()); | 265 assertEquals(1.5f, message.getOptionalFloat()); |
| 278 assertEquals(1.25, message.getOptionalDouble()); | 266 assertEquals(1.25, message.getOptionalDouble()); |
| 279 assertEquals(true, message.getOptionalBool()); | 267 assertEquals(true, message.getOptionalBool()); |
| 280 } | 268 } |
| 281 | 269 |
| 282 public void testParserAcceptFloatingPointValueForIntegerField() throws Excepti
on { | 270 public void testParserAcceptFloatingPointValueForIntegerField() throws Excepti
on { |
| 283 // Test that numeric values like "1.000", "1e5" will also be accepted. | 271 // Test that numeric values like "1.000", "1e5" will also be accepted. |
| 284 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 272 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
| 285 mergeFromJson( | 273 mergeFromJson( |
| 286 "{\n" | 274 "{\n" |
| 287 + " \"repeatedInt32\": [1.000, 1e5, \"1.000\", \"1e5\"],\n" | 275 + " \"repeatedInt32\": [1.000, 1e5, \"1.000\", \"1e5\"],\n" |
| 288 + " \"repeatedUint32\": [1.000, 1e5, \"1.000\", \"1e5\"],\n" | 276 + " \"repeatedUint32\": [1.000, 1e5, \"1.000\", \"1e5\"],\n" |
| 289 + " \"repeatedInt64\": [1.000, 1e5, \"1.000\", \"1e5\"],\n" | 277 + " \"repeatedInt64\": [1.000, 1e5, \"1.000\", \"1e5\"],\n" |
| 290 + " \"repeatedUint64\": [1.000, 1e5, \"1.000\", \"1e5\"]\n" | 278 + " \"repeatedUint64\": [1.000, 1e5, \"1.000\", \"1e5\"]\n" |
| 291 + "}", | 279 + "}", builder); |
| 292 builder); | 280 int[] expectedValues = new int[]{1, 100000, 1, 100000}; |
| 293 int[] expectedValues = new int[] {1, 100000, 1, 100000}; | |
| 294 assertEquals(4, builder.getRepeatedInt32Count()); | 281 assertEquals(4, builder.getRepeatedInt32Count()); |
| 295 assertEquals(4, builder.getRepeatedUint32Count()); | 282 assertEquals(4, builder.getRepeatedUint32Count()); |
| 296 assertEquals(4, builder.getRepeatedInt64Count()); | 283 assertEquals(4, builder.getRepeatedInt64Count()); |
| 297 assertEquals(4, builder.getRepeatedUint64Count()); | 284 assertEquals(4, builder.getRepeatedUint64Count()); |
| 298 for (int i = 0; i < 4; ++i) { | 285 for (int i = 0; i < 4; ++i) { |
| 299 assertEquals(expectedValues[i], builder.getRepeatedInt32(i)); | 286 assertEquals(expectedValues[i], builder.getRepeatedInt32(i)); |
| 300 assertEquals(expectedValues[i], builder.getRepeatedUint32(i)); | 287 assertEquals(expectedValues[i], builder.getRepeatedUint32(i)); |
| 301 assertEquals(expectedValues[i], builder.getRepeatedInt64(i)); | 288 assertEquals(expectedValues[i], builder.getRepeatedInt64(i)); |
| 302 assertEquals(expectedValues[i], builder.getRepeatedUint64(i)); | 289 assertEquals(expectedValues[i], builder.getRepeatedUint64(i)); |
| 303 } | 290 } |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 assertAccepts("optionalDouble", maxDouble.toString()); | 359 assertAccepts("optionalDouble", maxDouble.toString()); |
| 373 assertAccepts("optionalDouble", minDouble.toString()); | 360 assertAccepts("optionalDouble", minDouble.toString()); |
| 374 assertRejects("optionalDouble", maxDouble.multiply(moreThanOne).toString()); | 361 assertRejects("optionalDouble", maxDouble.multiply(moreThanOne).toString()); |
| 375 assertRejects("optionalDouble", minDouble.multiply(moreThanOne).toString()); | 362 assertRejects("optionalDouble", minDouble.multiply(moreThanOne).toString()); |
| 376 } | 363 } |
| 377 | 364 |
| 378 public void testParserAcceptNull() throws Exception { | 365 public void testParserAcceptNull() throws Exception { |
| 379 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 366 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
| 380 mergeFromJson( | 367 mergeFromJson( |
| 381 "{\n" | 368 "{\n" |
| 382 + " \"optionalInt32\": null,\n" | 369 + " \"optionalInt32\": null,\n" |
| 383 + " \"optionalInt64\": null,\n" | 370 + " \"optionalInt64\": null,\n" |
| 384 + " \"optionalUint32\": null,\n" | 371 + " \"optionalUint32\": null,\n" |
| 385 + " \"optionalUint64\": null,\n" | 372 + " \"optionalUint64\": null,\n" |
| 386 + " \"optionalSint32\": null,\n" | 373 + " \"optionalSint32\": null,\n" |
| 387 + " \"optionalSint64\": null,\n" | 374 + " \"optionalSint64\": null,\n" |
| 388 + " \"optionalFixed32\": null,\n" | 375 + " \"optionalFixed32\": null,\n" |
| 389 + " \"optionalFixed64\": null,\n" | 376 + " \"optionalFixed64\": null,\n" |
| 390 + " \"optionalSfixed32\": null,\n" | 377 + " \"optionalSfixed32\": null,\n" |
| 391 + " \"optionalSfixed64\": null,\n" | 378 + " \"optionalSfixed64\": null,\n" |
| 392 + " \"optionalFloat\": null,\n" | 379 + " \"optionalFloat\": null,\n" |
| 393 + " \"optionalDouble\": null,\n" | 380 + " \"optionalDouble\": null,\n" |
| 394 + " \"optionalBool\": null,\n" | 381 + " \"optionalBool\": null,\n" |
| 395 + " \"optionalString\": null,\n" | 382 + " \"optionalString\": null,\n" |
| 396 + " \"optionalBytes\": null,\n" | 383 + " \"optionalBytes\": null,\n" |
| 397 + " \"optionalNestedMessage\": null,\n" | 384 + " \"optionalNestedMessage\": null,\n" |
| 398 + " \"optionalNestedEnum\": null,\n" | 385 + " \"optionalNestedEnum\": null,\n" |
| 399 + " \"repeatedInt32\": null,\n" | 386 + " \"repeatedInt32\": null,\n" |
| 400 + " \"repeatedInt64\": null,\n" | 387 + " \"repeatedInt64\": null,\n" |
| 401 + " \"repeatedUint32\": null,\n" | 388 + " \"repeatedUint32\": null,\n" |
| 402 + " \"repeatedUint64\": null,\n" | 389 + " \"repeatedUint64\": null,\n" |
| 403 + " \"repeatedSint32\": null,\n" | 390 + " \"repeatedSint32\": null,\n" |
| 404 + " \"repeatedSint64\": null,\n" | 391 + " \"repeatedSint64\": null,\n" |
| 405 + " \"repeatedFixed32\": null,\n" | 392 + " \"repeatedFixed32\": null,\n" |
| 406 + " \"repeatedFixed64\": null,\n" | 393 + " \"repeatedFixed64\": null,\n" |
| 407 + " \"repeatedSfixed32\": null,\n" | 394 + " \"repeatedSfixed32\": null,\n" |
| 408 + " \"repeatedSfixed64\": null,\n" | 395 + " \"repeatedSfixed64\": null,\n" |
| 409 + " \"repeatedFloat\": null,\n" | 396 + " \"repeatedFloat\": null,\n" |
| 410 + " \"repeatedDouble\": null,\n" | 397 + " \"repeatedDouble\": null,\n" |
| 411 + " \"repeatedBool\": null,\n" | 398 + " \"repeatedBool\": null,\n" |
| 412 + " \"repeatedString\": null,\n" | 399 + " \"repeatedString\": null,\n" |
| 413 + " \"repeatedBytes\": null,\n" | 400 + " \"repeatedBytes\": null,\n" |
| 414 + " \"repeatedNestedMessage\": null,\n" | 401 + " \"repeatedNestedMessage\": null,\n" |
| 415 + " \"repeatedNestedEnum\": null\n" | 402 + " \"repeatedNestedEnum\": null\n" |
| 416 + "}", | 403 + "}", builder); |
| 417 builder); | |
| 418 TestAllTypes message = builder.build(); | 404 TestAllTypes message = builder.build(); |
| 419 assertEquals(TestAllTypes.getDefaultInstance(), message); | 405 assertEquals(TestAllTypes.getDefaultInstance(), message); |
| 420 | 406 |
| 421 // Repeated field elements cannot be null. | 407 // Repeated field elements cannot be null. |
| 422 try { | 408 try { |
| 423 builder = TestAllTypes.newBuilder(); | 409 builder = TestAllTypes.newBuilder(); |
| 424 mergeFromJson("{\n" + " \"repeatedInt32\": [null, null],\n" + "}", builde
r); | 410 mergeFromJson( |
| 411 "{\n" |
| 412 + " \"repeatedInt32\": [null, null],\n" |
| 413 + "}", builder); |
| 425 fail(); | 414 fail(); |
| 426 } catch (InvalidProtocolBufferException e) { | 415 } catch (InvalidProtocolBufferException e) { |
| 427 // Exception expected. | 416 // Exception expected. |
| 428 } | 417 } |
| 429 | 418 |
| 430 try { | 419 try { |
| 431 builder = TestAllTypes.newBuilder(); | 420 builder = TestAllTypes.newBuilder(); |
| 432 mergeFromJson("{\n" + " \"repeatedNestedMessage\": [null, null],\n" + "}"
, builder); | 421 mergeFromJson( |
| 422 "{\n" |
| 423 + " \"repeatedNestedMessage\": [null, null],\n" |
| 424 + "}", builder); |
| 433 fail(); | 425 fail(); |
| 434 } catch (InvalidProtocolBufferException e) { | 426 } catch (InvalidProtocolBufferException e) { |
| 435 // Exception expected. | 427 // Exception expected. |
| 436 } | 428 } |
| 437 } | 429 } |
| 438 | 430 |
| 439 public void testNullInOneof() throws Exception { | |
| 440 TestOneof.Builder builder = TestOneof.newBuilder(); | |
| 441 mergeFromJson("{\n" + " \"oneofNullValue\": null \n" + "}", builder); | |
| 442 TestOneof message = builder.build(); | |
| 443 assertEquals(TestOneof.OneofFieldCase.ONEOF_NULL_VALUE, message.getOneofFiel
dCase()); | |
| 444 assertEquals(NullValue.NULL_VALUE, message.getOneofNullValue()); | |
| 445 } | |
| 446 | |
| 447 public void testParserRejectDuplicatedFields() throws Exception { | 431 public void testParserRejectDuplicatedFields() throws Exception { |
| 448 // TODO(xiaofeng): The parser we are currently using (GSON) will accept and
keep the last | 432 // TODO(xiaofeng): The parser we are currently using (GSON) will accept and
keep the last |
| 449 // one if multiple entries have the same name. This is not the desired behav
ior but it can | 433 // one if multiple entries have the same name. This is not the desired behav
ior but it can |
| 450 // only be fixed by using our own parser. Here we only test the cases where
the names are | 434 // only be fixed by using our own parser. Here we only test the cases where
the names are |
| 451 // different but still referring to the same field. | 435 // different but still referring to the same field. |
| 452 | 436 |
| 453 // Duplicated optional fields. | 437 // Duplicated optional fields. |
| 454 try { | 438 try { |
| 455 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 439 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
| 456 mergeFromJson( | 440 mergeFromJson( |
| 457 "{\n" | 441 "{\n" |
| 458 + " \"optionalNestedMessage\": {},\n" | 442 + " \"optionalNestedMessage\": {},\n" |
| 459 + " \"optional_nested_message\": {}\n" | 443 + " \"optional_nested_message\": {}\n" |
| 460 + "}", | 444 + "}", builder); |
| 461 builder); | |
| 462 fail(); | 445 fail(); |
| 463 } catch (InvalidProtocolBufferException e) { | 446 } catch (InvalidProtocolBufferException e) { |
| 464 // Exception expected. | 447 // Exception expected. |
| 465 } | 448 } |
| 466 | 449 |
| 467 // Duplicated repeated fields. | 450 // Duplicated repeated fields. |
| 468 try { | 451 try { |
| 469 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 452 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
| 470 mergeFromJson( | 453 mergeFromJson( |
| 471 "{\n" | 454 "{\n" |
| 472 + " \"repeatedNestedMessage\": [null, null],\n" | 455 + " \"repeatedNestedMessage\": [null, null],\n" |
| 473 + " \"repeated_nested_message\": [null, null]\n" | 456 + " \"repeated_nested_message\": [null, null]\n" |
| 474 + "}", | 457 + "}", builder); |
| 475 builder); | |
| 476 fail(); | 458 fail(); |
| 477 } catch (InvalidProtocolBufferException e) { | 459 } catch (InvalidProtocolBufferException e) { |
| 478 // Exception expected. | 460 // Exception expected. |
| 479 } | 461 } |
| 480 | 462 |
| 481 // Duplicated oneof fields. | 463 // Duplicated oneof fields. |
| 482 try { | 464 try { |
| 483 TestOneof.Builder builder = TestOneof.newBuilder(); | 465 TestOneof.Builder builder = TestOneof.newBuilder(); |
| 484 mergeFromJson("{\n" + " \"oneofInt32\": 1,\n" + " \"oneof_int32\": 2\n"
+ "}", builder); | 466 mergeFromJson( |
| 467 "{\n" |
| 468 + " \"oneofInt32\": 1,\n" |
| 469 + " \"oneof_int32\": 2\n" |
| 470 + "}", builder); |
| 485 fail(); | 471 fail(); |
| 486 } catch (InvalidProtocolBufferException e) { | 472 } catch (InvalidProtocolBufferException e) { |
| 487 // Exception expected. | 473 // Exception expected. |
| 488 } | 474 } |
| 489 } | 475 } |
| 490 | 476 |
| 491 public void testMapFields() throws Exception { | 477 public void testMapFields() throws Exception { |
| 492 TestMap.Builder builder = TestMap.newBuilder(); | 478 TestMap.Builder builder = TestMap.newBuilder(); |
| 493 builder.putInt32ToInt32Map(1, 10); | 479 builder.getMutableInt32ToInt32Map().put(1, 10); |
| 494 builder.putInt64ToInt32Map(1234567890123456789L, 10); | 480 builder.getMutableInt64ToInt32Map().put(1234567890123456789L, 10); |
| 495 builder.putUint32ToInt32Map(2, 20); | 481 builder.getMutableUint32ToInt32Map().put(2, 20); |
| 496 builder.putUint64ToInt32Map(2234567890123456789L, 20); | 482 builder.getMutableUint64ToInt32Map().put(2234567890123456789L, 20); |
| 497 builder.putSint32ToInt32Map(3, 30); | 483 builder.getMutableSint32ToInt32Map().put(3, 30); |
| 498 builder.putSint64ToInt32Map(3234567890123456789L, 30); | 484 builder.getMutableSint64ToInt32Map().put(3234567890123456789L, 30); |
| 499 builder.putFixed32ToInt32Map(4, 40); | 485 builder.getMutableFixed32ToInt32Map().put(4, 40); |
| 500 builder.putFixed64ToInt32Map(4234567890123456789L, 40); | 486 builder.getMutableFixed64ToInt32Map().put(4234567890123456789L, 40); |
| 501 builder.putSfixed32ToInt32Map(5, 50); | 487 builder.getMutableSfixed32ToInt32Map().put(5, 50); |
| 502 builder.putSfixed64ToInt32Map(5234567890123456789L, 50); | 488 builder.getMutableSfixed64ToInt32Map().put(5234567890123456789L, 50); |
| 503 builder.putBoolToInt32Map(false, 6); | 489 builder.getMutableBoolToInt32Map().put(false, 6); |
| 504 builder.putStringToInt32Map("Hello", 10); | 490 builder.getMutableStringToInt32Map().put("Hello", 10); |
| 505 | 491 |
| 506 builder.putInt32ToInt64Map(1, 1234567890123456789L); | 492 builder.getMutableInt32ToInt64Map().put(1, 1234567890123456789L); |
| 507 builder.putInt32ToUint32Map(2, 20); | 493 builder.getMutableInt32ToUint32Map().put(2, 20); |
| 508 builder.putInt32ToUint64Map(2, 2234567890123456789L); | 494 builder.getMutableInt32ToUint64Map().put(2, 2234567890123456789L); |
| 509 builder.putInt32ToSint32Map(3, 30); | 495 builder.getMutableInt32ToSint32Map().put(3, 30); |
| 510 builder.putInt32ToSint64Map(3, 3234567890123456789L); | 496 builder.getMutableInt32ToSint64Map().put(3, 3234567890123456789L); |
| 511 builder.putInt32ToFixed32Map(4, 40); | 497 builder.getMutableInt32ToFixed32Map().put(4, 40); |
| 512 builder.putInt32ToFixed64Map(4, 4234567890123456789L); | 498 builder.getMutableInt32ToFixed64Map().put(4, 4234567890123456789L); |
| 513 builder.putInt32ToSfixed32Map(5, 50); | 499 builder.getMutableInt32ToSfixed32Map().put(5, 50); |
| 514 builder.putInt32ToSfixed64Map(5, 5234567890123456789L); | 500 builder.getMutableInt32ToSfixed64Map().put(5, 5234567890123456789L); |
| 515 builder.putInt32ToFloatMap(6, 1.5f); | 501 builder.getMutableInt32ToFloatMap().put(6, 1.5f); |
| 516 builder.putInt32ToDoubleMap(6, 1.25); | 502 builder.getMutableInt32ToDoubleMap().put(6, 1.25); |
| 517 builder.putInt32ToBoolMap(7, false); | 503 builder.getMutableInt32ToBoolMap().put(7, false); |
| 518 builder.putInt32ToStringMap(7, "World"); | 504 builder.getMutableInt32ToStringMap().put(7, "World"); |
| 519 builder.putInt32ToBytesMap(8, ByteString.copyFrom(new byte[] {1, 2, 3})); | 505 builder.getMutableInt32ToBytesMap().put( |
| 520 builder.putInt32ToMessageMap(8, NestedMessage.newBuilder().setValue(1234).bu
ild()); | 506 8, ByteString.copyFrom(new byte[]{1, 2, 3})); |
| 521 builder.putInt32ToEnumMap(9, NestedEnum.BAR); | 507 builder.getMutableInt32ToMessageMap().put( |
| 508 8, NestedMessage.newBuilder().setValue(1234).build()); |
| 509 builder.getMutableInt32ToEnumMap().put(9, NestedEnum.BAR); |
| 522 TestMap message = builder.build(); | 510 TestMap message = builder.build(); |
| 523 | 511 |
| 524 assertEquals( | 512 assertEquals( |
| 525 "{\n" | 513 "{\n" |
| 526 + " \"int32ToInt32Map\": {\n" | 514 + " \"int32ToInt32Map\": {\n" |
| 527 + " \"1\": 10\n" | 515 + " \"1\": 10\n" |
| 528 + " },\n" | 516 + " },\n" |
| 529 + " \"int64ToInt32Map\": {\n" | 517 + " \"int64ToInt32Map\": {\n" |
| 530 + " \"1234567890123456789\": 10\n" | 518 + " \"1234567890123456789\": 10\n" |
| 531 + " },\n" | 519 + " },\n" |
| 532 + " \"uint32ToInt32Map\": {\n" | 520 + " \"uint32ToInt32Map\": {\n" |
| 533 + " \"2\": 20\n" | 521 + " \"2\": 20\n" |
| 534 + " },\n" | 522 + " },\n" |
| 535 + " \"uint64ToInt32Map\": {\n" | 523 + " \"uint64ToInt32Map\": {\n" |
| 536 + " \"2234567890123456789\": 20\n" | 524 + " \"2234567890123456789\": 20\n" |
| 537 + " },\n" | 525 + " },\n" |
| 538 + " \"sint32ToInt32Map\": {\n" | 526 + " \"sint32ToInt32Map\": {\n" |
| 539 + " \"3\": 30\n" | 527 + " \"3\": 30\n" |
| 540 + " },\n" | 528 + " },\n" |
| 541 + " \"sint64ToInt32Map\": {\n" | 529 + " \"sint64ToInt32Map\": {\n" |
| 542 + " \"3234567890123456789\": 30\n" | 530 + " \"3234567890123456789\": 30\n" |
| 543 + " },\n" | 531 + " },\n" |
| 544 + " \"fixed32ToInt32Map\": {\n" | 532 + " \"fixed32ToInt32Map\": {\n" |
| 545 + " \"4\": 40\n" | 533 + " \"4\": 40\n" |
| 546 + " },\n" | 534 + " },\n" |
| 547 + " \"fixed64ToInt32Map\": {\n" | 535 + " \"fixed64ToInt32Map\": {\n" |
| 548 + " \"4234567890123456789\": 40\n" | 536 + " \"4234567890123456789\": 40\n" |
| 549 + " },\n" | 537 + " },\n" |
| 550 + " \"sfixed32ToInt32Map\": {\n" | 538 + " \"sfixed32ToInt32Map\": {\n" |
| 551 + " \"5\": 50\n" | 539 + " \"5\": 50\n" |
| 552 + " },\n" | 540 + " },\n" |
| 553 + " \"sfixed64ToInt32Map\": {\n" | 541 + " \"sfixed64ToInt32Map\": {\n" |
| 554 + " \"5234567890123456789\": 50\n" | 542 + " \"5234567890123456789\": 50\n" |
| 555 + " },\n" | 543 + " },\n" |
| 556 + " \"boolToInt32Map\": {\n" | 544 + " \"boolToInt32Map\": {\n" |
| 557 + " \"false\": 6\n" | 545 + " \"false\": 6\n" |
| 558 + " },\n" | 546 + " },\n" |
| 559 + " \"stringToInt32Map\": {\n" | 547 + " \"stringToInt32Map\": {\n" |
| 560 + " \"Hello\": 10\n" | 548 + " \"Hello\": 10\n" |
| 561 + " },\n" | 549 + " },\n" |
| 562 + " \"int32ToInt64Map\": {\n" | 550 + " \"int32ToInt64Map\": {\n" |
| 563 + " \"1\": \"1234567890123456789\"\n" | 551 + " \"1\": \"1234567890123456789\"\n" |
| 564 + " },\n" | 552 + " },\n" |
| 565 + " \"int32ToUint32Map\": {\n" | 553 + " \"int32ToUint32Map\": {\n" |
| 566 + " \"2\": 20\n" | 554 + " \"2\": 20\n" |
| 567 + " },\n" | 555 + " },\n" |
| 568 + " \"int32ToUint64Map\": {\n" | 556 + " \"int32ToUint64Map\": {\n" |
| 569 + " \"2\": \"2234567890123456789\"\n" | 557 + " \"2\": \"2234567890123456789\"\n" |
| 570 + " },\n" | 558 + " },\n" |
| 571 + " \"int32ToSint32Map\": {\n" | 559 + " \"int32ToSint32Map\": {\n" |
| 572 + " \"3\": 30\n" | 560 + " \"3\": 30\n" |
| 573 + " },\n" | 561 + " },\n" |
| 574 + " \"int32ToSint64Map\": {\n" | 562 + " \"int32ToSint64Map\": {\n" |
| 575 + " \"3\": \"3234567890123456789\"\n" | 563 + " \"3\": \"3234567890123456789\"\n" |
| 576 + " },\n" | 564 + " },\n" |
| 577 + " \"int32ToFixed32Map\": {\n" | 565 + " \"int32ToFixed32Map\": {\n" |
| 578 + " \"4\": 40\n" | 566 + " \"4\": 40\n" |
| 579 + " },\n" | 567 + " },\n" |
| 580 + " \"int32ToFixed64Map\": {\n" | 568 + " \"int32ToFixed64Map\": {\n" |
| 581 + " \"4\": \"4234567890123456789\"\n" | 569 + " \"4\": \"4234567890123456789\"\n" |
| 582 + " },\n" | 570 + " },\n" |
| 583 + " \"int32ToSfixed32Map\": {\n" | 571 + " \"int32ToSfixed32Map\": {\n" |
| 584 + " \"5\": 50\n" | 572 + " \"5\": 50\n" |
| 585 + " },\n" | 573 + " },\n" |
| 586 + " \"int32ToSfixed64Map\": {\n" | 574 + " \"int32ToSfixed64Map\": {\n" |
| 587 + " \"5\": \"5234567890123456789\"\n" | 575 + " \"5\": \"5234567890123456789\"\n" |
| 588 + " },\n" | 576 + " },\n" |
| 589 + " \"int32ToFloatMap\": {\n" | 577 + " \"int32ToFloatMap\": {\n" |
| 590 + " \"6\": 1.5\n" | 578 + " \"6\": 1.5\n" |
| 591 + " },\n" | 579 + " },\n" |
| 592 + " \"int32ToDoubleMap\": {\n" | 580 + " \"int32ToDoubleMap\": {\n" |
| 593 + " \"6\": 1.25\n" | 581 + " \"6\": 1.25\n" |
| 594 + " },\n" | 582 + " },\n" |
| 595 + " \"int32ToBoolMap\": {\n" | 583 + " \"int32ToBoolMap\": {\n" |
| 596 + " \"7\": false\n" | 584 + " \"7\": false\n" |
| 597 + " },\n" | 585 + " },\n" |
| 598 + " \"int32ToStringMap\": {\n" | 586 + " \"int32ToStringMap\": {\n" |
| 599 + " \"7\": \"World\"\n" | 587 + " \"7\": \"World\"\n" |
| 600 + " },\n" | 588 + " },\n" |
| 601 + " \"int32ToBytesMap\": {\n" | 589 + " \"int32ToBytesMap\": {\n" |
| 602 + " \"8\": \"AQID\"\n" | 590 + " \"8\": \"AQID\"\n" |
| 603 + " },\n" | 591 + " },\n" |
| 604 + " \"int32ToMessageMap\": {\n" | 592 + " \"int32ToMessageMap\": {\n" |
| 605 + " \"8\": {\n" | 593 + " \"8\": {\n" |
| 606 + " \"value\": 1234\n" | 594 + " \"value\": 1234\n" |
| 607 + " }\n" | 595 + " }\n" |
| 608 + " },\n" | 596 + " },\n" |
| 609 + " \"int32ToEnumMap\": {\n" | 597 + " \"int32ToEnumMap\": {\n" |
| 610 + " \"9\": \"BAR\"\n" | 598 + " \"9\": \"BAR\"\n" |
| 611 + " }\n" | 599 + " }\n" |
| 612 + "}", | 600 + "}", toJsonString(message)); |
| 613 toJsonString(message)); | |
| 614 assertRoundTripEquals(message); | 601 assertRoundTripEquals(message); |
| 615 | 602 |
| 616 // Test multiple entries. | 603 // Test multiple entries. |
| 617 builder = TestMap.newBuilder(); | 604 builder = TestMap.newBuilder(); |
| 618 builder.putInt32ToInt32Map(1, 2); | 605 builder.getMutableInt32ToInt32Map().put(1, 2); |
| 619 builder.putInt32ToInt32Map(3, 4); | 606 builder.getMutableInt32ToInt32Map().put(3, 4); |
| 620 message = builder.build(); | 607 message = builder.build(); |
| 621 | 608 |
| 622 assertEquals( | 609 assertEquals( |
| 623 "{\n" + " \"int32ToInt32Map\": {\n" + " \"1\": 2,\n" + " \"3\": 4
\n" + " }\n" + "}", | 610 "{\n" |
| 624 toJsonString(message)); | 611 + " \"int32ToInt32Map\": {\n" |
| 612 + " \"1\": 2,\n" |
| 613 + " \"3\": 4\n" |
| 614 + " }\n" |
| 615 + "}", toJsonString(message)); |
| 625 assertRoundTripEquals(message); | 616 assertRoundTripEquals(message); |
| 626 } | 617 } |
| 627 | 618 |
| 628 public void testMapNullValueIsRejected() throws Exception { | 619 public void testMapNullValueIsRejected() throws Exception { |
| 629 try { | 620 try { |
| 630 TestMap.Builder builder = TestMap.newBuilder(); | 621 TestMap.Builder builder = TestMap.newBuilder(); |
| 631 mergeFromJson( | 622 mergeFromJson( |
| 632 "{\n" | 623 "{\n" |
| 633 + " \"int32ToInt32Map\": {null: 1},\n" | 624 + " \"int32ToInt32Map\": {null: 1},\n" |
| 634 + " \"int32ToMessageMap\": {null: 2}\n" | 625 + " \"int32ToMessageMap\": {null: 2}\n" |
| 635 + "}", | 626 + "}", builder); |
| 636 builder); | |
| 637 fail(); | 627 fail(); |
| 638 } catch (InvalidProtocolBufferException e) { | 628 } catch (InvalidProtocolBufferException e) { |
| 639 // Exception expected. | 629 // Exception expected. |
| 640 } | 630 } |
| 641 | 631 |
| 642 try { | 632 try { |
| 643 TestMap.Builder builder = TestMap.newBuilder(); | 633 TestMap.Builder builder = TestMap.newBuilder(); |
| 644 mergeFromJson( | 634 mergeFromJson( |
| 645 "{\n" | 635 "{\n" |
| 646 + " \"int32ToInt32Map\": {\"1\": null},\n" | 636 + " \"int32ToInt32Map\": {\"1\": null},\n" |
| 647 + " \"int32ToMessageMap\": {\"2\": null}\n" | 637 + " \"int32ToMessageMap\": {\"2\": null}\n" |
| 648 + "}", | 638 + "}", builder); |
| 649 builder); | |
| 650 fail(); | 639 fail(); |
| 651 } catch (InvalidProtocolBufferException e) { | 640 } catch (InvalidProtocolBufferException e) { |
| 652 // Exception expected. | 641 // Exception expected. |
| 653 } | 642 } |
| 654 } | 643 } |
| 655 | 644 |
| 656 public void testParserAcceptNonQuotedObjectKey() throws Exception { | 645 public void testParserAcceptNonQuotedObjectKey() throws Exception { |
| 657 TestMap.Builder builder = TestMap.newBuilder(); | 646 TestMap.Builder builder = TestMap.newBuilder(); |
| 658 mergeFromJson( | 647 mergeFromJson( |
| 659 "{\n" + " int32ToInt32Map: {1: 2},\n" + " stringToInt32Map: {hello: 3}
\n" + "}", builder); | 648 "{\n" |
| 649 + " int32ToInt32Map: {1: 2},\n" |
| 650 + " stringToInt32Map: {hello: 3}\n" |
| 651 + "}", builder); |
| 660 TestMap message = builder.build(); | 652 TestMap message = builder.build(); |
| 661 assertEquals(2, message.getInt32ToInt32Map().get(1).intValue()); | 653 assertEquals(2, message.getInt32ToInt32Map().get(1).intValue()); |
| 662 assertEquals(3, message.getStringToInt32Map().get("hello").intValue()); | 654 assertEquals(3, message.getStringToInt32Map().get("hello").intValue()); |
| 663 } | 655 } |
| 664 | 656 |
| 665 public void testWrappers() throws Exception { | 657 public void testWrappers() throws Exception { |
| 666 TestWrappers.Builder builder = TestWrappers.newBuilder(); | 658 TestWrappers.Builder builder = TestWrappers.newBuilder(); |
| 667 builder.getBoolValueBuilder().setValue(false); | 659 builder.getBoolValueBuilder().setValue(false); |
| 668 builder.getInt32ValueBuilder().setValue(0); | 660 builder.getInt32ValueBuilder().setValue(0); |
| 669 builder.getInt64ValueBuilder().setValue(0); | 661 builder.getInt64ValueBuilder().setValue(0); |
| 670 builder.getUint32ValueBuilder().setValue(0); | 662 builder.getUint32ValueBuilder().setValue(0); |
| 671 builder.getUint64ValueBuilder().setValue(0); | 663 builder.getUint64ValueBuilder().setValue(0); |
| 672 builder.getFloatValueBuilder().setValue(0.0f); | 664 builder.getFloatValueBuilder().setValue(0.0f); |
| 673 builder.getDoubleValueBuilder().setValue(0.0); | 665 builder.getDoubleValueBuilder().setValue(0.0); |
| 674 builder.getStringValueBuilder().setValue(""); | 666 builder.getStringValueBuilder().setValue(""); |
| 675 builder.getBytesValueBuilder().setValue(ByteString.EMPTY); | 667 builder.getBytesValueBuilder().setValue(ByteString.EMPTY); |
| 676 TestWrappers message = builder.build(); | 668 TestWrappers message = builder.build(); |
| 677 | 669 |
| 678 assertEquals( | 670 assertEquals( |
| 679 "{\n" | 671 "{\n" |
| 680 + " \"int32Value\": 0,\n" | 672 + " \"int32Value\": 0,\n" |
| 681 + " \"uint32Value\": 0,\n" | 673 + " \"uint32Value\": 0,\n" |
| 682 + " \"int64Value\": \"0\",\n" | 674 + " \"int64Value\": \"0\",\n" |
| 683 + " \"uint64Value\": \"0\",\n" | 675 + " \"uint64Value\": \"0\",\n" |
| 684 + " \"floatValue\": 0.0,\n" | 676 + " \"floatValue\": 0.0,\n" |
| 685 + " \"doubleValue\": 0.0,\n" | 677 + " \"doubleValue\": 0.0,\n" |
| 686 + " \"boolValue\": false,\n" | 678 + " \"boolValue\": false,\n" |
| 687 + " \"stringValue\": \"\",\n" | 679 + " \"stringValue\": \"\",\n" |
| 688 + " \"bytesValue\": \"\"\n" | 680 + " \"bytesValue\": \"\"\n" |
| 689 + "}", | 681 + "}", toJsonString(message)); |
| 690 toJsonString(message)); | |
| 691 assertRoundTripEquals(message); | 682 assertRoundTripEquals(message); |
| 692 | 683 |
| 693 builder = TestWrappers.newBuilder(); | 684 builder = TestWrappers.newBuilder(); |
| 694 builder.getBoolValueBuilder().setValue(true); | 685 builder.getBoolValueBuilder().setValue(true); |
| 695 builder.getInt32ValueBuilder().setValue(1); | 686 builder.getInt32ValueBuilder().setValue(1); |
| 696 builder.getInt64ValueBuilder().setValue(2); | 687 builder.getInt64ValueBuilder().setValue(2); |
| 697 builder.getUint32ValueBuilder().setValue(3); | 688 builder.getUint32ValueBuilder().setValue(3); |
| 698 builder.getUint64ValueBuilder().setValue(4); | 689 builder.getUint64ValueBuilder().setValue(4); |
| 699 builder.getFloatValueBuilder().setValue(5.0f); | 690 builder.getFloatValueBuilder().setValue(5.0f); |
| 700 builder.getDoubleValueBuilder().setValue(6.0); | 691 builder.getDoubleValueBuilder().setValue(6.0); |
| 701 builder.getStringValueBuilder().setValue("7"); | 692 builder.getStringValueBuilder().setValue("7"); |
| 702 builder.getBytesValueBuilder().setValue(ByteString.copyFrom(new byte[] {8}))
; | 693 builder.getBytesValueBuilder().setValue(ByteString.copyFrom(new byte[]{8})); |
| 703 message = builder.build(); | 694 message = builder.build(); |
| 704 | 695 |
| 705 assertEquals( | 696 assertEquals( |
| 706 "{\n" | 697 "{\n" |
| 707 + " \"int32Value\": 1,\n" | 698 + " \"int32Value\": 1,\n" |
| 708 + " \"uint32Value\": 3,\n" | 699 + " \"uint32Value\": 3,\n" |
| 709 + " \"int64Value\": \"2\",\n" | 700 + " \"int64Value\": \"2\",\n" |
| 710 + " \"uint64Value\": \"4\",\n" | 701 + " \"uint64Value\": \"4\",\n" |
| 711 + " \"floatValue\": 5.0,\n" | 702 + " \"floatValue\": 5.0,\n" |
| 712 + " \"doubleValue\": 6.0,\n" | 703 + " \"doubleValue\": 6.0,\n" |
| 713 + " \"boolValue\": true,\n" | 704 + " \"boolValue\": true,\n" |
| 714 + " \"stringValue\": \"7\",\n" | 705 + " \"stringValue\": \"7\",\n" |
| 715 + " \"bytesValue\": \"CA==\"\n" | 706 + " \"bytesValue\": \"CA==\"\n" |
| 716 + "}", | 707 + "}", toJsonString(message)); |
| 717 toJsonString(message)); | |
| 718 assertRoundTripEquals(message); | 708 assertRoundTripEquals(message); |
| 719 } | 709 } |
| 720 | 710 |
| 721 public void testTimestamp() throws Exception { | 711 public void testTimestamp() throws Exception { |
| 722 TestTimestamp message = | 712 TestTimestamp message = TestTimestamp.newBuilder() |
| 723 TestTimestamp.newBuilder() | 713 .setTimestampValue(TimeUtil.parseTimestamp("1970-01-01T00:00:00Z")) |
| 724 .setTimestampValue(Timestamps.parse("1970-01-01T00:00:00Z")) | 714 .build(); |
| 725 .build(); | |
| 726 | 715 |
| 727 assertEquals( | 716 assertEquals( |
| 728 "{\n" + " \"timestampValue\": \"1970-01-01T00:00:00Z\"\n" + "}", toJson
String(message)); | 717 "{\n" |
| 718 + " \"timestampValue\": \"1970-01-01T00:00:00Z\"\n" |
| 719 + "}", toJsonString(message)); |
| 729 assertRoundTripEquals(message); | 720 assertRoundTripEquals(message); |
| 730 } | 721 } |
| 731 | 722 |
| 732 public void testDuration() throws Exception { | 723 public void testDuration() throws Exception { |
| 733 TestDuration message = | 724 TestDuration message = TestDuration.newBuilder() |
| 734 TestDuration.newBuilder().setDurationValue(Durations.parse("12345s")).bu
ild(); | 725 .setDurationValue(TimeUtil.parseDuration("12345s")) |
| 726 .build(); |
| 735 | 727 |
| 736 assertEquals("{\n" + " \"durationValue\": \"12345s\"\n" + "}", toJsonString
(message)); | 728 assertEquals( |
| 729 "{\n" |
| 730 + " \"durationValue\": \"12345s\"\n" |
| 731 + "}", toJsonString(message)); |
| 737 assertRoundTripEquals(message); | 732 assertRoundTripEquals(message); |
| 738 } | 733 } |
| 739 | 734 |
| 740 public void testFieldMask() throws Exception { | 735 public void testFieldMask() throws Exception { |
| 741 TestFieldMask message = | 736 TestFieldMask message = TestFieldMask.newBuilder() |
| 742 TestFieldMask.newBuilder() | 737 .setFieldMaskValue(FieldMaskUtil.fromString("foo.bar,baz")) |
| 743 .setFieldMaskValue(FieldMaskUtil.fromString("foo.bar,baz,foo_bar.baz
")) | 738 .build(); |
| 744 .build(); | |
| 745 | 739 |
| 746 assertEquals( | 740 assertEquals( |
| 747 "{\n" + " \"fieldMaskValue\": \"foo.bar,baz,fooBar.baz\"\n" + "}", toJs
onString(message)); | 741 "{\n" |
| 742 + " \"fieldMaskValue\": \"foo.bar,baz\"\n" |
| 743 + "}", toJsonString(message)); |
| 748 assertRoundTripEquals(message); | 744 assertRoundTripEquals(message); |
| 749 } | 745 } |
| 750 | 746 |
| 751 public void testStruct() throws Exception { | 747 public void testStruct() throws Exception { |
| 752 // Build a struct with all possible values. | 748 // Build a struct with all possible values. |
| 753 TestStruct.Builder builder = TestStruct.newBuilder(); | 749 TestStruct.Builder builder = TestStruct.newBuilder(); |
| 754 Struct.Builder structBuilder = builder.getStructValueBuilder(); | 750 Struct.Builder structBuilder = builder.getStructValueBuilder(); |
| 755 structBuilder.putFields("null_value", Value.newBuilder().setNullValueValue(0
).build()); | 751 structBuilder.getMutableFields().put( |
| 756 structBuilder.putFields("number_value", Value.newBuilder().setNumberValue(1.
25).build()); | 752 "null_value", Value.newBuilder().setNullValueValue(0).build()); |
| 757 structBuilder.putFields("string_value", Value.newBuilder().setStringValue("h
ello").build()); | 753 structBuilder.getMutableFields().put( |
| 754 "number_value", Value.newBuilder().setNumberValue(1.25).build()); |
| 755 structBuilder.getMutableFields().put( |
| 756 "string_value", Value.newBuilder().setStringValue("hello").build()); |
| 758 Struct.Builder subStructBuilder = Struct.newBuilder(); | 757 Struct.Builder subStructBuilder = Struct.newBuilder(); |
| 759 subStructBuilder.putFields("number_value", Value.newBuilder().setNumberValue
(1234).build()); | 758 subStructBuilder.getMutableFields().put( |
| 760 structBuilder.putFields( | 759 "number_value", Value.newBuilder().setNumberValue(1234).build()); |
| 760 structBuilder.getMutableFields().put( |
| 761 "struct_value", Value.newBuilder().setStructValue(subStructBuilder.build
()).build()); | 761 "struct_value", Value.newBuilder().setStructValue(subStructBuilder.build
()).build()); |
| 762 ListValue.Builder listBuilder = ListValue.newBuilder(); | 762 ListValue.Builder listBuilder = ListValue.newBuilder(); |
| 763 listBuilder.addValues(Value.newBuilder().setNumberValue(1.125).build()); | 763 listBuilder.addValues(Value.newBuilder().setNumberValue(1.125).build()); |
| 764 listBuilder.addValues(Value.newBuilder().setNullValueValue(0).build()); | 764 listBuilder.addValues(Value.newBuilder().setNullValueValue(0).build()); |
| 765 structBuilder.putFields( | 765 structBuilder.getMutableFields().put( |
| 766 "list_value", Value.newBuilder().setListValue(listBuilder.build()).build
()); | 766 "list_value", Value.newBuilder().setListValue(listBuilder.build()).build
()); |
| 767 TestStruct message = builder.build(); | 767 TestStruct message = builder.build(); |
| 768 | 768 |
| 769 assertEquals( | 769 assertEquals( |
| 770 "{\n" | 770 "{\n" |
| 771 + " \"structValue\": {\n" | 771 + " \"structValue\": {\n" |
| 772 + " \"null_value\": null,\n" | 772 + " \"null_value\": null,\n" |
| 773 + " \"number_value\": 1.25,\n" | 773 + " \"number_value\": 1.25,\n" |
| 774 + " \"string_value\": \"hello\",\n" | 774 + " \"string_value\": \"hello\",\n" |
| 775 + " \"struct_value\": {\n" | 775 + " \"struct_value\": {\n" |
| 776 + " \"number_value\": 1234.0\n" | 776 + " \"number_value\": 1234.0\n" |
| 777 + " },\n" | 777 + " },\n" |
| 778 + " \"list_value\": [1.125, null]\n" | 778 + " \"list_value\": [1.125, null]\n" |
| 779 + " }\n" | 779 + " }\n" |
| 780 + "}", | 780 + "}", toJsonString(message)); |
| 781 toJsonString(message)); | |
| 782 assertRoundTripEquals(message); | 781 assertRoundTripEquals(message); |
| 783 | 782 |
| 784 builder = TestStruct.newBuilder(); | 783 builder = TestStruct.newBuilder(); |
| 785 builder.setValue(Value.newBuilder().setNullValueValue(0).build()); | 784 builder.setValue(Value.newBuilder().setNullValueValue(0).build()); |
| 786 message = builder.build(); | 785 message = builder.build(); |
| 787 assertEquals("{\n" + " \"value\": null\n" + "}", toJsonString(message)); | 786 assertEquals( |
| 787 "{\n" |
| 788 + " \"value\": null\n" |
| 789 + "}", toJsonString(message)); |
| 788 assertRoundTripEquals(message); | 790 assertRoundTripEquals(message); |
| 789 | 791 |
| 790 builder = TestStruct.newBuilder(); | 792 builder = TestStruct.newBuilder(); |
| 791 listBuilder = builder.getListValueBuilder(); | 793 listBuilder = builder.getListValueBuilder(); |
| 792 listBuilder.addValues(Value.newBuilder().setNumberValue(31831.125).build()); | 794 listBuilder.addValues(Value.newBuilder().setNumberValue(31831.125).build()); |
| 793 listBuilder.addValues(Value.newBuilder().setNullValueValue(0).build()); | 795 listBuilder.addValues(Value.newBuilder().setNullValueValue(0).build()); |
| 794 message = builder.build(); | 796 message = builder.build(); |
| 795 assertEquals("{\n" + " \"listValue\": [31831.125, null]\n" + "}", toJsonStr
ing(message)); | 797 assertEquals( |
| 798 "{\n" |
| 799 + " \"listValue\": [31831.125, null]\n" |
| 800 + "}", toJsonString(message)); |
| 796 assertRoundTripEquals(message); | 801 assertRoundTripEquals(message); |
| 797 } | 802 } |
| 798 | 803 |
| 799 public void testAnyFields() throws Exception { | 804 public void testAnyFields() throws Exception { |
| 800 TestAllTypes content = TestAllTypes.newBuilder().setOptionalInt32(1234).buil
d(); | 805 TestAllTypes content = TestAllTypes.newBuilder().setOptionalInt32(1234).buil
d(); |
| 801 TestAny message = TestAny.newBuilder().setAnyValue(Any.pack(content)).build(
); | 806 TestAny message = TestAny.newBuilder().setAnyValue(Any.pack(content)).build(
); |
| 802 | 807 |
| 803 // A TypeRegistry must be provided in order to convert Any types. | 808 // A TypeRegistry must be provided in order to convert Any types. |
| 804 try { | 809 try { |
| 805 toJsonString(message); | 810 toJsonString(message); |
| 806 fail("Exception is expected."); | 811 fail("Exception is expected."); |
| 807 } catch (IOException e) { | 812 } catch (IOException e) { |
| 808 // Expected. | 813 // Expected. |
| 809 } | 814 } |
| 810 | 815 |
| 811 JsonFormat.TypeRegistry registry = | 816 JsonFormat.TypeRegistry registry = JsonFormat.TypeRegistry.newBuilder() |
| 812 JsonFormat.TypeRegistry.newBuilder().add(TestAllTypes.getDescriptor()).b
uild(); | 817 .add(TestAllTypes.getDescriptor()).build(); |
| 813 JsonFormat.Printer printer = JsonFormat.printer().usingTypeRegistry(registry
); | 818 JsonFormat.Printer printer = JsonFormat.printer().usingTypeRegistry(registry
); |
| 814 | 819 |
| 815 assertEquals( | 820 assertEquals( |
| 816 "{\n" | 821 "{\n" |
| 817 + " \"anyValue\": {\n" | 822 + " \"anyValue\": {\n" |
| 818 + " \"@type\": \"type.googleapis.com/json_test.TestAllTypes\",\n" | 823 + " \"@type\": \"type.googleapis.com/json_test.TestAllTypes\",\n" |
| 819 + " \"optionalInt32\": 1234\n" | 824 + " \"optionalInt32\": 1234\n" |
| 820 + " }\n" | 825 + " }\n" |
| 821 + "}", | 826 + "}" , printer.print(message)); |
| 822 printer.print(message)); | |
| 823 assertRoundTripEquals(message, registry); | 827 assertRoundTripEquals(message, registry); |
| 824 | 828 |
| 825 TestAny messageWithDefaultAnyValue = | |
| 826 TestAny.newBuilder().setAnyValue(Any.getDefaultInstance()).build(); | |
| 827 assertEquals( | |
| 828 "{\n" | |
| 829 + " \"anyValue\": {}\n" | |
| 830 + "}", | |
| 831 printer.print(messageWithDefaultAnyValue)); | |
| 832 assertRoundTripEquals(messageWithDefaultAnyValue, registry); | |
| 833 | 829 |
| 834 // Well-known types have a special formatting when embedded in Any. | 830 // Well-known types have a special formatting when embedded in Any. |
| 835 // | 831 // |
| 836 // 1. Any in Any. | 832 // 1. Any in Any. |
| 837 Any anyMessage = Any.pack(Any.pack(content)); | 833 Any anyMessage = Any.pack(Any.pack(content)); |
| 838 assertEquals( | 834 assertEquals( |
| 839 "{\n" | 835 "{\n" |
| 840 + " \"@type\": \"type.googleapis.com/google.protobuf.Any\",\n" | 836 + " \"@type\": \"type.googleapis.com/google.protobuf.Any\",\n" |
| 841 + " \"value\": {\n" | 837 + " \"value\": {\n" |
| 842 + " \"@type\": \"type.googleapis.com/json_test.TestAllTypes\",\n" | 838 + " \"@type\": \"type.googleapis.com/json_test.TestAllTypes\",\n" |
| 843 + " \"optionalInt32\": 1234\n" | 839 + " \"optionalInt32\": 1234\n" |
| 844 + " }\n" | 840 + " }\n" |
| 845 + "}", | 841 + "}", printer.print(anyMessage)); |
| 846 printer.print(anyMessage)); | |
| 847 assertRoundTripEquals(anyMessage, registry); | 842 assertRoundTripEquals(anyMessage, registry); |
| 848 | 843 |
| 849 // 2. Wrappers in Any. | 844 // 2. Wrappers in Any. |
| 850 anyMessage = Any.pack(Int32Value.newBuilder().setValue(12345).build()); | 845 anyMessage = Any.pack(Int32Value.newBuilder().setValue(12345).build()); |
| 851 assertEquals( | 846 assertEquals( |
| 852 "{\n" | 847 "{\n" |
| 853 + " \"@type\": \"type.googleapis.com/google.protobuf.Int32Value\",\
n" | 848 + " \"@type\": \"type.googleapis.com/google.protobuf.Int32Value\",\n" |
| 854 + " \"value\": 12345\n" | 849 + " \"value\": 12345\n" |
| 855 + "}", | 850 + "}", printer.print(anyMessage)); |
| 856 printer.print(anyMessage)); | |
| 857 assertRoundTripEquals(anyMessage, registry); | 851 assertRoundTripEquals(anyMessage, registry); |
| 858 anyMessage = Any.pack(UInt32Value.newBuilder().setValue(12345).build()); | 852 anyMessage = Any.pack(UInt32Value.newBuilder().setValue(12345).build()); |
| 859 assertEquals( | 853 assertEquals( |
| 860 "{\n" | 854 "{\n" |
| 861 + " \"@type\": \"type.googleapis.com/google.protobuf.UInt32Value\",
\n" | 855 + " \"@type\": \"type.googleapis.com/google.protobuf.UInt32Value\",\n" |
| 862 + " \"value\": 12345\n" | 856 + " \"value\": 12345\n" |
| 863 + "}", | 857 + "}", printer.print(anyMessage)); |
| 864 printer.print(anyMessage)); | |
| 865 assertRoundTripEquals(anyMessage, registry); | 858 assertRoundTripEquals(anyMessage, registry); |
| 866 anyMessage = Any.pack(Int64Value.newBuilder().setValue(12345).build()); | 859 anyMessage = Any.pack(Int64Value.newBuilder().setValue(12345).build()); |
| 867 assertEquals( | 860 assertEquals( |
| 868 "{\n" | 861 "{\n" |
| 869 + " \"@type\": \"type.googleapis.com/google.protobuf.Int64Value\",\
n" | 862 + " \"@type\": \"type.googleapis.com/google.protobuf.Int64Value\",\n" |
| 870 + " \"value\": \"12345\"\n" | 863 + " \"value\": \"12345\"\n" |
| 871 + "}", | 864 + "}", printer.print(anyMessage)); |
| 872 printer.print(anyMessage)); | |
| 873 assertRoundTripEquals(anyMessage, registry); | 865 assertRoundTripEquals(anyMessage, registry); |
| 874 anyMessage = Any.pack(UInt64Value.newBuilder().setValue(12345).build()); | 866 anyMessage = Any.pack(UInt64Value.newBuilder().setValue(12345).build()); |
| 875 assertEquals( | 867 assertEquals( |
| 876 "{\n" | 868 "{\n" |
| 877 + " \"@type\": \"type.googleapis.com/google.protobuf.UInt64Value\",
\n" | 869 + " \"@type\": \"type.googleapis.com/google.protobuf.UInt64Value\",\n" |
| 878 + " \"value\": \"12345\"\n" | 870 + " \"value\": \"12345\"\n" |
| 879 + "}", | 871 + "}", printer.print(anyMessage)); |
| 880 printer.print(anyMessage)); | |
| 881 assertRoundTripEquals(anyMessage, registry); | 872 assertRoundTripEquals(anyMessage, registry); |
| 882 anyMessage = Any.pack(FloatValue.newBuilder().setValue(12345).build()); | 873 anyMessage = Any.pack(FloatValue.newBuilder().setValue(12345).build()); |
| 883 assertEquals( | 874 assertEquals( |
| 884 "{\n" | 875 "{\n" |
| 885 + " \"@type\": \"type.googleapis.com/google.protobuf.FloatValue\",\
n" | 876 + " \"@type\": \"type.googleapis.com/google.protobuf.FloatValue\",\n" |
| 886 + " \"value\": 12345.0\n" | 877 + " \"value\": 12345.0\n" |
| 887 + "}", | 878 + "}", printer.print(anyMessage)); |
| 888 printer.print(anyMessage)); | |
| 889 assertRoundTripEquals(anyMessage, registry); | 879 assertRoundTripEquals(anyMessage, registry); |
| 890 anyMessage = Any.pack(DoubleValue.newBuilder().setValue(12345).build()); | 880 anyMessage = Any.pack(DoubleValue.newBuilder().setValue(12345).build()); |
| 891 assertEquals( | 881 assertEquals( |
| 892 "{\n" | 882 "{\n" |
| 893 + " \"@type\": \"type.googleapis.com/google.protobuf.DoubleValue\",
\n" | 883 + " \"@type\": \"type.googleapis.com/google.protobuf.DoubleValue\",\n" |
| 894 + " \"value\": 12345.0\n" | 884 + " \"value\": 12345.0\n" |
| 895 + "}", | 885 + "}", printer.print(anyMessage)); |
| 896 printer.print(anyMessage)); | |
| 897 assertRoundTripEquals(anyMessage, registry); | 886 assertRoundTripEquals(anyMessage, registry); |
| 898 anyMessage = Any.pack(BoolValue.newBuilder().setValue(true).build()); | 887 anyMessage = Any.pack(BoolValue.newBuilder().setValue(true).build()); |
| 899 assertEquals( | 888 assertEquals( |
| 900 "{\n" | 889 "{\n" |
| 901 + " \"@type\": \"type.googleapis.com/google.protobuf.BoolValue\",\n
" | 890 + " \"@type\": \"type.googleapis.com/google.protobuf.BoolValue\",\n" |
| 902 + " \"value\": true\n" | 891 + " \"value\": true\n" |
| 903 + "}", | 892 + "}", printer.print(anyMessage)); |
| 904 printer.print(anyMessage)); | |
| 905 assertRoundTripEquals(anyMessage, registry); | 893 assertRoundTripEquals(anyMessage, registry); |
| 906 anyMessage = Any.pack(StringValue.newBuilder().setValue("Hello").build()); | 894 anyMessage = Any.pack(StringValue.newBuilder().setValue("Hello").build()); |
| 907 assertEquals( | 895 assertEquals( |
| 908 "{\n" | 896 "{\n" |
| 909 + " \"@type\": \"type.googleapis.com/google.protobuf.StringValue\",
\n" | 897 + " \"@type\": \"type.googleapis.com/google.protobuf.StringValue\",\n" |
| 910 + " \"value\": \"Hello\"\n" | 898 + " \"value\": \"Hello\"\n" |
| 911 + "}", | 899 + "}", printer.print(anyMessage)); |
| 912 printer.print(anyMessage)); | |
| 913 assertRoundTripEquals(anyMessage, registry); | 900 assertRoundTripEquals(anyMessage, registry); |
| 914 anyMessage = | 901 anyMessage = Any.pack(BytesValue.newBuilder().setValue( |
| 915 Any.pack(BytesValue.newBuilder().setValue(ByteString.copyFrom(new byte[]
{1, 2})).build()); | 902 ByteString.copyFrom(new byte[]{1, 2})).build()); |
| 916 assertEquals( | 903 assertEquals( |
| 917 "{\n" | 904 "{\n" |
| 918 + " \"@type\": \"type.googleapis.com/google.protobuf.BytesValue\",\
n" | 905 + " \"@type\": \"type.googleapis.com/google.protobuf.BytesValue\",\n" |
| 919 + " \"value\": \"AQI=\"\n" | 906 + " \"value\": \"AQI=\"\n" |
| 920 + "}", | 907 + "}", printer.print(anyMessage)); |
| 921 printer.print(anyMessage)); | |
| 922 assertRoundTripEquals(anyMessage, registry); | 908 assertRoundTripEquals(anyMessage, registry); |
| 923 | 909 |
| 924 // 3. Timestamp in Any. | 910 // 3. Timestamp in Any. |
| 925 anyMessage = Any.pack(Timestamps.parse("1969-12-31T23:59:59Z")); | 911 anyMessage = Any.pack(TimeUtil.parseTimestamp("1969-12-31T23:59:59Z")); |
| 926 assertEquals( | 912 assertEquals( |
| 927 "{\n" | 913 "{\n" |
| 928 + " \"@type\": \"type.googleapis.com/google.protobuf.Timestamp\",\n
" | 914 + " \"@type\": \"type.googleapis.com/google.protobuf.Timestamp\",\n" |
| 929 + " \"value\": \"1969-12-31T23:59:59Z\"\n" | 915 + " \"value\": \"1969-12-31T23:59:59Z\"\n" |
| 930 + "}", | 916 + "}", printer.print(anyMessage)); |
| 931 printer.print(anyMessage)); | |
| 932 assertRoundTripEquals(anyMessage, registry); | 917 assertRoundTripEquals(anyMessage, registry); |
| 933 | 918 |
| 934 // 4. Duration in Any | 919 // 4. Duration in Any |
| 935 anyMessage = Any.pack(Durations.parse("12345.10s")); | 920 anyMessage = Any.pack(TimeUtil.parseDuration("12345.10s")); |
| 936 assertEquals( | 921 assertEquals( |
| 937 "{\n" | 922 "{\n" |
| 938 + " \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n" | 923 + " \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n" |
| 939 + " \"value\": \"12345.100s\"\n" | 924 + " \"value\": \"12345.100s\"\n" |
| 940 + "}", | 925 + "}", printer.print(anyMessage)); |
| 941 printer.print(anyMessage)); | |
| 942 assertRoundTripEquals(anyMessage, registry); | 926 assertRoundTripEquals(anyMessage, registry); |
| 943 | 927 |
| 944 // 5. FieldMask in Any | 928 // 5. FieldMask in Any |
| 945 anyMessage = Any.pack(FieldMaskUtil.fromString("foo.bar,baz")); | 929 anyMessage = Any.pack(FieldMaskUtil.fromString("foo.bar,baz")); |
| 946 assertEquals( | 930 assertEquals( |
| 947 "{\n" | 931 "{\n" |
| 948 + " \"@type\": \"type.googleapis.com/google.protobuf.FieldMask\",\n
" | 932 + " \"@type\": \"type.googleapis.com/google.protobuf.FieldMask\",\n" |
| 949 + " \"value\": \"foo.bar,baz\"\n" | 933 + " \"value\": \"foo.bar,baz\"\n" |
| 950 + "}", | 934 + "}", printer.print(anyMessage)); |
| 951 printer.print(anyMessage)); | |
| 952 assertRoundTripEquals(anyMessage, registry); | 935 assertRoundTripEquals(anyMessage, registry); |
| 953 | 936 |
| 954 // 6. Struct in Any | 937 // 6. Struct in Any |
| 955 Struct.Builder structBuilder = Struct.newBuilder(); | 938 Struct.Builder structBuilder = Struct.newBuilder(); |
| 956 structBuilder.putFields("number", Value.newBuilder().setNumberValue(1.125).b
uild()); | 939 structBuilder.getMutableFields().put( |
| 940 "number", Value.newBuilder().setNumberValue(1.125).build()); |
| 957 anyMessage = Any.pack(structBuilder.build()); | 941 anyMessage = Any.pack(structBuilder.build()); |
| 958 assertEquals( | 942 assertEquals( |
| 959 "{\n" | 943 "{\n" |
| 960 + " \"@type\": \"type.googleapis.com/google.protobuf.Struct\",\n" | 944 + " \"@type\": \"type.googleapis.com/google.protobuf.Struct\",\n" |
| 961 + " \"value\": {\n" | 945 + " \"value\": {\n" |
| 962 + " \"number\": 1.125\n" | 946 + " \"number\": 1.125\n" |
| 963 + " }\n" | 947 + " }\n" |
| 964 + "}", | 948 + "}", printer.print(anyMessage)); |
| 965 printer.print(anyMessage)); | |
| 966 assertRoundTripEquals(anyMessage, registry); | 949 assertRoundTripEquals(anyMessage, registry); |
| 967 | |
| 968 // 7. Value (number type) in Any | |
| 969 Value.Builder valueBuilder = Value.newBuilder(); | 950 Value.Builder valueBuilder = Value.newBuilder(); |
| 970 valueBuilder.setNumberValue(1); | 951 valueBuilder.setNumberValue(1); |
| 971 anyMessage = Any.pack(valueBuilder.build()); | 952 anyMessage = Any.pack(valueBuilder.build()); |
| 972 assertEquals( | 953 assertEquals( |
| 973 "{\n" | 954 "{\n" |
| 974 + " \"@type\": \"type.googleapis.com/google.protobuf.Value\",\n" | 955 + " \"@type\": \"type.googleapis.com/google.protobuf.Value\",\n" |
| 975 + " \"value\": 1.0\n" | 956 + " \"value\": 1.0\n" |
| 976 + "}", | 957 + "}", printer.print(anyMessage)); |
| 977 printer.print(anyMessage)); | |
| 978 assertRoundTripEquals(anyMessage, registry); | 958 assertRoundTripEquals(anyMessage, registry); |
| 979 | |
| 980 // 8. Value (null type) in Any | |
| 981 anyMessage = Any.pack(Value.newBuilder().setNullValue(NullValue.NULL_VALUE).
build()); | |
| 982 assertEquals( | |
| 983 "{\n" | |
| 984 + " \"@type\": \"type.googleapis.com/google.protobuf.Value\",\n" | |
| 985 + " \"value\": null\n" | |
| 986 + "}", | |
| 987 printer.print(anyMessage)); | |
| 988 assertRoundTripEquals(anyMessage, registry); | |
| 989 } | |
| 990 | |
| 991 public void testAnyInMaps() throws Exception { | |
| 992 JsonFormat.TypeRegistry registry = | |
| 993 JsonFormat.TypeRegistry.newBuilder().add(TestAllTypes.getDescriptor()).b
uild(); | |
| 994 JsonFormat.Printer printer = JsonFormat.printer().usingTypeRegistry(registry
); | |
| 995 | |
| 996 TestAny.Builder testAny = TestAny.newBuilder(); | |
| 997 testAny.putAnyMap("int32_wrapper", Any.pack(Int32Value.newBuilder().setValue
(123).build())); | |
| 998 testAny.putAnyMap("int64_wrapper", Any.pack(Int64Value.newBuilder().setValue
(456).build())); | |
| 999 testAny.putAnyMap("timestamp", Any.pack(Timestamps.parse("1969-12-31T23:59:5
9Z"))); | |
| 1000 testAny.putAnyMap("duration", Any.pack(Durations.parse("12345.1s"))); | |
| 1001 testAny.putAnyMap("field_mask", Any.pack(FieldMaskUtil.fromString("foo.bar,b
az"))); | |
| 1002 Value numberValue = Value.newBuilder().setNumberValue(1.125).build(); | |
| 1003 Struct.Builder struct = Struct.newBuilder(); | |
| 1004 struct.putFields("number", numberValue); | |
| 1005 testAny.putAnyMap("struct", Any.pack(struct.build())); | |
| 1006 Value nullValue = Value.newBuilder().setNullValue(NullValue.NULL_VALUE).buil
d(); | |
| 1007 testAny.putAnyMap( | |
| 1008 "list_value", | |
| 1009 Any.pack(ListValue.newBuilder().addValues(numberValue).addValues(nullVal
ue).build())); | |
| 1010 testAny.putAnyMap("number_value", Any.pack(numberValue)); | |
| 1011 testAny.putAnyMap("any_value_number", Any.pack(Any.pack(numberValue))); | |
| 1012 testAny.putAnyMap("any_value_default", Any.pack(Any.getDefaultInstance())); | |
| 1013 testAny.putAnyMap("default", Any.getDefaultInstance()); | |
| 1014 | |
| 1015 assertEquals( | |
| 1016 "{\n" | |
| 1017 + " \"anyMap\": {\n" | |
| 1018 + " \"int32_wrapper\": {\n" | |
| 1019 + " \"@type\": \"type.googleapis.com/google.protobuf.Int32Value
\",\n" | |
| 1020 + " \"value\": 123\n" | |
| 1021 + " },\n" | |
| 1022 + " \"int64_wrapper\": {\n" | |
| 1023 + " \"@type\": \"type.googleapis.com/google.protobuf.Int64Value
\",\n" | |
| 1024 + " \"value\": \"456\"\n" | |
| 1025 + " },\n" | |
| 1026 + " \"timestamp\": {\n" | |
| 1027 + " \"@type\": \"type.googleapis.com/google.protobuf.Timestamp\
",\n" | |
| 1028 + " \"value\": \"1969-12-31T23:59:59Z\"\n" | |
| 1029 + " },\n" | |
| 1030 + " \"duration\": {\n" | |
| 1031 + " \"@type\": \"type.googleapis.com/google.protobuf.Duration\"
,\n" | |
| 1032 + " \"value\": \"12345.100s\"\n" | |
| 1033 + " },\n" | |
| 1034 + " \"field_mask\": {\n" | |
| 1035 + " \"@type\": \"type.googleapis.com/google.protobuf.FieldMask\
",\n" | |
| 1036 + " \"value\": \"foo.bar,baz\"\n" | |
| 1037 + " },\n" | |
| 1038 + " \"struct\": {\n" | |
| 1039 + " \"@type\": \"type.googleapis.com/google.protobuf.Struct\",\
n" | |
| 1040 + " \"value\": {\n" | |
| 1041 + " \"number\": 1.125\n" | |
| 1042 + " }\n" | |
| 1043 + " },\n" | |
| 1044 + " \"list_value\": {\n" | |
| 1045 + " \"@type\": \"type.googleapis.com/google.protobuf.ListValue\
",\n" | |
| 1046 + " \"value\": [1.125, null]\n" | |
| 1047 + " },\n" | |
| 1048 + " \"number_value\": {\n" | |
| 1049 + " \"@type\": \"type.googleapis.com/google.protobuf.Value\",\n
" | |
| 1050 + " \"value\": 1.125\n" | |
| 1051 + " },\n" | |
| 1052 + " \"any_value_number\": {\n" | |
| 1053 + " \"@type\": \"type.googleapis.com/google.protobuf.Any\",\n" | |
| 1054 + " \"value\": {\n" | |
| 1055 + " \"@type\": \"type.googleapis.com/google.protobuf.Value\",
\n" | |
| 1056 + " \"value\": 1.125\n" | |
| 1057 + " }\n" | |
| 1058 + " },\n" | |
| 1059 + " \"any_value_default\": {\n" | |
| 1060 + " \"@type\": \"type.googleapis.com/google.protobuf.Any\",\n" | |
| 1061 + " \"value\": {}\n" | |
| 1062 + " },\n" | |
| 1063 + " \"default\": {}\n" | |
| 1064 + " }\n" | |
| 1065 + "}", | |
| 1066 printer.print(testAny.build())); | |
| 1067 assertRoundTripEquals(testAny.build(), registry); | |
| 1068 } | 959 } |
| 1069 | 960 |
| 1070 public void testParserMissingTypeUrl() throws Exception { | 961 public void testParserMissingTypeUrl() throws Exception { |
| 1071 try { | 962 try { |
| 1072 Any.Builder builder = Any.newBuilder(); | 963 Any.Builder builder = Any.newBuilder(); |
| 1073 mergeFromJson("{\n" + " \"optionalInt32\": 1234\n" + "}", builder); | 964 mergeFromJson( |
| 965 "{\n" |
| 966 + " \"optionalInt32\": 1234\n" |
| 967 + "}", builder); |
| 1074 fail("Exception is expected."); | 968 fail("Exception is expected."); |
| 1075 } catch (IOException e) { | 969 } catch (IOException e) { |
| 1076 // Expected. | 970 // Expected. |
| 1077 } | 971 } |
| 1078 } | 972 } |
| 1079 | 973 |
| 1080 public void testParserUnexpectedTypeUrl() throws Exception { | 974 public void testParserUnexpectedTypeUrl() throws Exception { |
| 1081 try { | 975 try { |
| 1082 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 976 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
| 1083 mergeFromJson( | 977 mergeFromJson( |
| 1084 "{\n" | 978 "{\n" |
| 1085 + " \"@type\": \"type.googleapis.com/json_test.TestAllTypes\",\n" | 979 + " \"@type\": \"type.googleapis.com/json_test.TestAllTypes\",\n" |
| 1086 + " \"optionalInt32\": 12345\n" | 980 + " \"optionalInt32\": 12345\n" |
| 1087 + "}", | 981 + "}", builder); |
| 1088 builder); | |
| 1089 fail("Exception is expected."); | 982 fail("Exception is expected."); |
| 1090 } catch (IOException e) { | 983 } catch (IOException e) { |
| 1091 // Expected. | 984 // Expected. |
| 1092 } | 985 } |
| 1093 } | 986 } |
| 1094 | 987 |
| 1095 public void testParserRejectTrailingComma() throws Exception { | 988 public void testParserRejectTrailingComma() throws Exception { |
| 1096 try { | 989 try { |
| 1097 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 990 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
| 1098 mergeFromJson("{\n" + " \"optionalInt32\": 12345,\n" + "}", builder); | 991 mergeFromJson( |
| 992 "{\n" |
| 993 + " \"optionalInt32\": 12345,\n" |
| 994 + "}", builder); |
| 1099 fail("Exception is expected."); | 995 fail("Exception is expected."); |
| 1100 } catch (IOException e) { | 996 } catch (IOException e) { |
| 1101 // Expected. | 997 // Expected. |
| 1102 } | 998 } |
| 1103 | 999 |
| 1104 // TODO(xiaofeng): GSON allows trailing comma in arrays even after I set | 1000 // TODO(xiaofeng): GSON allows trailing comma in arrays even after I set |
| 1105 // the JsonReader to non-lenient mode. If we want to enforce strict JSON | 1001 // the JsonReader to non-lenient mode. If we want to enforce strict JSON |
| 1106 // compliance, we might want to switch to a different JSON parser or | 1002 // compliance, we might want to switch to a different JSON parser or |
| 1107 // implement one by ourselves. | 1003 // implement one by ourselves. |
| 1108 // try { | 1004 // try { |
| 1109 // TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 1005 // TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
| 1110 // JsonFormat.merge( | 1006 // JsonFormat.merge( |
| 1111 // "{\n" | 1007 // "{\n" |
| 1112 // + " \"repeatedInt32\": [12345,]\n" | 1008 // + " \"repeatedInt32\": [12345,]\n" |
| 1113 // + "}", builder); | 1009 // + "}", builder); |
| 1114 // fail("Exception is expected."); | 1010 // fail("Exception is expected."); |
| 1115 // } catch (IOException e) { | 1011 // } catch (IOException e) { |
| 1116 // // Expected. | 1012 // // Expected. |
| 1117 // } | 1013 // } |
| 1118 } | 1014 } |
| 1119 | 1015 |
| 1120 public void testParserRejectInvalidBase64() throws Exception { | 1016 public void testParserRejectInvalidBase64() throws Exception { |
| 1121 assertRejects("optionalBytes", "!@#$"); | 1017 assertRejects("optionalBytes", "!@#$"); |
| 1122 } | 1018 // We use standard BASE64 with paddings. |
| 1123 | 1019 assertRejects("optionalBytes", "AQI"); |
| 1124 public void testParserAcceptBase64Variants() throws Exception { | |
| 1125 assertAccepts("optionalBytes", "AQI"); | |
| 1126 } | 1020 } |
| 1127 | 1021 |
| 1128 public void testParserRejectInvalidEnumValue() throws Exception { | 1022 public void testParserRejectInvalidEnumValue() throws Exception { |
| 1129 try { | 1023 try { |
| 1130 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 1024 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
| 1131 mergeFromJson("{\n" + " \"optionalNestedEnum\": \"XXX\"\n" + "}", builder
); | 1025 mergeFromJson( |
| 1026 "{\n" |
| 1027 + " \"optionalNestedEnum\": \"XXX\"\n" |
| 1028 + "}", builder); |
| 1132 fail("Exception is expected."); | 1029 fail("Exception is expected."); |
| 1133 } catch (InvalidProtocolBufferException e) { | 1030 } catch (InvalidProtocolBufferException e) { |
| 1134 // Expected. | 1031 // Expected. |
| 1135 } | 1032 } |
| 1136 } | 1033 } |
| 1137 | 1034 |
| 1138 public void testParserUnknownFields() throws Exception { | |
| 1139 try { | |
| 1140 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
| 1141 String json = "{\n" + " \"unknownField\": \"XXX\"\n" + "}"; | |
| 1142 JsonFormat.parser().merge(json, builder); | |
| 1143 fail("Exception is expected."); | |
| 1144 } catch (InvalidProtocolBufferException e) { | |
| 1145 // Expected. | |
| 1146 } | |
| 1147 } | |
| 1148 | |
| 1149 public void testParserIgnoringUnknownFields() throws Exception { | |
| 1150 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
| 1151 String json = "{\n" + " \"unknownField\": \"XXX\"\n" + "}"; | |
| 1152 JsonFormat.parser().ignoringUnknownFields().merge(json, builder); | |
| 1153 } | |
| 1154 | |
| 1155 public void testCustomJsonName() throws Exception { | 1035 public void testCustomJsonName() throws Exception { |
| 1156 TestCustomJsonName message = TestCustomJsonName.newBuilder().setValue(12345)
.build(); | 1036 TestCustomJsonName message = TestCustomJsonName.newBuilder().setValue(12345)
.build(); |
| 1157 assertEquals("{\n" + " \"@value\": 12345\n" + "}", JsonFormat.printer().pri
nt(message)); | 1037 assertEquals("{\n" + " \"@value\": 12345\n" + "}", JsonFormat.printer().pri
nt(message)); |
| 1158 assertRoundTripEquals(message); | 1038 assertRoundTripEquals(message); |
| 1159 } | 1039 } |
| 1160 | 1040 |
| 1161 public void testDefaultGsonDoesNotHtmlEscape() throws Exception { | 1041 public void testDefaultGsonDoesNotHtmlEscape() throws Exception { |
| 1162 TestAllTypes message = TestAllTypes.newBuilder().setOptionalString("=").buil
d(); | 1042 TestAllTypes message = TestAllTypes.newBuilder().setOptionalString("=").buil
d(); |
| 1163 assertEquals( | 1043 assertEquals( |
| 1164 "{\n" + " \"optionalString\": \"=\"" + "\n}", JsonFormat.printer().prin
t(message)); | 1044 "{\n" + " \"optionalString\": \"=\"" + "\n}", JsonFormat.printer().prin
t(message)); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1260 + " \"int32ToStringMap\": {\n" | 1140 + " \"int32ToStringMap\": {\n" |
| 1261 + " },\n" | 1141 + " },\n" |
| 1262 + " \"int32ToBytesMap\": {\n" | 1142 + " \"int32ToBytesMap\": {\n" |
| 1263 + " },\n" | 1143 + " },\n" |
| 1264 + " \"int32ToMessageMap\": {\n" | 1144 + " \"int32ToMessageMap\": {\n" |
| 1265 + " },\n" | 1145 + " },\n" |
| 1266 + " \"int32ToEnumMap\": {\n" | 1146 + " \"int32ToEnumMap\": {\n" |
| 1267 + " }\n" | 1147 + " }\n" |
| 1268 + "}", | 1148 + "}", |
| 1269 JsonFormat.printer().includingDefaultValueFields().print(mapMessage)); | 1149 JsonFormat.printer().includingDefaultValueFields().print(mapMessage)); |
| 1270 | |
| 1271 TestOneof oneofMessage = TestOneof.getDefaultInstance(); | |
| 1272 assertEquals("{\n}", JsonFormat.printer().print(oneofMessage)); | |
| 1273 assertEquals("{\n}", JsonFormat.printer().includingDefaultValueFields().prin
t(oneofMessage)); | |
| 1274 | |
| 1275 oneofMessage = TestOneof.newBuilder().setOneofInt32(42).build(); | |
| 1276 assertEquals("{\n \"oneofInt32\": 42\n}", | |
| 1277 JsonFormat.printer().print(oneofMessage)); | |
| 1278 assertEquals("{\n \"oneofInt32\": 42\n}", | |
| 1279 JsonFormat.printer().includingDefaultValueFields().print(oneofMessage)); | |
| 1280 | |
| 1281 TestOneof.Builder oneofBuilder = TestOneof.newBuilder(); | |
| 1282 mergeFromJson("{\n" + " \"oneofNullValue\": null \n" + "}", oneofBuilder); | |
| 1283 oneofMessage = oneofBuilder.build(); | |
| 1284 assertEquals("{\n \"oneofNullValue\": null\n}", JsonFormat.printer().print(
oneofMessage)); | |
| 1285 assertEquals("{\n \"oneofNullValue\": null\n}", | |
| 1286 JsonFormat.printer().includingDefaultValueFields().print(oneofMessage)); | |
| 1287 } | 1150 } |
| 1288 | 1151 |
| 1289 public void testPreservingProtoFieldNames() throws Exception { | 1152 public void testPreservingProtoFieldNames() throws Exception { |
| 1290 TestAllTypes message = TestAllTypes.newBuilder().setOptionalInt32(12345).bui
ld(); | 1153 TestAllTypes message = TestAllTypes.newBuilder().setOptionalInt32(12345).bui
ld(); |
| 1291 assertEquals("{\n" + " \"optionalInt32\": 12345\n" + "}", JsonFormat.printe
r().print(message)); | 1154 assertEquals("{\n" + " \"optionalInt32\": 12345\n" + "}", JsonFormat.printe
r().print(message)); |
| 1292 assertEquals( | 1155 assertEquals( |
| 1293 "{\n" + " \"optional_int32\": 12345\n" + "}", | 1156 "{\n" + " \"optional_int32\": 12345\n" + "}", |
| 1294 JsonFormat.printer().preservingProtoFieldNames().print(message)); | 1157 JsonFormat.printer().preservingProtoFieldNames().print(message)); |
| 1295 | 1158 |
| 1296 // The json_name field option is ignored when configured to use original pro
to field names. | 1159 // The json_name field option is ignored when configured to use original pro
to field names. |
| 1297 TestCustomJsonName messageWithCustomJsonName = | 1160 TestCustomJsonName messageWithCustomJsonName = |
| 1298 TestCustomJsonName.newBuilder().setValue(12345).build(); | 1161 TestCustomJsonName.newBuilder().setValue(12345).build(); |
| 1299 assertEquals( | 1162 assertEquals( |
| 1300 "{\n" + " \"value\": 12345\n" + "}", | 1163 "{\n" + " \"value\": 12345\n" + "}", |
| 1301 JsonFormat.printer().preservingProtoFieldNames().print(messageWithCustom
JsonName)); | 1164 JsonFormat.printer().preservingProtoFieldNames().print(messageWithCustom
JsonName)); |
| 1302 | 1165 |
| 1303 // Parsers accept both original proto field names and lowerCamelCase names. | 1166 // Parsers accept both original proto field names and lowerCamelCase names. |
| 1304 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | 1167 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); |
| 1305 JsonFormat.parser().merge("{\"optionalInt32\": 12345}", builder); | 1168 JsonFormat.parser().merge("{\"optionalInt32\": 12345}", builder); |
| 1306 assertEquals(12345, builder.getOptionalInt32()); | 1169 assertEquals(12345, builder.getOptionalInt32()); |
| 1307 builder.clear(); | 1170 builder.clear(); |
| 1308 JsonFormat.parser().merge("{\"optional_int32\": 54321}", builder); | 1171 JsonFormat.parser().merge("{\"optional_int32\": 54321}", builder); |
| 1309 assertEquals(54321, builder.getOptionalInt32()); | 1172 assertEquals(54321, builder.getOptionalInt32()); |
| 1310 } | 1173 } |
| 1311 | |
| 1312 public void testOmittingInsignificantWhiteSpace() throws Exception { | |
| 1313 TestAllTypes message = TestAllTypes.newBuilder().setOptionalInt32(12345).bui
ld(); | |
| 1314 assertEquals( | |
| 1315 "{" + "\"optionalInt32\":12345" + "}", | |
| 1316 JsonFormat.printer().omittingInsignificantWhitespace().print(message)); | |
| 1317 TestAllTypes message1 = TestAllTypes.getDefaultInstance(); | |
| 1318 assertEquals("{}", JsonFormat.printer().omittingInsignificantWhitespace().pr
int(message1)); | |
| 1319 TestAllTypes.Builder builder = TestAllTypes.newBuilder(); | |
| 1320 setAllFields(builder); | |
| 1321 TestAllTypes message2 = builder.build(); | |
| 1322 assertEquals( | |
| 1323 "{" | |
| 1324 + "\"optionalInt32\":1234," | |
| 1325 + "\"optionalInt64\":\"1234567890123456789\"," | |
| 1326 + "\"optionalUint32\":5678," | |
| 1327 + "\"optionalUint64\":\"2345678901234567890\"," | |
| 1328 + "\"optionalSint32\":9012," | |
| 1329 + "\"optionalSint64\":\"3456789012345678901\"," | |
| 1330 + "\"optionalFixed32\":3456," | |
| 1331 + "\"optionalFixed64\":\"4567890123456789012\"," | |
| 1332 + "\"optionalSfixed32\":7890," | |
| 1333 + "\"optionalSfixed64\":\"5678901234567890123\"," | |
| 1334 + "\"optionalFloat\":1.5," | |
| 1335 + "\"optionalDouble\":1.25," | |
| 1336 + "\"optionalBool\":true," | |
| 1337 + "\"optionalString\":\"Hello world!\"," | |
| 1338 + "\"optionalBytes\":\"AAEC\"," | |
| 1339 + "\"optionalNestedMessage\":{" | |
| 1340 + "\"value\":100" | |
| 1341 + "}," | |
| 1342 + "\"optionalNestedEnum\":\"BAR\"," | |
| 1343 + "\"repeatedInt32\":[1234,234]," | |
| 1344 + "\"repeatedInt64\":[\"1234567890123456789\",\"234567890123456789\"
]," | |
| 1345 + "\"repeatedUint32\":[5678,678]," | |
| 1346 + "\"repeatedUint64\":[\"2345678901234567890\",\"345678901234567890\
"]," | |
| 1347 + "\"repeatedSint32\":[9012,10]," | |
| 1348 + "\"repeatedSint64\":[\"3456789012345678901\",\"456789012345678901\
"]," | |
| 1349 + "\"repeatedFixed32\":[3456,456]," | |
| 1350 + "\"repeatedFixed64\":[\"4567890123456789012\",\"567890123456789012
\"]," | |
| 1351 + "\"repeatedSfixed32\":[7890,890]," | |
| 1352 + "\"repeatedSfixed64\":[\"5678901234567890123\",\"67890123456789012
3\"]," | |
| 1353 + "\"repeatedFloat\":[1.5,11.5]," | |
| 1354 + "\"repeatedDouble\":[1.25,11.25]," | |
| 1355 + "\"repeatedBool\":[true,true]," | |
| 1356 + "\"repeatedString\":[\"Hello world!\",\"ello world!\"]," | |
| 1357 + "\"repeatedBytes\":[\"AAEC\",\"AQI=\"]," | |
| 1358 + "\"repeatedNestedMessage\":[{" | |
| 1359 + "\"value\":100" | |
| 1360 + "},{" | |
| 1361 + "\"value\":200" | |
| 1362 + "}]," | |
| 1363 + "\"repeatedNestedEnum\":[\"BAR\",\"BAZ\"]" | |
| 1364 + "}", | |
| 1365 toCompactJsonString(message2)); | |
| 1366 } | |
| 1367 | |
| 1368 // Regression test for b/29892357 | |
| 1369 public void testEmptyWrapperTypesInAny() throws Exception { | |
| 1370 JsonFormat.TypeRegistry registry = | |
| 1371 JsonFormat.TypeRegistry.newBuilder().add(TestAllTypes.getDescriptor()).b
uild(); | |
| 1372 JsonFormat.Parser parser = JsonFormat.parser().usingTypeRegistry(registry); | |
| 1373 | |
| 1374 Any.Builder builder = Any.newBuilder(); | |
| 1375 parser.merge( | |
| 1376 "{\n" | |
| 1377 + " \"@type\": \"type.googleapis.com/google.protobuf.BoolValue\",\n
" | |
| 1378 + " \"value\": false\n" | |
| 1379 + "}\n", | |
| 1380 builder); | |
| 1381 Any any = builder.build(); | |
| 1382 assertEquals(0, any.getValue().size()); | |
| 1383 } | |
| 1384 | |
| 1385 public void testRecursionLimit() throws Exception { | |
| 1386 String input = | |
| 1387 "{\n" | |
| 1388 + " \"nested\": {\n" | |
| 1389 + " \"nested\": {\n" | |
| 1390 + " \"nested\": {\n" | |
| 1391 + " \"nested\": {\n" | |
| 1392 + " \"value\": 1234\n" | |
| 1393 + " }\n" | |
| 1394 + " }\n" | |
| 1395 + " }\n" | |
| 1396 + " }\n" | |
| 1397 + "}\n"; | |
| 1398 | |
| 1399 JsonFormat.Parser parser = JsonFormat.parser(); | |
| 1400 TestRecursive.Builder builder = TestRecursive.newBuilder(); | |
| 1401 parser.merge(input, builder); | |
| 1402 TestRecursive message = builder.build(); | |
| 1403 assertEquals(1234, message.getNested().getNested().getNested().getNested().g
etValue()); | |
| 1404 | |
| 1405 parser = JsonFormat.parser().usingRecursionLimit(3); | |
| 1406 builder = TestRecursive.newBuilder(); | |
| 1407 try { | |
| 1408 parser.merge(input, builder); | |
| 1409 fail("Exception is expected."); | |
| 1410 } catch (InvalidProtocolBufferException e) { | |
| 1411 // Expected. | |
| 1412 } | |
| 1413 } | |
| 1414 } | 1174 } |
| OLD | NEW |