forked from community/product-iots-community
Merge pull request 'Add integration test to iot-community' (#6) from Gimhan-minion/community-product:integration-tests into master
Reviewed-on: community/community-product#6apim420
commit
bbc7b0f0b0
@ -0,0 +1,238 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
~ Copyright (C) 2018 - 2023 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
~
|
||||
~ Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
~
|
||||
~ Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ https://entgra.io/licenses/entgra-commercial/1.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.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<groupId>io.entgra.product.community</groupId>
|
||||
<artifactId>integration-test</artifactId>
|
||||
<version>5.1.3-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>io.entgra.product.community.iot.test.integration</artifactId>
|
||||
<name>Entgra IoT Community - Integration Test Module</name>
|
||||
<description>Integration Tests for Entgra IoT Community Product</description>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<inherited>false</inherited>
|
||||
<configuration>
|
||||
<argLine>-Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m</argLine>
|
||||
|
||||
<suiteXmlFiles>
|
||||
<suiteXmlFile>src/test/resources/testng-server-mgt.xml</suiteXmlFile>
|
||||
<suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
|
||||
</suiteXmlFiles>
|
||||
|
||||
<skipTests>${skipTests}</skipTests>
|
||||
|
||||
<systemProperties>
|
||||
<property>
|
||||
<name>maven.test.haltafterfailure</name>
|
||||
<value>false</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>java.io.tmpdir</name>
|
||||
<value>${project.build.directory}/</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>carbon.zip</name>
|
||||
<value>
|
||||
${basedir}/../../distribution/iot-community/target/${entgra-iot-community}.zip
|
||||
</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>framework.resource.location</name>
|
||||
<value>
|
||||
${basedir}/src/test/resources/
|
||||
</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>server.list</name>
|
||||
<value>
|
||||
IOT
|
||||
</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>usedefaultlisteners</name>
|
||||
<value>false</value>
|
||||
</property>
|
||||
<sec.verifier.dir>${project.build.directory}/security-verifier/</sec.verifier.dir>
|
||||
<instr.file>${basedir}/src/test/resources/instrumentation.txt</instr.file>
|
||||
<filters.file>${basedir}/src/test/resources/filters.txt</filters.file>
|
||||
</systemProperties>
|
||||
<workingDirectory>${basedir}/target</workingDirectory>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-dependency-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>copy-secVerifier</id>
|
||||
<phase>compile</phase>
|
||||
<goals>
|
||||
<goal>copy-dependencies</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<outputDirectory>${project.build.directory}/security-verifier</outputDirectory>
|
||||
<includeTypes>aar</includeTypes>
|
||||
<includeArtifactIds>SecVerifier</includeArtifactIds>
|
||||
<stripVersion>true</stripVersion>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>2.4</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>test-jar</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
<version>2.6</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>copy-resources-jks</id>
|
||||
<phase>compile</phase>
|
||||
<goals>
|
||||
<goal>copy-resources</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<outputDirectory>${basedir}/src/test/resources/keystores/products
|
||||
</outputDirectory>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>
|
||||
${project.build.directory}/tobeCopied/${entgra-iot-community}/repository/resources/security/
|
||||
</directory>
|
||||
<includes>
|
||||
<include>**/*.jks</include>
|
||||
</includes>
|
||||
</resource>
|
||||
</resources>
|
||||
</configuration>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>copy-stratos-jks</id>
|
||||
<phase>compile</phase>
|
||||
<goals>
|
||||
<goal>copy-resources</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<outputDirectory>${basedir}/src/test/resources/keystores/stratos
|
||||
</outputDirectory>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>
|
||||
${project.build.directory}/tobeCopied/${entgra-iot-community}/repository/resources/security/
|
||||
</directory>
|
||||
<includes>
|
||||
<include>**/*.jks</include>
|
||||
</includes>
|
||||
</resource>
|
||||
</resources>
|
||||
</configuration>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>copy-axis2files</id>
|
||||
<phase>compile</phase>
|
||||
<goals>
|
||||
<goal>copy-resources</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<outputDirectory>${basedir}/src/test/resources/axis2config
|
||||
</outputDirectory>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>
|
||||
${project.build.directory}/tobeCopied/${entgra-iot-community}/repository/conf/axis2/
|
||||
</directory>
|
||||
<includes>
|
||||
<include>**/*.xml</include>
|
||||
</includes>
|
||||
</resource>
|
||||
</resources>
|
||||
</configuration>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>copy-resources-mar</id>
|
||||
<phase>compile</phase>
|
||||
<goals>
|
||||
<goal>copy-resources</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<outputDirectory>${basedir}/src/test/resources/client/modules
|
||||
</outputDirectory>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>
|
||||
${project.build.directory}/tobeCopied/${entgra-iot-community}/repository/deployment/client/modules
|
||||
</directory>
|
||||
<includes>
|
||||
<include>**/*.mar</include>
|
||||
</includes>
|
||||
</resource>
|
||||
</resources>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.wso2.carbon.automation</groupId>
|
||||
<artifactId>org.wso2.carbon.automation.engine</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.wso2.carbon.automation</groupId>
|
||||
<artifactId>org.wso2.carbon.automation.test.utils</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.wso2.carbon.automationutils</groupId>
|
||||
<artifactId>org.wso2.carbon.integration.common.extensions</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.wso2.carbon.automation</groupId>
|
||||
<artifactId>org.wso2.carbon.automation.extensions</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<skipTests>false</skipTests>
|
||||
</properties>
|
||||
|
||||
</project>
|
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
*
|
||||
* Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
*
|
||||
* Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://entgra.io/licenses/entgra-commercial/1.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.common;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import org.testng.Assert;
|
||||
|
||||
/**
|
||||
* This class contains methods to make assertions easier and which are not available out of the box, from testng.
|
||||
*/
|
||||
public class AssertUtil {
|
||||
/**
|
||||
* This can be used to compare if to json strings are matched or not.
|
||||
*
|
||||
* @param expectedJsonPayload the expected json string.
|
||||
* @param realPayload real json string.
|
||||
* @param mustMatch If the real and expected must match, in order to become the test successful or not.
|
||||
*/
|
||||
public static void jsonPayloadCompare(String expectedJsonPayload, String realPayload, boolean mustMatch) {
|
||||
JsonElement jsonElement = new JsonParser().parse(expectedJsonPayload);
|
||||
JsonObject expectedPayloadObject = jsonElement.getAsJsonObject();
|
||||
jsonElement = new JsonParser().parse(realPayload);
|
||||
JsonObject realPayloadObject = jsonElement.getAsJsonObject();
|
||||
if (mustMatch) {
|
||||
Assert.assertTrue(realPayloadObject.equals(expectedPayloadObject));
|
||||
} else {
|
||||
Assert.assertFalse(realPayloadObject.equals(expectedPayloadObject));
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,510 @@
|
||||
/*
|
||||
* Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
*
|
||||
* Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
*
|
||||
* Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://entgra.io/licenses/entgra-commercial/1.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.common;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* Constants used through out the test suite are defined here.
|
||||
*/
|
||||
public final class Constants {
|
||||
public static final String DEVICE_ID = "d24f870f390352a41234";
|
||||
public static final String NUMBER_NOT_EQUAL_TO_DEVICE_ID = "1111";
|
||||
public static final String DEVICE_IMEI = "123123123";
|
||||
public static final String AUTOMATION_CONTEXT = "IOT";
|
||||
public static final String APPLICATION_JSON = "application/json";
|
||||
public static final String APPLICATION_ZIP = "application/zip";
|
||||
public static final String APPLICATION_URL_ENCODED = "application/x-www-form-urlencoded";
|
||||
public static final String OAUTH_CLIENT_ID = "client_id";
|
||||
public static final String OAUTH_CLIENT_SECRET = "client_secret";
|
||||
public static final String OAUTH_ACCESS_TOKEN = "access_token";
|
||||
public static final String SCOPE = "scope";
|
||||
public static final String ANDROID_DEVICE_TYPE = "android";
|
||||
public static final String HTTP_METHOD_POST = "POST";
|
||||
public static final String HTTP_METHOD_PUT = "PUT";
|
||||
public static final String HTTP_METHOD_GET = "GET";
|
||||
public static final String HTTP_METHOD_DELETE = "DELETE";
|
||||
public static final String DEVICE_IDENTIFIER_KEY = "deviceIdentifier";
|
||||
public static final String DEVICE_IDENTIFIERS_KEY = "deviceIDs";
|
||||
public static final String CONTENT_TYPE = "Content-Type";
|
||||
public static final String APPLICATION_SOAP_XML = "application/soap+xml; charset=utf-8";
|
||||
public static final String UTF8 = "UTF-8";
|
||||
public static final int HTTPS_ANALYTICS_PORT = 9445;
|
||||
|
||||
public static final String HTTPS = "https";
|
||||
public static final String HTTP = "http";
|
||||
|
||||
public static final int HTTPS_GATEWAY_PORT = 8243;
|
||||
public static final int HTTP_GATEWAY_PORT = 8280;
|
||||
|
||||
public static final class APIApplicationRegistration {
|
||||
public static final String API_APP_REGISTRATION_ENDPOINT = "/api-application-registration/register";
|
||||
public static final String TOKEN_ENDPOINT = "/token";
|
||||
public static final String MULTI_TENANT_OAUTH_TOKEN_PAYLOAD = "&grant_type=password&scope=perm:android:enroll"
|
||||
+ " perm:android:wipe perm:android:ring perm:android:lock-devices perm:android:configure-vpn "
|
||||
+ "perm:android:configure-wifi perm:android:enroll perm:android:uninstall-application "
|
||||
+ "perm:android:manage-configuration perm:android:location perm:android:install-application "
|
||||
+ "perm:android:mute perm:android:change-lock-code perm:android:blacklist-applications "
|
||||
+ "perm:android:set-password-policy perm:android:encrypt-storage perm:android:clear-password "
|
||||
+ "perm:android:enterprise-wipe perm:android:info perm:android:view-configuration "
|
||||
+ "perm:android:upgrade-firmware perm:android:set-webclip perm:android:send-notification "
|
||||
+ "perm:android:disenroll perm:android:update-application perm:android:unlock-devices "
|
||||
+ "perm:android:control-camera perm:android:reboot perm:android:logcat appm:read appm:subscribe "
|
||||
+ "perm:sign-csr perm:admin:devices:view perm:roles:add perm:roles:add-users perm:roles:update "
|
||||
+
|
||||
"perm:roles:permissions perm:roles:details perm:roles:view perm:roles:create-combined-role " +
|
||||
"perm:roles:delete "
|
||||
+ "perm:dashboard:vulnerabilities perm:dashboard:non-compliant-count perm:dashboard:non-compliant "
|
||||
+ "perm:dashboard:by-groups perm:dashboard:device-counts perm:dashboard:feature-non-compliant "
|
||||
+
|
||||
"perm:dashboard:count-overview perm:dashboard:filtered-count perm:dashboard:details perm:get-activity "
|
||||
+
|
||||
"perm:devices:delete perm:devices:applications perm:devices:effective-policy " +
|
||||
"perm:devices:compliance-data "
|
||||
+
|
||||
"perm:devices:features perm:devices:operations perm:devices:search perm:devices:details " +
|
||||
"perm:devices:update "
|
||||
+ "perm:devices:view perm:view-configuration perm:manage-configuration perm:policies:remove "
|
||||
+
|
||||
"perm:policies:priorities perm:policies:deactivate perm:policies:get-policy-details " +
|
||||
"perm:policies:manage "
|
||||
+ "perm:policies:activate perm:policies:update perm:policies:changes perm:policies:get-details "
|
||||
+
|
||||
"perm:users:add perm:users:details perm:users:count perm:users:delete perm:users:roles " +
|
||||
"perm:users:user-details "
|
||||
+
|
||||
"perm:users:credentials perm:users:search perm:users:is-exist perm:users:update " +
|
||||
"perm:users:send-invitation "
|
||||
+ "perm:admin-users:view perm:groups:devices perm:groups:update perm:groups:add perm:groups:device "
|
||||
+
|
||||
"perm:groups:devices-count perm:groups:remove perm:groups:groups perm:groups:groups-view " +
|
||||
"perm:groups:share "
|
||||
+
|
||||
"perm:groups:count perm:groups:roles perm:groups:devices-remove perm:groups:devices-add " +
|
||||
"perm:groups:assign "
|
||||
+
|
||||
"perm:device-types:features perm:device-types:types perm:applications:install " +
|
||||
"perm:applications:uninstall "
|
||||
+
|
||||
"perm:admin-groups:count perm:admin-groups:view perm:notifications:mark-checked " +
|
||||
"perm:notifications:view "
|
||||
+ "perm:admin:certificates:delete perm:admin:certificates:details perm:admin:certificates:view "
|
||||
+ "perm:admin:certificates:add perm:admin:certificates:verify perm:ios:enroll perm:ios:view-device "
|
||||
+
|
||||
"perm:ios:apn perm:ios:ldap perm:ios:enterprise-app perm:ios:store-application " +
|
||||
"perm:ios:remove-application "
|
||||
+ "perm:ios:app-list perm:ios:profile-list perm:ios:lock perm:ios:enterprise-wipe perm:ios:device-info "
|
||||
+
|
||||
"perm:ios:restriction perm:ios:email perm:ios:cellular perm:ios:applications perm:ios:wifi " +
|
||||
"perm:ios:ring "
|
||||
+ "perm:ios:location perm:ios:notification perm:ios:airplay perm:ios:caldav perm:ios:cal-subscription "
|
||||
+
|
||||
"perm:ios:passcode-policy perm:ios:webclip perm:ios:vpn perm:ios:per-app-vpn " +
|
||||
"perm:ios:app-to-per-app-vpn "
|
||||
+ "perm:ios:app-lock perm:ios:clear-passcode perm:ios:remove-profile perm:ios:get-restrictions "
|
||||
+ "perm:ios:wipe-data perm:admin perm:android:applications perm:devicetype:deployment "
|
||||
+ "perm:android-sense:enroll perm:admin:device-type perm:device-types:events "
|
||||
+ "perm:device-types:events:view perm:device-types:types perm:device:enroll perm:device:disenroll "
|
||||
+
|
||||
"perm:device:modify perm:device:operations perm:device:publish-event perm:devices:operations " +
|
||||
"perm:devices:operations perm:firealarm:enroll ";
|
||||
|
||||
public static final String OAUTH_TOKEN_PAYLOAD = "username=admin&password=admin" +
|
||||
MULTI_TENANT_OAUTH_TOKEN_PAYLOAD;
|
||||
private static StringBuffer dynamicClientPayloadBuffer = new StringBuffer();
|
||||
public static final String API_APP_REGISTRATION_PAYLOAD = dynamicClientPayloadBuffer.append("{ \n"
|
||||
+
|
||||
" \"applicationName\":\"app_123456\",\n" +
|
||||
" \"isAllowedToAllDomains\":false,\n"
|
||||
+
|
||||
" \"tags\":[\"android\", \"device_management\"],\n" +
|
||||
" \"isMappingAnExistingOAuthApp\":false\n"
|
||||
+ "}")
|
||||
.toString();
|
||||
public static final String PERMISSION_LIST =
|
||||
"appm:read appm:subscribe perm:admin-groups:count perm:admin-groups:view perm:admin-users:view " +
|
||||
"perm:admin:certificates:add perm:admin:certificates:delete perm:admin:certificates:details " +
|
||||
"perm:admin:certificates:verify perm:admin:certificates:view perm:admin:device-type " +
|
||||
"perm:admin:devices:view perm:android-sense:enroll perm:android:applications " +
|
||||
"perm:android:blacklist-applications perm:android:change-lock-code " +
|
||||
"perm:android:clear-password perm:android:configure-vpn perm:android:configure-wifi " +
|
||||
"perm:android:control-camera perm:android:disenroll perm:android:encrypt-storage " +
|
||||
"perm:android:enroll perm:android:enterprise-wipe perm:android:info " +
|
||||
"perm:android:install-application perm:android:location perm:android:lock-devices " +
|
||||
"perm:android:logcat perm:android:manage-configuration perm:android:mute perm:android:reboot " +
|
||||
"perm:android:ring perm:android:send-notification perm:android:set-password-policy " +
|
||||
"perm:android:set-webclip perm:android:uninstall-application perm:android:unlock-devices " +
|
||||
"perm:android:update-application perm:android:upgrade-firmware " +
|
||||
"perm:android:view-configuration perm:android:wipe perm:applications:install " +
|
||||
"perm:applications:uninstall perm:device-types:events perm:device-types:events:view " +
|
||||
"perm:device-types:features perm:device-types:types perm:device:disenroll perm:device:enroll " +
|
||||
"perm:device:modify perm:device:operations perm:device:publish-event " +
|
||||
"perm:devices:applications perm:devices:compliance-data perm:devices:delete " +
|
||||
"perm:devices:details perm:devices:effective-policy perm:devices:features " +
|
||||
"perm:devices:operations perm:devices:search perm:devices:update perm:devices:view " +
|
||||
"perm:devicetype:deployment perm:firealarm:enroll perm:get-activity perm:groups:add " +
|
||||
"perm:groups:assign perm:groups:count perm:groups:device perm:groups:devices " +
|
||||
"perm:groups:devices-add perm:groups:devices-count perm:groups:devices-remove " +
|
||||
"perm:groups:groups perm:groups:groups-view perm:groups:remove perm:groups:roles " +
|
||||
"perm:groups:share perm:groups:update perm:manage-configuration " +
|
||||
"perm:notifications:mark-checked perm:notifications:view perm:policies:activate " +
|
||||
"perm:policies:changes perm:policies:deactivate perm:policies:get-details " +
|
||||
"perm:policies:get-policy-details perm:policies:manage perm:policies:priorities " +
|
||||
"perm:policies:remove perm:policies:update perm:roles:add perm:roles:add-users " +
|
||||
"perm:roles:create-combined-role perm:roles:delete perm:roles:details perm:roles:permissions " +
|
||||
"perm:roles:update perm:roles:view perm:users:add perm:users:count perm:users:credentials " +
|
||||
"perm:users:delete perm:users:details perm:users:is-exist perm:users:roles perm:users:search " +
|
||||
"perm:users:send-invitation perm:users:update perm:users:user-details perm:view-configuration";
|
||||
|
||||
private APIApplicationRegistration() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
public static final class AndroidEnrollment {
|
||||
public static final String ENROLLMENT_PAYLOAD_FILE_NAME = "android-enrollment-payloads.json";
|
||||
public static final String ENROLLMENT_RESPONSE_PAYLOAD_FILE_NAME = "android-enrollment-response-payloads.json";
|
||||
public static final String ENROLLMENT_ENDPOINT = "/api/device-mgt/android/v1.0/devices";
|
||||
public static final String ENROLLMENT_GROUP = "android-enrollment";
|
||||
public static final String UPDATE_APPLICATION_METHOD = "UPDATE_APPLICATIONS";
|
||||
public static final String ANDROID_DEVICE_TYPE = "android";
|
||||
public static final String GET_PENDING_OPERATIONS_METHOD = "GET_PENDING_OPERATIONS";
|
||||
|
||||
private AndroidEnrollment() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
public static final class AndroidPolicy {
|
||||
public static final String POLICY_RESPONSE_PAYLOAD_FILE_NAME = "android-policy-response-payloads.json";
|
||||
public static final String POLICY_ENDPOINT = "/mdm-android-agent/policy/";
|
||||
public static final String POLICY_GROUP = "android-policy";
|
||||
public static final String GET_EFFECTIVE_POLICY = "getEffectivePolicy";
|
||||
|
||||
private AndroidPolicy() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
public static final class WindowsEnrollment {
|
||||
public static final String DISCOVERY_GET_URL = "/mdm-windows-agent/services/discovery/get";
|
||||
public static final String DISCOVERY_POST_URL = "/mdm-windows-agent/services/discovery/post";
|
||||
public static final String BSD_URL = "/mdm-windows-agent/services/federated/bst/authentication";
|
||||
public static final String MS_EXCEP = "/mdm-windows-agent/services/certificatepolicy/xcep";
|
||||
public static final String WINDOWS_ENROLLMENT_GROUP = "windows-enrollment";
|
||||
public static final String WSTEP_URL = "/mdm-windows-agent/services/deviceenrolment/wstep";
|
||||
public static final String SYNC_ML_URL = "/mdm-windows-agent/services/syncml/devicemanagement/request";
|
||||
public static final String DISCOVERY_POST_FILE = "windows" + File.separator + "enrollment" + File
|
||||
.separator + "discovery-post.xml";
|
||||
public static final String MS_XCEP_FILE =
|
||||
"windows" + File.separator + "enrollment" + File.separator + "ms_xcep.xml";
|
||||
public static final String WS_STEP_FILE =
|
||||
"windows" + File.separator + "enrollment" + File.separator + "wstep.xml";
|
||||
public static final String BSD_PAYLOAD =
|
||||
"{\"credentials\" : {\"username\" : \"admin\", \"email\" : \"admin@wso2.com\", " +
|
||||
"\"password\" : \"admin\", \"ownership\" : \"BYOD\", " +
|
||||
"\"token\" : \"cbe53efd46ec612c456540f8dfef5428\"}}";
|
||||
|
||||
private WindowsEnrollment() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
public static final class AndroidOperations {
|
||||
public static final String PAYLOAD_COMMON = "[" + DEVICE_ID + "]";
|
||||
|
||||
public static final String OPERATION_PAYLOAD_FILE_NAME = "android-operation-payloads.json";
|
||||
public static final String OPERATIONS_GROUP = "operations";
|
||||
|
||||
public static final String CAMERA_OPERATION = "control-camera";
|
||||
public static final String CAMERA_OPERATION_PAYLOAD = "{\n" + " \"operation\": {\n"
|
||||
+ " \"enabled\": false\n" + " },\n" + " \"deviceIDs\": [\n" + " \"" + DEVICE_ID + "\" \n"
|
||||
+ " ]\n" + "}";
|
||||
|
||||
public static final String WIPE_DATA_OPERATION = "wipe_data";
|
||||
public static final String WIPE_DATA_OPERATION_PAYLOAD = "wipe_data";
|
||||
|
||||
public static final String INSTALL_APPS_OPERATION = "install_apps";
|
||||
public static final String NOTIFICATION_OPERATION = "notification";
|
||||
public static final String WIFI_OPERATION = "wifi";
|
||||
public static final String ENCRYPT_OPERATION = "encrypt";
|
||||
public static final String CHANGE_LOCK_OPERATION = "unlock-devices";
|
||||
public static final String PASSWORD_POLICY_OPERATION = "password_policy";
|
||||
public static final String WEB_CLIP_OPERATION = "web_clip";
|
||||
public static final String OPERATION_ENDPOINT = "/api/device-mgt/android/v1.0/admin/devices/";
|
||||
public static final String UNLOCK_ENDPOINT = "unlock-devices";
|
||||
public static final String UNLOCK_OPERATION_PAYLOAD = PAYLOAD_COMMON;
|
||||
|
||||
public static final String LOCK_ENDPOINT = "lock-devices";
|
||||
public static final String LOCK_OPERATION_PAYLOAD = "{ \"deviceIDs\": [\"" + DEVICE_ID + "\"],"
|
||||
+ "\"operation\": { \"message\": \"string\", \"hardLockEnabled\": false }}";
|
||||
|
||||
public static final String LOCATION_ENDPOINT = "location";
|
||||
public static final String LOCATION_PAYLOAD = PAYLOAD_COMMON;
|
||||
|
||||
public static final String CLEAR_PASSWORD_ENDPOINT = "clear-password";
|
||||
public static final String CLEAR_PASSWORD_PAYLOAD = PAYLOAD_COMMON;
|
||||
|
||||
public static final String DEVICE_INFO_ENDPOINT = "info";
|
||||
public static final String DEVICE_INFO_PAYLOAD = "[\"" + DEVICE_ID + "\"]";
|
||||
|
||||
public static final String DEVICE_LOGCAT_ENDPOINT = "logcat";
|
||||
|
||||
public static final String ENTERPRISE_WIPE_ENDPOINT = "enterprise-wipe";
|
||||
public static final String ENTERPRISE_WIPE_PAYLOAD = PAYLOAD_COMMON;
|
||||
|
||||
public static final String WIPE_DATA_ENDPOINT = "wipe";
|
||||
public static final String WIPE_DATA_PAYLOAD = "{\n" + " \"operation\": {\n" + " \"pin\": \"string\"\n"
|
||||
+ " },\n" + " \"deviceIDs\": [\n" + " \"" + DEVICE_ID + "\"\n" + " ]\n" + "}";
|
||||
|
||||
public static final String APPLICATION_LIST_ENDPOINT = "applications";
|
||||
public static final String APPLICATION_LIST_PAYLOAD = PAYLOAD_COMMON;
|
||||
|
||||
public static final String RING_ENDPOINT = "ring";
|
||||
public static final String RING_PAYLOAD = PAYLOAD_COMMON;
|
||||
|
||||
public static final String MUTE_ENDPOINT = "mute";
|
||||
public static final String MUTE_PAYLOAD = PAYLOAD_COMMON;
|
||||
|
||||
public static final String INSTALL_APPS_ENDPOINT = "install-application";
|
||||
public static final String UPDATE_APPS_ENDPOINT = "update-application";
|
||||
public static final String INSTALL_APPS_PAYLOAD = "{\n" + " \"deviceIDs\": [\n" + " \"" + DEVICE_ID + "\"\n"
|
||||
+ " ],\n" + " \"operation\": {\n" + " \"appIdentifier\": \"string\",\n"
|
||||
+ " \"type\": \"string\",\n" + " \"url\": \"string\"\n" + " }\n" + "}";
|
||||
|
||||
public static final String UNINSTALL_APPS_ENDPOINT = "uninstall-application";
|
||||
public static final String UNINSTALL_APPS_PAYLOAD = "{\n" + " \"deviceIDs\": [\n"
|
||||
+ " \"" + DEVICE_ID + "\"\n" + " ],\n" + " \"operation\": {\n"
|
||||
+ " \"appIdentifier\": \"string\",\n" + " \"type\": \"enterprise\"} }";
|
||||
|
||||
public static final String BLACKLIST_APPS_ENDPOINT = "blacklist-applications";
|
||||
public static final String BLACKLIST_OPERATION = "black_list_application";
|
||||
|
||||
public static final String UPGRADE_FIRMWARE_ENDPOINT = "upgrade-firmware";
|
||||
public static final String UPGRADE_FIRMWARE_OPERATION = "upgrade-firmware";
|
||||
|
||||
public static final String VPN_ENDPOINT = "configure-vpn";
|
||||
public static final String VPN_OPERATION = "vpn";
|
||||
|
||||
public static final String NOTIFICATION_ENDPOINT = "send-notification";
|
||||
public static final String NOTIFICATION_PAYLOAD = "{\n" + " \"deviceIDs\": [\n" + " \"" + DEVICE_ID + "\"\n"
|
||||
+ " ],\n" + " \"operation\": {\n" + " \"messageText\": \"string\",\n"
|
||||
+ " \"messageTitle\": \"string\"\n" + " }\n" + "}";
|
||||
|
||||
public static final String WIFI_ENDPOINT = "configure-wifi";
|
||||
public static final String WIFI_PAYLOAD = "{\n" + " \"operation\": {\n" + " \"ssid\": \"string\",\n"
|
||||
+ " \"password\": \"string\"\n" + " },\n" + " \"deviceIDs\": [\n" + " \"" + DEVICE_ID + "\"\n"
|
||||
+ " ]\n" + "}";
|
||||
|
||||
public static final String ENCRYPT_ENDPOINT = "encrypt-storage";
|
||||
public static final String ENCRYPT_PAYLOAD = "{\n" + " \"operation\": {\n" + " \"encrypted\": false\n"
|
||||
+ " },\n" + " \"deviceIDs\": [\n" + " \"" + DEVICE_ID + "\"\n" + " ]\n" + "}";
|
||||
|
||||
public static final String REBOOT_ENDPOINT = "reboot";
|
||||
public static final String REBOOT_PAYLOAD = PAYLOAD_COMMON;
|
||||
;
|
||||
|
||||
public static final String CHANGE_LOCK_ENDPOINT = "change-lock-code";
|
||||
public static final String CHANGE_LOCK_PAYLOAD = "{\n" + " \"operation\": {\n" + " \"lockCode\": \"0000\"\n"
|
||||
+ " },\n" + " \"deviceIDs\": [\n" + " \"" + DEVICE_ID + "\"\n" + " ]\n" + "}\n";
|
||||
|
||||
public static final String PASSWORD_POLICY_ENDPOINT = "set-password-policy";
|
||||
public static final String PASSWORD_POLICY_PAYLOAD = "{\n" + " \"operation\": {\n"
|
||||
+ " \"maxFailedAttempts\": 0,\n" + " \"minLength\": 0,\n" + " \"pinHistory\": 0,\n"
|
||||
+ " \"minComplexChars\": 0,\n" + " \"maxPINAgeInDays\": 0,\n"
|
||||
+ " \"requireAlphanumeric\": false,\n" + " \"allowSimple\": false\n" + " },\n"
|
||||
+ " \"deviceIDs\": [\n" + " \"" + DEVICE_ID + "\"\n" + " ]\n" + "}";
|
||||
|
||||
public static final String WEB_CLIP_ENDPOINT = "set-webclip";
|
||||
public static final String WEB_CLIP_PAYLOAD = "{\n" + " \"operation\": {\n" + " \"identity\": \"string\",\n"
|
||||
+ " \"title\": \"string\",\n" + " \"type\": \"string\"\n" + " },\n" + " \"deviceIDs\": [\n"
|
||||
+ " \"" + DEVICE_ID + "\"\n" + " ]\n" + "}";
|
||||
|
||||
private AndroidOperations() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static final class AndroidConfigurationManagement {
|
||||
public static final String DEVICE_CONFIGURATION_GROUP = "android-config-mgt";
|
||||
public static final String CONFIG_MGT_ENDPOINT = "/api/device-mgt/android/v1.0/configuration/";
|
||||
public static final String LICENSE_ENDPOINT = "license";
|
||||
public static final String PAYLOAD_FILE_NAME = "android-configuration-payloads.json";
|
||||
public static final String RESPONSE_PAYLOAD_FILE_NAME = "android-config-response-payloads.json";
|
||||
|
||||
private AndroidConfigurationManagement() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
public static final class OperationManagement {
|
||||
public static final String PATH_APPS = "/apps";
|
||||
public static final String OPERATION_MANAGEMENT_GROUP = "api-policy-mgt";
|
||||
public static final String GET_DEVICE_APPS_ENDPOINT = "/mdm-admin/operations/android/";
|
||||
public static final String GET_DEVICE_OPERATIONS_ENDPOINT = "/mdm-admin/operations/android/";
|
||||
|
||||
private OperationManagement() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
public static final class MobileDeviceManagement {
|
||||
public static final String MOBILE_DEVICE_MANAGEMENT_GROUP = "mobile-device-mgt";
|
||||
public static final String GET_DEVICE_COUNT_ENDPOINT = "/api/device-mgt/v1.0/devices";
|
||||
public static final String CHANGE_DEVICE_STATUS_ENDPOINT = "/api/device-mgt/v1.0/devices/";
|
||||
public static final String NO_OF_DEVICES = "1";
|
||||
public static final String GET_ALL_DEVICES_ENDPOINT = "/api/device-mgt/v1.0/devices/";
|
||||
public static final String USER_DEVICE_ENDPOINT = "user-devices";
|
||||
public static final String ADVANCE_SEARCH_ENDPOINT = "search-devices";
|
||||
public static final String ADVANCE_SEARCH_OPERATION = "ADVANCE_SEARCH";
|
||||
public static final String REQUEST_PAYLOAD_FILE_NAME = "mobile-device-mgt-payloads.json";
|
||||
public static final String UPDATE_PAYLOAD_OPERATION = "UPDATE_DEVICE_INFO";
|
||||
public static final String VIEW_DEVICE_TYPES_ENDPOINT = "/mdm-admin/devices/types";
|
||||
public static final String NO_DEVICE = "{\"devices\":[],\"count\":0}";
|
||||
|
||||
private MobileDeviceManagement() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static final class UserManagement {
|
||||
public static final String USER_MANAGEMENT_GROUP = "user-mgt";
|
||||
public static final String USER_NAME = "username123";
|
||||
public static final String USER_ENDPOINT = "/api/device-mgt/v1.0/users";
|
||||
public static final String USER_PAYLOAD_FILE_NAME = "user-payloads.json";
|
||||
public static final String USER_RESPONSE_PAYLOAD_FILE_NAME = "user-response-payloads.json";
|
||||
public static final String GET_ROLES_METHOD = "GET_ROLES";
|
||||
public static final String RESET_PASSWORD_PAYLOAD = "RESET_PASSWORD";
|
||||
|
||||
private UserManagement() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static final class RoleManagement {
|
||||
public static final String ROLE_MANAGEMENT_GROUP = "role-mgt";
|
||||
public static final String ROLE_MANAGEMENT_END_POINT = "/api/device-mgt/v1.0/roles";
|
||||
public static final String ROLE_PAYLOAD_FILE_NAME = "role-payloads.json";
|
||||
public static final String ROLE_RESPONSE_PAYLOAD_FILE_NAME = "role-response-payloads.json";
|
||||
public static final String GET_FILTERED_ROLED_METHOD = "GET_FILTERED_ROLES";
|
||||
public static final String UPDATE_ROLES_METHOD = "UPDATE_USERS";
|
||||
|
||||
private RoleManagement() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static final class PolicyManagement {
|
||||
public static final String POLICY_MANAGEMENT_GROUP = "policy-mgt";
|
||||
public static final String ADD_POLICY_ENDPOINT = "/mdm-admin/policies/active-policy";
|
||||
public static final String POLICY_PAYLOAD_FILE_NAME = "policy-payloads.json";
|
||||
public static final String POLICY_RESPONSE_PAYLOAD_FILE_NAME = "policy-response-payloads.json";
|
||||
public static final String UPDATE_POLICY_ENDPOINT = "/mdm-admin/policies/1";
|
||||
public static final String REMOVE_POLICY_ENDPOINT = "/mdm-admin/policies/bulk-remove";
|
||||
public static final String REMOVE_POLICY_PAYLOAD_FILE_NAME = "[1]";
|
||||
public static final String VIEW_POLICY_LIST_ENDPOINT = "/api/device-mgt/v1.0/policies";
|
||||
|
||||
private PolicyManagement() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
public static final class FeatureManagement {
|
||||
public static final String FEATURE_MANAGEMENT_GROUP = "feature-mgt";
|
||||
public static final String VIEW_FEATURES_ENDPOINT = "/mdm-admin/features/android";
|
||||
|
||||
private FeatureManagement() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
public static final class LicenseManagement {
|
||||
public static final String LICENSE_MANAGEMENT_GROUP = "license-mgt";
|
||||
public static final String GET_LICENSE_ENDPOINT = "/mdm-admin/license/android/en_US";
|
||||
public static final String LICENSE_RESPONSE_PAYLOAD_FILE_NAME = "license-response-payloads.json";
|
||||
|
||||
private LicenseManagement() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static final class ConfigurationManagement {
|
||||
public static final String CONFIGURATION_MANAGEMENT_GROUP = "configuration-mgt";
|
||||
public static final String CONFIGURATION_ENDPOINT = "/mdm-admin/configuration";
|
||||
public static final String CONFIGURATION_PAYLOAD_FILE_NAME = "configuration-payloads.json";
|
||||
public static final String CONFIGURATION_RESPONSE_PAYLOAD_FILE_NAME = "configuration-response-payloads.json";
|
||||
|
||||
private ConfigurationManagement() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
public static final class NotificationManagement {
|
||||
public static final String NOTIFICATION_MANAGEMENT_GROUP = "notification-mgt";
|
||||
public static final String NOTIFICATION_ENDPOINT = "/mdm-admin/notifications";
|
||||
public static final String NOTIFICATION_PAYLOAD_FILE_NAME = "notification-payloads.json";
|
||||
public static final String NOTIFICATION_RESPONSE_PAYLOAD_FILE_NAME = "notification-response-payloads.json";
|
||||
public static final String NOTIFICATION_UPDATE_ENDPOINT = "/mdm-admin/notifications/1234/NEW";
|
||||
|
||||
private NotificationManagement() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
public static final class AndroidSenseEnrollment {
|
||||
public static final String ENROLLMENT_ENDPOINT = "/android_sense/1.0.0/device/";
|
||||
public static final String RETRIEVER_ENDPOINT = "analytics/tables/";
|
||||
public static final String ANALYTICS_ARTIFACTS_DEPLOYMENT_ENDPOINT =
|
||||
"/api/device-mgt/v1.0/admin/publish-artifact/1.0.0/deploy/android_sense";
|
||||
public static final String ENROLLMENT_PAYLOAD_FILE_NAME = "android-sense-enrollment-payloads.json";
|
||||
public static final String PUBLISH_DATA_OPERATION = "PUBLISH_DATA";
|
||||
public static final String BATTERY_STATS_TABLE_NAME = "ORG_WSO2_IOT_ANDROID_BATTERY_STATS";
|
||||
public static final String IS_TABLE_EXIST_CHECK_URL = "analytics/table_exists";
|
||||
|
||||
private AndroidSenseEnrollment() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
public static final class QSGManagement {
|
||||
public static final String GET_MOBILE_APPS_ENDPONT = "/api/appm/publisher/v1.1/apps/mobileapp";
|
||||
|
||||
private QSGManagement() {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
public static final class VirtualFireAlarmConstants {
|
||||
public static final String ENROLLMENT_ENDPOINT = "/virtual_firealarm/1.0.0/device/download";
|
||||
public static final String STATS_ENDPOINT = "/virtual_firealarm/1.0.0/device/stats";
|
||||
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/publish-artifact/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";
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,189 @@
|
||||
/*
|
||||
* Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
*
|
||||
* Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
*
|
||||
* Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://entgra.io/licenses/entgra-commercial/1.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.common;
|
||||
|
||||
|
||||
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
|
||||
import org.apache.commons.httpclient.HttpClient;
|
||||
import org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory;
|
||||
import org.apache.commons.httpclient.methods.DeleteMethod;
|
||||
import org.apache.commons.httpclient.methods.GetMethod;
|
||||
import org.apache.commons.httpclient.methods.PostMethod;
|
||||
import org.apache.commons.httpclient.methods.PutMethod;
|
||||
import org.apache.commons.httpclient.methods.StringRequestEntity;
|
||||
import org.apache.commons.httpclient.params.HttpMethodParams;
|
||||
import org.apache.commons.httpclient.protocol.Protocol;
|
||||
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.security.GeneralSecurityException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* This class creates a customised Http Client Class
|
||||
*/
|
||||
public class IOTHttpClient {
|
||||
|
||||
private static final String AUTHORIZATION = "Authorization";
|
||||
private static Log log = LogFactory.getLog(IOTHttpClient.class);
|
||||
private String backEndUrl;
|
||||
private String authorizationString;
|
||||
private Map<String, String> requestHeaders = new HashMap<String, String>();
|
||||
|
||||
public IOTHttpClient(String backEndUrl, String contentType, String authorization) {
|
||||
|
||||
this.backEndUrl = backEndUrl;
|
||||
this.requestHeaders.put(Constants.CONTENT_TYPE, contentType);
|
||||
if (authorization != null || !authorization.isEmpty()) {
|
||||
this.authorizationString = authorization;
|
||||
this.requestHeaders.put(AUTHORIZATION, authorization);
|
||||
}
|
||||
}
|
||||
|
||||
public String getAuthorizationString() {
|
||||
return authorizationString;
|
||||
}
|
||||
|
||||
public void setAuthorizationString(String authorizationString) {
|
||||
this.authorizationString = authorizationString;
|
||||
}
|
||||
|
||||
public void setHttpHeader(String headerName, String value) {
|
||||
this.requestHeaders.put(headerName, value);
|
||||
}
|
||||
|
||||
public String getHttpHeader(String headerName) {
|
||||
return this.requestHeaders.get(headerName);
|
||||
}
|
||||
|
||||
public void removeHttpHeader(String headerName) {
|
||||
this.requestHeaders.remove(headerName);
|
||||
}
|
||||
|
||||
public IOTResponse post(String endpoint, String body) {
|
||||
HttpClient client = new HttpClient();
|
||||
try {
|
||||
ProtocolSocketFactory socketFactory = new EasySSLProtocolSocketFactory();
|
||||
Protocol https = new Protocol(Constants.HTTPS, socketFactory, Constants.HTTPS_GATEWAY_PORT);
|
||||
Protocol.registerProtocol(Constants.HTTPS, https);
|
||||
String url = backEndUrl + endpoint;
|
||||
PostMethod method = new PostMethod(url);
|
||||
method.setRequestHeader(AUTHORIZATION, authorizationString);
|
||||
StringRequestEntity requestEntity = new StringRequestEntity(body,
|
||||
requestHeaders.get(Constants.CONTENT_TYPE), Constants.UTF8);
|
||||
method.setRequestEntity(requestEntity);
|
||||
IOTResponse iotResponse = new IOTResponse();
|
||||
iotResponse.setStatus(client.executeMethod(method));
|
||||
iotResponse.setBody(method.getResponseBodyAsString());
|
||||
return iotResponse;
|
||||
|
||||
} catch (GeneralSecurityException e) {
|
||||
log.error("Failure occurred at IOTResponse post for GeneralSecurityException", e);
|
||||
} catch (IOException e) {
|
||||
log.error("Failure occurred at IOTResponse post for IOException", e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public IOTResponse put(String endpoint, String body) {
|
||||
HttpClient client = new HttpClient();
|
||||
try {
|
||||
ProtocolSocketFactory socketFactory = new EasySSLProtocolSocketFactory();
|
||||
Protocol https = new Protocol(Constants.HTTPS, socketFactory, Constants.HTTPS_GATEWAY_PORT);
|
||||
Protocol.registerProtocol(Constants.HTTPS, https);
|
||||
String url = backEndUrl + endpoint;
|
||||
PutMethod method = new PutMethod(url);
|
||||
method.setRequestHeader(AUTHORIZATION, authorizationString);
|
||||
StringRequestEntity requestEntity = new StringRequestEntity(
|
||||
body, requestHeaders.get(Constants.CONTENT_TYPE), Constants.UTF8);
|
||||
method.setRequestEntity(requestEntity);
|
||||
IOTResponse iotResponse = new IOTResponse();
|
||||
iotResponse.setStatus(client.executeMethod(method));
|
||||
iotResponse.setBody(method.getResponseBodyAsString());
|
||||
return iotResponse;
|
||||
|
||||
} catch (GeneralSecurityException e) {
|
||||
log.error("Failure occurred at IOTResponse put for GeneralSecurityException", e);
|
||||
} catch (IOException e) {
|
||||
log.error("Failure occurred at IOTResponse put for IO Exception", e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public IOTResponse get(String endpoint) {
|
||||
HttpClient client = new HttpClient();
|
||||
try {
|
||||
ProtocolSocketFactory socketFactory = new EasySSLProtocolSocketFactory();
|
||||
|
||||
Protocol https = new Protocol(Constants.HTTPS, socketFactory, Constants.HTTPS_GATEWAY_PORT);
|
||||
Protocol.registerProtocol(Constants.HTTPS, https);
|
||||
String url = backEndUrl + endpoint;
|
||||
GetMethod method = new GetMethod(url);
|
||||
method.setRequestHeader(AUTHORIZATION, authorizationString);
|
||||
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
|
||||
new DefaultHttpMethodRetryHandler(3, false));
|
||||
IOTResponse iotResponse = new IOTResponse();
|
||||
iotResponse.setStatus(client.executeMethod(method));
|
||||
iotResponse.setBody(new String(method.getResponseBody()));
|
||||
return iotResponse;
|
||||
|
||||
} catch (GeneralSecurityException e) {
|
||||
log.error("Failure occurred at IOTResponse get for GeneralSecurityException", e);
|
||||
} catch (IOException e) {
|
||||
log.error("Failure occurred at IOTResponse get for IOException", e);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public IOTResponse delete(String endpoint) {
|
||||
|
||||
HttpClient client = new HttpClient();
|
||||
|
||||
try {
|
||||
ProtocolSocketFactory socketFactory = new EasySSLProtocolSocketFactory();
|
||||
|
||||
Protocol https = new Protocol(Constants.HTTPS, socketFactory, Constants.HTTPS_GATEWAY_PORT);
|
||||
Protocol.registerProtocol(Constants.HTTPS, https);
|
||||
|
||||
String url = backEndUrl + endpoint;
|
||||
|
||||
DeleteMethod method = new DeleteMethod(url);
|
||||
method.setRequestHeader(AUTHORIZATION, authorizationString);
|
||||
method.setRequestHeader(Constants.CONTENT_TYPE, requestHeaders.get(Constants.CONTENT_TYPE));
|
||||
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
|
||||
new DefaultHttpMethodRetryHandler(3, false));
|
||||
|
||||
IOTResponse iotResponse = new IOTResponse();
|
||||
iotResponse.setStatus(client.executeMethod(method));
|
||||
iotResponse.setBody(method.getResponseBodyAsString());
|
||||
return iotResponse;
|
||||
|
||||
} catch (GeneralSecurityException e) {
|
||||
log.error("Failure occurred at IOTResponse delete for GeneralSecurityException", e);
|
||||
} catch (IOException e) {
|
||||
log.error("Failure occurred at IOTResponse delete for IOException", e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
*
|
||||
* Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
*
|
||||
* Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://entgra.io/licenses/entgra-commercial/1.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.common;
|
||||
|
||||
/**
|
||||
* This class contains the functions to handle a HTTP Response
|
||||
*/
|
||||
public class IOTResponse {
|
||||
|
||||
private int status;
|
||||
private String body;
|
||||
|
||||
public int getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(int status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public String getBody() {
|
||||
return body;
|
||||
}
|
||||
|
||||
public void setBody(String body) {
|
||||
this.body = body;
|
||||
}
|
||||
}
|
@ -0,0 +1,84 @@
|
||||
/*
|
||||
* Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
*
|
||||
* Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
*
|
||||
* Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://entgra.io/licenses/entgra-commercial/1.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.common;
|
||||
|
||||
import org.apache.commons.net.util.Base64;
|
||||
import org.json.JSONObject;
|
||||
import org.wso2.carbon.automation.test.utils.http.client.HttpResponse;
|
||||
|
||||
/**
|
||||
* This Util class holds method necessary to get an OAuth token.
|
||||
*/
|
||||
public class OAuthUtil {
|
||||
|
||||
|
||||
public static String getScopes(String backendHTTPURL, String backendHTTPSURL) throws Exception {
|
||||
return getOAuthTokenPair(backendHTTPURL, backendHTTPSURL).get(Constants.SCOPE).toString();
|
||||
}
|
||||
|
||||
public static String getOAuthToken(String backendHTTPURL, String backendHTTPSURL) throws Exception {
|
||||
return getOAuthTokenPair(backendHTTPURL, backendHTTPSURL).get(Constants.OAUTH_ACCESS_TOKEN).toString();
|
||||
}
|
||||
|
||||
public static JSONObject getOAuthTokenPair(String backendHTTPURL, String backendHTTPSURL) throws Exception {
|
||||
String AuthString = "Basic YWRtaW46YWRtaW4=";
|
||||
RestClient client = new RestClient(backendHTTPURL, Constants.APPLICATION_JSON, AuthString);
|
||||
HttpResponse oAuthData = client.post(Constants.APIApplicationRegistration.API_APP_REGISTRATION_ENDPOINT,
|
||||
Constants.APIApplicationRegistration.API_APP_REGISTRATION_PAYLOAD);
|
||||
JSONObject jsonObj = new JSONObject(oAuthData.getData());
|
||||
String clientId = jsonObj.get(Constants.OAUTH_CLIENT_ID).toString();
|
||||
String clientSecret = jsonObj.get(Constants.OAUTH_CLIENT_SECRET).toString();
|
||||
byte[] bytesEncoded = Base64.encodeBase64((clientId + ":" + clientSecret).getBytes());
|
||||
String basicAuthString = "Basic " + new String(bytesEncoded);
|
||||
//Initiate a RestClient to get OAuth token
|
||||
client = new RestClient(backendHTTPSURL, Constants.APPLICATION_URL_ENCODED, basicAuthString);
|
||||
oAuthData = client.post(Constants.APIApplicationRegistration.TOKEN_ENDPOINT,
|
||||
Constants.APIApplicationRegistration.OAUTH_TOKEN_PAYLOAD);
|
||||
jsonObj = new JSONObject(oAuthData.getData());
|
||||
return jsonObj;
|
||||
}
|
||||
|
||||
/**
|
||||
* To get the oauth token pair for the given auth string which is encoded in base64 format.
|
||||
* @param authString encoded auth string
|
||||
* @param backendHTTPURL backend http URL
|
||||
* @param backendHTTPSURL backend https URL
|
||||
* @return a JSON object which consist of oauth token pair
|
||||
* @throws Exception Exception
|
||||
*/
|
||||
public static String getOAuthTokenPair(String authString, String backendHTTPURL, String backendHTTPSURL,
|
||||
String username, String password) throws Exception {
|
||||
RestClient client = new RestClient(backendHTTPURL, Constants.APPLICATION_JSON, "Basic " + authString);
|
||||
HttpResponse oAuthData = client.post(Constants.APIApplicationRegistration.API_APP_REGISTRATION_ENDPOINT,
|
||||
Constants.APIApplicationRegistration.API_APP_REGISTRATION_PAYLOAD);
|
||||
JSONObject jsonObj = new JSONObject(oAuthData.getData());
|
||||
String clientId = jsonObj.get(Constants.OAUTH_CLIENT_ID).toString();
|
||||
String clientSecret = jsonObj.get(Constants.OAUTH_CLIENT_SECRET).toString();
|
||||
byte[] bytesEncoded = Base64.encodeBase64((clientId + ":" + clientSecret).getBytes());
|
||||
String basicAuthString = "Basic " + new String(bytesEncoded);
|
||||
//Initiate a RestClient to get OAuth token
|
||||
client = new RestClient(backendHTTPSURL, Constants.APPLICATION_URL_ENCODED, basicAuthString);
|
||||
oAuthData = client.post(Constants.APIApplicationRegistration.TOKEN_ENDPOINT,
|
||||
"username=" + username + "&password=" + password + Constants.APIApplicationRegistration.MULTI_TENANT_OAUTH_TOKEN_PAYLOAD);
|
||||
jsonObj = new JSONObject(oAuthData.getData());
|
||||
return jsonObj.get(Constants.OAUTH_ACCESS_TOKEN).toString();
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
*
|
||||
* Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
*
|
||||
* Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://entgra.io/licenses/entgra-commercial/1.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.common;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
|
||||
/**
|
||||
* This class is used to load the necessary payloads from payload files for integration tests.
|
||||
*/
|
||||
public class PayloadGenerator {
|
||||
|
||||
private static final String PAYLOAD_LOCATION = "payloads/";
|
||||
private static JsonParser parser = new JsonParser();
|
||||
|
||||
public static JsonObject getJsonPayload(String fileName, String method)
|
||||
throws FileNotFoundException {
|
||||
URL url = PayloadGenerator.class.getClassLoader().getResource(PAYLOAD_LOCATION + fileName);
|
||||
JsonObject jsonObject = parser.parse(new FileReader(url.getPath())).getAsJsonObject();
|
||||
return jsonObject.get(method).getAsJsonObject();
|
||||
}
|
||||
|
||||
public static String getJsonPayloadToString(String fileName) throws IOException {
|
||||
URL url = Thread.currentThread().getContextClassLoader().getResource(PAYLOAD_LOCATION + fileName);
|
||||
FileInputStream fisTargetFile = new FileInputStream(new File(url.getPath()));
|
||||
String returnString = IOUtils.toString(fisTargetFile, Constants.UTF8);
|
||||
return returnString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a Json Array from a specific method in the file
|
||||
* @param fileName Name of the file
|
||||
* @param method Method name
|
||||
* @return Json Arry created from the specific method in the file
|
||||
* @throws FileNotFoundException File Not found exception
|
||||
*/
|
||||
public static JsonArray getJsonArray(String fileName, String method)
|
||||
throws FileNotFoundException {
|
||||
URL url = PayloadGenerator.class.getClassLoader().getResource(PAYLOAD_LOCATION + fileName);
|
||||
JsonObject jsonObject = parser.parse(new FileReader(url.getPath())).getAsJsonObject();
|
||||
return jsonObject.get(method).getAsJsonArray();
|
||||
}
|
||||
}
|
@ -0,0 +1,221 @@
|
||||
/*
|
||||
* Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
*
|
||||
* Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
*
|
||||
* Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://entgra.io/licenses/entgra-commercial/1.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.common;
|
||||
|
||||
import org.wso2.carbon.automation.engine.exceptions.AutomationFrameworkException;
|
||||
import org.wso2.carbon.automation.test.utils.http.client.HttpRequestUtil;
|
||||
import org.wso2.carbon.automation.test.utils.http.client.HttpResponse;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.ProtocolException;
|
||||
import java.net.URL;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* This is the rest client that is used to calls to APIs.
|
||||
*/
|
||||
public class RestClient {
|
||||
|
||||
private static final String AUTHORIZATION = "Authorization";
|
||||
private String backEndUrl;
|
||||
private String authrizationString;
|
||||
private Map<String, String> requestHeaders = new HashMap<String, String>();
|
||||
|
||||
public RestClient(String backEndUrl, String contentType) {
|
||||
this.backEndUrl = backEndUrl;
|
||||
this.requestHeaders.put(Constants.CONTENT_TYPE, contentType);
|
||||
}
|
||||
|
||||
public RestClient(String backEndUrl, String contentType, String authorization) {
|
||||
this.backEndUrl = backEndUrl;
|
||||
this.requestHeaders.put(Constants.CONTENT_TYPE, contentType);
|
||||
if (authorization != null || !authorization.isEmpty()) {
|
||||
this.authrizationString = authorization;
|
||||
this.requestHeaders.put(AUTHORIZATION, authorization);
|
||||
}
|
||||
}
|
||||
|
||||
public String getAuthrizationString() {
|
||||
return authrizationString;
|
||||
}
|
||||
|
||||
public void setAuthrizationString(String authrizationString) {
|
||||
this.authrizationString = authrizationString;
|
||||
}
|
||||
|
||||
public void setHttpHeader(String headerName, String value) {
|
||||
this.requestHeaders.put(headerName, value);
|
||||
}
|
||||
|
||||
public String getHttpHeader(String headerName) {
|
||||
return this.requestHeaders.get(headerName);
|
||||
}
|
||||
|
||||
public void removeHttpHeader(String headerName) {
|
||||
this.requestHeaders.remove(headerName);
|
||||
}
|
||||
|
||||
public HttpResponse post(String endpoint, String body) throws MalformedURLException, AutomationFrameworkException {
|
||||
return HttpRequestUtil.doPost(new URL(backEndUrl + endpoint), body, requestHeaders);
|
||||
}
|
||||
|
||||
public HttpResponse put(String endpoint, String body) throws Exception {
|
||||
HttpURLConnection urlConnection = null;
|
||||
try {
|
||||
urlConnection = (HttpURLConnection) new URL(backEndUrl + endpoint).openConnection();
|
||||
try {
|
||||
urlConnection.setRequestMethod("PUT");
|
||||
} catch (ProtocolException e) {
|
||||
throw new Exception("Shouldn\'t happen: HttpURLConnection doesn\'t support POST?? " + e.getMessage(),
|
||||
e);
|
||||
}
|
||||
|
||||
urlConnection.setDoOutput(true);
|
||||
urlConnection.setDoInput(true);
|
||||
urlConnection.setUseCaches(false);
|
||||
urlConnection.setAllowUserInteraction(false);
|
||||
Iterator entryIterator = this.requestHeaders.entrySet().iterator();
|
||||
while (entryIterator.hasNext()) {
|
||||
Map.Entry sb = (Map.Entry) entryIterator.next();
|
||||
urlConnection.setRequestProperty((String) sb.getKey(), (String) sb.getValue());
|
||||
}
|
||||
OutputStream outputStream = urlConnection.getOutputStream();
|
||||
try {
|
||||
OutputStreamWriter sb1 = new OutputStreamWriter(outputStream, "UTF-8");
|
||||
sb1.write(body);
|
||||
sb1.close();
|
||||
} catch (IOException e) {
|
||||
throw new Exception("IOException while sending data " + e.getMessage(), e);
|
||||
} finally {
|
||||
if (outputStream != null) {
|
||||
outputStream.close();
|
||||
}
|
||||
}
|
||||
StringBuilder sb2 = new StringBuilder();
|
||||
BufferedReader rd = null;
|
||||
try {
|
||||
rd = new BufferedReader(
|
||||
new InputStreamReader(urlConnection.getInputStream(), Charset.defaultCharset()));
|
||||
String itr;
|
||||
while ((itr = rd.readLine()) != null) {
|
||||
sb2.append(itr);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
throw new Exception("IOException while reading put request data " + e.getMessage(), e);
|
||||
} finally {
|
||||
if (rd != null) {
|
||||
rd.close();
|
||||
}
|
||||
}
|
||||
Iterator iterator = urlConnection.getHeaderFields().keySet().iterator();
|
||||
HashMap responseHeaders = new HashMap();
|
||||
while (iterator.hasNext()) {
|
||||
String key = (String) iterator.next();
|
||||
if (key != null) {
|
||||
responseHeaders.put(key, urlConnection.getHeaderField(key));
|
||||
}
|
||||
}
|
||||
HttpResponse httpResponse =
|
||||
new HttpResponse(sb2.toString(), urlConnection.getResponseCode(), responseHeaders);
|
||||
return httpResponse;
|
||||
} catch (IOException e) {
|
||||
throw new Exception("Connection error (Is server running at " + endpoint + " ?): " + e.getMessage(), e);
|
||||
} finally {
|
||||
if (urlConnection != null) {
|
||||
urlConnection.disconnect();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public HttpResponse get(String endpoint) throws Exception {
|
||||
return HttpRequestUtil.doGet(backEndUrl + endpoint, requestHeaders);
|
||||
}
|
||||
|
||||
public HttpResponse delete(String endpoint) throws Exception {
|
||||
HttpURLConnection conn = null;
|
||||
|
||||
HttpResponse httpResponse1;
|
||||
try {
|
||||
URL url = new URL(backEndUrl + endpoint);
|
||||
conn = (HttpURLConnection) url.openConnection();
|
||||
conn.setRequestMethod("DELETE");
|
||||
conn.setDoOutput(true);
|
||||
conn.setReadTimeout(30000);
|
||||
Iterator entryIterator = this.requestHeaders.entrySet().iterator();
|
||||
|
||||
while (entryIterator.hasNext()) {
|
||||
Map.Entry rd = (Map.Entry) entryIterator.next();
|
||||
conn.setRequestProperty((String) rd.getKey(), (String) rd.getValue());
|
||||
}
|
||||
|
||||
conn.connect();
|
||||
StringBuilder sb1 = new StringBuilder();
|
||||
BufferedReader rd1 = null;
|
||||
|
||||
HttpResponse httpResponse;
|
||||
try {
|
||||
rd1 = new BufferedReader(new InputStreamReader(conn.getInputStream(), Charset.defaultCharset()));
|
||||
|
||||
String ignored;
|
||||
while ((ignored = rd1.readLine()) != null) {
|
||||
sb1.append(ignored);
|
||||
}
|
||||
|
||||
httpResponse = new HttpResponse(sb1.toString(), conn.getResponseCode());
|
||||
httpResponse.setResponseMessage(conn.getResponseMessage());
|
||||
} catch (IOException e) {
|
||||
rd1 = new BufferedReader(new InputStreamReader(conn.getErrorStream(), Charset.defaultCharset()));
|
||||
|
||||
String line;
|
||||
while ((line = rd1.readLine()) != null) {
|
||||
sb1.append(line);
|
||||
}
|
||||
|
||||
httpResponse = new HttpResponse(sb1.toString(), conn.getResponseCode());
|
||||
httpResponse.setResponseMessage(conn.getResponseMessage());
|
||||
} finally {
|
||||
if (rd1 != null) {
|
||||
rd1.close();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
httpResponse1 = httpResponse;
|
||||
} finally {
|
||||
if (conn != null) {
|
||||
conn.disconnect();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return httpResponse1;
|
||||
}
|
||||
}
|
@ -0,0 +1,102 @@
|
||||
/*
|
||||
* Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
*
|
||||
* Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
*
|
||||
* Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://entgra.io/licenses/entgra-commercial/1.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.common;
|
||||
|
||||
import org.apache.commons.net.util.Base64;
|
||||
import org.testng.annotations.DataProvider;
|
||||
import org.wso2.carbon.automation.engine.context.AutomationContext;
|
||||
import org.wso2.carbon.automation.engine.context.TestUserMode;
|
||||
import org.wso2.carbon.automation.engine.context.beans.User;
|
||||
import org.wso2.carbon.automation.engine.frameworkutils.FrameworkPathUtil;
|
||||
import org.wso2.carbon.integration.common.utils.LoginLogoutClient;
|
||||
|
||||
import javax.xml.xpath.XPathExpressionException;
|
||||
|
||||
/**
|
||||
* This is the base test class that provides common details necessary for other test cases.
|
||||
*/
|
||||
public class TestBase {
|
||||
protected AutomationContext automationContext;
|
||||
protected String backendHTTPSURL;
|
||||
protected String backendHTTPURL;
|
||||
protected String accessTokenString;
|
||||
protected String accessToken;
|
||||
protected TestUserMode userMode;
|
||||
|
||||
protected void init(TestUserMode userMode) throws Exception {
|
||||
automationContext = new AutomationContext(Constants.AUTOMATION_CONTEXT, userMode);
|
||||
String tenantDomain = automationContext.getContextTenant().getDomain();
|
||||
backendHTTPSURL = automationContext.getContextUrls().getWebAppURLHttps().replace("9443", String.valueOf(Constants
|
||||
.HTTPS_GATEWAY_PORT)).replace("/t/" + tenantDomain , "");
|
||||
backendHTTPURL = automationContext.getContextUrls().getWebAppURL().replace("9763", String.valueOf(Constants
|
||||
.HTTP_GATEWAY_PORT)).replace("/t/" + tenantDomain , "");
|
||||
User currentUser = getAutomationContext().getContextTenant().getContextUser();
|
||||
byte[] bytesEncoded = Base64
|
||||
.encodeBase64((currentUser.getUserName() + ":" + currentUser.getPassword()).getBytes());
|
||||
String encoded = new String(bytesEncoded);
|
||||
accessToken = OAuthUtil.getOAuthTokenPair(encoded, backendHTTPSURL, backendHTTPSURL, currentUser.getUserName(),
|
||||
currentUser.getPassword());
|
||||
accessTokenString = "Bearer " + accessToken;
|
||||
}
|
||||
|
||||
protected void initPublisher(String productGroupName, String instanceName,
|
||||
TestUserMode userMode)
|
||||
throws XPathExpressionException {
|
||||
automationContext = new AutomationContext(productGroupName, instanceName, userMode);
|
||||
backendHTTPSURL = automationContext.getContextUrls().getBackEndUrl();
|
||||
}
|
||||
|
||||
public String getBackendHTTPURL() {
|
||||
return backendHTTPURL;
|
||||
}
|
||||
|
||||
public void setBackendHTTPURL(String backendHTTPURL) {
|
||||
this.backendHTTPURL = backendHTTPURL;
|
||||
}
|
||||
|
||||
protected String getBackendHTTPSURL() throws XPathExpressionException {
|
||||
return backendHTTPSURL;
|
||||
}
|
||||
|
||||
protected String getSessionCookie() throws Exception {
|
||||
LoginLogoutClient loginLogoutClient = new LoginLogoutClient(automationContext);
|
||||
return loginLogoutClient.login();
|
||||
}
|
||||
|
||||
protected String getServiceURL() throws XPathExpressionException {
|
||||
return automationContext.getContextUrls().getServiceUrl();
|
||||
}
|
||||
|
||||
protected AutomationContext getAutomationContext() {
|
||||
return automationContext;
|
||||
}
|
||||
|
||||
protected String getTestArtifactLocation() {
|
||||
return FrameworkPathUtil.getSystemResourceLocation();
|
||||
}
|
||||
|
||||
@DataProvider
|
||||
public static Object[][] userModeProvider() {
|
||||
return new TestUserMode[][]{
|
||||
new TestUserMode[]{TestUserMode.SUPER_TENANT_ADMIN},
|
||||
new TestUserMode[]{TestUserMode.TENANT_ADMIN}
|
||||
};
|
||||
}
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
*
|
||||
* Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
*
|
||||
* Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://entgra.io/licenses/entgra-commercial/1.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.common.extensions;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.wso2.carbon.automation.engine.annotations.ExecutionEnvironment;
|
||||
import org.wso2.carbon.automation.engine.context.AutomationContext;
|
||||
import org.wso2.carbon.automation.engine.context.ContextXpathConstants;
|
||||
import org.wso2.carbon.automation.engine.context.TestUserMode;
|
||||
import org.wso2.carbon.automation.engine.extensions.ExecutionListenerExtension;
|
||||
import org.wso2.carbon.automation.extensions.ExtensionConstants;
|
||||
import org.wso2.carbon.automation.extensions.servers.carbonserver.CarbonServerExtension;
|
||||
|
||||
import javax.xml.xpath.XPathExpressionException;
|
||||
|
||||
/**
|
||||
* Test Automation server extension to start the DAS.
|
||||
* This will set the carbon_home to {carbonHome}/core and port offset : 2
|
||||
*/
|
||||
public class AnalyticsServerExtension extends ExecutionListenerExtension {
|
||||
|
||||
private CustomTestServerManager serverManager;
|
||||
private static final Log log = LogFactory.getLog(CarbonServerExtension.class);
|
||||
private String executionEnvironment;
|
||||
private AutomationContext automationContext;
|
||||
private final String ANALYTICS_PORT_OFFSET = "2";
|
||||
|
||||
@Override
|
||||
public void initiate() {
|
||||
try {
|
||||
automationContext = new AutomationContext("IOT", TestUserMode.SUPER_TENANT_USER);
|
||||
if (getParameters().get(ExtensionConstants.SERVER_STARTUP_PORT_OFFSET_COMMAND) == null) {
|
||||
getParameters().put(ExtensionConstants.SERVER_STARTUP_PORT_OFFSET_COMMAND, ANALYTICS_PORT_OFFSET);
|
||||
}
|
||||
serverManager = new CustomTestServerManager(getAutomationContext(), null, getParameters());
|
||||
executionEnvironment =
|
||||
automationContext.getConfigurationValue(ContextXpathConstants.EXECUTION_ENVIRONMENT);
|
||||
|
||||
} catch (XPathExpressionException e) {
|
||||
throw new RuntimeException("Error while initiating test environment", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onExecutionStart() {
|
||||
try {
|
||||
if (executionEnvironment.equalsIgnoreCase(ExecutionEnvironment.STANDALONE.name())) {
|
||||
String carbonHome = serverManager.startServer("analytics");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Fail to start carbon server ", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onExecutionFinish() {
|
||||
try {
|
||||
if (executionEnvironment.equalsIgnoreCase(ExecutionEnvironment.STANDALONE.name())) {
|
||||
serverManager.stopServer();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Fail to stop carbon server ", e);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
*
|
||||
* Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
*
|
||||
* Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://entgra.io/licenses/entgra-commercial/1.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.common.extensions;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.wso2.carbon.automation.engine.annotations.ExecutionEnvironment;
|
||||
import org.wso2.carbon.automation.engine.context.AutomationContext;
|
||||
import org.wso2.carbon.automation.engine.context.ContextXpathConstants;
|
||||
import org.wso2.carbon.automation.engine.context.TestUserMode;
|
||||
import org.wso2.carbon.automation.engine.extensions.ExecutionListenerExtension;
|
||||
import org.wso2.carbon.automation.extensions.ExtensionConstants;
|
||||
import org.wso2.carbon.automation.extensions.servers.carbonserver.CarbonServerExtension;
|
||||
|
||||
import javax.xml.xpath.XPathExpressionException;
|
||||
|
||||
/**
|
||||
* Test Automation server extension to start the Broker.
|
||||
* This will set the carbon_home to {carbonHome}/core and port offset : 3
|
||||
*/
|
||||
public class BrokerServerExtension extends ExecutionListenerExtension {
|
||||
|
||||
private CustomTestServerManager serverManager;
|
||||
private static final Log log = LogFactory.getLog(CarbonServerExtension.class);
|
||||
private String executionEnvironment;
|
||||
private AutomationContext automationContext;
|
||||
private final String BROKER_PORT_OFFSET = "3";
|
||||
|
||||
@Override
|
||||
public void initiate() {
|
||||
try {
|
||||
automationContext = new AutomationContext("IOT", TestUserMode.SUPER_TENANT_USER);
|
||||
if (getParameters().get(ExtensionConstants.SERVER_STARTUP_PORT_OFFSET_COMMAND) == null) {
|
||||
getParameters().put(ExtensionConstants.SERVER_STARTUP_PORT_OFFSET_COMMAND, BROKER_PORT_OFFSET);
|
||||
}
|
||||
serverManager = new CustomTestServerManager(getAutomationContext(), null, getParameters());
|
||||
executionEnvironment =
|
||||
automationContext.getConfigurationValue(ContextXpathConstants.EXECUTION_ENVIRONMENT);
|
||||
|
||||
} catch (XPathExpressionException e) {
|
||||
throw new RuntimeException("Error while initiating test environment", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onExecutionStart() {
|
||||
try {
|
||||
if (executionEnvironment.equalsIgnoreCase(ExecutionEnvironment.STANDALONE.name())) {
|
||||
String carbonHome = serverManager.startServer("broker");
|
||||
log.info(carbonHome);
|
||||
System.setProperty(ExtensionConstants.CARBON_HOME, carbonHome);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Fail to start carbon server ", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onExecutionFinish() {
|
||||
try {
|
||||
if (executionEnvironment.equalsIgnoreCase(ExecutionEnvironment.STANDALONE.name())) {
|
||||
serverManager.stopServer();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Fail to stop carbon server ", e);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,428 @@
|
||||
/*
|
||||
* Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
*
|
||||
* Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
*
|
||||
* Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://entgra.io/licenses/entgra-commercial/1.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.common.extensions;
|
||||
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.io.filefilter.DirectoryFileFilter;
|
||||
import org.apache.commons.io.filefilter.RegexFileFilter;
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.wso2.carbon.automation.engine.context.AutomationContext;
|
||||
import org.wso2.carbon.automation.engine.context.beans.User;
|
||||
import org.wso2.carbon.automation.engine.exceptions.AutomationFrameworkException;
|
||||
import org.wso2.carbon.automation.engine.frameworkutils.CodeCoverageUtils;
|
||||
import org.wso2.carbon.automation.engine.frameworkutils.FrameworkPathUtil;
|
||||
import org.wso2.carbon.automation.engine.frameworkutils.ReportGenerator;
|
||||
import org.wso2.carbon.automation.engine.frameworkutils.TestFrameworkUtils;
|
||||
import org.wso2.carbon.automation.extensions.servers.utils.ArchiveExtractor;
|
||||
import org.wso2.carbon.automation.extensions.servers.utils.ClientConnectionUtil;
|
||||
import org.wso2.carbon.automation.extensions.servers.utils.FileManipulator;
|
||||
import org.wso2.carbon.automation.extensions.servers.utils.ServerLogReader;
|
||||
|
||||
import javax.xml.xpath.XPathExpressionException;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
public class CarbonServerManagerExtension {
|
||||
private static final Log log = LogFactory.getLog(CarbonServerManagerExtension.class);
|
||||
private Process process;
|
||||
private String carbonHome;
|
||||
private AutomationContext automationContext;
|
||||
private ServerLogReader inputStreamHandler;
|
||||
private ServerLogReader errorStreamHandler;
|
||||
private boolean isCoverageEnable = false;
|
||||
private String coverageDumpFilePath;
|
||||
private int portOffset = 0;
|
||||
private static final String SERVER_SHUTDOWN_MESSAGE = "Halting JVM";
|
||||
private static final String SERVER_STARTUP_MESSAGE = "Mgt Console URL";
|
||||
private static final long DEFAULT_START_STOP_WAIT_MS = 900000L;
|
||||
private static final String CMD_ARG = "cmdArg";
|
||||
private static int defaultHttpPort = Integer.parseInt("9763");
|
||||
private static int defaultHttpsPort = Integer.parseInt("9443");
|
||||
private static final long COVERAGE_DUMP_WAIT_TIME = 30000;
|
||||
|
||||
public CarbonServerManagerExtension(AutomationContext context) {
|
||||
this.automationContext = context;
|
||||
}
|
||||
|
||||
public synchronized void startServerUsingCarbonHome(String carbonHome, Map<String, String> commandMap) throws AutomationFrameworkException {
|
||||
if(this.process == null) {
|
||||
this.portOffset = this.checkPortAvailability(commandMap);
|
||||
Process tempProcess = null;
|
||||
|
||||
try {
|
||||
if(!commandMap.isEmpty() && this.getPortOffsetFromCommandMap(commandMap) == 0) {
|
||||
System.setProperty("carbon.home", carbonHome);
|
||||
}
|
||||
|
||||
File commandDir = new File(carbonHome);
|
||||
log.info("Starting carbon server............. ");
|
||||
String scriptName = TestFrameworkUtils.getStartupScriptFileName(carbonHome);
|
||||
String[] parameters = this.expandServerStartupCommandList(commandMap);
|
||||
String[] cmdArray;
|
||||
if(System.getProperty("os.name").toLowerCase().contains("windows")) {
|
||||
commandDir = new File(carbonHome + File.separator + "bin");
|
||||
cmdArray = new String[]{"cmd.exe", "/c", scriptName + ".bat"};
|
||||
cmdArray = this.mergePropertiesToCommandArray(parameters, cmdArray);
|
||||
tempProcess = Runtime.getRuntime().exec(cmdArray, (String[])null, commandDir);
|
||||
} else {
|
||||
cmdArray = new String[]{"sh", "bin/" + scriptName + ".sh"};
|
||||
cmdArray = this.mergePropertiesToCommandArray(parameters, cmdArray);
|
||||
tempProcess = Runtime.getRuntime().exec(cmdArray, (String[])null, commandDir);
|
||||
}
|
||||
|
||||
this.errorStreamHandler = new ServerLogReader("errorStream", tempProcess.getErrorStream());
|
||||
this.inputStreamHandler = new ServerLogReader("inputStream", tempProcess.getInputStream());
|
||||
this.inputStreamHandler.start();
|
||||
this.errorStreamHandler.start();
|
||||
Runtime.getRuntime().addShutdownHook(new Thread() {
|
||||
public void run() {
|
||||
try {
|
||||
CarbonServerManagerExtension.this.serverShutdown(CarbonServerManagerExtension.this.portOffset);
|
||||
} catch (Exception var2) {
|
||||
CarbonServerManagerExtension.log.error("Error while server shutdown ..", var2);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
ClientConnectionUtil.waitForPort(defaultHttpPort + this.portOffset, DEFAULT_START_STOP_WAIT_MS, false, (String)this
|
||||
.automationContext.getInstance().getHosts().get("default"));
|
||||
long time = System.currentTimeMillis() + 60000L;
|
||||
|
||||
// while(true) {
|
||||
// if(this.inputStreamHandler.getOutput().contains("Mgt Console URL") || System.currentTimeMillis() >= time) {
|
||||
// int httpsPort = defaultHttpsPort + this.portOffset;
|
||||
// String backendURL = this.automationContext.getContextUrls().getSecureServiceUrl().replaceAll("(:\\d+)", ":" + httpsPort);
|
||||
// User superUser = this.automationContext.getSuperTenant().getTenantAdmin();
|
||||
// ClientConnectionUtil.waitForLogin(backendURL, superUser);
|
||||
// log.info("Server started successfully.");
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
int httpsPort = defaultHttpsPort + this.portOffset;
|
||||
String backendURL = this.automationContext.getContextUrls().getSecureServiceUrl().replaceAll("(:\\d+)", ":" + httpsPort);
|
||||
User superUser = this.automationContext.getSuperTenant().getTenantAdmin();
|
||||
ClientConnectionUtil.waitForLogin(backendURL, superUser);
|
||||
} catch (XPathExpressionException | IOException var13) {
|
||||
throw new IllegalStateException("Unable to start server", var13);
|
||||
}
|
||||
|
||||
this.process = tempProcess;
|
||||
}
|
||||
}
|
||||
|
||||
private int checkPortAvailability(Map<String, String> commandMap) throws AutomationFrameworkException {
|
||||
int portOffset = this.getPortOffsetFromCommandMap(commandMap);
|
||||
if(ClientConnectionUtil.isPortOpen(defaultHttpPort + portOffset)) {
|
||||
throw new AutomationFrameworkException("Unable to start carbon server on port " + (defaultHttpPort + portOffset) + " : Port already in use");
|
||||
} else if(ClientConnectionUtil.isPortOpen(defaultHttpsPort + portOffset)) {
|
||||
throw new AutomationFrameworkException("Unable to start carbon server on port " + (defaultHttpsPort + portOffset) + " : Port already in use");
|
||||
} else {
|
||||
return portOffset;
|
||||
}
|
||||
}
|
||||
|
||||
private String[] mergePropertiesToCommandArray(String[] parameters, String[] cmdArray) {
|
||||
if(parameters != null) {
|
||||
cmdArray = this.mergerArrays(cmdArray, parameters);
|
||||
}
|
||||
|
||||
return cmdArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unzip carbon zip file and return the carbon home. Based on the coverage configuration in automation.xml
|
||||
* This method will inject jacoco agent to the carbon server startup scripts.
|
||||
*
|
||||
* @param carbonServerZipFile - Carbon zip file, which should be specified in test module pom
|
||||
* @return - carbonHome - carbon home
|
||||
* @throws IOException - If pack extraction fails
|
||||
*/
|
||||
public synchronized String setUpCarbonHome(String carbonServerZipFile) throws IOException, AutomationFrameworkException {
|
||||
if(this.process != null) {
|
||||
return this.carbonHome;
|
||||
} else {
|
||||
int indexOfZip = carbonServerZipFile.lastIndexOf(".zip");
|
||||
if(indexOfZip == -1) {
|
||||
throw new IllegalArgumentException(carbonServerZipFile + " is not a zip file");
|
||||
} else {
|
||||
String fileSeparator = File.separator.equals("\\")?"\\":"/";
|
||||
if(fileSeparator.equals("\\")) {
|
||||
carbonServerZipFile = carbonServerZipFile.replace("/", "\\");
|
||||
}
|
||||
|
||||
String extractedCarbonDir = carbonServerZipFile.substring(carbonServerZipFile.lastIndexOf(fileSeparator) + 1, indexOfZip);
|
||||
FileManipulator.deleteDir(extractedCarbonDir);
|
||||
String extractDir = "carbontmp" + System.currentTimeMillis();
|
||||
String baseDir = System.getProperty("basedir", ".") + File.separator + "target";
|
||||
log.info("Extracting carbon zip file.. ");
|
||||
(new ArchiveExtractor()).extractFile(carbonServerZipFile, baseDir + File.separator + extractDir);
|
||||
this.carbonHome = (new File(baseDir)).getAbsolutePath() + File.separator + extractDir + File.separator + extractedCarbonDir;
|
||||
|
||||
try {
|
||||
this.isCoverageEnable = Boolean.parseBoolean(this.automationContext.getConfigurationValue("//coverage"));
|
||||
} catch (XPathExpressionException var8) {
|
||||
throw new AutomationFrameworkException("Coverage configuration not found in automation.xml", var8);
|
||||
}
|
||||
|
||||
if(this.isCoverageEnable) {
|
||||
this.instrumentForCoverage();
|
||||
}
|
||||
|
||||
return this.carbonHome;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void serverShutdown(int portOffset) throws AutomationFrameworkException {
|
||||
if(this.process != null) {
|
||||
log.info("Shutting down server..");
|
||||
if(ClientConnectionUtil.isPortOpen(Integer.parseInt("9443") + portOffset)) {
|
||||
int httpsPort = defaultHttpsPort + portOffset;
|
||||
String url = null;
|
||||
|
||||
try {
|
||||
url = this.automationContext.getContextUrls().getBackEndUrl();
|
||||
} catch (XPathExpressionException var10) {
|
||||
throw new AutomationFrameworkException("Get context failed", var10);
|
||||
}
|
||||
|
||||
String backendURL = url.replaceAll("(:\\d+)", ":" + httpsPort);
|
||||
|
||||
try {
|
||||
ClientConnectionUtil.sendForcefulShutDownRequest(backendURL, this.automationContext.getSuperTenant().getContextUser().getUserName(), this.automationContext.getSuperTenant().getContextUser().getPassword());
|
||||
} catch (AutomationFrameworkException var8) {
|
||||
throw new AutomationFrameworkException("Get context failed", var8);
|
||||
} catch (XPathExpressionException var9) {
|
||||
throw new AutomationFrameworkException("Get context failed", var9);
|
||||
}
|
||||
|
||||
long time = System.currentTimeMillis() + 300000L;
|
||||
|
||||
// while(!this.inputStreamHandler.getOutput().contains("Halting JVM") && System.currentTimeMillis() < time) {
|
||||
// ;
|
||||
// }
|
||||
|
||||
log.info("Server stopped successfully...");
|
||||
}
|
||||
|
||||
this.inputStreamHandler.stop();
|
||||
this.errorStreamHandler.stop();
|
||||
this.process.destroy();
|
||||
this.process = null;
|
||||
if(this.isCoverageEnable) {
|
||||
try {
|
||||
log.info("Generating Jacoco code coverage...");
|
||||
this.generateCoverageReport(new File(this.carbonHome + File.separator + "repository"
|
||||
+ File.separator + "components" + File.separator + "plugins" + File.separator));
|
||||
} catch (IOException var7) {
|
||||
log.error("Failed to generate code coverage ", var7);
|
||||
throw new AutomationFrameworkException("Failed to generate code coverage ", var7);
|
||||
}
|
||||
}
|
||||
|
||||
if(portOffset == 0) {
|
||||
System.clearProperty("carbon.home");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void generateCoverageReport(File classesDir) throws IOException, AutomationFrameworkException {
|
||||
checkJacocoDataFileSizes(FrameworkPathUtil.getJacocoCoverageHome());
|
||||
CodeCoverageUtils.executeMerge(FrameworkPathUtil.getJacocoCoverageHome(), FrameworkPathUtil.getCoverageMergeFilePath());
|
||||
ReportGenerator reportGenerator = new ReportGenerator(new File(FrameworkPathUtil.getCoverageMergeFilePath()), classesDir, new File(CodeCoverageUtils.getJacocoReportDirectory()), (File)null);
|
||||
reportGenerator.create();
|
||||
log.info("Jacoco coverage dump file path : " + FrameworkPathUtil.getCoverageDumpFilePath());
|
||||
log.info("Jacoco class file path : " + classesDir);
|
||||
log.info("Jacoco coverage HTML report path : " + CodeCoverageUtils.getJacocoReportDirectory() + File.separator + "index.html");
|
||||
}
|
||||
|
||||
public synchronized void restartGracefully() throws AutomationFrameworkException {
|
||||
try {
|
||||
int httpsPort = defaultHttpsPort + this.portOffset;
|
||||
String backendURL = this.automationContext.getContextUrls().getSecureServiceUrl().replaceAll("(:\\d+)", ":" + httpsPort);
|
||||
User superUser = this.automationContext.getSuperTenant().getTenantAdmin();
|
||||
ClientConnectionUtil.sendGraceFullRestartRequest(backendURL, superUser.getUserName(), superUser.getPassword());
|
||||
} catch (XPathExpressionException var5) {
|
||||
throw new AutomationFrameworkException("restart failed", var5);
|
||||
}
|
||||
|
||||
long time = System.currentTimeMillis() + 300000L;
|
||||
|
||||
// while(!this.inputStreamHandler.getOutput().contains("Halting JVM") && System.currentTimeMillis() < time) {
|
||||
// ;
|
||||
// }
|
||||
|
||||
time = System.currentTimeMillis();
|
||||
|
||||
while(System.currentTimeMillis() < time + 5000L) {
|
||||
;
|
||||
}
|
||||
|
||||
try {
|
||||
ClientConnectionUtil.waitForPort(Integer.parseInt((String)this.automationContext.getInstance().getPorts().get("https")), (String)this.automationContext.getInstance().getHosts().get("default"));
|
||||
ClientConnectionUtil.waitForLogin(this.automationContext);
|
||||
} catch (XPathExpressionException var4) {
|
||||
throw new AutomationFrameworkException("Connection attempt to carbon server failed", var4);
|
||||
}
|
||||
}
|
||||
|
||||
private String[] expandServerStartupCommandList(Map<String, String> commandMap) {
|
||||
if(commandMap != null && commandMap.size() != 0) {
|
||||
String[] cmdParaArray = null;
|
||||
String cmdArg = null;
|
||||
if(commandMap.containsKey("cmdArg")) {
|
||||
cmdArg = (String)commandMap.get("cmdArg");
|
||||
cmdParaArray = cmdArg.trim().split("\\s+");
|
||||
commandMap.remove("cmdArg");
|
||||
}
|
||||
|
||||
String[] parameterArray = new String[commandMap.size()];
|
||||
int arrayIndex = 0;
|
||||
Set<Map.Entry<String, String>> entries = commandMap.entrySet();
|
||||
|
||||
String parameter;
|
||||
for(Iterator i$ = entries.iterator(); i$.hasNext(); parameterArray[arrayIndex++] = parameter) {
|
||||
Map.Entry<String, String> entry = (Map.Entry)i$.next();
|
||||
String key = (String)entry.getKey();
|
||||
String value = (String)entry.getValue();
|
||||
if(value != null && !value.isEmpty()) {
|
||||
parameter = key + "=" + value;
|
||||
} else {
|
||||
parameter = key;
|
||||
}
|
||||
}
|
||||
|
||||
if(cmdArg != null) {
|
||||
commandMap.put("cmdArg", cmdArg);
|
||||
}
|
||||
|
||||
if(cmdParaArray != null && cmdParaArray.length != 0) {
|
||||
return (String[]) ArrayUtils.addAll(parameterArray, cmdParaArray);
|
||||
} else {
|
||||
return parameterArray;
|
||||
}
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private int getPortOffsetFromCommandMap(Map<String, String> commandMap) {
|
||||
return commandMap.containsKey("-DportOffset")?Integer.parseInt((String)commandMap.get("-DportOffset")):0;
|
||||
}
|
||||
|
||||
private String[] mergerArrays(String[] array1, String[] array2) {
|
||||
return (String[])ArrayUtils.addAll(array1, array2);
|
||||
}
|
||||
|
||||
/**
|
||||
* This methods will insert jacoco agent settings into startup script under JAVA_OPTS
|
||||
*
|
||||
* @param scriptName - Name of the startup script
|
||||
* @throws IOException - throws if shell script edit fails
|
||||
*/
|
||||
private void insertJacocoAgentToShellScript(String scriptName) throws IOException {
|
||||
String jacocoAgentFile = CodeCoverageUtils.getJacocoAgentJarLocation();
|
||||
this.coverageDumpFilePath = FrameworkPathUtil.getCoverageDumpFilePath();
|
||||
CodeCoverageUtils.insertStringToFile(new File(this.carbonHome + File.separator + "bin" + File.separator + scriptName + ".sh"), new File(this.carbonHome + File.separator + "tmp" + File.separator + scriptName + ".sh"), "-Dwso2.server.standalone=true", "-javaagent:" + jacocoAgentFile + "=destfile=" + this.coverageDumpFilePath + "" + ",append=true,includes=" + CodeCoverageUtils.getInclusionJarsPattern(":") + " \\");
|
||||
}
|
||||
|
||||
/**
|
||||
* This methods will insert jacoco agent settings into windows bat script
|
||||
*
|
||||
* @param scriptName - Name of the startup script
|
||||
* @throws IOException - throws if shell script edit fails
|
||||
*/
|
||||
private void insertJacocoAgentToBatScript(String scriptName) throws IOException {
|
||||
String jacocoAgentFile = CodeCoverageUtils.getJacocoAgentJarLocation();
|
||||
this.coverageDumpFilePath = FrameworkPathUtil.getCoverageDumpFilePath();
|
||||
CodeCoverageUtils.insertJacocoAgentToStartupBat(new File(this.carbonHome + File.separator + "bin" + File.separator + scriptName + ".bat"), new File(this.carbonHome + File.separator + "tmp" + File.separator + scriptName + ".bat"), "-Dcatalina.base", "-javaagent:" + jacocoAgentFile + "=destfile=" + this.coverageDumpFilePath + "" + ",append=true,includes=" + CodeCoverageUtils.getInclusionJarsPattern(":"));
|
||||
}
|
||||
|
||||
/**
|
||||
* This method will check the OS and edit server startup script to inject jacoco agent
|
||||
*
|
||||
* @throws IOException - If agent insertion fails.
|
||||
*/
|
||||
private void instrumentForCoverage() throws IOException, AutomationFrameworkException {
|
||||
String scriptName = TestFrameworkUtils.getStartupScriptFileName(this.carbonHome);
|
||||
if(System.getProperty("os.name").toLowerCase().contains("windows")) {
|
||||
this.insertJacocoAgentToBatScript(scriptName);
|
||||
if(log.isDebugEnabled()) {
|
||||
log.debug("Included files " + CodeCoverageUtils.getInclusionJarsPattern(":"));
|
||||
log.debug("Excluded files " + CodeCoverageUtils.getExclusionJarsPattern(":"));
|
||||
}
|
||||
} else {
|
||||
this.insertJacocoAgentToShellScript(scriptName);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* To check jacoco file sizes and wait for them to get created..
|
||||
*
|
||||
* @param filePath File Path of the jacoco data files.
|
||||
*/
|
||||
private void checkJacocoDataFileSizes(String filePath) {
|
||||
Collection<File> fileSetsCollection = FileUtils
|
||||
.listFiles(new File(filePath), new RegexFileFilter("[^s]+(." + "(?i)(exec))$"),
|
||||
DirectoryFileFilter.DIRECTORY);
|
||||
|
||||
for (File inputFile : fileSetsCollection) {
|
||||
if (inputFile.isDirectory()) {
|
||||
continue;
|
||||
}
|
||||
//retry to check whether exec data file is non empty.
|
||||
waitForCoverageDumpFileCreation(inputFile);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This is to wait for jacoco exe file creation.
|
||||
*
|
||||
* @param file File that need to be created.
|
||||
*/
|
||||
private void waitForCoverageDumpFileCreation(File file) {
|
||||
long currentTime = System.currentTimeMillis();
|
||||
long waitTime = currentTime + COVERAGE_DUMP_WAIT_TIME;
|
||||
|
||||
while (waitTime > System.currentTimeMillis()) {
|
||||
if (file.length() > 0) {
|
||||
log.info("Execution data file non empty file size in KB : " + file.length() / 1024);
|
||||
break;
|
||||
} else {
|
||||
try {
|
||||
log.warn("Execution data file is empty file size in KB : " + file.length() / 1024);
|
||||
Thread.sleep(500);
|
||||
} catch (InterruptedException ignored) {
|
||||
log.warn("Sleep interrupted ", ignored);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,182 @@
|
||||
/*
|
||||
* Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
*
|
||||
* Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
*
|
||||
* Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://entgra.io/licenses/entgra-commercial/1.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.common.extensions;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.wso2.carbon.automation.engine.FrameworkConstants;
|
||||
import org.wso2.carbon.automation.engine.context.AutomationContext;
|
||||
import org.wso2.carbon.automation.engine.exceptions.AutomationFrameworkException;
|
||||
import org.wso2.carbon.automation.extensions.ExtensionConstants;
|
||||
|
||||
import javax.xml.xpath.XPathExpressionException;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class CustomTestServerManager {
|
||||
protected CarbonServerManagerExtension carbonServer;
|
||||
protected String carbonZip;
|
||||
protected int portOffset;
|
||||
protected Map<String, String> commandMap = new HashMap<String, String>();
|
||||
private static final Log log = LogFactory.getLog(CustomTestServerManager.class);
|
||||
protected String carbonHome;
|
||||
|
||||
public CustomTestServerManager(AutomationContext context) {
|
||||
carbonServer = new CarbonServerManagerExtension(context);
|
||||
}
|
||||
|
||||
public CustomTestServerManager(AutomationContext context, String carbonZip) {
|
||||
carbonServer = new CarbonServerManagerExtension(context);
|
||||
this.carbonZip = carbonZip;
|
||||
}
|
||||
|
||||
public CustomTestServerManager(AutomationContext context, int portOffset) {
|
||||
carbonServer = new CarbonServerManagerExtension(context);
|
||||
this.portOffset = portOffset;
|
||||
commandMap.put(ExtensionConstants.SERVER_STARTUP_PORT_OFFSET_COMMAND, String.valueOf(portOffset));
|
||||
}
|
||||
|
||||
public CustomTestServerManager(AutomationContext context, String carbonZip,
|
||||
Map<String, String> commandMap) {
|
||||
carbonServer = new CarbonServerManagerExtension(context);
|
||||
this.carbonZip = carbonZip;
|
||||
if (commandMap.get(ExtensionConstants.SERVER_STARTUP_PORT_OFFSET_COMMAND) != null) {
|
||||
this.portOffset = Integer.parseInt(commandMap.get(ExtensionConstants.SERVER_STARTUP_PORT_OFFSET_COMMAND));
|
||||
} else {
|
||||
throw new IllegalArgumentException("portOffset value must be set in command list");
|
||||
}
|
||||
this.commandMap = commandMap;
|
||||
}
|
||||
|
||||
public String getCarbonZip() {
|
||||
return carbonZip;
|
||||
}
|
||||
|
||||
public String getCarbonHome() {
|
||||
return carbonHome;
|
||||
}
|
||||
|
||||
public int getPortOffset() {
|
||||
return portOffset;
|
||||
}
|
||||
|
||||
public void configureServer() throws AutomationFrameworkException {
|
||||
|
||||
}
|
||||
|
||||
public Map<String, String> getCommands() {
|
||||
return commandMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called for starting a Carbon server in preparation for execution of a
|
||||
* TestSuite
|
||||
* <p/>
|
||||
* Add the @BeforeSuite TestNG annotation in the method overriding this method
|
||||
*
|
||||
* @param server : The server which needs to be start.
|
||||
* @return The CARBON_HOME
|
||||
* @throws IOException If an error occurs while copying the deployment artifacts into the
|
||||
* Carbon server
|
||||
*/
|
||||
public synchronized String startServer(String server)
|
||||
throws AutomationFrameworkException, IOException, XPathExpressionException, InterruptedException {
|
||||
if (carbonHome == null) {
|
||||
if (carbonZip == null) {
|
||||
carbonZip = System.getProperty(FrameworkConstants.SYSTEM_PROPERTY_CARBON_ZIP_LOCATION);
|
||||
}
|
||||
if (carbonZip == null) {
|
||||
throw new IllegalArgumentException("carbon zip file cannot find in the given location");
|
||||
}
|
||||
String extractedDir = getExistingExtractedDir();
|
||||
if (server.equalsIgnoreCase("core")) {
|
||||
if (extractedDir == null) {
|
||||
carbonHome = carbonServer.setUpCarbonHome(carbonZip);
|
||||
} else {
|
||||
carbonHome = extractedDir;
|
||||
}
|
||||
} else if (server.equalsIgnoreCase("analytics") || server.equalsIgnoreCase("broker")) {
|
||||
if (extractedDir == null) {
|
||||
carbonHome = carbonServer.setUpCarbonHome(carbonZip) + File.separator + "wso2" + File.separator + server;
|
||||
} else {
|
||||
carbonHome = extractedDir + File.separator + "wso2" + File.separator + server;
|
||||
}
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unsupported server type provided - " + server);
|
||||
}
|
||||
configureServer();
|
||||
}
|
||||
log.info("Carbon Home - " + carbonHome);
|
||||
if (commandMap.get(ExtensionConstants.SERVER_STARTUP_PORT_OFFSET_COMMAND) != null) {
|
||||
this.portOffset = Integer.parseInt(commandMap.get(ExtensionConstants.SERVER_STARTUP_PORT_OFFSET_COMMAND));
|
||||
} else {
|
||||
this.portOffset = 0;
|
||||
}
|
||||
|
||||
carbonServer.startServerUsingCarbonHome(carbonHome, commandMap);
|
||||
return carbonHome;
|
||||
}
|
||||
|
||||
private String getExistingExtractedDir() {
|
||||
File zipDir = new File(System.getProperty("basedir", ".") + File.separator + "target");
|
||||
File[] subFiles = zipDir.listFiles();
|
||||
if (subFiles != null) {
|
||||
for (File subFile : subFiles) {
|
||||
if (subFile.getName().startsWith("carbontmp")) {
|
||||
File[] carbonServerFiles = subFile.listFiles();
|
||||
if (carbonServerFiles != null) {
|
||||
for (File file : carbonServerFiles) {
|
||||
if (file.getName().startsWith("entgra-iot")) {
|
||||
return file.getAbsolutePath();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restarting server already started by the method startServer
|
||||
*
|
||||
* @throws AutomationFrameworkException
|
||||
*/
|
||||
public void restartGracefully() throws AutomationFrameworkException {
|
||||
if (carbonHome == null) {
|
||||
throw new AutomationFrameworkException("No Running Server found to restart. " +
|
||||
"Please make sure whether server is started");
|
||||
}
|
||||
carbonServer.restartGracefully();
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called for stopping a Carbon server
|
||||
* <p/>
|
||||
* Add the @AfterSuite annotation in the method overriding this method
|
||||
*
|
||||
* @throws AutomationFrameworkException If an error occurs while shutting down the server
|
||||
*/
|
||||
public void stopServer() throws AutomationFrameworkException {
|
||||
carbonServer.serverShutdown(portOffset);
|
||||
}
|
||||
}
|
@ -0,0 +1,88 @@
|
||||
/*
|
||||
* Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
*
|
||||
* Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
*
|
||||
* Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://entgra.io/licenses/entgra-commercial/1.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.common.extensions;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.wso2.carbon.automation.engine.annotations.ExecutionEnvironment;
|
||||
import org.wso2.carbon.automation.engine.context.AutomationContext;
|
||||
import org.wso2.carbon.automation.engine.context.ContextXpathConstants;
|
||||
import org.wso2.carbon.automation.engine.context.TestUserMode;
|
||||
import org.wso2.carbon.automation.engine.extensions.ExecutionListenerExtension;
|
||||
import org.wso2.carbon.automation.extensions.ExtensionConstants;
|
||||
import org.wso2.carbon.automation.extensions.servers.carbonserver.CarbonServerExtension;
|
||||
|
||||
import javax.xml.xpath.XPathExpressionException;
|
||||
|
||||
/**
|
||||
* Test Automation server extension to start the IOT core.
|
||||
* This will set the carbon_home to {carbonHome}/core and port offset : 0
|
||||
*/
|
||||
public class IOTServerExtension extends ExecutionListenerExtension {
|
||||
|
||||
private CustomTestServerManager serverManager;
|
||||
private static final Log log = LogFactory.getLog(CarbonServerExtension.class);
|
||||
private String executionEnvironment;
|
||||
private AutomationContext automationContext;
|
||||
private final String IOT_CORE_PORT_OFFSET = "0";
|
||||
|
||||
@Override
|
||||
public void initiate() {
|
||||
try {
|
||||
automationContext = new AutomationContext("IOT", TestUserMode.SUPER_TENANT_USER);
|
||||
if (getParameters().get(ExtensionConstants.SERVER_STARTUP_PORT_OFFSET_COMMAND) == null) {
|
||||
getParameters().put(ExtensionConstants.SERVER_STARTUP_PORT_OFFSET_COMMAND, IOT_CORE_PORT_OFFSET);
|
||||
}
|
||||
serverManager = new CustomTestServerManager(getAutomationContext(), null, getParameters());
|
||||
executionEnvironment =
|
||||
automationContext.getConfigurationValue(ContextXpathConstants.EXECUTION_ENVIRONMENT);
|
||||
|
||||
} catch (XPathExpressionException e) {
|
||||
throw new RuntimeException("Error while initiating test environment", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onExecutionStart() {
|
||||
try {
|
||||
if (executionEnvironment.equalsIgnoreCase(ExecutionEnvironment.STANDALONE.name())) {
|
||||
String carbonHome = serverManager.startServer("core");
|
||||
log.info(carbonHome);
|
||||
System.setProperty(ExtensionConstants.CARBON_HOME, carbonHome);
|
||||
|
||||
// Need to give time for the apis to be added to the synapse configurations.
|
||||
Thread.sleep(200000);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Fail to start carbon server ", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onExecutionFinish() {
|
||||
try {
|
||||
if (executionEnvironment.equalsIgnoreCase(ExecutionEnvironment.STANDALONE.name())) {
|
||||
serverManager.stopServer();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Fail to stop carbon server ", e);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright (C) 2018 - 2022 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
*
|
||||
* Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
*
|
||||
* Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://entgra.io/licenses/entgra-commercial/1.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.jmeter;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.testng.annotations.Test;
|
||||
import org.wso2.carbon.automation.engine.exceptions.AutomationFrameworkException;
|
||||
import org.wso2.carbon.automation.extensions.jmeter.JMeterTest;
|
||||
import org.wso2.carbon.automation.extensions.jmeter.JMeterTestManager;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URL;
|
||||
|
||||
/**
|
||||
* JMeter Test cases for Device Management APIs.
|
||||
*/
|
||||
public class AndroidDeviceManagementAPIJmeterTestCase {
|
||||
private static Log log = LogFactory.getLog(AndroidDeviceManagementAPIJmeterTestCase.class);
|
||||
|
||||
@Test(description = "Testing the android device management functionalities")
|
||||
public void permutationTest() throws AutomationFrameworkException {
|
||||
URL url = Thread.currentThread().getContextClassLoader().getResource(
|
||||
"jmeter-scripts" + File.separator + "AndroidDeviceManagementAPI.jmx");
|
||||
JMeterTest script = new JMeterTest(new File(url.getPath()));
|
||||
JMeterTestManager manager = new JMeterTestManager();
|
||||
log.info("Running permutation test using jmeter scripts");
|
||||
manager.runTest(script);
|
||||
}
|
||||
}
|
@ -0,0 +1,225 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
~ Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
~
|
||||
~ Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
~
|
||||
~ Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ https://entgra.io/licenses/entgra-commercial/1.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.
|
||||
-->
|
||||
<automation xmlns="automationXMLSchema.xsd">
|
||||
<!-- ================================================= -->
|
||||
<!-- Parameters -->
|
||||
<!-- ================================================= -->
|
||||
<configurations>
|
||||
<!--
|
||||
Change this to edit wait time for test artifact deployment
|
||||
-->
|
||||
<deploymentDelay>100000</deploymentDelay>
|
||||
<!--
|
||||
Change this to standalone|platform|all to execute test on specific environment
|
||||
-->
|
||||
<executionEnvironment>standalone</executionEnvironment>
|
||||
<!--
|
||||
Change this to true if you want to generate coverage statistics
|
||||
-->
|
||||
<coverage>false</coverage>
|
||||
<!--
|
||||
Change this to true if you want to enable framework dashboard
|
||||
-->
|
||||
<frameworkDashboard>false</frameworkDashboard>
|
||||
<!--
|
||||
Browser type with used by framework to execute UI test, supported types - chrome|firefox|opera|ie|htmlUnit
|
||||
-->
|
||||
</configurations>
|
||||
<tools>
|
||||
<selenium>
|
||||
<!-- Change to enable remote webDriver -->
|
||||
<!-- URL of remote webDriver server -->
|
||||
<remoteDriverUrl enable="false">http://10.100.2.51:4444/wd/hub/</remoteDriverUrl>
|
||||
|
||||
<!-- Type of the browser selenium tests are running" -->
|
||||
<browser>
|
||||
<browserType>firefox</browserType>
|
||||
<!-- path to webDriver executable - required only for chrome-->
|
||||
<webdriverPath enable="false">/home/test/name/webDriver</webdriverPath>
|
||||
</browser>
|
||||
</selenium>
|
||||
</tools>
|
||||
<!--
|
||||
Database configuration to be used for data service testing. DB configuration in dbs files will be replaced with
|
||||
below configuration at test run time
|
||||
-->
|
||||
<datasources>
|
||||
<datasource name="dataService">
|
||||
<url>jdbc:h2:testDB</url>
|
||||
<username>wso2carbon</username>
|
||||
<password>wso2carbon</password>
|
||||
<driverClassName>org.h2.Driver</driverClassName>
|
||||
</datasource>
|
||||
<datasource name="dataService1">
|
||||
<url>jdbc:h2:testDB</url>
|
||||
<username>wso2carbon</username>
|
||||
<password>wso2carbon</password>
|
||||
<driverClassName>org.h2.Driver</driverClassName>
|
||||
</datasource>
|
||||
</datasources>
|
||||
<security>
|
||||
<!--
|
||||
KeyStore which will be used for encrypting/decrypting passwords
|
||||
and other sensitive information.
|
||||
-->
|
||||
<keystore name="wso2">
|
||||
<!-- Keystore file location -->
|
||||
<fileName>keystores/products/wso2carbon.jks</fileName>
|
||||
<!-- Keystore type (JKS/PKCS12 etc.) -->
|
||||
<type>JKS</type>
|
||||
<!-- Keystore password -->
|
||||
<password>wso2carbon</password>
|
||||
<!-- Private Key alias -->
|
||||
<keyAlias>wso2carbon</keyAlias>
|
||||
<!-- Private Key password -->
|
||||
<keyPassword>wso2carbon</keyPassword>
|
||||
</keystore>
|
||||
<!--
|
||||
System wide trust-store which is used to maintain the certificates of all
|
||||
the trusted parties.
|
||||
-->
|
||||
<truststore name="wso2">
|
||||
<!-- trust-store file location -->
|
||||
<fileName>client-truststore.jks</fileName>
|
||||
<!-- trust-store type (JKS/PKCS12 etc.) -->
|
||||
<type>JKS</type>
|
||||
<!-- trust-store password -->
|
||||
<password>wso2carbon</password>
|
||||
</truststore>
|
||||
</security>
|
||||
<featureManagement>
|
||||
<p2Repositories>
|
||||
<repository name="localDefault">
|
||||
<repository repo-id="online-repository">https://wso2.org/repo</repository>
|
||||
<repository repo-id="file-repository">file:///home/krishantha/test</repository>
|
||||
</repository>
|
||||
</p2Repositories>
|
||||
</featureManagement>
|
||||
<!--
|
||||
System wide users who to be registered at the test initiation
|
||||
-->
|
||||
<userManagement>
|
||||
<superTenant>
|
||||
<tenant domain="carbon.super" key="superTenant">
|
||||
<admin>
|
||||
<user key="superAdmin">
|
||||
<userName>admin</userName>
|
||||
<password>admin</password>
|
||||
</user>
|
||||
</admin>
|
||||
<users>
|
||||
<user key="user1">
|
||||
<userName>testuser11</userName>
|
||||
<password>testuser11</password>
|
||||
</user>
|
||||
<user key="user2">
|
||||
<userName>testuser21</userName>
|
||||
<password>testuser21</password>
|
||||
</user>
|
||||
</users>
|
||||
</tenant>
|
||||
</superTenant>
|
||||
<tenants>
|
||||
<tenant domain="wso2.com" key="wso2">
|
||||
<admin>
|
||||
<user key="admin">
|
||||
<userName>admin</userName>
|
||||
<password>admin</password>
|
||||
</user>
|
||||
</admin>
|
||||
<users>
|
||||
<user key="user1">
|
||||
<userName>testuser11</userName>
|
||||
<password>testuser11</password>
|
||||
</user>
|
||||
<user key="user2">
|
||||
<userName>testuser21</userName>
|
||||
<password>testuser21</password>
|
||||
</user>
|
||||
</users>
|
||||
</tenant>
|
||||
</tenants>
|
||||
</userManagement>
|
||||
<!--
|
||||
This section will initiate the initial deployment of the platform required by
|
||||
the test suites.
|
||||
-->
|
||||
<platform>
|
||||
<!--
|
||||
cluster instance details to be used to platform test execution
|
||||
-->
|
||||
<productGroup name="IOT" clusteringEnabled="false" default="true">
|
||||
|
||||
<instance name="iot001" type="standalone" nonBlockingTransportEnabled="false">
|
||||
<hosts>
|
||||
<host type="default">localhost</host>
|
||||
</hosts>
|
||||
<ports>
|
||||
<port type="http">9763</port>
|
||||
<!--<port type="https">9446</port>-->
|
||||
<port type="https">9443</port>
|
||||
<!--<port type="https">9445</port>-->
|
||||
</ports>
|
||||
|
||||
<properties>
|
||||
<!--<property name="webContext">admin</property>-->
|
||||
</properties>
|
||||
</instance>
|
||||
|
||||
</productGroup>
|
||||
</platform>
|
||||
|
||||
<listenerExtensions>
|
||||
<platformExecutionManager>
|
||||
<extentionClasses>
|
||||
<class>
|
||||
<!-- <name>org.wso2.iot.integration.common.extensions.BrokerServerExtension</name>-->
|
||||
<name>org.wso2.iot.integration.common.extensions.IOTServerExtension</name>
|
||||
<!-- <name>org.wso2.iot.integration.common.extensions.AnalyticsServerExtension</name>-->
|
||||
<!-- <name>org.wso2.carbon.integration.common.extensions.usermgt.UserPopulateExtension</name>-->
|
||||
</class>
|
||||
</extentionClasses>
|
||||
</platformExecutionManager>
|
||||
|
||||
|
||||
<PlatformSuiteManager>
|
||||
<extentionClasses>
|
||||
<!--<className>org.wso2.carbon.automation.extensions.servers.carbonserver.CarbonServerExtension</className>-->
|
||||
</extentionClasses>
|
||||
</PlatformSuiteManager>
|
||||
|
||||
<PlatformAnnotationTransferManager>
|
||||
<extentionClasses>
|
||||
<!--<className>org.wso2.carbon.automation.extensions.servers.carbonserver.CarbonServerExtension</className>-->
|
||||
</extentionClasses>
|
||||
</PlatformAnnotationTransferManager>
|
||||
|
||||
<PlatformTestManager>
|
||||
<extentionClasses>
|
||||
</extentionClasses>
|
||||
</PlatformTestManager>
|
||||
|
||||
<PlatformReportManager>
|
||||
<extentionClasses>
|
||||
</extentionClasses>
|
||||
</PlatformReportManager>
|
||||
|
||||
</listenerExtensions>
|
||||
</automation>
|
@ -0,0 +1,565 @@
|
||||
<!--
|
||||
~ Copyright (c) 2015, 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.
|
||||
-->
|
||||
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified"
|
||||
elementFormDefault="qualified"
|
||||
targetNamespace="automationSchema.xsd">
|
||||
<xs:element name="automation">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="configurations">
|
||||
<xs:annotation>
|
||||
<xs:documentation>=================================================
|
||||
Parameters =================================================
|
||||
Browser type with used by framework to execute UI test, supported types
|
||||
- chrome|firefox|opera|ie|htmlUnit
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element type="xs:string" name="deploymentDelay">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Change this to edit wait time for test
|
||||
artifact deployment
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element type="xs:string" name="executionEnvironment">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Change this to product|platform/cloud to
|
||||
execute test on specific environment
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element type="xs:boolean" name="multiTenantMode">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Change this to user/tenant to execute test
|
||||
with user mode or tenant mode
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element type="xs:string" name="coverage">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Change this to true if you want to generate
|
||||
coverage statistics
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element type="xs:string" name="frameworkDashboard">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Change this to true if you want to enable
|
||||
framework dashboard
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="tools">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="selenium">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="remoteDriverUrl">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Change to enable remote webDriver
|
||||
URL of remote webDriver server
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:anyURI">
|
||||
<xs:attribute type="xs:string"
|
||||
name="enable"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="browser">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Type of the browser selenium tests
|
||||
are running"
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element type="xs:string"
|
||||
name="browserType"/>
|
||||
<xs:element name="webdriverPath">
|
||||
<xs:annotation>
|
||||
<xs:documentation>path to webDriver
|
||||
executable - required only for
|
||||
chrome
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute type="xs:string"
|
||||
name="enable"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="datasources">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="datasource" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element type="xs:string" name="url"/>
|
||||
<xs:element type="xs:string" name="username"/>
|
||||
<xs:element type="xs:string" name="password"/>
|
||||
<xs:element type="xs:string" name="driverClassName"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute type="xs:string" name="name"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="security">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="keystore" maxOccurs="unbounded">
|
||||
<xs:annotation>
|
||||
<xs:documentation>KeyStore which will be used for
|
||||
encrypting/decrypting passwords
|
||||
and other sensitive information.
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element type="xs:string" name="fileName">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Keystore file location
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element type="xs:string" name="type">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Keystore type (JKS/PKCS12 etc.)
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element type="xs:string" name="password">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Keystore password
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element type="xs:string" name="keyAlias">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Private Key alias
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element type="xs:string" name="keyPassword">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Private Key password
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute type="xs:string" name="name"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="truststore" maxOccurs="unbounded">
|
||||
<xs:annotation>
|
||||
<xs:documentation>System wide trust-store which is used to
|
||||
maintain the certificates of all
|
||||
the trusted parties.
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element type="xs:string" name="fileName">
|
||||
<xs:annotation>
|
||||
<xs:documentation>trust-store file location
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element type="xs:string" name="type">
|
||||
<xs:annotation>
|
||||
<xs:documentation>trust-store type (JKS/PKCS12
|
||||
etc.)
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element type="xs:string" name="password">
|
||||
<xs:annotation>
|
||||
<xs:documentation>trust-store password
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute type="xs:string" name="name"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="featureManagement">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="p2Repositories">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="repository">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="repository"
|
||||
maxOccurs="unbounded" minOccurs="0">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute type="xs:string"
|
||||
name="repo-id"
|
||||
use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute type="xs:string" name="name"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="userManagement">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="superTenant">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="tenant">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="admin">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="user">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element
|
||||
type="xs:string"
|
||||
name="userName"/>
|
||||
<xs:element
|
||||
type="xs:string"
|
||||
name="password"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute
|
||||
type="xs:string"
|
||||
name="key"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="users">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="user"
|
||||
maxOccurs="unbounded"
|
||||
minOccurs="0">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element
|
||||
type="xs:string"
|
||||
name="userName"/>
|
||||
<xs:element
|
||||
type="xs:string"
|
||||
name="password"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute
|
||||
type="xs:string"
|
||||
name="key"
|
||||
use="optional"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute type="xs:string" name="key"
|
||||
use="required"/>
|
||||
<xs:attribute type="xs:string" name="domain"
|
||||
use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="tenants">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="tenant" maxOccurs="unbounded"
|
||||
minOccurs="0">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="admin">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="user">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element
|
||||
type="xs:string"
|
||||
name="userName"/>
|
||||
<xs:element
|
||||
type="xs:string"
|
||||
name="password"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute
|
||||
type="xs:string"
|
||||
name="key"
|
||||
use="optional"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="users">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="user"
|
||||
maxOccurs="unbounded"
|
||||
minOccurs="0">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element
|
||||
type="xs:string"
|
||||
name="userName"/>
|
||||
<xs:element
|
||||
type="xs:string"
|
||||
name="password"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute
|
||||
type="xs:string"
|
||||
name="key"
|
||||
use="optional"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute type="xs:string" name="key"
|
||||
use="required"/>
|
||||
<xs:attribute type="xs:string" name="domain"
|
||||
use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="platform">
|
||||
|
||||
<xs:complexType>
|
||||
<xs:choice>
|
||||
<xs:element name="productGroup" maxOccurs="unbounded" minOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:choice maxOccurs="unbounded" minOccurs="1">
|
||||
<xs:element name="instance">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="hosts">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="host"
|
||||
maxOccurs="unbounded"
|
||||
minOccurs="0">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension
|
||||
base="xs:string">
|
||||
<xs:attribute
|
||||
type="xs:string"
|
||||
name="type"
|
||||
use="required"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="ports">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="port"
|
||||
maxOccurs="unbounded"
|
||||
minOccurs="0">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension
|
||||
base="xs:string">
|
||||
<xs:attribute
|
||||
type="xs:string"
|
||||
name="type"
|
||||
use="required"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="properties">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="property"
|
||||
maxOccurs="unbounded"
|
||||
minOccurs="0">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension
|
||||
base="xs:string">
|
||||
<xs:attribute
|
||||
type="xs:string"
|
||||
name="name"
|
||||
use="optional"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
<xs:attribute type="xs:string" name="name"
|
||||
use="required"/>
|
||||
<xs:attribute type="xs:string" name="type"
|
||||
use="required"/>
|
||||
<xs:attribute type="xs:boolean"
|
||||
name="nonBlockingTransportEnabled"
|
||||
use="required"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:choice>
|
||||
<xs:attribute type="xs:string" name="name"/>
|
||||
<xs:attribute type="xs:string" name="clusteringEnabled"/>
|
||||
<xs:attribute type="xs:boolean" name="default"/>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="listenerExtensions">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="platformExecutionManager">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="extentionClasses">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element type="xs:string" name="className"
|
||||
maxOccurs="unbounded"
|
||||
minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="PlatformSuiteManager">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="extentionClasses">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element type="xs:string" name="className"
|
||||
maxOccurs="unbounded"
|
||||
minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="PlatformAnnotationTransferManager">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="extentionClasses">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element type="xs:string" name="className"
|
||||
maxOccurs="unbounded"
|
||||
minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="PlatformTestManager">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="extentionClasses">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element type="xs:string" name="className"
|
||||
maxOccurs="unbounded"
|
||||
minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="PlatformReportManager">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="extentionClasses">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element type="xs:string" name="className"
|
||||
maxOccurs="unbounded"
|
||||
minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:schema>
|
Binary file not shown.
@ -0,0 +1,23 @@
|
||||
-org.wso2.carbon.caching.core.identity.*
|
||||
-org.wso2.carbon.caching.core.permissiontree.*
|
||||
-org.wso2.carbon.caching.infinispan.*
|
||||
-org.wso2.carbon.event.core.internal.delivery.jms.*
|
||||
-org.wso2.carbon.event.core.qpid.*
|
||||
-org.wso2.carbon.registry.synchronization.*
|
||||
-*.stub*
|
||||
-*.stub_
|
||||
-*.stub_4.0.0
|
||||
-*.stub-
|
||||
-org.eclipse.*
|
||||
-*.equinox.*
|
||||
-org.wso2.carbon.user.core.*
|
||||
-samples.*
|
||||
-*.log4j*
|
||||
-*.axis2*
|
||||
-*.ui*
|
||||
-*.tenant*
|
||||
-*.stratos*
|
||||
-*.eventing*
|
||||
-*tests-transports*
|
||||
-org.wso2.carbon.mediation.statistics*
|
||||
-*startup*
|
@ -0,0 +1,8 @@
|
||||
io.entgra.power.meter.logger_
|
||||
io.entgra.meter.request_
|
||||
io.entgra.device.mgt.plugin.power.meter_
|
||||
io.entgra.tableau.integration_
|
||||
io.entgra.iot.ami.communication.adaptor_
|
||||
io.entgra.iot.dlms_
|
||||
io.entgra.iot.iec_
|
||||
io.entgra.iot.sms_
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,37 @@
|
||||
#
|
||||
# Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
#
|
||||
# Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
#
|
||||
# Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# https://entgra.io/licenses/entgra-commercial/1.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.
|
||||
#
|
||||
|
||||
log4j.rootLogger=INFO, console, Default
|
||||
|
||||
log4j.logger.org.wso2=INFO
|
||||
log4j.logger.org.apache.axis2.deployment.ModuleDeployer=ERROR
|
||||
#Automation file apender
|
||||
log4j.appender.Default=org.apache.log4j.RollingFileAppender
|
||||
log4j.appender.Default.File=logs/automation.log
|
||||
log4j.appender.Default.Append=true
|
||||
log4j.appender.Default.MaxFileSize=10MB
|
||||
log4j.appender.Default.MaxBackupIndex=10
|
||||
log4j.appender.Default.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.Default.layout.ConversionPattern=%d{ISO8601} %-5p [%c] - %m%n
|
||||
|
||||
|
||||
#Automation console apender
|
||||
log4j.appender.console=org.apache.log4j.ConsoleAppender
|
||||
log4j.appender.console.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.console.layout.ConversionPattern=%-5p [%c] - %m%n
|
@ -0,0 +1,24 @@
|
||||
<!--
|
||||
~ Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
~
|
||||
~ Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
~
|
||||
~ Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ https://entgra.io/licenses/entgra-commercial/1.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.
|
||||
-->
|
||||
|
||||
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
|
||||
|
||||
<suite name="mdm-suite">
|
||||
|
||||
</suite>
|
@ -0,0 +1,37 @@
|
||||
<!--
|
||||
~ Copyright (C) 2018 - 2020 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
~
|
||||
~ Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
~
|
||||
~ Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ https://entgra.io/licenses/entgra-commercial/1.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.
|
||||
-->
|
||||
|
||||
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
|
||||
|
||||
<suite name="iot-suite-initializer" verbose="10">
|
||||
<parameter name="useDefaultListeners" value="false"/>
|
||||
<listeners>
|
||||
<listener class-name="org.wso2.carbon.automation.engine.testlisteners.TestExecutionListener"/>
|
||||
<listener class-name="org.wso2.carbon.automation.engine.testlisteners.TestManagerListener"/>
|
||||
<listener class-name="org.wso2.carbon.automation.engine.testlisteners.TestReportListener"/>
|
||||
<listener class-name="org.wso2.carbon.automation.engine.testlisteners.TestSuiteListener"/>
|
||||
<listener class-name="org.wso2.carbon.automation.engine.testlisteners.TestTransformerListener"/>
|
||||
</listeners>
|
||||
|
||||
<test name="iot-test-cases" preserve-order="true" parallel="false">
|
||||
<classes>
|
||||
<class name="org.wso2.iot.integration.jmeter.AndroidDeviceManagementAPIJmeterTestCase"/>
|
||||
</classes>
|
||||
</test>
|
||||
</suite>
|
@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
~ Copyright (C) 2018 - 2023 Entgra (Pvt) Ltd, Inc - All Rights Reserved.
|
||||
~
|
||||
~ Unauthorised copying/redistribution of this file, via any medium is strictly prohibited.
|
||||
~
|
||||
~ Licensed under the Entgra Commercial License, Version 1.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ https://entgra.io/licenses/entgra-commercial/1.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.
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
|
||||
<parent>
|
||||
<groupId>io.entgra.product.community</groupId>
|
||||
<artifactId>product-parent</artifactId>
|
||||
<version>5.1.3-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>integration-test</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<name>Entgra IoT - Integration Tests</name>
|
||||
|
||||
<modules>
|
||||
<module>iot-community</module>
|
||||
</modules>
|
||||
|
||||
</project>
|
Loading…
Reference in new issue