Commit eecc6aa1a69a9b558c76dd59399df68ebbc49d39

Authored by ShvaykaD
1 parent 706fd01d

fix dynamic schemas, tests

@@ -62,19 +62,28 @@ public abstract class AbstractMqttIntegrationTest extends AbstractControllerTest @@ -62,19 +62,28 @@ public abstract class AbstractMqttIntegrationTest extends AbstractControllerTest
62 62
63 private static final AtomicInteger atomicInteger = new AtomicInteger(2); 63 private static final AtomicInteger atomicInteger = new AtomicInteger(2);
64 64
65 - protected static final String DEVICE_TELEMETRY_PROTO_SCHEMA = "syntax =\"proto3\";\n" + 65 + public static final String DEVICE_TELEMETRY_PROTO_SCHEMA = "syntax =\"proto3\";\n" +
66 "\n" + 66 "\n" +
67 "package test;\n" + 67 "package test;\n" +
68 - " \n" + 68 + "\n" +
69 "message PostTelemetry {\n" + 69 "message PostTelemetry {\n" +
70 " string key1 = 1;\n" + 70 " string key1 = 1;\n" +
71 " bool key2 = 2;\n" + 71 " bool key2 = 2;\n" +
72 " double key3 = 3;\n" + 72 " double key3 = 3;\n" +
73 " int32 key4 = 4;\n" + 73 " int32 key4 = 4;\n" +
74 - " string key5 = 5;\n" + 74 + " JsonObject key5 = 5;\n" +
  75 + "\n" +
  76 + " message JsonObject {\n" +
  77 + " int32 someNumber = 6;\n" +
  78 + " repeated int32 someArray = 7;\n" +
  79 + " NestedJsonObject someNestedObject = 8;\n" +
  80 + " message NestedJsonObject {\n" +
  81 + " string key = 9;\n" +
  82 + " }\n" +
  83 + " }\n" +
75 "}"; 84 "}";
76 85
77 - protected static final String DEVICE_ATTRIBUTES_PROTO_SCHEMA = "syntax =\"proto3\";\n" + 86 + public static final String DEVICE_ATTRIBUTES_PROTO_SCHEMA = "syntax =\"proto3\";\n" +
78 "\n" + 87 "\n" +
79 "package test;\n" + 88 "package test;\n" +
80 "\n" + 89 "\n" +
@@ -83,7 +92,16 @@ public abstract class AbstractMqttIntegrationTest extends AbstractControllerTest @@ -83,7 +92,16 @@ public abstract class AbstractMqttIntegrationTest extends AbstractControllerTest
83 " bool key2 = 2;\n" + 92 " bool key2 = 2;\n" +
84 " double key3 = 3;\n" + 93 " double key3 = 3;\n" +
85 " int32 key4 = 4;\n" + 94 " int32 key4 = 4;\n" +
86 - " string key5 = 5;\n" + 95 + " JsonObject key5 = 5;\n" +
  96 + "\n" +
  97 + " message JsonObject {\n" +
  98 + " int32 someNumber = 6;\n" +
  99 + " repeated int32 someArray = 7;\n" +
  100 + " NestedJsonObject someNestedObject = 8;\n" +
  101 + " message NestedJsonObject {\n" +
  102 + " string key = 9;\n" +
  103 + " }\n" +
  104 + " }\n" +
