diff --git a/modules/integration/tests-common/integration-common/pom.xml b/modules/integration/tests-common/integration-common/pom.xml index 2270613b..12c927cb 100644 --- a/modules/integration/tests-common/integration-common/pom.xml +++ b/modules/integration/tests-common/integration-common/pom.xml @@ -140,6 +140,10 @@ org.wso2.carbon.integration.common.utils compile + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + diff --git a/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/Constants.java b/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/Constants.java index c5e4a70f..824e2c7d 100644 --- a/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/Constants.java +++ b/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/Constants.java @@ -451,6 +451,9 @@ public final class Constants { public static final String PAYLOAD_FILE = "virtual-fire-alarm-enrollment-payloads.json"; public static final String ANALYTICS_ARTIFACTS_DEPLOYMENT_ENDPOINT = "/api/device-mgt/v1.0/admin/devicetype/1.0.0/deploy/virtual_firealarm"; + public static final String POLICY_DATA = "POLICY_DATA"; + public static final String ACTIVATE_POLICY_ENDPOINT = "/api/device-mgt/v1.0/policies/activate-policy"; + public static final String APPLY_CHANGES_ENDPOINT = "/api/device-mgt/v1.0/policies/apply-changes"; } } diff --git a/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/MqttSubscriberClient.java b/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/MqttSubscriberClient.java new file mode 100644 index 00000000..cb8c2b6d --- /dev/null +++ b/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/MqttSubscriberClient.java @@ -0,0 +1,57 @@ +package org.wso2.iot.integration.common; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.eclipse.paho.client.mqttv3.*; +import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; + +import java.util.ArrayList; + +/** + * This is a mqtt subscriber client to receive . + */ +public class MqttSubscriberClient implements MqttCallback { + private static Log log = LogFactory.getLog(MqttSubscriberClient.class); + private ArrayList mqttMessages; + + @Override + public void connectionLost(Throwable throwable) { + // Not implemented + } + + @Override + public void messageArrived(String s, MqttMessage mqttMessage) throws Exception { + mqttMessages.add(mqttMessage); + } + + @Override + public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { + // Not implemented + } + + /** + * + * @param serverAddress Mqtt broker address + * @param clientId Client ID + * @param topicName Topic Name + * @throws MqttException Mqtt Exception + */ + public MqttSubscriberClient(String serverAddress, String clientId, String topicName, String accessToken) throws + MqttException { + mqttMessages = new ArrayList<>(); + MemoryPersistence persistence = new MemoryPersistence(); + MqttClient client = new MqttClient(serverAddress, clientId, persistence); + MqttConnectOptions connectOptions = new MqttConnectOptions(); + client.setCallback(this); + connectOptions.setUserName(accessToken); + connectOptions.setPassword("".toCharArray()); + connectOptions.setCleanSession(true); + client.connect(connectOptions); + client.subscribe(topicName); + } + + public ArrayList getMqttMessages() { + return mqttMessages; + } + +} diff --git a/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/samples/VirtualFireAlarmTestCase.java b/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/samples/VirtualFireAlarmTestCase.java index 232a90f6..e0852e58 100644 --- a/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/samples/VirtualFireAlarmTestCase.java +++ b/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/samples/VirtualFireAlarmTestCase.java @@ -21,6 +21,7 @@ package org.wso2.iot.integration.samples; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import com.google.gson.JsonPrimitive; import junit.framework.Assert; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.logging.Log; @@ -35,10 +36,13 @@ import org.testng.annotations.Test; import org.wso2.carbon.automation.engine.context.TestUserMode; import org.wso2.carbon.automation.test.utils.http.client.HttpResponse; import org.wso2.iot.integration.common.Constants; +import org.wso2.iot.integration.common.MqttSubscriberClient; import org.wso2.iot.integration.common.PayloadGenerator; import org.wso2.iot.integration.common.RestClient; import org.wso2.iot.integration.common.TestBase; +import java.util.ArrayList; + /** * This class tests the functionality of the virtual fire alarm. */ @@ -46,7 +50,12 @@ public class VirtualFireAlarmTestCase extends TestBase { private static Log log = LogFactory.getLog(VirtualFireAlarmTestCase.class); public static String deviceId1; public static String deviceId2; + public static String tenantDeviceId1; + public static String tenantDeviceId2; public static long currentTime; + private String broker = "tcp://localhost:1886"; + private String DEVICE_TYPE = "virtual_firealarm"; + private RestClient restClient; @Factory(dataProvider = "userModeProvider") public VirtualFireAlarmTestCase(TestUserMode userMode) { @@ -55,10 +64,10 @@ public class VirtualFireAlarmTestCase extends TestBase { @BeforeClass(alwaysRun = true) public void initTest() throws Exception { - super.init(userMode);; - RestClient client = new RestClient(backendHTTPSURL, Constants.APPLICATION_JSON, accessTokenString); + super.init(userMode); + restClient = new RestClient(backendHTTPSURL, Constants.APPLICATION_JSON, accessTokenString); if (userMode == TestUserMode.TENANT_ADMIN) { - HttpResponse response = client + HttpResponse response = restClient .post(Constants.VirtualFireAlarmConstants.ANALYTICS_ARTIFACTS_DEPLOYMENT_ENDPOINT, ""); Assert.assertEquals(HttpStatus.SC_CREATED, response.getResponseCode()); // Time for deploying the carbon apps @@ -85,20 +94,24 @@ public class VirtualFireAlarmTestCase extends TestBase { JsonArray jsonArray = new JsonParser().parse(response.getData()).getAsJsonObject().getAsJsonArray("devices"); Assert.assertEquals("Virtual fire alarm enrollment failed ", 2, jsonArray.size()); - deviceId1 = jsonArray.get(0).getAsJsonObject().getAsJsonPrimitive("deviceIdentifier").getAsString(); - deviceId2 = jsonArray.get(1).getAsJsonObject().getAsJsonPrimitive("deviceIdentifier").getAsString(); + if (userMode != TestUserMode.TENANT_ADMIN) { + deviceId1 = jsonArray.get(0).getAsJsonObject().getAsJsonPrimitive("deviceIdentifier").getAsString(); + deviceId2 = jsonArray.get(1).getAsJsonObject().getAsJsonPrimitive("deviceIdentifier").getAsString(); + } else { + tenantDeviceId1 = jsonArray.get(0).getAsJsonObject().getAsJsonPrimitive("deviceIdentifier").getAsString(); + tenantDeviceId2 = jsonArray.get(1).getAsJsonObject().getAsJsonPrimitive("deviceIdentifier").getAsString(); + } } @Test(description = "Test whether the publishing to a mqtt broker works fine without exceptions", dependsOnMethods = {"testEnrollment"} ) public void testEventPublishing() throws Exception { - String DEVICE_TYPE = "virtual_firealarm"; - + String deviceId1 = userMode == TestUserMode.TENANT_ADMIN ? tenantDeviceId1 : VirtualFireAlarmTestCase.deviceId1; + String deviceId2 = userMode == TestUserMode.TENANT_ADMIN ? tenantDeviceId2 : VirtualFireAlarmTestCase.deviceId2; // Publishing message as a device with simple agent (device 1) String topic = automationContext.getContextTenant().getDomain() + "/" + DEVICE_TYPE + "/" + deviceId1 + "/temperature"; int qos = 2; - String broker = "tcp://localhost:1886"; String clientId = deviceId1 + ":" + DEVICE_TYPE; MemoryPersistence persistence = new MemoryPersistence(); MqttClient sampleClient = new MqttClient(broker, clientId, persistence); @@ -154,4 +167,35 @@ public class VirtualFireAlarmTestCase extends TestBase { log.info("Mqtt Client is Disconnected"); currentTime = System.currentTimeMillis(); } + + @Test(description = "Test whether the policy publishing from the server to device works", dependsOnMethods = + {"testEnrollment"} ) + public void testPolicyPublishing() throws Exception { + String deviceId2 = userMode == TestUserMode.TENANT_ADMIN ? tenantDeviceId2 : VirtualFireAlarmTestCase.deviceId2; + String topic = automationContext.getContextTenant().getDomain() + "/" + DEVICE_TYPE + "/" + deviceId2 + "/#"; + String clientId = deviceId2 + ":" + DEVICE_TYPE; + HttpResponse response = restClient.post("/api/device-mgt/v1.0/policies", PayloadGenerator + .getJsonPayload(Constants.VirtualFireAlarmConstants.PAYLOAD_FILE, + Constants.VirtualFireAlarmConstants.POLICY_DATA).toString()); + Assert.assertEquals("Policy creation for virtual fire alarm failed", HttpStatus.SC_CREATED, + response.getResponseCode()); + JsonObject jsonObject = new JsonParser().parse(response.getData()).getAsJsonObject(); + String policyId = jsonObject.getAsJsonPrimitive("id").getAsString(); + JsonArray jsonArray = new JsonArray(); + jsonArray.add(new JsonPrimitive(policyId)); + response = restClient.post(Constants.VirtualFireAlarmConstants.ACTIVATE_POLICY_ENDPOINT, + jsonArray.toString()); + Assert.assertEquals("Policy activation for virtual fire alarm failed", HttpStatus.SC_OK, + response.getResponseCode()); + MqttSubscriberClient mqttSubscriberClient = new MqttSubscriberClient(broker, clientId, topic, accessToken); + response = restClient.put(Constants.VirtualFireAlarmConstants.APPLY_CHANGES_ENDPOINT, ""); + Assert.assertEquals("Applying changes to policy for virtual fire alarm failed", HttpStatus.SC_OK, + response.getResponseCode()); + // Allow some time for message delivery + Thread.sleep(20000); + ArrayList mqttMessages = mqttSubscriberClient.getMqttMessages(); + Assert.assertEquals("Policy published message is not received by the mqtt listener. ", 1, mqttMessages.size()); + + + } } diff --git a/modules/integration/tests-integration/src/test/resources/payloads/virtual-fire-alarm-enrollment-payloads.json b/modules/integration/tests-integration/src/test/resources/payloads/virtual-fire-alarm-enrollment-payloads.json index b90369ae..58b14913 100644 --- a/modules/integration/tests-integration/src/test/resources/payloads/virtual-fire-alarm-enrollment-payloads.json +++ b/modules/integration/tests-integration/src/test/resources/payloads/virtual-fire-alarm-enrollment-payloads.json @@ -10,5 +10,21 @@ "temperature": 30 } } + }, + "POLICY_DATA" : { + "policyName":"testpolicy", + "description":"","compliance":"enforce","ownershipType":null,"active":true, + "profile":{ + "profileName":"dvdv", + "deviceType":"virtual_firealarm", + "profileFeaturesList":[{ + "featureCode":"CONFIG", + "deviceType":"virtual_firealarm", + "content":{ + "policyDefinition":"define stream fireAlarmEventStream (deviceID string, temp int);\nfrom fireAlarmEventStream#window.time(30 sec)\nselect deviceID, max(temp) as maxValue\ngroup by deviceID\ninsert into analyzeStream for expired-events;\nfrom analyzeStream[maxValue > 50]\nselect maxValue\ninsert into bulbOnStream;\nfrom fireAlarmEventStream[temp < 50]\nselect deviceID, temp\ninsert into bulbOffStream;" + } + }] + }, + "roles":["ANY"] } } \ No newline at end of file diff --git a/pom.xml b/pom.xml index 13177a1b..643baf36 100644 --- a/pom.xml +++ b/pom.xml @@ -1512,7 +1512,7 @@ - 2.0.65 + 2.0.68 [2.0.0, 3.0.0) @@ -1520,7 +1520,7 @@ - 3.0.35 + 3.0.36 6.1.80