org.wso2.iot.integration.samples.VirtualFireAlarmTestCase.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.iot.integration.samples.VirtualFireAlarmTestCase.java

Source

/*
 * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 * WSO2 Inc. licenses this file to you under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

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;
import org.apache.commons.logging.LogFactory;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Factory;
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.
 */
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) {
        this.userMode = userMode;
    }

    @BeforeClass(alwaysRun = true)
    public void initTest() throws Exception {
        super.init(userMode);
        restClient = new RestClient(backendHTTPSURL, Constants.APPLICATION_JSON, accessTokenString);
        if (userMode == TestUserMode.TENANT_ADMIN) {
            HttpResponse response = restClient
                    .post(Constants.VirtualFireAlarmConstants.ANALYTICS_ARTIFACTS_DEPLOYMENT_ENDPOINT, "");
            Assert.assertEquals(HttpStatus.SC_CREATED, response.getResponseCode());
        }
    }

    @Test(description = "This test case tests the virtual fire alarm enrollment")
    public void testEnrollment() throws Exception {
        // Time for deploying the carbon apps
        Thread.sleep(30000);
        RestClient client = new RestClient(backendHTTPSURL, Constants.APPLICATION_ZIP, accessTokenString);
        // Enroll an advanced agent and check whether that enrollment succeeds without issues.
        HttpResponse response = client.get(Constants.VirtualFireAlarmConstants.ENROLLMENT_ENDPOINT
                + "?deviceName=advanced&sketchType=virtual_firealarm_advanced");
        Assert.assertEquals("Advance fire alarm advance agent enrollment failed", HttpStatus.SC_OK,
                response.getResponseCode());

        // Enroll an simple agent and check whether that enrollment succeeds without issues.
        response = client.get(Constants.VirtualFireAlarmConstants.ENROLLMENT_ENDPOINT
                + "?deviceName=simple&sketchType=virtual_firealarm");
        Assert.assertEquals("Advance fire alarm advance agent enrollment failed", HttpStatus.SC_OK,
                response.getResponseCode());

        response = client
                .get(Constants.MobileDeviceManagement.GET_DEVICE_COUNT_ENDPOINT + "?type=virtual_firealarm");
        JsonArray jsonArray = new JsonParser().parse(response.getData()).getAsJsonObject()
                .getAsJsonArray("devices");
        Assert.assertEquals("Virtual fire alarm enrollment failed ", 2, jsonArray.size());

        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 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 clientId = deviceId1 + ":" + DEVICE_TYPE;
        MemoryPersistence persistence = new MemoryPersistence();
        MqttClient sampleClient = new MqttClient(broker, clientId, persistence);
        MqttConnectOptions connOpts = new MqttConnectOptions();
        connOpts.setUserName(accessToken);
        connOpts.setPassword("".toCharArray());
        connOpts.setKeepAliveInterval(120);
        connOpts.setCleanSession(true);
        log.info("Connecting to broker: " + broker);
        sampleClient.connect(connOpts);
        log.info("Connected");
        JsonObject fireAlarmPayload = PayloadGenerator.getJsonPayload(
                Constants.VirtualFireAlarmConstants.PAYLOAD_FILE,
                Constants.AndroidSenseEnrollment.PUBLISH_DATA_OPERATION);
        JsonObject eventPayload = fireAlarmPayload.getAsJsonObject("event");
        JsonObject metaDataPayload = eventPayload.getAsJsonObject("metaData");
        metaDataPayload.addProperty("deviceId", deviceId1);
        eventPayload.add("metaData", metaDataPayload);
        fireAlarmPayload.add("event", eventPayload);
        MqttMessage message;
        for (int i = 0; i < 100; i++) {
            message = new MqttMessage(fireAlarmPayload.toString().getBytes());
            message.setQos(qos);
            sampleClient.publish(topic, message);
            Thread.sleep(1000);
        }
        log.info("Message is published to Mqtt Client");
        sampleClient.disconnect();
        log.info("Mqtt Client is Disconnected");

        // Publishing message as a device with simple agent (device 2)
        topic = automationContext.getContextTenant().getDomain() + "/" + DEVICE_TYPE + "/" + deviceId2
                + "/temperature";
        clientId = deviceId2 + ":" + DEVICE_TYPE;
        persistence = new MemoryPersistence();
        sampleClient = new MqttClient(broker, clientId, persistence);
        connOpts = new MqttConnectOptions();
        connOpts.setUserName(accessToken);
        connOpts.setPassword("".toCharArray());
        connOpts.setKeepAliveInterval(120);
        connOpts.setCleanSession(true);
        log.info("Connecting to broker: " + broker);
        sampleClient.connect(connOpts);
        log.info("Connected");

        fireAlarmPayload = PayloadGenerator.getJsonPayload(Constants.VirtualFireAlarmConstants.PAYLOAD_FILE,
                Constants.AndroidSenseEnrollment.PUBLISH_DATA_OPERATION);
        eventPayload = fireAlarmPayload.getAsJsonObject("event");
        metaDataPayload = eventPayload.getAsJsonObject("metaData");
        metaDataPayload.addProperty("deviceId", deviceId2);
        eventPayload.add("metaData", metaDataPayload);
        fireAlarmPayload.add("event", eventPayload);
        for (int i = 0; i < 100; i++) {
            message = new MqttMessage(fireAlarmPayload.toString().getBytes());
            message.setQos(qos);
            sampleClient.publish(topic, message);
            Thread.sleep(1000);
        }
        log.info("Message is published to Mqtt Client");
        sampleClient.disconnect();
        log.info("Mqtt Client is Disconnected");
        currentTime = System.currentTimeMillis();
    }

    @Test(description = "Test whether the policy publishing from the server to device works", dependsOnMethods = {
            "testEventPublishing" })
    public void testPolicyPublishing() throws Exception {
        String deviceId2 = userMode == TestUserMode.TENANT_ADMIN ? tenantDeviceId2
                : VirtualFireAlarmTestCase.deviceId2;
        String topic = automationContext.getContextTenant().getDomain() + "/" + DEVICE_TYPE + "/" + deviceId2
                + "/operation/#";
        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<MqttMessage> mqttMessages = mqttSubscriberClient.getMqttMessages();
        Assert.assertEquals("Policy published message is not received by the mqtt listener. ", 2,
                mqttMessages.size());

    }

    // Test case related to virtual fire alarm added here as the batch cron runs for every 5 minutes and rather than
    // waiting for that we can check them in a latter test cases
    @Test(description = "Test whether data that is published is stored in analytics event table", dependsOnMethods = {
            "testPolicyPublishing" })
    public void testBatchDataPersistence() throws Exception {
        String deviceId1 = this.userMode == TestUserMode.TENANT_ADMIN ? tenantDeviceId1
                : VirtualFireAlarmTestCase.deviceId1;
        String deviceId2 = this.userMode == TestUserMode.TENANT_ADMIN ? tenantDeviceId2
                : VirtualFireAlarmTestCase.deviceId2;

        long MilliSecondDifference = System.currentTimeMillis() - VirtualFireAlarmTestCase.currentTime;
        if (MilliSecondDifference < 300000) {
            Thread.sleep(300000 - MilliSecondDifference);
        }
        String url = Constants.VirtualFireAlarmConstants.STATS_ENDPOINT + "/" + deviceId1;
        url += "?from=" + (VirtualFireAlarmTestCase.currentTime - 300000) / 1000 + "&to="
                + System.currentTimeMillis() / 1000;
        HttpResponse response = restClient.get(url);
        //        TODO:Need to verify this testcase
        //        JsonArray jsonArray = new JsonParser().parse(response.getData()).getAsJsonArray();
        //        Assert.assertEquals(
        //                "Published event for the device with the id " + deviceId1 + " is not inserted to "
        //                        + "analytics table", HttpStatus.SC_OK, response.getResponseCode());
        //        Assert.assertTrue(
        //                "Published event for the device with the id " + deviceId1 + " is not inserted to analytics table",
        //                jsonArray.size() > 0);
        //
        //        url = Constants.VirtualFireAlarmConstants.STATS_ENDPOINT + "/" + deviceId2;
        //        url += "?from=" + (VirtualFireAlarmTestCase.currentTime - 300000)/1000 + "&to=" + System.currentTimeMillis()
        //                /1000;
        //        response = restClient.get(url);
        //        log.info("PAYLOADXX : " + response.getData());
        //        jsonArray = new JsonParser().parse(response.getData()).getAsJsonArray();
        //        Assert.assertEquals(
        //                "Published event for the device with the id " + deviceId2 + " is not inserted to "
        //                        + "analytics table", HttpStatus.SC_OK, response.getResponseCode());
        //        Assert.assertTrue(
        //                "Published event for the device with the id " + deviceId2 + " is not inserted to analytics table",
        //                jsonArray.size() > 0);
    }
}