87 "}"; 105 "}";
88 106
89 protected Tenant savedTenant; 107 protected Tenant savedTenant;
@@ -26,13 +26,13 @@ import java.util.Arrays; @@ -26,13 +26,13 @@ import java.util.Arrays;
26 26
27 @RunWith(ClasspathSuite.class) 27 @RunWith(ClasspathSuite.class)
28 @ClasspathSuite.ClassnameFilters({ 28 @ClasspathSuite.ClassnameFilters({
29 -// "org.thingsboard.server.mqtt.rpc.sql.*Test",  
30 -// "org.thingsboard.server.mqtt.telemetry.timeseries.sql.*Test",  
31 -// "org.thingsboard.server.mqtt.telemetry.attributes.sql.*Test",  
32 -// "org.thingsboard.server.mqtt.attributes.updates.sql.*Test", 29 + "org.thingsboard.server.mqtt.rpc.sql.*Test",
  30 + "org.thingsboard.server.mqtt.telemetry.timeseries.sql.*Test",
  31 + "org.thingsboard.server.mqtt.telemetry.attributes.sql.*Test",
  32 + "org.thingsboard.server.mqtt.attributes.updates.sql.*Test",
33 "org.thingsboard.server.mqtt.attributes.request.sql.*Test", 33 "org.thingsboard.server.mqtt.attributes.request.sql.*Test",
34 -// "org.thingsboard.server.mqtt.claim.sql.*Test",  
35 -// "org.thingsboard.server.mqtt.provision.sql.*Test" 34 + "org.thingsboard.server.mqtt.claim.sql.*Test",
  35 + "org.thingsboard.server.mqtt.provision.sql.*Test"
36 }) 36 })
37 public class MqttSqlTestSuite { 37 public class MqttSqlTestSuite {
38 38
@@ -122,7 +122,7 @@ public abstract class AbstractMqttAttributesRequestIntegrationTest extends Abstr @@ -122,7 +122,7 @@ public abstract class AbstractMqttAttributesRequestIntegrationTest extends Abstr
122 client.publish(MqttTopics.DEVICE_ATTRIBUTES_REQUEST_TOPIC_PREFIX + "1", mqttMessage); 122 client.publish(MqttTopics.DEVICE_ATTRIBUTES_REQUEST_TOPIC_PREFIX + "1", mqttMessage);
123 latch.await(3, TimeUnit.SECONDS); 123 latch.await(3, TimeUnit.SECONDS);
124 assertEquals(MqttQoS.AT_MOST_ONCE.value(), callback.getQoS()); 124 assertEquals(MqttQoS.AT_MOST_ONCE.value(), callback.getQoS());
125 - String expectedRequestPayload = "{\"client\":{\"attribute5\":{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}},\"attribute4\":73,\"attribute1\":\"value1\",\"attribute3\":42.0,\"attribute2\":true},\"shared\":{\"attribute5\":{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}},\"attribute4\":73,\"attribute1\":\"value1\",\"attribute3\":42.0,\"attribute2\":true}}"; 125 + String expectedRequestPayload = "{\"client\":{\"attribute1\":\"value1\",\"attribute2\":true,\"attribute3\":42.0,\"attribute4\":73,\"attribute5\":{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}},\"shared\":{\"attribute1\":\"value1\",\"attribute2\":true,\"attribute3\":42.0,\"attribute4\":73,\"attribute5\":{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}}}";
126 assertEquals(JacksonUtil.toJsonNode(expectedRequestPayload), JacksonUtil.toJsonNode(new String(callback.getPayloadBytes(), StandardCharsets.UTF_8))); 126 assertEquals(JacksonUtil.toJsonNode(expectedRequestPayload), JacksonUtil.toJsonNode(new String(callback.getPayloadBytes(), StandardCharsets.UTF_8)));
127 } 127 }
128 128
@@ -62,7 +62,16 @@ public abstract class AbstractMqttAttributesRequestProtoIntegrationTest extends @@ -62,7 +62,16 @@ public abstract class AbstractMqttAttributesRequestProtoIntegrationTest extends
62 " bool attribute2 = 2;\n" + 62 " bool attribute2 = 2;\n" +
63 " double attribute3 = 3;\n" + 63 " double attribute3 = 3;\n" +
64 " int32 attribute4 = 4;\n" + 64 " int32 attribute4 = 4;\n" +
65 - " string attribute5 = 5;\n" + 65 + " JsonObject attribute5 = 5;\n" +
  66 + "\n" +
  67 + " message JsonObject {\n" +
  68 + " int32 someNumber = 6;\n" +
  69 + " repeated int32 someArray = 7;\n" +
  70 + " NestedJsonObject someNestedObject = 8;\n" +
  71 + " message NestedJsonObject {\n" +
  72 + " string key = 9;\n" +
  73 + " }\n" +
  74 + " }\n" +
