diff --git a/modules/integration/pom.xml b/modules/integration/pom.xml
index 035ddede..d503ea18 100644
--- a/modules/integration/pom.xml
+++ b/modules/integration/pom.xml
@@ -33,11 +33,11 @@
pom
- tests-artifacts
+
tests-common
- tests-integration
- tests-ui-integration
- tests-platform
+
+
+ tests-iot-web-ui
diff --git a/modules/integration/tests-common/pom.xml b/modules/integration/tests-common/pom.xml
index 048d805a..a9d2d3cc 100644
--- a/modules/integration/tests-common/pom.xml
+++ b/modules/integration/tests-common/pom.xml
@@ -31,9 +31,9 @@
WSO2 IoT Server - Integration Test Common
- admin-clients
- integration-test-utils
- ui-pages
+
+
+ web-ui-pages
diff --git a/modules/integration/tests-common/web-ui-pages/pom.xml b/modules/integration/tests-common/web-ui-pages/pom.xml
new file mode 100644
index 00000000..614d9398
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/pom.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+ org.wso2.iot
+ tests-common
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+ 4.0.0
+ org.wso2.carbon.iot.integration.ui.pages
+ jar
+ WSO2 IoT Server - Integration Test Common Web UI Pages
+
+
+
+ org.wso2.carbon.automationutils
+ org.wso2.carbon.integration.common.admin.client
+ compile
+
+
+ org.wso2.carbon
+ org.wso2.carbon.user.mgt.stub
+
+
+ org.wso2.carbon
+ org.wso2.carbon.logging.view.stub
+
+
+ org.wso2.carbon
+ org.wso2.carbon.ndatasource.stub
+
+
+ org.wso2.carbon
+ org.wso2.carbon.server.admin.stub
+
+
+ org.wso2.carbon
+ org.wso2.carbon.throttle.stub
+
+
+ org.wso2.carbon
+ org.wso2.carbon.tenant.mgt.stub
+
+
+ org.wso2.carbon
+ org.wso2.carbon.application.mgt.stub
+
+
+ org.wso2.carbon
+ org.wso2.carbon.security.mgt.stub
+
+
+ org.wso2.carbon
+ org.wso2.carbon.identity.user.profile.stub
+
+
+ org.wso2.carbon
+ org.wso2.carbon.identity.user.profile.stub
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+ org.wso2.carbon.automation
+ org.wso2.carbon.automation.extensions
+ compile
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+
+ org.testng
+ testng
+ compile
+
+
+ org.wso2.carbon.automation
+ org.wso2.carbon.automation.test.utils
+ compile
+
+
+ org.wso2.carbon.automation
+ org.wso2.carbon.automation.engine
+ compile
+
+
+
+
diff --git a/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/IOTIntegrationUIBaseTestCase.java b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/IOTIntegrationUIBaseTestCase.java
new file mode 100644
index 00000000..c2998991
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/IOTIntegrationUIBaseTestCase.java
@@ -0,0 +1,57 @@
+package org.wso2.iot.integration.ui.pages;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.wso2.carbon.authenticator.stub.LoginAuthenticationExceptionException;
+import org.wso2.carbon.automation.engine.context.AutomationContext;
+import org.wso2.carbon.automation.engine.context.TestUserMode;
+import org.wso2.carbon.automation.test.utils.common.HomePageGenerator;
+import org.wso2.carbon.integration.common.admin.client.AuthenticatorClient;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.xpath.XPathExpressionException;
+import java.io.IOException;
+import java.rmi.RemoteException;
+
+/**
+ * Created by menaka on 1/19/16.
+ *
+ */
+public class IOTIntegrationUIBaseTestCase {
+
+ private static final Log log = LogFactory.getLog(IOTIntegrationUIBaseTestCase.class);
+ protected AutomationContext automationContext;
+
+ protected void init() throws IOException, XMLStreamException, XPathExpressionException {
+ automationContext = new AutomationContext("IOT", "iot001", TestUserMode.SUPER_TENANT_ADMIN);
+ }
+
+ protected String getBackendURL() throws XPathExpressionException {
+ return automationContext.getContextUrls().getBackEndUrl();
+ }
+
+ protected String getWebAppURL() throws XPathExpressionException {
+ return automationContext.getContextUrls().getWebAppURL();
+ }
+
+ protected String getSessionCookie(AutomationContext context)
+ throws RemoteException, XPathExpressionException,
+ LoginAuthenticationExceptionException {
+ AuthenticatorClient authenticationAdminClient = new AuthenticatorClient(context.getContextUrls().getBackEndUrl());
+ String sessionCookie = authenticationAdminClient.login(automationContext.getSuperTenant().
+ getTenantAdmin().getUserName(), automationContext.getSuperTenant().
+ getTenantAdmin().getPassword(),
+ automationContext.getDefaultInstance().getHosts().get("default"));
+
+ return sessionCookie;
+ }
+
+ protected String getServiceURL() throws XPathExpressionException {
+ String serviceURL = automationContext.getContextUrls().getServiceUrl();
+ return automationContext.getContextUrls().getServiceUrl();
+ }
+
+ protected String getLoginURL() throws XPathExpressionException {
+ return HomePageGenerator.getProductHomeURL(automationContext);
+ }
+}
diff --git a/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/UIElementMapper.java b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/UIElementMapper.java
new file mode 100644
index 00000000..c3840973
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/UIElementMapper.java
@@ -0,0 +1,51 @@
+package org.wso2.iot.integration.ui.pages;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+/**
+ * Read the mapper file and load the UI elements into Properties object.
+ */
+public class UIElementMapper {
+
+ public static final Properties uiPropertiies = new Properties();
+ private static final Log log = LogFactory.getLog(UIElementMapper.class);
+ private static UIElementMapper instance;
+
+ private UIElementMapper(){
+
+ }
+
+ public static synchronized UIElementMapper getInstance() throws IOException {
+ if (instance == null) {
+ setStream();
+ instance = new UIElementMapper();
+ }
+ return instance;
+ }
+
+ public static Properties setStream() throws IOException {
+
+ InputStream inputStream = UIElementMapper.class.getResourceAsStream("/mapper.properties");
+
+ if (inputStream.available() > 0) {
+ uiPropertiies.load(inputStream);
+ inputStream.close();
+ return uiPropertiies;
+ }
+ return null;
+ }
+
+ public String getElement (String key) {
+ if (uiPropertiies != null) {
+ return uiPropertiies.getProperty(key);
+ }
+ return null;
+ }
+
+
+}
diff --git a/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/enroll/EnrollDevicePage.java b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/enroll/EnrollDevicePage.java
new file mode 100644
index 00000000..43b3bbb3
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/enroll/EnrollDevicePage.java
@@ -0,0 +1,23 @@
+package org.wso2.iot.integration.ui.pages.enroll;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openqa.selenium.WebDriver;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+
+import java.io.IOException;
+
+/**
+ * Device Enrollment page for new user
+ */
+public class EnrollDevicePage {
+ private static final Log log = LogFactory.getLog(EnrollDevicePage.class);
+ private WebDriver driver;
+ private UIElementMapper uiElementMapper;
+
+ public EnrollDevicePage(WebDriver driver) throws IOException{
+ this.driver = driver;
+ this.uiElementMapper = UIElementMapper.getInstance();
+ }
+
+}
diff --git a/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/groups/DeviceAddGroupPage.java b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/groups/DeviceAddGroupPage.java
new file mode 100644
index 00000000..86e90196
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/groups/DeviceAddGroupPage.java
@@ -0,0 +1,69 @@
+package org.wso2.iot.integration.ui.pages.groups;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+
+import java.io.IOException;
+
+/**
+ * Add group page of iot server
+ */
+public class DeviceAddGroupPage {
+
+ private static final Log log = LogFactory.getLog(DeviceAddGroupPage.class);
+ private WebDriver driver;
+ private UIElementMapper uiElementMapper;
+
+ public DeviceAddGroupPage(WebDriver driver) throws IOException {
+ this.driver = driver;
+ this.uiElementMapper = UIElementMapper.getInstance();
+ WebDriverWait webDriverWait = new WebDriverWait(driver, 10);
+
+ if (!driver.findElement(By.xpath
+ (uiElementMapper.getElement("iot.device.group.addNewGroup.xpath"))).getText().contains("ADD NEW GROUP")){
+ throw new IllegalStateException("This is not the Add Group page");
+ }
+ }
+
+
+ public DeviceGroupsPage addNewGroup (String name, String description) throws Exception{
+
+ WebElement nameField = driver.findElement(By.id(
+ uiElementMapper.getElement("iot.device.group.addGroupForm.name.id")));
+ WebElement descriptionField = driver.findElement(By.id(
+ uiElementMapper.getElement("iot.device.group.addGroupForm.description.id")));
+ WebElement addGroupButton = driver.findElement(By.id(
+ uiElementMapper.getElement("iot.device.group.addGroupForm.addButton.id")));
+
+ nameField.sendKeys(name);
+ descriptionField.sendKeys(description);
+
+ addGroupButton.click();
+
+ return new DeviceGroupsPage(driver);
+
+ }
+
+ public String submitEmptyForm() {
+ WebElement nameField = driver.findElement(By.id(
+ uiElementMapper.getElement("iot.device.group.addGroupForm.name.id")));
+ WebElement descriptionField = driver.findElement(By.id(
+ uiElementMapper.getElement("iot.device.group.addGroupForm.description.id")));
+ WebElement addGroupButton = driver.findElement(By.id(
+ uiElementMapper.getElement("iot.device.group.addGroupForm.addButton.id")));
+
+ nameField.sendKeys("");
+ descriptionField.sendKeys("");
+
+ addGroupButton.click();
+
+ return driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.device.groups.add.emptyfrom.error"))).getText();
+ }
+
+}
diff --git a/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/groups/DeviceGroupsPage.java b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/groups/DeviceGroupsPage.java
new file mode 100644
index 00000000..89f0685b
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/groups/DeviceGroupsPage.java
@@ -0,0 +1,58 @@
+package org.wso2.iot.integration.ui.pages.groups;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by menaka on 1/24/16.
+ *
+ */
+public class DeviceGroupsPage {
+ private static final Log log = LogFactory.getLog(DeviceGroupsPage.class);
+ private WebDriver driver;
+ private UIElementMapper uiElementMapper;
+
+ public DeviceGroupsPage(WebDriver driver) throws IOException {
+ this.driver = driver;
+ this.uiElementMapper = UIElementMapper.getInstance();
+ WebDriverWait webDriverWait = new WebDriverWait(driver, 10);
+
+ if (!webDriverWait.until(ExpectedConditions.textToBePresentInElement(driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.device.groups.view.header.xpath"))), "GROUPS"))) {
+ throw new IllegalStateException("This is not the Groups page");
+ }
+ }
+
+ public DeviceAddGroupPage addNewGroup() throws Exception {
+ WebElement addNewGroupBtn = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.device.viewGroup.empty.addGroup.xpath")));
+ addNewGroupBtn.click();
+ return new DeviceAddGroupPage(driver);
+ }
+
+ public boolean isGroupCreated (String groupName) {
+ WebElement table = driver.findElement(By.id(uiElementMapper.getElement("iot.device.table.id")));
+ List allGroupNames = table.findElements(By.tagName("h4"));
+ List groupsList = new ArrayList<>();
+
+ for (WebElement name : allGroupNames) {
+ groupsList.add(name.getText());
+
+ }
+
+ return groupsList.contains(groupName);
+ }
+
+
+
+}
diff --git a/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/home/IOTAdminDashboard.java b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/home/IOTAdminDashboard.java
new file mode 100644
index 00000000..83ff939c
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/home/IOTAdminDashboard.java
@@ -0,0 +1,63 @@
+package org.wso2.iot.integration.ui.pages.home;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+import org.wso2.iot.integration.ui.pages.groups.DeviceAddGroupPage;
+import org.wso2.iot.integration.ui.pages.groups.DeviceGroupsPage;
+import org.wso2.iot.integration.ui.pages.login.LoginPage;
+import org.wso2.iot.integration.ui.pages.uesr.AddUserPage;
+import org.wso2.iot.integration.ui.pages.uesr.UserListingPage;
+
+import java.io.IOException;
+
+public class IOTAdminDashboard {
+
+ private static final Log log = LogFactory.getLog(IOTHomePage.class);
+ private WebDriver driver;
+ private UIElementMapper uiElementMapper;
+
+ public IOTAdminDashboard(WebDriver driver) throws IOException {
+ this.driver = driver;
+ this.uiElementMapper = UIElementMapper.getInstance();
+ log.info(driver.findElement(By.xpath(uiElementMapper.getElement("iot.admin.dashboard.title.xpath"))).
+ getText());
+ // Check that we're on the right page.
+ if (!driver.findElement(By.xpath(uiElementMapper.getElement("iot.admin.dashboard.title.xpath"))).
+ getText().contains("DASHBOARD")) {
+ throw new IllegalStateException("This is not the home page");
+ }
+ }
+
+ public LoginPage logout() throws IOException {
+ driver.findElement(By.xpath("/html/body/header/div/div[2]/a/span[1]")).click();
+ WebElement logout = driver.findElement(By.xpath(uiElementMapper.getElement("iot.user.logout.link.xpath")));
+ logout.click();
+ return new LoginPage(driver);
+ }
+
+ public DeviceAddGroupPage addGroup() throws Exception {
+ driver.findElement(By.xpath(uiElementMapper.getElement("iot.device.group.addButton.xpath"))).click();
+ return new DeviceAddGroupPage(driver);
+ }
+
+ public DeviceGroupsPage viewGroups() throws Exception {
+ driver.findElement(By.xpath(uiElementMapper.getElement("iot.device.group.viewButton.xpath"))).click();
+ return new DeviceGroupsPage(driver);
+ }
+
+ public AddUserPage addUser() throws Exception {
+ driver.findElement(By.xpath(uiElementMapper.getElement("iot.admin.user.addButton.xpath"))).click();
+ return new AddUserPage(driver);
+ }
+
+ public UserListingPage viewUser() throws Exception {
+ driver.findElement(By.xpath(uiElementMapper.getElement("iot.admin.user.viewButton.xpath"))).click();
+ return new UserListingPage(driver);
+ }
+
+ //ToDo : Need to add device and policy methods
+}
diff --git a/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/home/IOTHomePage.java b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/home/IOTHomePage.java
new file mode 100644
index 00000000..0f81ce5c
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/home/IOTHomePage.java
@@ -0,0 +1,71 @@
+package org.wso2.iot.integration.ui.pages.home;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+import org.wso2.iot.integration.ui.pages.enroll.EnrollDevicePage;
+import org.wso2.iot.integration.ui.pages.groups.DeviceAddGroupPage;
+import org.wso2.iot.integration.ui.pages.login.LoginPage;
+
+import java.io.IOException;
+
+/**
+ * In IOT server, this page is the Devices page for users.
+ * For admin this is the dashboard.
+ */
+public class IOTHomePage {
+ private static final Log log = LogFactory.getLog(IOTHomePage.class);
+ private WebDriver driver;
+ private UIElementMapper uiElementMapper;
+
+ public IOTHomePage(WebDriver driver) throws IOException {
+ this.driver = driver;
+ this.uiElementMapper = UIElementMapper.getInstance();
+ // Check that we're on the right page.
+ WebDriverWait wait = new WebDriverWait(driver, 10);
+ if (!wait.until(ExpectedConditions.titleIs("Device Management | IoT Server"))) {
+ throw new IllegalStateException("This is not the home page");
+ }
+ }
+
+ public boolean checkUserName() throws Exception{
+ String name = driver.findElement(By.xpath(uiElementMapper.getElement("iot.user.registered.name"))).getText();
+ return name.contains(uiElementMapper.getElement("iot.user.login.username"));
+ }
+
+ //To logout
+ public LoginPage logout() throws Exception {
+ driver.findElement(By.xpath(uiElementMapper.getElement("iot.user.registered.name"))).click();
+ WebElement logout = driver.findElement(By.xpath(uiElementMapper.getElement("iot.user.logout.link.xpath")));
+ logout.click();
+ return new LoginPage(driver);
+ }
+
+ //To enroll devices as user
+ public EnrollDevicePage enrollNewDevice() throws Exception{
+ driver.findElement(By.xpath("iot.home.page.uuf-menu.xpath")).click();
+ driver.findElement(By.xpath("iot.home.page.uuf-menu.devicemgt.xpath")).click();
+ driver.findElement(By.xpath("iot.home.enrollDevice.xpath")).click();
+ return new EnrollDevicePage(driver);
+ }
+
+ //To add new Device groups as user
+
+ public void goToGroupMgt() throws Exception {
+ driver.findElement(By.xpath("iot.home.page.uuf-menu.xpath")).click();
+ driver.findElement(By.xpath("iot.home.page.uuf-menu.groupmgt.xpath")).click();
+ }
+
+ public DeviceAddGroupPage addNewGroup() throws Exception {
+ driver.findElement(By.xpath("iot.device.viewGroup.empty.addGroup.xpath")).click();
+ return new DeviceAddGroupPage(driver);
+ }
+
+ //ToDo : To add policies
+
+}
diff --git a/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/login/LoginPage.java b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/login/LoginPage.java
new file mode 100644
index 00000000..fde006cd
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/login/LoginPage.java
@@ -0,0 +1,67 @@
+package org.wso2.iot.integration.ui.pages.login;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+import org.wso2.iot.integration.ui.pages.home.IOTAdminDashboard;
+import org.wso2.iot.integration.ui.pages.home.IOTHomePage;
+import org.wso2.iot.integration.ui.pages.uesr.NewUserRegisterPage;
+
+import java.io.IOException;
+
+/**
+ * Login page of the iot server
+ *
+ */
+public class LoginPage {
+ private static final Log log = LogFactory.getLog(LoginPage.class);
+ private WebDriver driver;
+ private UIElementMapper uiElementMapper;
+
+ public LoginPage(WebDriver driver) throws IOException {
+ this.driver = driver;
+ this.uiElementMapper = UIElementMapper.getInstance();
+ WebDriverWait webDriverWait = new WebDriverWait(driver, 10);
+
+ if (!webDriverWait.until(ExpectedConditions.titleContains("Login | IoT Server"))) {
+ throw new IllegalStateException("This is not the Login page");
+ }
+ }
+
+ public IOTHomePage loginAsUser(String username, String password) throws IOException {
+ log.info("Login as " + username);
+ WebElement userNameField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.login.input.username.xpath")));
+ WebElement passwordField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.login.input.password.xpath")));
+ userNameField.sendKeys(username);
+ passwordField.sendKeys(password);
+ driver.findElement(By.xpath(uiElementMapper.getElement("iot.user.login.button.xpath"))).click();
+ return new IOTHomePage(driver);
+ }
+
+ public IOTAdminDashboard loginAsAdmin(String username, String password) throws IOException {
+ log.info("Login as " + username);
+ WebElement userNameField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.login.input.username.xpath")));
+ WebElement passwordField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.login.input.password.xpath")));
+ userNameField.sendKeys(username);
+ passwordField.sendKeys(password);
+ driver.findElement(By.xpath(uiElementMapper.getElement("iot.user.login.button.xpath"))).click();
+ return new IOTAdminDashboard(driver);
+ }
+
+ public NewUserRegisterPage registerNewUser() throws IOException {
+ WebElement registerLink = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.register.link.xpath")));
+ registerLink.click();
+ return new NewUserRegisterPage(driver);
+ }
+
+}
diff --git a/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/AddUserPage.java b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/AddUserPage.java
new file mode 100644
index 00000000..e1e07241
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/AddUserPage.java
@@ -0,0 +1,53 @@
+package org.wso2.iot.integration.ui.pages.uesr;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+
+public class AddUserPage {
+ private static final Log log = LogFactory.getLog(AddUserPage.class);
+ private WebDriver driver;
+ private UIElementMapper uiElementMapper;
+
+ public AddUserPage(WebDriver driver) throws Exception {
+ this.driver = driver;
+ this.uiElementMapper = UIElementMapper.getInstance();
+
+ WebDriverWait webDriverWait = new WebDriverWait(driver, 10);
+ if (!webDriverWait.until(ExpectedConditions.titleContains("User Management | IoT Server"))){
+ throw new IllegalStateException("This is not the Add User page");
+ }
+ }
+
+ public UserAddedPage createNewUser(String userName, String firstName, String lastName, String email) throws Exception {
+
+ WebElement userNameField = driver.findElement(By.id(
+ uiElementMapper.getElement("iot.admin.addUser.username.id")));
+ WebElement firstNameField = driver.findElement(By.id(
+ uiElementMapper.getElement("iot.admin.addUser.firstName.id")));
+ WebElement lastNameField = driver.findElement(By.id(
+ uiElementMapper.getElement("iot.admin.addUser.lastName.id")));
+ WebElement emailField = driver.findElement(By.id(
+ uiElementMapper.getElement("iot.admin.addUser.email.id")));
+
+ userNameField.sendKeys(userName);
+ firstNameField.sendKeys(firstName);
+ lastNameField.sendKeys(lastName);
+ emailField.sendKeys(email);
+
+ WebDriverWait wait = new WebDriverWait(driver, 10);
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(
+ uiElementMapper.getElement("iot.admin.addUser.add.btn.xpath"))));
+
+ driver.findElement(By.xpath("//button[@id='add-user-btn']")).click();
+
+ return new UserAddedPage(driver);
+ }
+
+
+}
\ No newline at end of file
diff --git a/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/EditUserPage.java b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/EditUserPage.java
new file mode 100644
index 00000000..7011cfa3
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/EditUserPage.java
@@ -0,0 +1,34 @@
+package org.wso2.iot.integration.ui.pages.uesr;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+
+/**
+ * Created by menaka on 2/8/16.
+ *
+ */
+public class EditUserPage {
+ private static final Log log = LogFactory.getLog(EditUserPage.class);
+ private WebDriver driver;
+ private UIElementMapper uiElementMapper;
+
+ public EditUserPage(WebDriver driver) throws Exception {
+ this.driver = driver;
+ this.uiElementMapper = UIElementMapper.getInstance();
+
+ WebDriverWait webDriverWait = new WebDriverWait(driver, 10);
+ if (!webDriverWait.until(ExpectedConditions.titleContains("User Management | IoT Server"))){
+ throw new IllegalStateException("This is not the Edit User page");
+ }
+ }
+
+ public void editUser(String password, String firstName, String lastName) {
+ driver.findElement(By.xpath(uiElementMapper.getElement("iot.user.add.input.password.xpath")));
+ }
+
+}
diff --git a/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/NewUserRegisterPage.java b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/NewUserRegisterPage.java
new file mode 100644
index 00000000..7f5064c1
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/NewUserRegisterPage.java
@@ -0,0 +1,58 @@
+package org.wso2.iot.integration.ui.pages.uesr;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+import org.wso2.iot.integration.ui.pages.login.LoginPage;
+
+import java.io.IOException;
+
+/**
+ * Created by menaka on 1/19/16.
+ */
+public class NewUserRegisterPage {
+ private static final Log log = LogFactory.getLog(NewUserRegisterPage.class);
+ private WebDriver driver;
+ private UIElementMapper uiElementMapper;
+
+ public NewUserRegisterPage(WebDriver driver) throws IOException {
+ this.driver = driver;
+ this.uiElementMapper = UIElementMapper.getInstance();
+ // Check that we're on the right page.
+ WebDriverWait webDriverWait = new WebDriverWait(driver, 10);
+ if (!webDriverWait.until(ExpectedConditions.titleContains("Register | IoT Server"))){
+ throw new IllegalStateException("This is not the Register page");
+ }
+ }
+
+ public LoginPage addUser(String firstName, String lastName, String email, String userName, String password,
+ String
+ confirmPassword) throws IOException {
+ WebElement firstNameField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.add.input.firstname.xpath")));
+ WebElement lastNameField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.add.input.lastname.xpath")));
+ WebElement emailField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.add.input.email.xpath")));
+ WebElement userNameField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.add.input.username.xpath")));
+ WebElement passwordField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.add.input.password.xpath")));
+ WebElement passwordConfirmationField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.add.input.confirmpassword.xpath")));
+ firstNameField.sendKeys(firstName);
+ lastNameField.sendKeys(lastName);
+ emailField.sendKeys(email);
+ userNameField.sendKeys(userName);
+ passwordField.sendKeys(password);
+ passwordConfirmationField.sendKeys(confirmPassword);
+ driver.findElement(By.xpath(uiElementMapper.getElement("iot.user.add.register.button.xpath"))).click();
+ return new LoginPage(driver);
+ }
+
+}
diff --git a/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/UserAddedPage.java b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/UserAddedPage.java
new file mode 100644
index 00000000..3b3149e6
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/UserAddedPage.java
@@ -0,0 +1,37 @@
+package org.wso2.iot.integration.ui.pages.uesr;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+
+/**
+ * Created by menaka on 1/27/16.
+ *
+ */
+public class UserAddedPage {
+ private static final Log log = LogFactory.getLog(UserAddedPage.class);
+ private WebDriver driver;
+ private UIElementMapper uiElementMapper;
+
+ public UserAddedPage(WebDriver driver) throws Exception {
+ this.driver = driver;
+ this.uiElementMapper = UIElementMapper.getInstance();
+
+ driver.findElement(By.xpath(uiElementMapper.getElement("iot.admin.addUser.view.btn.xpath"))).click();
+// WebDriverWait webDriverWait = new WebDriverWait(driver, 10);
+// if (!driver.findElement(By.xpath(uiElementMapper.getElement("iot.admin.user.added.page.subtitle.xpath")))
+// .getText().contains("User was added successfully.")){
+// throw new IllegalStateException("This is not the User Added page");
+// }
+
+
+
+ }
+
+
+
+}
diff --git a/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/UserListingPage.java b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/UserListingPage.java
new file mode 100644
index 00000000..1cc2a3ad
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/UserListingPage.java
@@ -0,0 +1,44 @@
+package org.wso2.iot.integration.ui.pages.uesr;
+
+import org.apache.commons.jexl2.UnifiedJEXL;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.omg.PortableServer.THREAD_POLICY_ID;
+import org.openqa.selenium.By;
+import org.openqa.selenium.ElementNotVisibleException;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+
+public class UserListingPage {
+ private static final Log log = LogFactory.getLog(UserListingPage.class);
+ private WebDriver driver;
+ private UIElementMapper uiElementMapper;
+
+ public UserListingPage(WebDriver driver) throws Exception {
+ this.driver = driver;
+ this.uiElementMapper = UIElementMapper.getInstance();
+
+ if (!driver.findElement(By.xpath("//span[@class='page-sub-title']"))
+ .getText().contains("USERS")){
+ throw new IllegalStateException("This is not the User Listing page");
+ }
+ }
+
+ public UserListingPage deleteUser() throws Exception {
+ WebElement deleteBtn = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.admin.deleteUser.btn.xpath")));
+ if (deleteBtn!=null){
+ deleteBtn.click();
+ } else {
+ return new UserListingPage(driver);
+ }
+ driver.findElement(By.xpath(uiElementMapper.getElement("iot.admin.deleteUser.yes.link.xpath"))).click();
+ Thread.sleep(1000);
+ driver.findElement(By.xpath(uiElementMapper.getElement("iot.admin.deleteUser.success.link.xpath"))).click();
+
+ return new UserListingPage(driver);
+ }
+
+
+}
diff --git a/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/ViewUserPage.java b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/ViewUserPage.java
new file mode 100644
index 00000000..e5c56b11
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/src/main/java/org/wso2/iot/integration/ui/pages/uesr/ViewUserPage.java
@@ -0,0 +1,30 @@
+package org.wso2.iot.integration.ui.pages.uesr;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+
+/**
+ * Created by menaka on 2/8/16.
+ */
+public class ViewUserPage {
+ private static final Log log = LogFactory.getLog(ViewUserPage.class);
+ private WebDriver driver;
+ private UIElementMapper uiElementMapper;
+
+ public ViewUserPage (WebDriver driver) throws Exception {
+ this.driver = driver;
+ this.uiElementMapper = UIElementMapper.getInstance();
+
+ WebDriverWait webDriverWait = new WebDriverWait(driver, 10);
+ if (!webDriverWait.until(ExpectedConditions.titleContains("User Management | IoT Server"))){
+ throw new IllegalStateException("This is not the User view page");
+ }
+ }
+
+
+
+}
diff --git a/modules/integration/tests-common/web-ui-pages/src/main/resources/mapper.properties b/modules/integration/tests-common/web-ui-pages/src/main/resources/mapper.properties
new file mode 100644
index 00000000..43e319b8
--- /dev/null
+++ b/modules/integration/tests-common/web-ui-pages/src/main/resources/mapper.properties
@@ -0,0 +1,614 @@
+#
+# 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.
+#
+
+# User registration and login details-----------------------------------------------------------------------------------
+
+iot.user.add.firstname=firstname
+iot.user.add.lastname=lastname
+iot.user.add.username=username
+iot.user.add.password=password
+iot.user.add.email=username@wso2.com
+
+iot.user.login.username=username
+iot.user.login.password=password
+
+# User registration and login ui----------------------------------------------------------------------------------------
+
+iot.user.registered.name=/html/body/header/div/div[2]/a/span[1]
+
+iot.user.add.input.firstname.xpath=//*[@id="first_name"]
+iot.user.add.input.lastname.xpath=//*[@id="last_name"]
+iot.user.add.input.username.xpath=//*[@id="user_name"]
+iot.user.add.input.password.xpath=//*[@id="password"]
+iot.user.add.input.confirmpassword.xpath=//*[@id="password_confirmation"]
+iot.user.add.input.email.xpath=//*[@id="email"]
+iot.user.add.register.button.xpath=//*[@id="add-user-btn"]
+
+
+iot.user.login.input.username.xpath=//*[@id="signInForm"]/div[1]/input
+iot.user.login.input.password.xpath=//*[@id="signInForm"]/div[2]/input
+iot.user.login.button.xpath=//*[@id="signInForm"]/div[3]/button
+
+iot.user.register.link.xpath=//*[@id="register-link-wrapper"]/a
+
+# Devices page elements ------------------------------------------------------------------------------------------------
+
+iot.home.page.uuf-menu.xpath=//*[@id="_uuf-navmenu-button"]
+
+iot.home.page.uuf-menu.devicemgt.xpath=//*[@id="_uuf-navmenu-items"]/ul/li[1]/a
+iot.home.page.uuf-menu.groupmgt.xpath=//*[@id="_uuf-navmenu-items"]/ul/li[2]/a
+iot.home.page.uuf-menu.policymgt.xpath=//*[@id="_uuf-navmenu-items"]/ul/li[3]/a
+
+iot.home.page.title.xpath=/html/body/div[3]/div[1]/div/span
+iot.admin.dashboard.title.xpath=/html/body/div[3]/div[1]/div/span
+
+iot.home.enrollDevice.xpath=//*[@id="ast-container"]/div/p/a
+iot.user.logout.link.xpath=/html/body/header/div/div[2]/ul/li[3]/a
+
+# Register page error elements -----------------------------------------------------------------------------------------
+
+iot.user.register.firstname.error=first_name-error
+iot.user.register.lastname.error=last_name-error
+iot.user.register.username.error=user_name-error
+iot.user.register.email.error=email-error
+iot.user.register.password.error=password-error
+iot.user.register.confirmPassword.error=password_confirmation-error
+
+# Incorrect login Credentials ------------------------------------------------------------------------------------------
+iot.user.login.username.error=username-error
+iot.user.login.password.error=password-error
+iot.user.login.incorrect.xpath=/html/body/div/div/div/div[1]
+iot.user.login.shortPassword=password-error
+
+
+iot.dashboard.device.div.xpath=/html/body/div[3]/div[7]/div[1]/div/div/div[1]
+
+#Grouping ---------------------------------------------------------------
+
+iot.device.group.addButton.xpath=/html/body/div[3]/div[2]/div[1]/div[2]/div/div/div[2]/div[2]/span[2]/a[2]
+iot.device.group.viewButton.xpath=/html/body/div[3]/div[2]/div[1]/div[2]/div/div/div[2]/div[2]/span[2]/a[1]
+
+iot.device.group.addNewGroup.xpath=/html/body/div[3]/div/div[1]/div/p[1]
+
+iot.device.viewGroup.empty.addGroup.xpath=//*[@id="ast-container"]/div/p/a
+
+iot.device.group.addGroupForm.name.id=name
+iot.device.group.addGroupForm.description.id=description
+iot.device.group.addGroupForm.addButton.id=add-group-btn
+
+iot.device.groups.view.header.xpath=/html/body/div[3]/div[1]/div/span
+
+iot.device.groups.add.emptyfrom.error=/html/body/div[3]/div/div[1]/div/span/strong
+
+iot.device.table.id=group-grid
+
+#Add user --------------------------------------------------------------------------------------------------------------
+iot.admin.user.addButton.xpath=/html/body/div[3]/div[2]/div[1]/div[3]/div/div/div[2]/div[2]/span[2]/a[2]/span/i[2]
+iot.admin.user.viewButton.xpath=/html/body/div[3]/div[2]/div[1]/div[3]/div/div/div[2]/div[2]/span[2]/a[1]/span/i[2]
+
+iot.admin.user.added.page.subtitle.xpath="//p[@class='page-sub-title']"
+
+
+iot.admin.addUser.username.id=username
+iot.admin.addUser.firstName.id=firstname
+iot.admin.addUser.lastName.id=lastname
+iot.admin.addUser.email.id=emailAddress
+iot.admin.addUser.roles.id=roles
+
+iot.admin.addUser.add.btn.xpath=//*[@id="add-user-btn"]
+iot.admin.addUser.view.btn.xpath=//*[@id="user-created-msg"]/div/button
+
+iot.admin.deleteUser.btn.xpath=//*[@id="user1"]/td[5]/a[3]/span[1]/i[2]
+iot.admin.deleteUser.yes.link.xpath=//a[@id="remove-user-yes-link"]
+iot.admin.deleteUser.success.link.xpath=//a[@id="remove-user-success-link"]
+
+iot.admin.addUser.formError.xpath=//*[@id="user-create-error-msg"]
+
+#----- User view page heading ----------------------------------------
+
+iot.user.view.page.heading.xpath=/html/body/div[3]/div[1]/div/label
+
+#----- Editing a user-------------------------------------------------
+
+iot.admin.viewUser.btn.xpath=//*[@id="user1"]/td[5]/a[1]/span[1]/i[2]
+iot.admin.editUser.btn.xpath=//*[@id="userEditBtn"]
+iot.admin.editUser.edit.btn.xpath=//*[@id="add-user-btn"]
+
+#-----------------------------------------------------------------------------------------------------------------------
+iot.user.delete.button=//*[@id="inosh"]/td[5]/a[3]
+iot.user.delete.button.confirm=remove-user-yes-link
+iot.user.delete.button.success=remove-user-success-link
+iot.roles.add.button=appbar-btn-
+iot.roles.add.rolename.input=rolename
+iot.roles.add.role.button=add-role-btn
+iot.roles.add.role.created.msg.div=role-created-msg
+iot.roles.update.rolename.input=rolename
+iot.roles.update.role.button=add-role-btn
+iot.roles.update.role.created.msg.div=role-created-msg
+iot.roles.update.role.created.success.msg=ROLE WAS UPDATED SUCCESSFULLY
+iot.configuration.android.tab.identifier=id('androidConfigLink')
+iot.configuration.widows.tab.identifier=id('windowsConfigLink')
+iot.configuration.ios.tab.identifier=id('iosConfigLink')
+iot.configuration.general.tab.identifier=id('generalConfigLink')
+iot.configuration.general.input.monitoringFr.identifier=id('monitoring-config-frequency')
+iot.configuration.general.button.save.identifier=id('monitoring-config-frequency')
+iot.configuration.saved.lable.identifier=id('record-created-msg')
+iot.configuration.saved.lable.val=Please click "Go back to configurations", if you wish to save another configuration or click "Exit" to complete the process and go back to the dashboard.
+iot.configuration.saved.button.back.identifier=id('btnBack')
+iot.configuration.saved.button.back.val=Go back to configurations
+iot.configuration.saved.button.exit.identifier=id('btnExit')
+iot.configuration.saved.button.exit.val=Exit
+iot.configuration.android.select.identifier=id('android-config-notifier')
+iot.configuration.android.input.identifier=id('android-config-notifier-frequency')
+iot.configuration.android.button.save.identifier=id('save-android-btn')
+iot.configuration.windows.input.identifier=id('windows-config-notifier-frequency')
+iot.configuration.windows.button.save.identifier=id('save-windows-btn')
+iot.notification.bubble.identifier=notification-bubble
+iot.notification.unread.identifier=unReadNotifications
+iot.notification.all.identifier=allNotifications
+
+
+
+
+app.sign.in.button=button.btn
+app.redMine.login.button.name=login
+app.redMine.issue.button=New issue
+app.redMine.issue.subject=issue_subject
+app.redMine.issue.description=issue_description
+app.redMine.issue.submit=commit
+app.AddNew.App.link=Add New Application
+new.app.add.app.name=applicationName
+new.app.add.app.key=applicationKey
+new.app.add.app.icon=icon
+new.app.add.app.Description=applicationDescription
+new.app.add.app.edit.Description=appDescriptionEdit_textarea
+new.app.add.app.type=applicationType
+app.issue.version.id=issue_fixed_version_id
+app.database.db.environment.id=rssInstances
+app.database.db.environment.user=js_db_user
+app.database.db.environment.template=js_db_template
+new.app.add.repository.type=repositoryType
+create.new.app.button=appcreation
+app.homepage.search.textBox=search
+app.first.element.of.home.page=/html/body/div/div/article/section/ul/li[2]/div/h2/a/b
+app.overview.page.app.type.id=apptype
+app.overview.page.app.description.id=description
+app.overview.page.repository.type.id=repotype
+app.overview.page.app.owner.id=appOwner
+app.overview.page.app.key.xpath=/html/body/div/div/article/section[2]/div/div/div/p
+app.add.member.link=Add Members
+app.add.member.name=allUsersList
+app.invite.users= btn_nvite_users
+app.add.add.to.list.button=addToListBtn
+app.add.branch.link=Create Branch
+app.add.second.branch.xpath=(//a[contains(text(),'Branch')])[2]
+app.add.branch.version=create_branchtrunk
+app.add.branch.button.xpath=//input[@value='Create Branch']
+app.add.branch.two.button.xpath=(//input[@value='Create Branch'])[2]
+app.navigate.Link=Repos & Builds
+app.navigate.Governance.page.link=menu_governance
+app.navigate.isue.page.link.id=menu_trackIssues
+app.trunk.overview.xpath=/html/body/div/div/article/section[3]/div/ul/li/p/strong
+app.trunk.build.status.xpath=/html/body/div/div/article/section[3]/div/ul/li[2]/p/span/strong
+governance.page.firstElement.xpath=/html/body/div/div[2]/article/section/div[2]/ul/li/ul/li/div/strong
+governance.page.firstElement.date.xpath=/html/body/div/div[2]/article/section/div[2]/ul/li/ul/li[2]/div[2]/form/div/input
+governance.page.date.save.xpath=/html/body/div/div[2]/article/section/div[2]/ul/li/ul/li[2]/div[2]/form/div/button
+governance.page.promote.key.xpath=/html/body/div/div[2]/article/section/div[2]/ul/li/ul/li[3]/div/ul/li[2]/a/span
+code.completed.status=(//input[@id='registry.custom_lifecycle.checklist.option.0.item'])[last()]
+code.review.status=(//input[@id='registry.custom_lifecycle.checklist.option.1.item'])[last()]
+design.review.status=(//input[@id='registry.custom_lifecycle.checklist.option.2.item'])[last()]
+app.application.overview.page=Overview
+app.overview.page.team.details.id=userCountList
+app.team.page.id=menu_userAdmin
+app.add.member.page.id=btnAddMembers
+app.issue.redMine.tab.link=Track Issues
+app.testing.first.element.xpath=/html/body/div/div[2]/article/section/div[2]/ul[2]/li/ul/li/div/strong
+app.testing.date.save.xpath=/html/body/div/div[2]/article/section/div[2]/ul[2]/li/ul/li[2]/div/form/div/button
+app.testing.first.element.arrow.xpath=/html/body/div/div[2]/article/section/div[2]/ul[2]/li/ul/li[3]/div/ul/li[2]/a
+app.factory.issue.total.count.xpath=/html/body/div/div[2]/article/section/section/div/ul/li[2]
+app.factory.issue.item.header.id=item_list
+app.factory.database.configure.page.link=Database Configurations
+app.factory.new.database.link=Database
+app.factory.database.name.id=databaseName
+app.factory.database.password=databaseUserPassword
+app.factory.database.confirm.password=confirmDatabaseUserPassword
+app.factory.database.submit.button=div.buttonrow > input[name="Submit"]
+app.factory.database.advance.Checkbox=advancecheckbox
+app.factory.database.user.CheckBox=Username
+app.factory.database.user.password=Password
+app.factory.database.user.Repeat.password=repeatPassword
+app.factory.database.environment.id=rssInstances
+app.factory.database.user.submit.name=Submit
+app.factory.database.template.name=templateName
+app.factory.database.template.submit.name=Submit
+app.factory.db.admin.id=menu_dbAdmin
+app.factory.db.dbUser.link=DB User
+app.factory.db.template.link=DB Template
+app.factory.db.resources.id=dbSection
+app.db.link=Db
+app.db.user=wso2usr
+app.db.template=wso2Temp@Development
+app.factory.delete.user=Delete User
+app.factory.del.template=Delete Template
+app.factory.delete.Ok=Ok
+app.factory.delete.db=Delete DB
+app.data.source.name=datasource_name
+app.data.source.description=datasource_description
+app.data.source.password=datasource_password_dev
+app.data.source.username=datasource_username_text_dev
+app.data.source.add.button=Submit
+app.property.name=property_name
+app.property.type=property_type
+app.property.description=property_description
+app.property.value=property_value
+app.factory.registry.page.link=Endpoints & Registry
+app.factory.data.source.page.link=Datasources
+app.db.details.id=dbSection
+app.db.user.id=dbUsrSection
+app.db.template.id=dbTempSection
+app.factory.new.data.source.page.button=//button[@type='button']
+app.factory.api.panel.text=/html/body/div/div/article/section[3]
+app.factory.sign.out.email=span.icon-chevron-down
+app.factory.sing.out.text=Sign Out
+app.factory.subscribe=Subscribe to APIs
+app.factory.subscribe.api.element=li > div.thumbnail > a > img
+app.api.select.app.name=application-list
+app.api.subscribe.button=subscribe-button
+app.api.api.manager.button=gotoApiManagerbtn
+app.go.to.subscriptions.text=Go to My Subscriptions
+app.api.manager.class.name.text=title-section
+app.api.key.generate.text=Show Keys
+app.api.sandbox.details.id=sandTable0
+app.api.production.details.id=prodTable0
+app.api.page.link.text=APIs
+app.api.page.resource.list.id=keySection
+app.factory.subscription.page=My Subscriptions
+app.factory.list.view=a.icon-th-list.table_view
+app.overview.link.css=/html/body/div/div[2]/article/nav/ul/li/a
+
+
+
+
+login.username=username
+login.password=password
+login.sign.in.button=button
+login.header.div=header-div
+
+home.dashboard.middle.text.xpath=/html/body/div[3]/div[1]/div/span
+home.greg.sign.out.xpath=//*[@id="header-div"]/div[4]/div/ul/li[3]/a
+home.logged.user.dev=logged-user
+
+jaggery.Main.tab=menu-panel-button1
+jaggery.Region1.tab=region1_manage_menu
+jaggery.dashboard.middle.text=middle
+add.jaggery.href=Jaggery
+jaggery.war.file.upload.name=warFileName
+jaggery.upload.button.name=upload
+jaggery.upload.successful.message=messagebox-info
+jaggery.upload.successful.button=ui-dialog-titlebar-close
+
+
+carbon.Main.tab=menu-panel-button1
+carbon.Region1.tab=region1_manage_menu
+carbon.add.href=Add
+carbon.dashboard.middle.text=middle
+carbon.file.upload.field=filename
+carbon.upload.button=upload
+carbon.upload.successful.message=messagebox-info
+carbon.upload.successful.button=ui-dialog-titlebar-close
+
+
+resource.Main.tab=menu-panel-button1
+resource.Region3.tab=region3_registry_menu
+resource.browse.link=Browse
+resource.dashboard.middle.text=middle
+resource.detailed.view=stdView
+resource.add.resource.link=Add Resource
+resource.add.collection.link=Add Collection
+resource.add.resource.input.field=uResourceFile
+resource.add.Collection.input.field=collectionName
+resource.add.Url.input.id=irFetchURL
+resource.add.collection.description=colDesc
+resource.add.resource.name=uResourceName
+Resource.add.resource.description=description
+resource.add.button=/html/body/table/tbody/tr[2]/td[3]/table/tbody/tr[2]/td/div/div/table/tbody/tr/td/div[2]/div[3]/div[3]/div[5]/table/tbody/tr[2]/td/form/table/tbody/tr[6]/td/input
+resource.add.Url.button.xpath=/html/body/table/tbody/tr[2]/td[3]/table/tbody/tr[2]/td/div/div/table/tbody/tr/td/div[2]/div[3]/div[3]/div[5]/table/tbody/tr[3]/td/form/table/tbody/tr[6]/td/input
+resource.collection.add.button=/html/body/table/tbody/tr[2]/td[3]/table/tbody/tr[2]/td/div/div/table/tbody/tr/td/div[2]/div[3]/div[3]/div[7]/form/table/tbody/tr[5]/td/input
+resource.upload.successful.message=messagebox-info
+resource.upload.successful.collection.message=messagebox-info
+resource.upload.successful.button=ui-dialog-titlebar-close
+resource.upload.collection.successful.close.button=/html/body/div[5]/div/div/a
+resource.add.Url.Successful.close=/html/body/div[4]/div/div/a
+
+
+
+service.add.link=Service
+service.dashboard.middle.text=middle
+service.list.dashboard.middle.text=middle
+service.add.name.id=id_Overview_Name
+service.add.namespace.id=id_Overview_Namespace
+service.check.save.service=Services
+
+
+wsdl.dashboard.middle.text=middle
+wsdl.list.dashboard.middle.text=middle
+wsdl.add.link=WSDL
+wsdl.add.url=irFetchURL
+wsdl.add.name=irResourceName
+wsdl.add.file.id=uResourceFile
+wsdl.add.file.name.id=uResourceName
+
+
+schema.add.link=Schema
+schema.dashboard.middle.text=middle
+schema.list.dashboard.middle.text=middle
+schema.add.url=irFetchURL
+schema.add.name=irResourceName
+schema.add.schema.name.id=uResourceName
+
+
+wsPolicy.add.link=Policy
+wsPolicy.dashboard.middle.text=middle
+ws.policy.list.dashboard.middle.text=middle
+wsPolicy.add.url=irFetchURL
+wsPolicy.add.name=irResourceName
+wsPolicy.add.file.id=uResourceFile
+wsPolicy.add.schema.name.id=uResourceName
+
+
+api.add.link=API
+api.dashboard.middle.text=middle
+api.provider.id=id_Overview_Provider
+api.name.id=id_Overview_Name
+api.context.id=id_Overview_Context
+api.version.id=id_Overview_Version
+api.list.link=APIs
+
+
+uri.add.link=URI
+uri.add.list.id=URIs
+uri.dashboard.middle.text=middle
+uri.add.uri=id_Overview_URI
+uri.add.uri.name=id_Overview_Name
+uri.list.link=URIs
+
+
+my.profile.region.tab.id=region5_my_identity_menu
+my.profile.add.page.link=My Profiles
+my.profile.dashboard.middle.text=middle
+my.profile.new.profile.add.link=Add New Profile
+my.profile.name.id=profile
+my.profile.first.name.id=http://wso2.org/claims/givenname
+my.profile.last.name.id=http://wso2.org/claims/lastname
+my.profile.email.id=http://wso2.org/claims/emailaddress
+my.profile.successful.save.pane=/html/body/div[3]/div/div/a
+
+
+search.activity.link=Activities
+search.activity.id=user
+search.activity.name.id=path
+search.activity.exists.id=activityList
+
+
+search.page.link=Search
+search.resource.name=resourcePath
+search.results.id=1
+filter.search.button=/html/body/table/tbody/tr[2]/td[3]/table/tbody/tr[2]/td/div/div/form[3]/table/tbody/tr/td[8]/table/tbody/tr/td/a
+
+users.add.new.user.link.id=Add New User
+users.and.roles.link.text=Users and Roles
+users.adn.roles.add.page.middle.text=middle
+users.add.link.id=Users
+users.add.new.user.name.id=username
+users.add.new.user.password.name=password
+users.add.new.user.password.retype.name=retype
+users.admin.tick.name=userRoles
+users.save=//input[contains(@value,'Finish')]
+users.page.next.id=2
+
+
+
+
+roles.add.link.id=Roles
+role.add.new.user.link.id=Add New Role
+role.add.new.user.name.id=roleName
+role.permission.id=ygtvspacer
+role.add.user.to.role.name=org.wso2.carbon.role.assign.filter
+role.search.button=td.buttonRow > input.button
+role.add.ok.button.css=button[type="button"]
+role.add.user.to.role.name.tick=selectedUsers
+role.add.user.finish.button=/html/body/table/tbody/tr[2]/td[3]/table/tbody/tr[2]/td/div/div/form[2]/table/tbody/tr[2]/td/input[2]
+
+
+pass.word.change.link=Change My Password
+pass.word.current.name=currentPassword
+pass.word.new.name=newPassword
+pass.word.check.name=checkPassword
+pass.word.change.save.xpath=/html/body/table/tbody/tr[2]/td[3]/table/tbody/tr[2]/td/div/div/form/table/tbody/tr[2]/td/input
+password.change.dialog.xpath=/html/body/div[3]/div/div/a
+
+
+
+features.add.link=Features
+repository.add.tab.text=Repository Management
+repositories.table.id=_table_manage_repositories
+repository.add.link.text=Add Repository
+repository.url.name=_txt_repository_location_url
+repository.save.id=_btn_add_repository
+repository.name.id=_txt_repository_name
+installed.features.tab.linkText=Installed Features
+repositories.dashboard.text=middle
+features.filter.id=_txt_IF_filterString
+feature.checkbox.click.name=chkSelectFeaturesToUninstall
+feature.uninstall.next.button.id=_btn_next_review_uninstall_features
+feature.uninstall.finish.button.id=_btn_uc_finish
+
+
+
+server.shutdown.link.text=Shutdown/Restart
+feature.revert.tab=Installation History
+feature.find.feature.text=Available Features
+feature.install.name.id=_txt_AF_filterString
+feature.find.id=_btn_next_filter_repositories
+feature.install.click=chkSelectFeaturesToInstall
+feature.install.accept.button=_radio_af_accept_licenses
+
+
+key.store.add.link=KeyStores
+key.store.dashboard.middle.text=middle
+key.store.add.new.link.text=Add New KeyStore
+key.store.file.path.id=keystoreFile
+key.store.password.name=ksPassword
+key.store.provider.name=provider
+key.store.next.button=/html/body/table/tbody/tr[2]/td[3]/table/tbody/tr[2]/td/div/div/form/table/tbody/tr[2]/td/input
+key.store.pass.key=keyPass
+key.store.successful.xpath=/html/body/div[3]/div/div/a
+
+
+logging.add.link=Logging
+logging.dashboard.middle.text=middle
+logging.update.button.id=globalLog4jUpdate
+log4j.appender.update.id=appenderUpdate
+log4j.global.success.xpath=/html/body/div[3]/div[2]/button
+log4j.appender.sucess.xpath=/html/body/div[4]/div[2]/button
+
+
+log4j.logger.search.id=filterText
+log4j.logger.successful.button.xpath=/html/body/div[3]/div/div/a
+
+
+notification.adding.link=Notifications
+notification.dashboard.middle.text=middle
+notification.add.edit.link.text=Add Subscription to Resource/Collection
+notification.add.email.id=subscriptionInput
+
+registry.subscription.middle.text=middle
+registry.subscription.path.id=subscriptionPath
+registry.subscription.event.id=eventList
+registry.subscription.notification.id=notificationMethodList
+registry.subscription.email.id=subscriptionInput
+registry.subscription.digest.id=subscriptionDigestTypeInput
+registry.subscription.hsmethod.id=hierarchicalSubscriptionList
+registry.subscription.subscribe.button.id=subscribeButton
+
+
+uri.configure.add.link=URIs
+uri.configure.dashboard.middle.text=middle
+
+
+
+api.configure.add.link=APIs
+api.configure.dashboard.middle.text=middle
+
+service.configure.add.link=Services
+service.configure.dashboard.middle.text=middle
+
+server.role.add.link=Server Roles
+server.role.dashboard.middle.text=middle
+server.role.add.link.text=Add New Server Role
+server.role.name.id=_serverRoleName
+
+
+add.new.tenant.link.text=Add New Tenant
+tenant.role.dashboard.middle.text=middle
+tenant.domain=domain
+tenant.first.name=admin-firstname
+tenant.last.name=admin-lastname
+tenant.admin.user.name=admin
+tenant.admin.password=admin-password
+tenant.admin.password.repeat=admin-password-repeat
+tenant.admin.email.id=admin-email
+add.new.tenant.success.button=/html/body/div[3]/div/div/a
+view.tenant.link=View Tenants
+
+
+
+add.new.extension.dashboard.middle.text=middle
+extension.tab.id=menu-panel-button5
+extension.list.page.dashboard.middle.text=middle
+extensions.add.link=Add
+extension.add.text.box=uResourceFile
+
+life.cycle.tab.id=menu-panel-button5
+life.cycle.add.link=Lifecycles
+add.new.lifecycle.dashboard.middle.text=middle
+add.new.lifecycle.link.text=Add New Lifecycle
+add.new.lifecycle.text.area=//*[@id="textarea"]
+add.new.lifecycle.save.css=input.button.registryWriteOperation
+resource.lifecycle.minimized=//*[@id="lifecycleIconMinimized"]
+resource.lifecycle.add=//*[@id="lifecycleExpanded"]/div[2]/a
+resource.lifecycle.add.select=//*[@id="aspect"]
+resource.lifecycle.add.select.id=aspect
+resource.lifecycle.add.button.add=//*[@id="add-lifecycle-div"]/form/table/tbody/tr[2]/td/input[1]
+resource.lifecycle.add.button.cancel=//*[@id="add-lifecycle-div"]/form/table/tbody/tr[2]/td/input[2]
+
+
+
+artifact.add.tab.id=menu-panel-button5
+artifacts.add.link=Artifact Types
+add.new.artifact.dashboard.middle.text=middle
+add.new.artifact.type.link=Add new Artifact
+add.new.artifact.text.area=textarea
+add.new.artifact.save.xpath=/html/body/table/tbody/tr[2]/td[3]/table/tbody/tr[2]/td/div/div/form/table/tbody/tr[2]/td/input
+
+add.new.artifact.dialog.box=button[type="button"]
+
+
+
+handler.add.tab.id=menu-panel-button5
+handler.add.link=Handlers
+add.new.handler.dashboard.middle.text=middle
+add.new.handler.link.text=Add New Handler
+add.new.handler.text.area=textarea
+add.new.handler.save.xpath=/html/body/table/tbody/tr[2]/td[3]/table/tbody/tr[2]/td/div/div/form/table/tbody/tr[2]/td/input
+add.new.handler.dialog.box=button[type="button"]
+configure.tab.id=menu-panel-button3
+
+
+
+manage.report.page.link=Reports
+manage.report.list.dashboard.middle.text=middle
+add.report.list.dashboard.middle.text=middle
+add.report.name=reportName
+add.report.template=reportTemplate
+add.report.type=reportType
+add.report.class=reportClass
+report.add.link=Add Report
+
+life.cycle.expand.id=lifecycleIconMinimized
+life.cycle.add=Add Lifecycle
+life.cycle.add.option=option0
+life.cycle.add.option1=option1
+life.cycle.add.option2=option2
+life.cycle.promote=Promote
+life.cycle.publish=Publish
+life.cycle.stage=/html/body/table/tbody/tr[2]/td[3]/table/tbody/tr[2]/td/div/div/table/tbody/tr/td[4]/div[14]/div[3]/div[2]/table/tbody/tr/td/div[2]/table/tbody/tr[2]/td
+life.cycle.promote.ok.button=button[type="\button\"]
+
+webapp.list.xpath=.//*[@id='menu']/ul/li[7]/ul/li[2]/ul/li[1]/a
+
+webapp.list.page.middle=middle
+webapp.add.xpath=//*[@id="menu"]/ul/li[5]/ul/li[2]/ul/li[3]/ul/li[1]/a
+webapp.add.page.middle=middle
+
+endpoints.tab.id=//*[@id="menu"]/ul/li[5]/ul/li[4]/ul/li[4]/a
+endpoints.page.middle=middle
+
+
+bam.dashboard.tab.id=//*[@id="menu"]/ul/li[3]/ul/li/a
+bam.dashboard.signin.xpath=//*[@id="wrap"]/div[2]/div/div/h1
diff --git a/modules/integration/tests-iot-web-ui/pom.xml b/modules/integration/tests-iot-web-ui/pom.xml
new file mode 100644
index 00000000..b79b49a6
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/pom.xml
@@ -0,0 +1,298 @@
+
+
+
+
+ org.wso2.iot
+ wso2iot-integration
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+
+ 4.0.0
+ WSO2 IoT Server - Integration Test UI Module
+ org.wso2.carbon.iot.integration.test.web.ui.integration
+ jar
+
+
+
+
+ maven-surefire-plugin
+ false
+
+
+ -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m
+
+
+ src/test/resources/testng-server-mgt.xml
+ src/test/resources/testng.xml
+
+
+
+
+
+
+ maven.test.haltafterfailure
+ false
+
+
+ java.io.tmpdir
+ ${basedir}/target/
+
+
+ carbon.zip
+
+ ${basedir}/../../distribution/target/wso2iots-${project.version}.zip
+
+
+
+ framework.resource.location
+
+ ${basedir}/src/test/resources/
+
+
+
+ server.list
+
+ IOT
+
+
+
+ usedefaultlisteners
+ false
+
+ ${basedir}/target/security-verifier/
+ ${basedir}/target/iot
+ ${basedir}/src/test/resources/instrumentation.txt
+ ${basedir}/src/test/resources/filters.txt
+ ${basedir}/target/iot
+
+ ${basedir}/target
+
+
+
+ maven-dependency-plugin
+
+
+
+ copy-emma-dependencies
+ compile
+
+ copy-dependencies
+
+
+ ${project.build.directory}/emma
+ jar
+ emma
+
+
+
+
+ copy-secVerifier
+ compile
+
+ copy-dependencies
+
+
+ ${basedir}/target/security-verifier
+ aar
+ SecVerifier
+ true
+
+
+
+
+ unpack-mar-jks
+ compile
+
+ unpack
+
+
+
+
+ org.wso2.iot
+ wso2iots
+ ${project.version}
+ zip
+ true
+ ${basedir}/target/tobeCopied/
+ **/*.jks,**/*.mar,**/axis2_client.xml
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 2.4
+
+
+
+ test-jar
+
+
+
+
+
+ maven-resources-plugin
+ 2.6
+
+
+ copy-resources-jks
+ compile
+
+ copy-resources
+
+
+ ${basedir}/src/test/resources/keystores/products
+
+
+
+
+ ${basedir}/target/tobeCopied/wso2iots-${project.version}/repository/resources/security/
+
+
+ **/*.jks
+
+
+
+
+
+
+ copy-stratos-jks
+ compile
+
+ copy-resources
+
+
+ ${basedir}/src/test/resources/keystores/stratos
+
+
+
+
+ ${basedir}/target/tobeCopied/wso2iots-${project.version}/repository/resources/security/
+
+
+ **/*.jks
+
+
+
+
+
+
+ copy-axis2files
+ compile
+
+ copy-resources
+
+
+ ${basedir}/src/test/resources/axis2config
+
+
+
+
+ ${basedir}/target/tobeCopied/wso2iots-${project.version}/repository/conf/axis2/
+
+
+ **/*.xml
+
+
+
+
+
+
+ copy-resources-mar
+ compile
+
+ copy-resources
+
+
+ ${basedir}/src/test/resources/client/modules
+
+
+
+
+ ${basedir}/target/tobeCopied/wso2iot-${project.version}/repository/deployment/client/modules
+
+
+ **/*.mar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.wso2.iot
+ org.wso2.carbon.iot.integration.ui.pages
+
+
+ org.wso2.carbon.automation
+ org.wso2.carbon.automation.engine
+
+
+ org.wso2.carbon.automation
+ org.wso2.carbon.automation.test.utils
+
+
+ org.wso2.carbon.automationutils
+ org.wso2.carbon.integration.common.extensions
+
+
+
+
+ true
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/Constants.java b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/Constants.java
new file mode 100644
index 00000000..6db2903e
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/Constants.java
@@ -0,0 +1,18 @@
+package org.wso2.carbon.iot.integration.web.ui.test;
+
+/**
+ * Created by menaka on 1/19/16.
+ */
+public class Constants {
+ public static final String IOT_LOGIN_PATH = "/devicemgt/login";
+// public static final String LOGIN_GROUP = "login-group";
+// public static final String MDM_ROLES_URL = "/mdm/roles";
+ public static final String IOT_USER_REGISTER_URL = "/devicemgt/register";
+ public static final String IOT_USER_ADD_URL = "/devicemgt/user/add";
+ public static final String IOT_GROUP_ADD_URL = "/devicemgt/group/add";
+// public static final String MDM_USER_URL = "/mdm/users/";
+// public static final String MDM_ROLES_EDIT_URL = "/mdm/roles/edit-role/";
+// public static final String MDM_PLATFORM_CONFIG_URL = "/mdm/platform-configuration";
+// public static final String MDM_NOTIFICATION_URL = "/mdm/notification-listing";
+ public static final String IOT_HOME_URL = "/devicemgt/";
+}
diff --git a/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/LoginUtils.java b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/LoginUtils.java
new file mode 100644
index 00000000..3ef60003
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/LoginUtils.java
@@ -0,0 +1,24 @@
+package org.wso2.carbon.iot.integration.web.ui.test;
+
+import org.openqa.selenium.WebDriver;
+import org.wso2.carbon.automation.engine.context.AutomationContext;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+import org.wso2.iot.integration.ui.pages.login.LoginPage;
+
+/**
+ * Login as registered user
+ */
+public class LoginUtils {
+ private static UIElementMapper uiElementMapper;
+
+ public static void login(WebDriver driver, AutomationContext automationContext,
+ String webAppURL) throws Exception {
+ uiElementMapper = UIElementMapper.getInstance();
+ driver.get(webAppURL + Constants.IOT_LOGIN_PATH);
+ LoginPage test = new LoginPage(driver);
+ test.loginAsAdmin(automationContext.getSuperTenant().getTenantAdmin().getUserName(),
+ automationContext.getSuperTenant().getTenantAdmin().getPassword());
+ }
+
+
+}
diff --git a/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/group/DeviceGroupFailTest.java b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/group/DeviceGroupFailTest.java
new file mode 100644
index 00000000..7b3cd4b9
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/group/DeviceGroupFailTest.java
@@ -0,0 +1,40 @@
+package org.wso2.carbon.iot.integration.web.ui.test.group;
+
+import org.junit.Assert;
+import org.openqa.selenium.WebDriver;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.wso2.carbon.automation.extensions.selenium.BrowserManager;
+import org.wso2.carbon.iot.integration.web.ui.test.Constants;
+import org.wso2.carbon.iot.integration.web.ui.test.LoginUtils;
+import org.wso2.iot.integration.ui.pages.IOTIntegrationUIBaseTestCase;
+import org.wso2.iot.integration.ui.pages.groups.DeviceAddGroupPage;
+
+/**
+ * Created by menaka on 1/25/16.
+ *
+ */
+public class DeviceGroupFailTest extends IOTIntegrationUIBaseTestCase {
+ private WebDriver driver;
+
+ @BeforeClass(alwaysRun = true)
+ public void setup() throws Exception {
+ super.init();
+ driver = BrowserManager.getWebDriver();
+ LoginUtils.login(driver, automationContext, getWebAppURL());
+ }
+
+ @Test(description = "Test for submitting an empty form.")
+ public void addNewGroupFailTest () throws Exception {
+ driver.get(getWebAppURL() + Constants.IOT_GROUP_ADD_URL);
+ DeviceAddGroupPage addGroupPage = new DeviceAddGroupPage(driver);
+
+ Assert.assertEquals(addGroupPage.submitEmptyForm(), "Group Name is a required field. It cannot be empty.");
+ }
+
+ @AfterClass(alwaysRun = true)
+ public void tearDown() throws Exception {
+ driver.quit();
+ }
+}
diff --git a/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/group/DeviceGroupTest.java b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/group/DeviceGroupTest.java
new file mode 100644
index 00000000..371552a0
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/group/DeviceGroupTest.java
@@ -0,0 +1,49 @@
+package org.wso2.carbon.iot.integration.web.ui.test.group;
+
+import org.openqa.selenium.WebDriver;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.wso2.carbon.automation.extensions.selenium.BrowserManager;
+import org.wso2.carbon.iot.integration.web.ui.test.Constants;
+import org.wso2.carbon.iot.integration.web.ui.test.LoginUtils;
+import org.wso2.iot.integration.ui.pages.IOTIntegrationUIBaseTestCase;
+import org.wso2.iot.integration.ui.pages.groups.DeviceAddGroupPage;
+import org.wso2.iot.integration.ui.pages.groups.DeviceGroupsPage;
+import org.wso2.iot.integration.ui.pages.home.IOTAdminDashboard;
+
+/**
+ * Test cases for grouping feature of IOT server.
+ */
+public class DeviceGroupTest extends IOTIntegrationUIBaseTestCase {
+ private WebDriver driver;
+ private IOTAdminDashboard adminDashboard;
+
+ @BeforeClass(alwaysRun = true)
+ public void setup() throws Exception {
+ super.init();
+ driver = BrowserManager.getWebDriver();
+ LoginUtils.login(driver, automationContext, getWebAppURL());
+ adminDashboard = new IOTAdminDashboard(driver);
+ }
+
+ @Test(description = "Test for adding a new device group.")
+ public void addNewGroupTest () throws Exception {
+ DeviceAddGroupPage addGroupPage = adminDashboard.addGroup();
+ addGroupPage.addNewGroup("group1", "This is test group");
+ }
+
+ @Test (description = "Check whether the created group exists", dependsOnMethods = {"addNewGroupTest"})
+ public void isGroupCreatedTest () throws Exception {
+ driver.get(getWebAppURL() + Constants.IOT_HOME_URL);
+ DeviceGroupsPage groupsPage = adminDashboard.viewGroups();
+ Assert.assertTrue(groupsPage.isGroupCreated("group1"));
+ }
+
+ @AfterClass(alwaysRun = true)
+ public void tearDown() throws Exception {
+ driver.quit();
+ }
+
+}
diff --git a/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/login/LoginFailTest.java b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/login/LoginFailTest.java
new file mode 100644
index 00000000..bdf58dd9
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/login/LoginFailTest.java
@@ -0,0 +1,115 @@
+package org.wso2.carbon.iot.integration.web.ui.test.login;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.wso2.carbon.automation.extensions.selenium.BrowserManager;
+import org.wso2.carbon.iot.integration.web.ui.test.Constants;
+import org.wso2.iot.integration.ui.pages.IOTIntegrationUIBaseTestCase;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+
+
+/**
+ * Test cases to test the incorrect login from submissions.
+ * Ex:
+ * 1. Empty form
+ * 2. Incorrect username or password
+ * 3. short password
+ */
+public class LoginFailTest extends IOTIntegrationUIBaseTestCase {
+
+ private WebDriver driver;
+ private UIElementMapper uiElementMapper;
+
+ WebElement userNameField;
+ WebElement passwordField;
+ WebElement loginButton;
+
+ @BeforeClass (alwaysRun = true)
+ public void setup() throws Exception {
+ super.init();
+ driver = BrowserManager.getWebDriver();
+ clearForm();
+ }
+
+ @Test(description = "Test for empty login form submission")
+ public void emptyLoginFormTest() throws Exception {
+ userNameField.sendKeys("");
+ passwordField.sendKeys("");
+
+ loginButton.click();
+
+ Assert.assertEquals(driver.findElement(By.id(uiElementMapper.getElement("iot.user.login.username.error")))
+ .getText(), "Please enter a username");
+ Assert.assertEquals(driver.findElement(By.id(uiElementMapper.getElement("iot.user.login.password.error")))
+ .getText(), "Please provide a password");
+
+ }
+
+ @Test (description = "Test for incorrect username")
+ public void incorrectUserNameTest() throws Exception {
+
+ clearForm();
+
+
+ userNameField.sendKeys("admin1");
+ passwordField.sendKeys(automationContext.getSuperTenant().getTenantAdmin().getPassword());
+
+ loginButton.click();
+
+ Assert.assertEquals(driver.findElement(By.xpath(uiElementMapper.getElement("iot.user.login.incorrect.xpath")))
+ .getText(), "Incorrect username or password.!");
+
+ }
+
+ @Test (description = "Test for incorrect password")
+ public void incorrectPasswordTest() throws Exception {
+ clearForm();
+
+ userNameField.sendKeys(automationContext.getSuperTenant().getTenantAdmin().getPassword());
+ passwordField.sendKeys("admnn");
+
+ loginButton.click();
+
+ Assert.assertEquals(driver.findElement(By.xpath(uiElementMapper.getElement("iot.user.login.incorrect.xpath")))
+ .getText(), "Incorrect username or password.!");
+
+ }
+
+
+ @Test (description = "Test for short password")
+ public void shortPasswordTest() throws Exception {
+
+ clearForm();
+
+ userNameField.sendKeys(automationContext.getSuperTenant().getTenantAdmin().getUserName());
+ passwordField.sendKeys("ad");
+
+ loginButton.click();
+
+ Assert.assertEquals(driver.findElement(By.id(uiElementMapper.getElement("iot.user.login.password.error")))
+ .getText(), "Your password must be at least 3 characters long");
+
+ }
+
+ public void clearForm() throws Exception{
+ driver.get(getWebAppURL() + Constants.IOT_LOGIN_PATH);
+ uiElementMapper = UIElementMapper.getInstance();
+
+ userNameField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.login.input.username.xpath")));
+ passwordField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.login.input.password.xpath")));
+ loginButton = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.login.button.xpath")));
+ }
+
+ @AfterClass(alwaysRun = true)
+ public void tearDown() throws Exception {
+ driver.quit();
+ }
+}
diff --git a/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/login/LoginTest.java b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/login/LoginTest.java
new file mode 100644
index 00000000..8255791a
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/login/LoginTest.java
@@ -0,0 +1,41 @@
+package org.wso2.carbon.iot.integration.web.ui.test.login;
+
+import org.openqa.selenium.WebDriver;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.wso2.carbon.automation.extensions.selenium.BrowserManager;
+import org.wso2.carbon.iot.integration.web.ui.test.Constants;
+import org.wso2.iot.integration.ui.pages.IOTIntegrationUIBaseTestCase;
+import org.wso2.iot.integration.ui.pages.home.IOTAdminDashboard;
+import org.wso2.iot.integration.ui.pages.login.LoginPage;
+
+/**
+ * Test Login as Admin
+ *
+ */
+public class LoginTest extends IOTIntegrationUIBaseTestCase {
+ private WebDriver driver;
+
+ @BeforeClass (alwaysRun = true)
+ public void setup() throws Exception {
+ super.init();
+ driver = BrowserManager.getWebDriver();
+ driver.get(getWebAppURL() + Constants.IOT_LOGIN_PATH);
+ }
+
+ @Test (description = "Verify login to IOT server dashboard")
+ public void testAdminLogin() throws Exception {
+ LoginPage test = new LoginPage(driver);
+ IOTAdminDashboard dashboard = test.loginAsAdmin(
+ automationContext.getSuperTenant().getTenantAdmin().getUserName(),
+ automationContext.getSuperTenant().getTenantAdmin().getPassword());
+ dashboard.logout();
+ driver.close();
+ }
+
+ @AfterClass(alwaysRun = true)
+ public void tearDown() throws Exception {
+ driver.quit();
+ }
+}
diff --git a/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/user/AddUserFormTest.java b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/user/AddUserFormTest.java
new file mode 100644
index 00000000..757b1593
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/user/AddUserFormTest.java
@@ -0,0 +1,168 @@
+package org.wso2.carbon.iot.integration.web.ui.test.user;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.wso2.carbon.automation.engine.context.AutomationContext;
+import org.wso2.carbon.automation.extensions.selenium.BrowserManager;
+import org.wso2.carbon.iot.integration.web.ui.test.Constants;
+import org.wso2.carbon.iot.integration.web.ui.test.LoginUtils;
+import org.wso2.iot.integration.ui.pages.IOTIntegrationUIBaseTestCase;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+
+/**
+ * Test cases for
+ * 1. Empty form submission
+ * 2. Short user name
+ * 3. Empty First Name
+ * 4. Empty Last Name
+ * 5. Empty email
+ * 6. Incorrect email
+ */
+public class AddUserFormTest extends IOTIntegrationUIBaseTestCase {
+
+ private WebDriver driver;
+ UIElementMapper uiElementMapper;
+
+ WebElement firstNameField;
+ WebElement lastNameField;
+ WebElement emailField;
+ WebElement userNameField;
+ WebElement addUserButton;
+
+ @BeforeClass(alwaysRun = true)
+ public void setup() throws Exception {
+ super.init();
+ driver = BrowserManager.getWebDriver();
+ LoginUtils.login(driver, automationContext, getWebAppURL());
+ driver.get(getWebAppURL() + Constants.IOT_USER_ADD_URL);
+
+ uiElementMapper = UIElementMapper.getInstance();
+
+
+
+ userNameField = driver.findElement(By.id(uiElementMapper.getElement("iot.admin.addUser.username.id")));
+ firstNameField = driver.findElement(By.id(uiElementMapper.getElement("iot.admin.addUser.firstName.id")));
+ lastNameField = driver.findElement(By.id(uiElementMapper.getElement("iot.admin.addUser.lastName.id")));
+ emailField = driver.findElement(By.id(uiElementMapper.getElement("iot.admin.addUser.email.id")));
+
+ addUserButton = driver.findElement(By.xpath(uiElementMapper.getElement("iot.admin.addUser.add.btn.xpath")));
+ }
+
+ @Test(description = "Test for empty form submission")
+ public void emptyFormTest() throws Exception {
+ clearForm();
+
+ firstNameField.sendKeys("");
+ lastNameField.sendKeys("");
+ emailField.sendKeys("");
+ userNameField.sendKeys("");
+
+ addUserButton.click();
+
+ Assert.assertEquals(driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.admin.addUser.formError.xpath"))).getText(),
+ "Username is a required field. It cannot be empty.");
+
+ }
+
+ @Test(description = "Test for short user name")
+ public void shortUserNameTest() throws Exception {
+ clearForm();
+
+ firstNameField.sendKeys("User");
+ lastNameField.sendKeys("User");
+ emailField.sendKeys("user@wso2.com");
+ userNameField.sendKeys("us");
+
+ addUserButton.click();
+
+ Assert.assertEquals(driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.admin.addUser.formError.xpath"))).getText(),
+ "Username must be between 3 and 30 characters long.");
+
+ }
+
+ @Test(description = "Test for empty first name")
+ public void emptyFirstNameTest() throws Exception {
+ clearForm();
+
+ firstNameField.sendKeys("");
+ lastNameField.sendKeys("User");
+ emailField.sendKeys("user@wso2.com");
+ userNameField.sendKeys("user1");
+
+ addUserButton.click();
+
+ Assert.assertEquals(driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.admin.addUser.formError.xpath"))).getText(),
+ "Firstname is a required field. It cannot be empty.");
+
+ }
+
+ @Test(description = "Test for empty last name")
+ public void emptyLastNameTest() throws Exception {
+ clearForm();
+
+ firstNameField.sendKeys("User");
+ lastNameField.sendKeys("");
+ emailField.sendKeys("user@wso2.com");
+ userNameField.sendKeys("user1");
+
+ addUserButton.click();
+ Assert.assertEquals(driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.admin.addUser.formError.xpath"))).getText(),
+ "Lastname is a required field. It cannot be empty.");
+
+ }
+
+ @Test(description = "Test for empty email name")
+ public void emptyEmailTest() throws Exception {
+ clearForm();
+
+ firstNameField.sendKeys("User");
+ lastNameField.sendKeys("User");
+ emailField.sendKeys("");
+ userNameField.sendKeys("user1");
+
+ addUserButton.click();
+
+ Assert.assertEquals(driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.admin.addUser.formError.xpath"))).getText(),
+ "Email is a required field. It cannot be empty.");
+
+ }
+
+ @Test(description = "Test for incorrect email")
+ public void incorrectEmailTest() throws Exception {
+ clearForm();
+
+ firstNameField.sendKeys("User");
+ lastNameField.sendKeys("User");
+ emailField.sendKeys("user.com");
+ userNameField.sendKeys("user1");
+
+ addUserButton.click();
+
+ Assert.assertEquals(driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.admin.addUser.formError.xpath"))).getText(),
+ "Provided email is invalid. Please check.");
+
+ }
+ public void clearForm() {
+ firstNameField.clear();
+ lastNameField.clear();
+ emailField.clear();
+ userNameField.clear();
+ }
+
+ @AfterClass(alwaysRun = true)
+ public void tearDown() throws Exception {
+ driver.quit();
+ }
+
+}
diff --git a/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/user/RegisterTest.java b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/user/RegisterTest.java
new file mode 100644
index 00000000..89866db1
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/user/RegisterTest.java
@@ -0,0 +1,59 @@
+package org.wso2.carbon.iot.integration.web.ui.test.user;
+
+import org.openqa.selenium.WebDriver;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.wso2.carbon.automation.extensions.selenium.BrowserManager;
+import org.wso2.carbon.iot.integration.web.ui.test.Constants;
+import org.wso2.iot.integration.ui.pages.IOTIntegrationUIBaseTestCase;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+import org.wso2.iot.integration.ui.pages.home.IOTHomePage;
+import org.wso2.iot.integration.ui.pages.login.LoginPage;
+import org.wso2.iot.integration.ui.pages.uesr.NewUserRegisterPage;
+
+/**
+ * Test for registering a new user and login
+ *
+ */
+public class RegisterTest extends IOTIntegrationUIBaseTestCase {
+ private WebDriver driver;
+ UIElementMapper uiElementMapper;
+
+ @BeforeClass(alwaysRun = true)
+ public void setup() throws Exception {
+ super.init();
+ driver = BrowserManager.getWebDriver();
+ driver.get(getWebAppURL() + Constants.IOT_LOGIN_PATH);
+ }
+
+ @Test(description = "Verify new User registration")
+ public void testUserRegister() throws Exception {
+ LoginPage test = new LoginPage(driver);
+ uiElementMapper = UIElementMapper.getInstance();
+ NewUserRegisterPage registerTest = test.registerNewUser();
+ LoginPage loginPage = registerTest.addUser(
+ uiElementMapper.getElement("iot.user.add.firstname"),
+ uiElementMapper.getElement("iot.user.add.lastname"),
+ uiElementMapper.getElement("iot.user.add.email"),
+ uiElementMapper.getElement("iot.user.add.username"),
+ uiElementMapper.getElement("iot.user.add.password"),
+ uiElementMapper.getElement("iot.user.add.password"));
+
+ IOTHomePage homePage = loginPage.loginAsUser(uiElementMapper.getElement("iot.user.add.username"),
+ uiElementMapper.getElement("iot.user.add.password"));
+
+ if (!homePage.checkUserName()){
+ throw new Exception("Incorrect user logged in");
+ }
+
+ homePage.logout();
+
+ driver.close();
+ }
+
+ @AfterClass(alwaysRun = true)
+ public void tearDown() throws Exception {
+ driver.quit();
+ }
+}
diff --git a/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/user/RegistrationFormTests.java b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/user/RegistrationFormTests.java
new file mode 100644
index 00000000..9a646039
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/user/RegistrationFormTests.java
@@ -0,0 +1,158 @@
+package org.wso2.carbon.iot.integration.web.ui.test.user;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.wso2.carbon.automation.extensions.selenium.BrowserManager;
+import org.wso2.carbon.iot.integration.web.ui.test.Constants;
+import org.wso2.iot.integration.ui.pages.IOTIntegrationUIBaseTestCase;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+
+/**
+ * These test cases check for following:
+ * - Submitting an empty form
+ * - Existing username
+ * - Non matching passwords
+ * - Password, username length
+ */
+public class RegistrationFormTests extends IOTIntegrationUIBaseTestCase{
+ private WebDriver driver;
+ UIElementMapper uiElementMapper;
+
+ WebElement firstNameField;
+ WebElement lastNameField;
+ WebElement emailField;
+ WebElement userNameField;
+ WebElement passwordField;
+ WebElement passwordConfirmationField;
+ WebElement registerButton;
+
+ @BeforeClass(alwaysRun = true)
+ public void setup() throws Exception {
+ super.init();
+ driver = BrowserManager.getWebDriver();
+ driver.get(getWebAppURL() + Constants.IOT_USER_REGISTER_URL);
+
+ uiElementMapper = UIElementMapper.getInstance();
+
+ WebDriverWait wait = new WebDriverWait(driver, 10);
+ wait.until(ExpectedConditions.titleContains("Register | IoT Server"));
+
+ firstNameField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.add.input.firstname.xpath")));
+ lastNameField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.add.input.lastname.xpath")));
+ emailField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.add.input.email.xpath")));
+ userNameField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.add.input.username.xpath")));
+ passwordField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.add.input.password.xpath")));
+ passwordConfirmationField = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.add.input.confirmpassword.xpath")));
+ registerButton = driver.findElement(By.xpath(
+ uiElementMapper.getElement("iot.user.add.register.button.xpath")));
+ }
+
+ @Test(description = "Test for submitting an empty registration form")
+ public void emptyFormTest() throws Exception {
+ clearForm();
+ firstNameField.sendKeys("");
+ lastNameField.sendKeys("");
+ emailField.sendKeys("");
+ userNameField.sendKeys("");
+ passwordField.sendKeys("");
+ passwordConfirmationField.sendKeys("");
+
+ registerButton.click();
+
+ Assert.assertEquals(driver.findElement(By.id(
+ uiElementMapper.getElement("iot.user.register.firstname.error"))).getText(),
+ "Firstname is a required field. This cannot be empty.");
+ Assert.assertEquals(driver.findElement(By.id(
+ uiElementMapper.getElement("iot.user.register.lastname.error"))).getText(),
+ "Lastname is a required field. This cannot be empty.");
+ Assert.assertEquals(driver.findElement(By.id(
+ uiElementMapper.getElement("iot.user.register.email.error"))).getText(),
+ "Email is a required field. This cannot be empty.");
+ Assert.assertEquals(driver.findElement(By.id(
+ uiElementMapper.getElement("iot.user.register.username.error"))).getText(),
+ "Username is a required field. This cannot be empty.");
+ Assert.assertEquals(driver.findElement(By.id(
+ uiElementMapper.getElement("iot.user.register.password.error"))).getText(),
+ "Please enter a user login password");
+ Assert.assertEquals(driver.findElement(By.id(
+ uiElementMapper.getElement("iot.user.register.confirmPassword.error"))).getText(),
+ "Please enter a user login password");
+ }
+
+ @Test (description = "Test for non matching passwords")
+ public void nonMatchingPasswordTest() throws Exception {
+ clearForm();
+
+ firstNameField.sendKeys("User");
+ lastNameField.sendKeys("User");
+ emailField.sendKeys("user@user.com");
+ userNameField.sendKeys("user");
+ passwordField.sendKeys("user123");
+ passwordConfirmationField.sendKeys("user234");
+ registerButton.click();
+
+ Assert.assertEquals(driver.findElement(By.id(
+ uiElementMapper.getElement("iot.user.register.confirmPassword.error"))).getText(),
+ "Please enter the same password as above");
+ }
+//
+ @Test (description = "Test for email")
+ public void incorrectEmail() throws Exception {
+ clearForm();
+
+ firstNameField.sendKeys("User");
+ lastNameField.sendKeys("User");
+ emailField.sendKeys("user.com");
+ registerButton.click();
+
+ Assert.assertEquals(driver.findElement(By.id(
+ uiElementMapper.getElement("iot.user.register.email.error"))).getText(),
+ "Email is not valid. Please enter a correct email address.");
+
+ }
+//
+ @Test (description = "Test for password length")
+ public void passwordLengthTest() throws Exception {
+ clearForm();
+
+ firstNameField.sendKeys("User");
+ lastNameField.sendKeys("User");
+ emailField.sendKeys("user@user.com");
+ userNameField.sendKeys("user");
+ passwordField.sendKeys("user");
+
+ registerButton.click();
+
+ Assert.assertEquals(driver.findElement(By.id(
+ uiElementMapper.getElement("iot.user.register.password.error"))).getText(),
+ "Password should be between 5 and 30 characters.");
+
+ }
+
+ @AfterClass(alwaysRun = true)
+ public void tearDown() throws Exception {
+ driver.quit();
+ }
+
+ public void clearForm() {
+ firstNameField.clear();
+ lastNameField.clear();
+ emailField.clear();
+ userNameField.clear();
+ passwordField.clear();
+ passwordConfirmationField.clear();
+ }
+}
diff --git a/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/user/TestAdminFunctions.java b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/user/TestAdminFunctions.java
new file mode 100644
index 00000000..1cbb1e30
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/java/org/wso2/carbon/iot/integration/web/ui/test/user/TestAdminFunctions.java
@@ -0,0 +1,59 @@
+package org.wso2.carbon.iot.integration.web.ui.test.user;
+
+import org.apache.bcel.classfile.Constant;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.wso2.carbon.automation.extensions.selenium.BrowserManager;
+import org.wso2.carbon.iot.integration.web.ui.test.Constants;
+import org.wso2.carbon.iot.integration.web.ui.test.LoginUtils;
+import org.wso2.iot.integration.ui.pages.IOTIntegrationUIBaseTestCase;
+import org.wso2.iot.integration.ui.pages.UIElementMapper;
+import org.wso2.iot.integration.ui.pages.home.IOTAdminDashboard;
+import org.wso2.iot.integration.ui.pages.uesr.AddUserPage;
+import org.wso2.iot.integration.ui.pages.uesr.UserListingPage;
+
+/**
+ * Test for checking admin capabilities.
+ * - Create a new User
+ * - Delete a user
+ * -- and more
+ */
+public class TestAdminFunctions extends IOTIntegrationUIBaseTestCase {
+
+ private WebDriver driver;
+
+ @BeforeClass(alwaysRun = true)
+ public void setup() throws Exception {
+ super.init();
+ driver = BrowserManager.getWebDriver();
+ LoginUtils.login(driver, automationContext, getWebAppURL());
+ }
+
+ @Test(description = "Test for creating a new user")
+ public void createUserTest() throws Exception {
+ IOTAdminDashboard adminDashboard = new IOTAdminDashboard(driver);
+ AddUserPage addUserPage = adminDashboard.addUser();
+ addUserPage.createNewUser("user1", "User", "User", "user@wso2.com");
+ }
+
+ @Test(description = "Test for deleting a created user", dependsOnMethods = {"createUserTest"})
+ public void deleteUserTest() throws Exception {
+ driver.get(getWebAppURL() + Constants.IOT_HOME_URL);
+ IOTAdminDashboard adminDashboard = new IOTAdminDashboard(driver);
+ UserListingPage userListingPage = adminDashboard.viewUser();
+ userListingPage.deleteUser();
+ }
+
+
+ @AfterClass(alwaysRun = true)
+ public void tearDown() throws Exception {
+ driver.quit();
+ }
+}
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/automation.xml b/modules/integration/tests-iot-web-ui/src/test/resources/automation.xml
new file mode 100644
index 00000000..da7025c0
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/automation.xml
@@ -0,0 +1,220 @@
+
+
+
+
+
+
+
+
+ 60000
+
+ standalone
+
+ false
+
+ false
+
+
+
+
+
+
+ http://10.100.2.51:4444/wd/hub/
+
+
+
+ firefox
+
+ /home/test/name/webDriver
+
+
+
+
+
+
+ jdbc:h2:testDB
+ wso2carbon
+ wso2carbon
+ org.h2.Driver
+
+
+ jdbc:h2:testDB
+ wso2carbon
+ wso2carbon
+ org.h2.Driver
+
+
+
+
+
+
+ keystores/products/wso2carbon.jks
+
+ JKS
+
+ wso2carbon
+
+ wso2carbon
+
+ wso2carbon
+
+
+
+
+ client-truststore.jks
+
+ JKS
+
+ wso2carbon
+
+
+
+
+
+ https://wso2.org/repo
+ file:///home/krishantha/test
+
+
+
+
+
+
+
+
+
+ admin
+ admin
+
+
+
+
+ testuser11
+ testuser11
+
+
+ testuser21
+ testuser21
+
+
+
+
+
+
+
+
+ admin
+ admin
+
+
+
+
+ testuser11
+ testuser11
+
+
+ testuser21
+ testuser21
+
+
+
+
+
+
+
+
+
+
+
+
+ localhost
+
+
+ 9763
+ 9443
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.wso2.carbon.automation.extensions.servers.carbonserver.CarbonServerExtension
+ org.wso2.carbon.integration.common.extensions.usermgt.UserPopulateExtension
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/automationXMLSchema.xsd b/modules/integration/tests-iot-web-ui/src/test/resources/automationXMLSchema.xsd
new file mode 100644
index 00000000..b800b2ba
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/automationXMLSchema.xsd
@@ -0,0 +1,611 @@
+
+
+
+
+
+
+ =================================================
+ Parameters =================================================
+ Browser type with used by framework to execute UI test, supported types
+ - chrome|firefox|opera|ie|htmlUnit
+
+
+
+
+
+
+ Change this to edit wait time for test
+ artifact deployment
+
+
+
+
+
+ Change this to product|platform/cloud to
+ execute test on specific environment
+
+
+
+
+
+
+ Change this to true if you want to generate
+ coverage statistics
+
+
+
+
+
+ Change this to true if you want to enable
+ framework dashboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Change to enable remote webDriver
+ URL of remote webDriver server
+
+
+
+
+
+
+
+
+
+
+
+
+ Type of the browser selenium tests
+ are running"
+
+
+
+
+
+
+
+ path to webDriver
+ executable - required only for
+ chrome
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ KeyStore which will be used for
+ encrypting/decrypting passwords
+ and other sensitive information.
+
+
+
+
+
+
+ Keystore file location
+
+
+
+
+
+ Keystore type (JKS/PKCS12 etc.)
+
+
+
+
+
+ Keystore password
+
+
+
+
+
+ Private Key alias
+
+
+
+
+
+ Private Key password
+
+
+
+
+
+
+
+
+
+ System wide trust-store which is used to
+ maintain the certificates of all
+ the trusted parties.
+
+
+
+
+
+
+ trust-store file location
+
+
+
+
+
+ trust-store type (JKS/PKCS12
+ etc.)
+
+
+
+
+
+ trust-store password
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/axis2config/axis2_client.xml b/modules/integration/tests-iot-web-ui/src/test/resources/axis2config/axis2_client.xml
new file mode 100644
index 00000000..a8b584d0
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/axis2config/axis2_client.xml
@@ -0,0 +1,300 @@
+
+
+
+
+
+
+ true
+ false
+ false
+
+
+ 500
+
+ 15000
+
+
+ false
+
+
+
+ true
+
+
+
+
+
+ false
+
+
+ admin
+ axis2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 6071
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HTTP/1.1
+ chunked
+ 60000
+ 60000
+
+
+ HTTP/1.1
+ chunked
+ 60000
+ 60000
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/build.xml b/modules/integration/tests-iot-web-ui/src/test/resources/build.xml
new file mode 100644
index 00000000..7079c026
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/build.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/client/modules/addressing-1.6.1-wso2v10.mar b/modules/integration/tests-iot-web-ui/src/test/resources/client/modules/addressing-1.6.1-wso2v10.mar
new file mode 100644
index 00000000..57f85764
Binary files /dev/null and b/modules/integration/tests-iot-web-ui/src/test/resources/client/modules/addressing-1.6.1-wso2v10.mar differ
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/client/modules/addressing-1.6.1-wso2v11-20140908.185829-596.mar b/modules/integration/tests-iot-web-ui/src/test/resources/client/modules/addressing-1.6.1-wso2v11-20140908.185829-596.mar
new file mode 100644
index 00000000..4ca7737a
Binary files /dev/null and b/modules/integration/tests-iot-web-ui/src/test/resources/client/modules/addressing-1.6.1-wso2v11-20140908.185829-596.mar differ
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/client/modules/addressing-1.6.1-wso2v15.mar b/modules/integration/tests-iot-web-ui/src/test/resources/client/modules/addressing-1.6.1-wso2v15.mar
new file mode 100644
index 00000000..68f5cbd6
Binary files /dev/null and b/modules/integration/tests-iot-web-ui/src/test/resources/client/modules/addressing-1.6.1-wso2v15.mar differ
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/client/modules/rampart-1.6.1-wso2v8.mar b/modules/integration/tests-iot-web-ui/src/test/resources/client/modules/rampart-1.6.1-wso2v8.mar
new file mode 100644
index 00000000..60cd6cdf
Binary files /dev/null and b/modules/integration/tests-iot-web-ui/src/test/resources/client/modules/rampart-1.6.1-wso2v8.mar differ
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/emma.properties b/modules/integration/tests-iot-web-ui/src/test/resources/emma.properties
new file mode 100644
index 00000000..9c48e81b
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/emma.properties
@@ -0,0 +1,105 @@
+# -------------------------------------------------------------
+#
+# for user-editable property overrides use one of these options:
+#
+# (1) option-specific command line overrides, e.g.
+# -Dreport.txt.out.file=coverage.txt
+#
+# (2) '-p ' command line option,
+#
+# (3) 'emma.properties' resource placed somewhere in the classpath
+# (e.g., in \classes directory -- note that it does
+# not exist by default),
+#
+# (4) '-Demma.*' JVM options, e.g.
+# -Demma.report.txt.out.file=coverage.txt
+#
+# (5) 'emma.properties' JVM option pointing to a properties file
+# -Demma.properties=./myproperties.txt
+# -------------------------------------------------------------
+
+# -------------------------------------------------------------
+# logging properties:
+
+verbosity.level: none
+
+# classloading properties:
+
+#clsload.forced_delegation_filter:
+#clsload.through_delegation_filter: -*
+
+# -------------------------------------------------------------
+
+# instrumentation properties:
+
+instr.exclude_empty_classes: true
+instr.exclude_synthetic_methods: true
+instr.exclude_bridge_methods: true
+instr.do_suid_compensation: true
+
+# -------------------------------------------------------------
+
+# runtime properties:
+
+rt.control: false
+rt.control.host: localhost
+#rt.control.port: 44444
+
+rt.filelock: true
+#rt.filelock.portbase: 59141
+rt.filelock.maxtime: 120000
+rt.filelock.retries: 11
+
+# -------------------------------------------------------------
+
+# apprunner session data output properties:
+
+session.out.file: coverage.es
+session.out.merge: true
+
+# -------------------------------------------------------------
+
+# runtime coverage data output properties:
+
+coverage.out.file: coverage.ec
+coverage.out.merge: true
+
+# -------------------------------------------------------------
+
+# instr metadata output properties:
+
+metadata.out.file: coverage.em
+metadata.out.merge: true
+
+# -------------------------------------------------------------
+
+# common report defaults:
+
+report.units: instr
+report.depth: method
+report.columns: name, line, block, method, class
+report.sort: -line,-block,-method,-class,+name
+report.metrics: method:40,block:80,line:40,class:100
+
+# -------------------------------------------------------------
+# txt report properties:
+
+report.txt.depth: all
+report.txt.columns: class,method,block,line,name
+report.txt.out.file: coverage.txt
+
+# -------------------------------------------------------------
+# html report properties:
+
+#report.html.out.dir: coverage
+#report.html.out.file: /Users/azeez/Desktop/coverage/index.html
+report.html.out.encoding: ISO-8859-1
+
+# -------------------------------------------------------------
+# xml report properties:
+
+#report.xml.out.file: coverage.xml
+report.xml.out.encoding: UTF-8
+# -------------------------------------------------------------
+# end of file
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/filters.txt b/modules/integration/tests-iot-web-ui/src/test/resources/filters.txt
new file mode 100644
index 00000000..54913a22
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/filters.txt
@@ -0,0 +1,17 @@
+-*.stub*
+-*.stub_
+-*.stub_4.0.0
+-*.stub-
+-org.eclipse.*
+-*.equinox.*
+-org.wso2.carbon.user.core.*
+-samples.*
+-*.log4j*
+-*.axis2*
+-*.ui*
+-*.tenant*
+-*.stratos*
+-*.eventing*
+-*transports*
+-org.wso2.carbon.mediation.statistics*
+-*startup*
\ No newline at end of file
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/instrumentation.txt b/modules/integration/tests-iot-web-ui/src/test/resources/instrumentation.txt
new file mode 100644
index 00000000..917b2bb7
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/instrumentation.txt
@@ -0,0 +1,11 @@
+org.wso2.carbon.datasource_
+org.wso2.carbon.dataservices.core_
+org.wso2.carbon.transaction.manager_
+org.wso2.carbon.dataservices.sql.driver_
+org.wso2.carbon.dataservices.task_
+org.wso2.carbon.ndatasource.common_
+org.wso2.carbon.ndatasource.core_
+org.wso2.carbon.ndatasource.rdbms_
+org.wso2.carbon.ntask.common_
+org.wso2.carbon.ntask.core_
+org.wso2.carbon.ntask.solutions_
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/keystores/products/client-truststore.jks b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/products/client-truststore.jks
new file mode 100644
index 00000000..ab222fdd
Binary files /dev/null and b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/products/client-truststore.jks differ
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/keystores/products/wso2carbon.jks b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/products/wso2carbon.jks
new file mode 100644
index 00000000..79784a5e
Binary files /dev/null and b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/products/wso2carbon.jks differ
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/keystores/products/wso2certs.jks b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/products/wso2certs.jks
new file mode 100644
index 00000000..eb27997d
Binary files /dev/null and b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/products/wso2certs.jks differ
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/keystores/products/wso2mdm.jks b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/products/wso2mdm.jks
new file mode 100644
index 00000000..66b68ea3
Binary files /dev/null and b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/products/wso2mdm.jks differ
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/keystores/stratos/client-truststore.jks b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/stratos/client-truststore.jks
new file mode 100644
index 00000000..ab222fdd
Binary files /dev/null and b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/stratos/client-truststore.jks differ
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/keystores/stratos/wso2carbon.jks b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/stratos/wso2carbon.jks
new file mode 100644
index 00000000..79784a5e
Binary files /dev/null and b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/stratos/wso2carbon.jks differ
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/keystores/stratos/wso2certs.jks b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/stratos/wso2certs.jks
new file mode 100644
index 00000000..eb27997d
Binary files /dev/null and b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/stratos/wso2certs.jks differ
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/keystores/stratos/wso2emm.jks b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/stratos/wso2emm.jks
new file mode 100644
index 00000000..ae5670b0
Binary files /dev/null and b/modules/integration/tests-iot-web-ui/src/test/resources/keystores/stratos/wso2emm.jks differ
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/log4j.properties b/modules/integration/tests-iot-web-ui/src/test/resources/log4j.properties
new file mode 100644
index 00000000..6fc06a7e
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/log4j.properties
@@ -0,0 +1,43 @@
+#
+# Copyright 2009 WSO2, Inc. (http://wso2.com)
+#
+# Licensed 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.
+#
+
+#
+# This is the log4j configuration file used by WSO2 Carbon
+#
+# IMPORTANT : Please do not remove or change the names of any
+# of the Appenders defined here. The layout pattern & log file
+# can be changed using the WSO2 Carbon Management Console, and those
+# settings will override the settings in this file.
+#
+
+log4j.rootLogger=INFO, console, Default
+
+log4j.logger.org.wso2=INFO
+
+#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
\ No newline at end of file
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario-config.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario-config.xml
new file mode 100644
index 00000000..79f018ca
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario-config.xml
@@ -0,0 +1,201 @@
+
+
+
+
+
+
+ UsernameToken
+ Provides Authentication. Clients have Username Tokens
+ ut
+
+ rampart
+
+ UTOverTransport
+ basic
+
+
+ Non-repudiation
+ Provides Authentication and Integrity. Clients have X509 certificates
+ keystore
+
+ rampart
+
+ SigOnly
+ basic
+
+
+ Integrity
+ Provides Integrity. Clients do not have X509 certificates
+ keystore
+
+ rampart
+
+ SgnOnlyAnonymous
+ basic
+
+
+ Confidentiality
+ Provides Confidentiality. Clients do not have X509 certificates
+ keystore
+
+ rampart
+
+ EncrOnlyAnonymous
+ basic
+
+
+
+
+ Sign and encrypt - X509 Authentication
+ Provides Authentication, Integrity and Confidentiality. Clients have X509 certificates
+
+ keystore
+
+ rampart
+
+ SigEncr
+ advanced
+
+
+ Sign and Encrypt - Anonymous clients
+ Provides Integrity and Confidentiality.
+ keystore
+
+ rampart
+
+ SgnEncrAnonymous
+ advanced
+
+
+ Encrypt only - Username Token Authentication
+ Provides Authentication and Confidentiality. Clients have Username Tokens
+ ut-keystore
+
+ rampart
+
+ EncrOnlyUsername
+ advanced
+
+
+ Sign and Encrypt - Username Token Authentication
+ Provides Authentication, Integrity and Confidentiality. Clients have Username Tokens
+ ut-keystore
+
+ rampart
+
+ SgnEncrUsername
+ advanced
+
+
+ SecureConversation - Sign only - Service as STS - Bootstrap policy - Sign and Encrypt , X509
+ Authentication
+
+ Provides Authentication and Integrity. Multiple message exchange.Clients have X509 certificates.
+
+ keystore
+
+ rampart
+ rahas
+
+ SecConSignOnly
+ advanced
+
+
+ SecureConversation - Encrypt only - Service as STS - Bootstrap policy -
+ Sign and Encrypt , X509 Authentication
+
+ Provides Confidentiality. Multiple message exchange.Clients have X509 certificates.
+ keystore
+
+ rampart
+ rahas
+
+ SecConEncrOnly
+ advanced
+
+
+ SecureConversation - Sign and Encrypt - Service as STS - Bootstrap policy - Sign and Encrypt , X509
+ Authentication
+
+ Provides Authentication, Integrity and Confidentiality. Multiple message exchange.Clients have X509
+ certificates.
+
+ keystore
+
+ rampart
+ rahas
+
+ SecConSgnEncr
+ advanced
+
+
+ SecureConversation - Sign Only - Service as STS - Bootstrap policy - Sign and Encrypt , Anonymous
+ clients
+
+ Provides Integrity. Multiple message exchange.
+ keystore
+
+ rampart
+ rahas
+
+ SecConSignOnlyAnonymous
+ advanced
+
+
+ SecureConversation - Encrypt Only - Service as STS - Bootstrap policy - Sign and Encrypt , Anonymous
+ clients
+
+ Provides Confidentiality. Multiple message exchange.
+ keystore
+
+ rampart
+ rahas
+
+ SecConEncrOnlyAnonymous
+ advanced
+
+
+ SecureConversation - Encrypt Only - Service as STS - Bootstrap policy - Sign and Encrypt , Username
+ Token Authentication
+
+ Provides Authentication and Confidentiality. Multiple message exchange. Clients have Username
+ Tokens.
+
+ ut-keystore
+
+ rampart
+ rahas
+
+ SecConEncrUsername
+ advanced
+
+
+ SecureConversation - Sign and Encrypt - Service as STS - Bootstrap policy - Sign and Encrypt , Username
+ Token Authentication
+
+ Provides Authentication Integrity and Confidentiality. Multiple message exchange. Clients have
+ Username Tokens.
+
+ ut-keystore
+
+ rampart
+ rahas
+
+ SecConSgnEncrUsername
+ advanced
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario1-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario1-policy.xml
new file mode 100644
index 00000000..4a232f73
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario1-policy.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario10-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario10-policy.xml
new file mode 100644
index 00000000..2d076e06
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario10-policy.xml
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario11-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario11-policy.xml
new file mode 100644
index 00000000..794d52ee
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario11-policy.xml
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario12-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario12-policy.xml
new file mode 100644
index 00000000..6ac14ecd
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario12-policy.xml
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario13-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario13-policy.xml
new file mode 100644
index 00000000..dbefeda8
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario13-policy.xml
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario14-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario14-policy.xml
new file mode 100644
index 00000000..bafd7263
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario14-policy.xml
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario15-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario15-policy.xml
new file mode 100644
index 00000000..47fb6711
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario15-policy.xml
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario16-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario16-policy.xml
new file mode 100644
index 00000000..dc383d79
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario16-policy.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ https://kirillgdev04/Security_Federation_SecurityTokenService_Indigo/Symmetric.svc/Scenario_1_IssuedTokenOverTransport_UsernameOverTransport
+
+
+
+
+ urn:oasis:names:tc:SAML:1.0:assertion
+
+
+ http://schemas.xmlsoap.org/ws/2005/02/trust/SymmetricKey
+
+
+ 256
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario17-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario17-policy.xml
new file mode 100644
index 00000000..637cf81d
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario17-policy.xml
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ http://foo.bar/we/don/t/process/this/yet
+
+
+
+
+ urn:oasis:names:tc:SAML:1.0:assertion
+
+
+ http://schemas.xmlsoap.org/ws/2005/02/trust/SymmetricKey
+
+ 256
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario2-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario2-policy.xml
new file mode 100644
index 00000000..08a45d55
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario2-policy.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario3-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario3-policy.xml
new file mode 100644
index 00000000..0bfd14eb
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario3-policy.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario4-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario4-policy.xml
new file mode 100644
index 00000000..9ee47cc2
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario4-policy.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario5-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario5-policy.xml
new file mode 100644
index 00000000..9454c745
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario5-policy.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario6-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario6-policy.xml
new file mode 100644
index 00000000..7de14746
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario6-policy.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario7-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario7-policy.xml
new file mode 100644
index 00000000..db95d371
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario7-policy.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario8-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario8-policy.xml
new file mode 100644
index 00000000..1fdfd940
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario8-policy.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario9-policy.xml b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario9-policy.xml
new file mode 100644
index 00000000..73fa833b
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/security/policies/scenario9-policy.xml
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/testng-server-mgt.xml b/modules/integration/tests-iot-web-ui/src/test/resources/testng-server-mgt.xml
new file mode 100644
index 00000000..b57f1223
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/testng-server-mgt.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/testng.xml b/modules/integration/tests-iot-web-ui/src/test/resources/testng.xml
new file mode 100644
index 00000000..8a4cd94b
--- /dev/null
+++ b/modules/integration/tests-iot-web-ui/src/test/resources/testng.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index 8e8fe903..bda62c36 100644
--- a/pom.xml
+++ b/pom.xml
@@ -42,7 +42,7 @@
modules/features
modules/p2-profile-gen
modules/distribution
-
+ modules/integration