Skip to content

Commit 2b1ff5c

Browse files
Handle model updates for new devices in Validator
1 parent a6f81a6 commit 2b1ff5c

File tree

2 files changed

+48
-16
lines changed

2 files changed

+48
-16
lines changed

validator/src/main/java/com/google/daq/mqtt/validator/Validator.java

+24-16
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ public class Validator {
187187
"Message validate");
188188
private Set<String> targetDevices;
189189
private final LoggingHandler outputLogger;
190-
private ImmutableSet<String> expectedDevices;
190+
private Set<String> expectedDevices;
191191
private File outBaseDir;
192192
private File schemaRoot;
193193
private String schemaSpec;
@@ -244,6 +244,11 @@ public Map<String, ReportingDevice> getReportingDevices() {
244244
return reportingDevices;
245245
}
246246

247+
@VisibleForTesting
248+
public Set<String> getExpectedDevices() {
249+
return expectedDevices;
250+
}
251+
247252
Validator processArgs(List<String> argListRaw) {
248253
List<String> argList = new ArrayList<>(argListRaw);
249254
try {
@@ -453,7 +458,7 @@ private void setMessageTraceDir(String writeDirArg) {
453458
private void initializeExpectedDevices() {
454459
Set<String> siteDevices = siteModel.getDeviceIds();
455460
try {
456-
expectedDevices = ImmutableSet.copyOf(siteDevices);
461+
expectedDevices = new HashSet<>(siteDevices);
457462
for (String device : siteDevices) {
458463
ReportingDevice reportingDevice = newReportingDevice(device);
459464
try {
@@ -612,25 +617,28 @@ private void handleUdmiConfig(UdmiConfig udmiConfig) {
612617
}
613618

614619
private boolean handleMetadataUpdate(Map<String, String> attributes, Object messageObject) {
615-
String deviceId = attributes.get("deviceId");
616620
String subFolderRaw = attributes.get(SUBFOLDER_PROPERTY_KEY);
617621
String subTypeRaw = attributes.get(SUBTYPE_PROPERTY_KEY);
618622

619-
if (SubType.MODEL.value().equals(subTypeRaw) && SubFolder.UPDATE.value().equals(subFolderRaw)) {
620-
if (reportingDevices.containsKey(deviceId)) {
621-
ReportingDevice device = reportingDevices.get(deviceId);
622-
Metadata metadata = convertTo(Metadata.class,
623-
requireNonNull(messageObject, "messageObject is null"));
623+
if (!SubType.MODEL.value().equals(subTypeRaw)
624+
|| !SubFolder.UPDATE.value().equals(subFolderRaw)) {
625+
return false;
626+
}
624627

625-
if (catchToNull(() -> metadata.cloud.operation) == Operation.DELETE) {
626-
reportingDevices.remove(deviceId);
627-
} else if (metadata.system != null) {
628-
device.setMetadata(metadata);
629-
}
630-
}
631-
return true;
628+
String deviceId = attributes.get("deviceId");
629+
Metadata metadata = convertTo(Metadata.class,
630+
requireNonNull(messageObject, "messageObject is null"));
631+
ReportingDevice device = reportingDevices.computeIfAbsent(deviceId, this::newReportingDevice);
632+
633+
if (catchToNull(() -> metadata.cloud.operation) == Operation.DELETE) {
634+
reportingDevices.remove(deviceId);
635+
} else {
636+
ifNotNullThen(metadata.system, () -> {
637+
device.setMetadata(metadata);
638+
expectedDevices.add(deviceId);
639+
});
632640
}
633-
return false;
641+
return true;
634642
}
635643

636644
protected synchronized void validateMessage(MessageBundle message) {

validator/src/test/java/com/google/daq/mqtt/validator/BasicTest.java

+24
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.google.daq.mqtt.validator;
22

3+
import static com.google.udmi.util.Common.DEVICE_ID_KEY;
34
import static com.google.udmi.util.Common.TIMESTAMP_KEY;
45
import static com.google.udmi.util.JsonUtil.getInstant;
56
import static com.google.udmi.util.JsonUtil.isoConvert;
@@ -16,6 +17,7 @@
1617
import java.util.Date;
1718
import java.util.List;
1819
import java.util.Map;
20+
import java.util.Set;
1921
import org.junit.Test;
2022
import udmi.schema.CloudModel;
2123
import udmi.schema.CloudModel.Operation;
@@ -183,4 +185,26 @@ public void deviceDeleteMetadataUpdate() {
183185
assertNull(reportingDevices.get(TestCommon.DEVICE_ID));
184186
}
185187

188+
@Test
189+
public void addNewDeviceWithModelUpdate() {
190+
Metadata messageObject = new Metadata();
191+
messageObject.version = TestCommon.UDMI_VERSION;
192+
messageObject.system = new SystemModel();
193+
messageObject.system.description = "New description";
194+
MessageBundle messageBundle = getMessageBundle(MODEL_SUBTYPE, UPDATE_SUBFOLDER, messageObject);
195+
196+
String newDeviceId = TestCommon.DEVICE_ID + "_1";
197+
messageBundle.attributes.put(DEVICE_ID_KEY, newDeviceId);
198+
199+
validator.validateMessage(messageBundle);
200+
201+
Map<String, ReportingDevice> reportingDevices = validator.getReportingDevices();
202+
Set<String> expectedDevices = validator.getExpectedDevices();
203+
204+
assertTrue(expectedDevices.contains(newDeviceId));
205+
assertTrue(reportingDevices.containsKey(newDeviceId));
206+
assertEquals(messageObject.system.description,
207+
reportingDevices.get(newDeviceId).getMetadata().system.description);
208+
}
209+
186210
}

0 commit comments

Comments
 (0)