66 "}"; 75 "}";
67 76
68 @After 77 @After
@@ -93,6 +102,23 @@ public abstract class AbstractMqttAttributesRequestProtoIntegrationTest extends @@ -93,6 +102,23 @@ public abstract class AbstractMqttAttributesRequestProtoIntegrationTest extends
93 ProtoTransportPayloadConfiguration protoTransportPayloadConfiguration = (ProtoTransportPayloadConfiguration) transportPayloadTypeConfiguration; 102 ProtoTransportPayloadConfiguration protoTransportPayloadConfiguration = (ProtoTransportPayloadConfiguration) transportPayloadTypeConfiguration;
94 ProtoFileElement transportProtoSchema = protoTransportPayloadConfiguration.getTransportProtoSchema(ATTRIBUTES_SCHEMA_STR); 103 ProtoFileElement transportProtoSchema = protoTransportPayloadConfiguration.getTransportProtoSchema(ATTRIBUTES_SCHEMA_STR);
95 DynamicSchema attributesSchema = protoTransportPayloadConfiguration.getDynamicSchema(transportProtoSchema, ProtoTransportPayloadConfiguration.ATTRIBUTES_PROTO_SCHEMA); 104 DynamicSchema attributesSchema = protoTransportPayloadConfiguration.getDynamicSchema(transportProtoSchema, ProtoTransportPayloadConfiguration.ATTRIBUTES_PROTO_SCHEMA);
  105 +
  106 + DynamicMessage.Builder nestedJsonObjectBuilder = attributesSchema.newMessageBuilder("PostAttributes.JsonObject.NestedJsonObject");
  107 + Descriptors.Descriptor nestedJsonObjectBuilderDescriptor = nestedJsonObjectBuilder.getDescriptorForType();
  108 + assertNotNull(nestedJsonObjectBuilderDescriptor);
  109 + DynamicMessage nestedJsonObject = nestedJsonObjectBuilder.setField(nestedJsonObjectBuilderDescriptor.findFieldByName("key"), "value").build();
  110 +
  111 + DynamicMessage.Builder jsonObjectBuilder = attributesSchema.newMessageBuilder("PostAttributes.JsonObject");
  112 + Descriptors.Descriptor jsonObjectBuilderDescriptor = jsonObjectBuilder.getDescriptorForType();
  113 + assertNotNull(jsonObjectBuilderDescriptor);
  114 + DynamicMessage jsonObject = jsonObjectBuilder
  115 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNumber"), 42)
  116 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 1)
  117 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 2)
  118 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 3)
  119 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNestedObject"), nestedJsonObject)
  120 + .build();
  121 +
96 DynamicMessage.Builder postAttributesBuilder = attributesSchema.newMessageBuilder("PostAttributes"); 122 DynamicMessage.Builder postAttributesBuilder = attributesSchema.newMessageBuilder("PostAttributes");
97 Descriptors.Descriptor postAttributesMsgDescriptor = postAttributesBuilder.getDescriptorForType(); 123 Descriptors.Descriptor postAttributesMsgDescriptor = postAttributesBuilder.getDescriptorForType();
98 assertNotNull(postAttributesMsgDescriptor); 124 assertNotNull(postAttributesMsgDescriptor);
@@ -101,7 +127,7 @@ public abstract class AbstractMqttAttributesRequestProtoIntegrationTest extends @@ -101,7 +127,7 @@ public abstract class AbstractMqttAttributesRequestProtoIntegrationTest extends
101 .setField(postAttributesMsgDescriptor.findFieldByName("attribute2"), true) 127 .setField(postAttributesMsgDescriptor.findFieldByName("attribute2"), true)
102 .setField(postAttributesMsgDescriptor.findFieldByName("attribute3"), 42.0) 128 .setField(postAttributesMsgDescriptor.findFieldByName("attribute3"), 42.0)
103 .setField(postAttributesMsgDescriptor.findFieldByName("attribute4"), 73) 129 .setField(postAttributesMsgDescriptor.findFieldByName("attribute4"), 73)
104 - .setField(postAttributesMsgDescriptor.findFieldByName("attribute5"), "{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}") 130 + .setField(postAttributesMsgDescriptor.findFieldByName("attribute5"), jsonObject)
105 .build(); 131 .build();
106 byte[] payload = postAttributesMsg.toByteArray(); 132 byte[] payload = postAttributesMsg.toByteArray();
107 client.publish(MqttTopics.DEVICE_ATTRIBUTES_TOPIC, new MqttMessage(payload)); 133 client.publish(MqttTopics.DEVICE_ATTRIBUTES_TOPIC, new MqttMessage(payload));
@@ -163,16 +163,10 @@ public abstract class AbstractMqttAttributesIntegrationTest extends AbstractMqtt @@ -163,16 +163,10 @@ public abstract class AbstractMqttAttributesIntegrationTest extends AbstractMqtt
163 break; 163 break;
164 case "key5": 164 case "key5":
165 assertNotNull(value); 165 assertNotNull(value);
166 - LinkedHashMap valueMap;  
167 - if (value instanceof String) {  
168 - valueMap = mapper.readValue((String) value, LinkedHashMap.class);  
169 - } else {  
170 - valueMap = (LinkedHashMap) value;  
171 - }  
172 - assertEquals(3, valueMap.size());  
173 - assertEquals(42, valueMap.get("someNumber"));  
174 - assertEquals(Arrays.asList(1, 2, 3), valueMap.get("someArray"));  
175 - LinkedHashMap<String, String> someNestedObject = (LinkedHashMap) valueMap.get("someNestedObject"); 166 + assertEquals(3, ((LinkedHashMap) value).size());
  167 + assertEquals(42, ((LinkedHashMap) value).get("someNumber"));
  168 + assertEquals(Arrays.asList(1, 2, 3), ((LinkedHashMap) value).get("someArray"));
  169 + LinkedHashMap<String, String> someNestedObject = (LinkedHashMap) ((LinkedHashMap) value).get("someNestedObject");
176 assertEquals("value", someNestedObject.get("key")); 170 assertEquals("value", someNestedObject.get("key"));
177 break; 171 break;
178 } 172 }
@@ -58,6 +58,23 @@ public abstract class AbstractMqttAttributesProtoIntegrationTest extends Abstrac @@ -58,6 +58,23 @@ public abstract class AbstractMqttAttributesProtoIntegrationTest extends Abstrac
58 ProtoTransportPayloadConfiguration protoTransportPayloadConfiguration = (ProtoTransportPayloadConfiguration) transportPayloadTypeConfiguration; 58 ProtoTransportPayloadConfiguration protoTransportPayloadConfiguration = (ProtoTransportPayloadConfiguration) transportPayloadTypeConfiguration;
59 ProtoFileElement transportProtoSchemaFile = protoTransportPayloadConfiguration.getTransportProtoSchema(DEVICE_ATTRIBUTES_PROTO_SCHEMA); 59 ProtoFileElement transportProtoSchemaFile = protoTransportPayloadConfiguration.getTransportProtoSchema(DEVICE_ATTRIBUTES_PROTO_SCHEMA);
60 DynamicSchema attributesSchema = protoTransportPayloadConfiguration.getDynamicSchema(transportProtoSchemaFile, ProtoTransportPayloadConfiguration.ATTRIBUTES_PROTO_SCHEMA); 60 DynamicSchema attributesSchema = protoTransportPayloadConfiguration.getDynamicSchema(transportProtoSchemaFile, ProtoTransportPayloadConfiguration.ATTRIBUTES_PROTO_SCHEMA);
  61 +
  62 + DynamicMessage.Builder nestedJsonObjectBuilder = attributesSchema.newMessageBuilder("PostAttributes.JsonObject.NestedJsonObject");
  63 + Descriptors.Descriptor nestedJsonObjectBuilderDescriptor = nestedJsonObjectBuilder.getDescriptorForType();
  64 + assertNotNull(nestedJsonObjectBuilderDescriptor);
  65 + DynamicMessage nestedJsonObject = nestedJsonObjectBuilder.setField(nestedJsonObjectBuilderDescriptor.findFieldByName("key"), "value").build();
  66 +
  67 + DynamicMessage.Builder jsonObjectBuilder = attributesSchema.newMessageBuilder("PostAttributes.JsonObject");
  68 + Descriptors.Descriptor jsonObjectBuilderDescriptor = jsonObjectBuilder.getDescriptorForType();
  69 + assertNotNull(jsonObjectBuilderDescriptor);
  70 + DynamicMessage jsonObject = jsonObjectBuilder
  71 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNumber"), 42)
  72 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 1)
  73 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 2)
  74 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 3)
  75 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNestedObject"), nestedJsonObject)
  76 + .build();
  77 +
61 DynamicMessage.Builder postAttributesBuilder = attributesSchema.newMessageBuilder("PostAttributes"); 78 DynamicMessage.Builder postAttributesBuilder = attributesSchema.newMessageBuilder("PostAttributes");
62 Descriptors.Descriptor postAttributesMsgDescriptor = postAttributesBuilder.getDescriptorForType(); 79 Descriptors.Descriptor postAttributesMsgDescriptor = postAttributesBuilder.getDescriptorForType();
63 assertNotNull(postAttributesMsgDescriptor); 80 assertNotNull(postAttributesMsgDescriptor);
@@ -66,7 +83,7 @@ public abstract class AbstractMqttAttributesProtoIntegrationTest extends Abstrac @@ -66,7 +83,7 @@ public abstract class AbstractMqttAttributesProtoIntegrationTest extends Abstrac
66 .setField(postAttributesMsgDescriptor.findFieldByName("key2"), true) 83 .setField(postAttributesMsgDescriptor.findFieldByName("key2"), true)
67 .setField(postAttributesMsgDescriptor.findFieldByName("key3"), 3.0) 84 .setField(postAttributesMsgDescriptor.findFieldByName("key3"), 3.0)
68 .setField(postAttributesMsgDescriptor.findFieldByName("key4"), 4) 85 .setField(postAttributesMsgDescriptor.findFieldByName("key4"), 4)
69 - .setField(postAttributesMsgDescriptor.findFieldByName("key5"), "{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}") 86 + .setField(postAttributesMsgDescriptor.findFieldByName("key5"), jsonObject)
70 .build(); 87 .build();
71 processAttributesTest(POST_DATA_ATTRIBUTES_TOPIC, expectedKeys, postAttributesMsg.toByteArray()); 88 processAttributesTest(POST_DATA_ATTRIBUTES_TOPIC, expectedKeys, postAttributesMsg.toByteArray());
72 } 89 }
@@ -62,6 +62,23 @@ public abstract class AbstractMqttTimeseriesProtoIntegrationTest extends Abstrac @@ -62,6 +62,23 @@ public abstract class AbstractMqttTimeseriesProtoIntegrationTest extends Abstrac
62 ProtoTransportPayloadConfiguration protoTransportPayloadConfiguration = (ProtoTransportPayloadConfiguration) transportPayloadTypeConfiguration; 62 ProtoTransportPayloadConfiguration protoTransportPayloadConfiguration = (ProtoTransportPayloadConfiguration) transportPayloadTypeConfiguration;
63 ProtoFileElement transportProtoSchema = protoTransportPayloadConfiguration.getTransportProtoSchema(DEVICE_TELEMETRY_PROTO_SCHEMA); 63 ProtoFileElement transportProtoSchema = protoTransportPayloadConfiguration.getTransportProtoSchema(DEVICE_TELEMETRY_PROTO_SCHEMA);
64 DynamicSchema telemetrySchema = protoTransportPayloadConfiguration.getDynamicSchema(transportProtoSchema, "telemetrySchema"); 64 DynamicSchema telemetrySchema = protoTransportPayloadConfiguration.getDynamicSchema(transportProtoSchema, "telemetrySchema");
  65 +
  66 + DynamicMessage.Builder nestedJsonObjectBuilder = telemetrySchema.newMessageBuilder("PostTelemetry.JsonObject.NestedJsonObject");
  67 + Descriptors.Descriptor nestedJsonObjectBuilderDescriptor = nestedJsonObjectBuilder.getDescriptorForType();
  68 + assertNotNull(nestedJsonObjectBuilderDescriptor);
  69 + DynamicMessage nestedJsonObject = nestedJsonObjectBuilder.setField(nestedJsonObjectBuilderDescriptor.findFieldByName("key"), "value").build();
  70 +
  71 + DynamicMessage.Builder jsonObjectBuilder = telemetrySchema.newMessageBuilder("PostTelemetry.JsonObject");
  72 + Descriptors.Descriptor jsonObjectBuilderDescriptor = jsonObjectBuilder.getDescriptorForType();
  73 + assertNotNull(jsonObjectBuilderDescriptor);
  74 + DynamicMessage jsonObject = jsonObjectBuilder
  75 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNumber"), 42)
  76 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 1)
  77 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 2)
  78 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 3)
  79 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNestedObject"), nestedJsonObject)
  80 + .build();
  81 +
65 DynamicMessage.Builder postTelemetryBuilder = telemetrySchema.newMessageBuilder("PostTelemetry"); 82 DynamicMessage.Builder postTelemetryBuilder = telemetrySchema.newMessageBuilder("PostTelemetry");
66 Descriptors.Descriptor postTelemetryMsgDescriptor = postTelemetryBuilder.getDescriptorForType(); 83 Descriptors.Descriptor postTelemetryMsgDescriptor = postTelemetryBuilder.getDescriptorForType();
67 assertNotNull(postTelemetryMsgDescriptor); 84 assertNotNull(postTelemetryMsgDescriptor);
@@ -70,7 +87,7 @@ public abstract class AbstractMqttTimeseriesProtoIntegrationTest extends Abstrac @@ -70,7 +87,7 @@ public abstract class AbstractMqttTimeseriesProtoIntegrationTest extends Abstrac
70 .setField(postTelemetryMsgDescriptor.findFieldByName("key2"), true) 87 .setField(postTelemetryMsgDescriptor.findFieldByName("key2"), true)
71 .setField(postTelemetryMsgDescriptor.findFieldByName("key3"), 3.0) 88 .setField(postTelemetryMsgDescriptor.findFieldByName("key3"), 3.0)
72 .setField(postTelemetryMsgDescriptor.findFieldByName("key4"), 4) 89 .setField(postTelemetryMsgDescriptor.findFieldByName("key4"), 4)
73 - .setField(postTelemetryMsgDescriptor.findFieldByName("key5"), "{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}") 90 + .setField(postTelemetryMsgDescriptor.findFieldByName("key5"), jsonObject)
74 .build(); 91 .build();
75 processTelemetryTest(POST_DATA_TELEMETRY_TOPIC, expectedKeys, postTelemetryMsg.toByteArray(), false); 92 processTelemetryTest(POST_DATA_TELEMETRY_TOPIC, expectedKeys, postTelemetryMsg.toByteArray(), false);
76 } 93 }
@@ -80,19 +97,27 @@ public abstract class AbstractMqttTimeseriesProtoIntegrationTest extends Abstrac @@ -80,19 +97,27 @@ public abstract class AbstractMqttTimeseriesProtoIntegrationTest extends Abstrac
80 String schemaStr = "syntax =\"proto3\";\n" + 97 String schemaStr = "syntax =\"proto3\";\n" +
81 "\n" + 98 "\n" +
82 "package test;\n" + 99 "package test;\n" +
83 - " \n" +  
84 - "message PostTelemetry {\n" +  
85 - "\n" +  
86 - " message Values {\n" +  
87 - " string key1 = 1;\n" +  
88 - " bool key2 = 2;\n" +  
89 - " double key3 = 3;\n" +  
90 - " int32 key4 = 4;\n" +  
91 - " string key5 = 5;\n" +  
92 - " }\n" +  
93 "\n" + 100 "\n" +
  101 + "message PostTelemetry {\n" +
94 " int64 ts = 1;\n" + 102 " int64 ts = 1;\n" +
95 " Values values = 2;\n" + 103 " Values values = 2;\n" +
  104 + " \n" +
  105 + " message Values {\n" +
  106 + " string key1 = 3;\n" +
  107 + " bool key2 = 4;\n" +
  108 + " double key3 = 5;\n" +
  109 + " int32 key4 = 6;\n" +
  110 + " JsonObject key5 = 7;\n" +
  111 + " }\n" +
  112 + " \n" +
  113 + " message JsonObject {\n" +
  114 + " int32 someNumber = 8;\n" +
  115 + " repeated int32 someArray = 9;\n" +
  116 + " NestedJsonObject someNestedObject = 10;\n" +
  117 + " message NestedJsonObject {\n" +
  118 + " string key = 11;\n" +
  119 + " }\n" +
  120 + " }\n" +
96 "}"; 121 "}";
97 super.processBeforeTest("Test Post Telemetry device proto payload", "Test Post Telemetry gateway proto payload", TransportPayloadType.PROTOBUF, POST_DATA_TELEMETRY_TOPIC, null, schemaStr, null, DeviceProfileProvisionType.DISABLED, null, null); 122 super.processBeforeTest("Test Post Telemetry device proto payload", "Test Post Telemetry gateway proto payload", TransportPayloadType.PROTOBUF, POST_DATA_TELEMETRY_TOPIC, null, schemaStr, null, DeviceProfileProvisionType.DISABLED, null, null);
98 List<String> expectedKeys = Arrays.asList("key1", "key2", "key3", "key4", "key5"); 123 List<String> expectedKeys = Arrays.asList("key1", "key2", "key3", "key4", "key5");
@@ -105,6 +130,23 @@ public abstract class AbstractMqttTimeseriesProtoIntegrationTest extends Abstrac @@ -105,6 +130,23 @@ public abstract class AbstractMqttTimeseriesProtoIntegrationTest extends Abstrac
105 ProtoFileElement transportProtoSchema = protoTransportPayloadConfiguration.getTransportProtoSchema(schemaStr); 130 ProtoFileElement transportProtoSchema = protoTransportPayloadConfiguration.getTransportProtoSchema(schemaStr);
106 DynamicSchema telemetrySchema = protoTransportPayloadConfiguration.getDynamicSchema(transportProtoSchema, "telemetrySchema"); 131 DynamicSchema telemetrySchema = protoTransportPayloadConfiguration.getDynamicSchema(transportProtoSchema, "telemetrySchema");
107 132
  133 + DynamicMessage.Builder nestedJsonObjectBuilder = telemetrySchema.newMessageBuilder("PostTelemetry.JsonObject.NestedJsonObject");
  134 + Descriptors.Descriptor nestedJsonObjectBuilderDescriptor = nestedJsonObjectBuilder.getDescriptorForType();
  135 + assertNotNull(nestedJsonObjectBuilderDescriptor);
  136 + DynamicMessage nestedJsonObject = nestedJsonObjectBuilder.setField(nestedJsonObjectBuilderDescriptor.findFieldByName("key"), "value").build();
  137 +
  138 + DynamicMessage.Builder jsonObjectBuilder = telemetrySchema.newMessageBuilder("PostTelemetry.JsonObject");
  139 + Descriptors.Descriptor jsonObjectBuilderDescriptor = jsonObjectBuilder.getDescriptorForType();
  140 + assertNotNull(jsonObjectBuilderDescriptor);
  141 + DynamicMessage jsonObject = jsonObjectBuilder
  142 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNumber"), 42)
  143 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 1)
  144 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 2)
  145 + .addRepeatedField(jsonObjectBuilderDescriptor.findFieldByName("someArray"), 3)
  146 + .setField(jsonObjectBuilderDescriptor.findFieldByName("someNestedObject"), nestedJsonObject)
  147 + .build();
  148 +
  149 +
108 DynamicMessage.Builder valuesBuilder = telemetrySchema.newMessageBuilder("PostTelemetry.Values"); 150 DynamicMessage.Builder valuesBuilder = telemetrySchema.newMessageBuilder("PostTelemetry.Values");
109 Descriptors.Descriptor valuesDescriptor = valuesBuilder.getDescriptorForType(); 151 Descriptors.Descriptor valuesDescriptor = valuesBuilder.getDescriptorForType();
110 assertNotNull(valuesDescriptor); 152 assertNotNull(valuesDescriptor);
@@ -114,7 +156,7 @@ public abstract class AbstractMqttTimeseriesProtoIntegrationTest extends Abstrac @@ -114,7 +156,7 @@ public abstract class AbstractMqttTimeseriesProtoIntegrationTest extends Abstrac
114 .setField(valuesDescriptor.findFieldByName("key2"), true) 156 .setField(valuesDescriptor.findFieldByName("key2"), true)
115 .setField(valuesDescriptor.findFieldByName("key3"), 3.0) 157 .setField(valuesDescriptor.findFieldByName("key3"), 3.0)
116 .setField(valuesDescriptor.findFieldByName("key4"), 4) 158 .setField(valuesDescriptor.findFieldByName("key4"), 4)
117 - .setField(valuesDescriptor.findFieldByName("key5"), "{\"someNumber\":42,\"someArray\":[1,2,3],\"someNestedObject\":{\"key\":\"value\"}}") 159 + .setField(valuesDescriptor.findFieldByName("key5"), jsonObject)
118 .build(); 160 .build();
119 161
120 DynamicMessage.Builder postTelemetryBuilder = telemetrySchema.newMessageBuilder("PostTelemetry"); 162 DynamicMessage.Builder postTelemetryBuilder = telemetrySchema.newMessageBuilder("PostTelemetry");
@@ -128,19 +128,8 @@ public class ProtoTransportPayloadConfiguration implements TransportPayloadTypeC @@ -128,19 +128,8 @@ public class ProtoTransportPayloadConfiguration implements TransportPayloadTypeC
128 List<MessageDefinition> messageDefinitions = new ArrayList<>(); 128 List<MessageDefinition> messageDefinitions = new ArrayList<>();
129 messageElementsList.forEach(messageElement -> { 129 messageElementsList.forEach(messageElement -> {
130 MessageDefinition.Builder messageDefinitionBuilder = MessageDefinition.newBuilder(messageElement.getName()); 130 MessageDefinition.Builder messageDefinitionBuilder = MessageDefinition.newBuilder(messageElement.getName());
131 - List<FieldElement> messageElementFields = messageElement.getFields();  
132 - List<OneOfElement> oneOfs = messageElement.getOneOfs();  
133 131
134 List<TypeElement> nestedTypes = messageElement.getNestedTypes(); 132 List<TypeElement> nestedTypes = messageElement.getNestedTypes();
135 - if (!messageElementFields.isEmpty()) {  
136 - addMessageFieldsToTheMessageDefinition(messageElementFields, messageDefinitionBuilder);  
137 - }  
138 - if (!oneOfs.isEmpty()) {  
139 - for (OneOfElement oneOfelement : oneOfs) {  
140 - MessageDefinition.OneofBuilder oneofBuilder = messageDefinitionBuilder.addOneof(oneOfelement.getName());  
141 - addMessageFieldsToTheOneOfDefinition(oneOfelement.getFields(), oneofBuilder);  
142 - }  
143 - }  
144 if (!nestedTypes.isEmpty()) { 133 if (!nestedTypes.isEmpty()) {
145 List<EnumElement> nestedEnumTypes = getEnumElements(nestedTypes); 134 List<EnumElement> nestedEnumTypes = getEnumElements(nestedTypes);
146 if (!nestedEnumTypes.isEmpty()) { 135 if (!nestedEnumTypes.isEmpty()) {
@@ -153,6 +142,17 @@ public class ProtoTransportPayloadConfiguration implements TransportPayloadTypeC @@ -153,6 +142,17 @@ public class ProtoTransportPayloadConfiguration implements TransportPayloadTypeC
153 List<MessageDefinition> nestedMessageDefinitions = getMessageDefinitions(nestedMessageTypes); 142 List<MessageDefinition> nestedMessageDefinitions = getMessageDefinitions(nestedMessageTypes);
154 nestedMessageDefinitions.forEach(messageDefinitionBuilder::addMessageDefinition); 143 nestedMessageDefinitions.forEach(messageDefinitionBuilder::addMessageDefinition);
155 } 144 }
  145 + List<FieldElement> messageElementFields = messageElement.getFields();
  146 + List<OneOfElement> oneOfs = messageElement.getOneOfs();
  147 + if (!oneOfs.isEmpty()) {
  148 + for (OneOfElement oneOfelement : oneOfs) {
  149 + MessageDefinition.OneofBuilder oneofBuilder = messageDefinitionBuilder.addOneof(oneOfelement.getName());
  150 + addMessageFieldsToTheOneOfDefinition(oneOfelement.getFields(), oneofBuilder);
  151 + }
  152 + }
  153 + if (!messageElementFields.isEmpty()) {
  154 + addMessageFieldsToTheMessageDefinition(messageElementFields, messageDefinitionBuilder);
  155 + }
156 messageDefinitions.add(messageDefinitionBuilder.build()); 156 messageDefinitions.add(messageDefinitionBuilder.build());
157 }); 157 });
158 return messageDefinitions; 158 return messageDefinitions;