From fa359b0455b52ec20d8e4d29f7b7c591e58ff036 Mon Sep 17 00:00:00 2001 From: megala21 Date: Wed, 5 Apr 2017 17:12:39 +0530 Subject: [PATCH 1/3] Adding test cases --- .../iot/integration/common/Constants.java | 4 +- .../common/extensions/IOTServerExtension.java | 3 ++ .../iot/integration/user/UserManagement.java | 34 +++++++++------ .../modules/addressing-1.6.1-wso2v20.mar | Bin 0 -> 31342 bytes .../payloads/user-response-payloads.json | 30 ++++++------- .../src/test/resources/testng.xml | 40 +++++++++--------- .../modules/addressing-1.6.1-wso2v20.mar | Bin 0 -> 31342 bytes 7 files changed, 60 insertions(+), 51 deletions(-) create mode 100644 modules/integration/tests-integration/src/test/resources/client/modules/addressing-1.6.1-wso2v20.mar create mode 100644 modules/integration/tests-iot-web-ui/src/test/resources/client/modules/addressing-1.6.1-wso2v20.mar diff --git a/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/Constants.java b/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/Constants.java index d6bf713a..c434981a 100644 --- a/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/Constants.java +++ b/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/Constants.java @@ -309,10 +309,10 @@ public final class Constants { public static final class UserManagement { public static final String USER_MANAGEMENT_GROUP = "user-mgt"; public static final String USER_NAME = "username123"; - public static final String USER_ENDPOINT = "/mdm-admin/users"; + public static final String USER_ENDPOINT = "/api/device-mgt/v1.0/users"; public static final String USER_PAYLOAD_FILE_NAME = "user-payloads.json"; public static final String USER_RESPONSE_PAYLOAD_FILE_NAME = "user-response-payloads.json"; - public static final String VIEW_USER_ENDPOINT = "/mdm-admin/users/view"; + public static final String GET_ROLES_METHOD = "GET_ROLES"; private UserManagement() { throw new AssertionError(); diff --git a/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/extensions/IOTServerExtension.java b/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/extensions/IOTServerExtension.java index a5d414d8..8c85eb48 100644 --- a/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/extensions/IOTServerExtension.java +++ b/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/extensions/IOTServerExtension.java @@ -65,6 +65,9 @@ public class IOTServerExtension extends ExecutionListenerExtension { String carbonHome = serverManager.startServer("core"); log.info(carbonHome); System.setProperty(ExtensionConstants.CARBON_HOME, carbonHome); + + // Need to give time for the apis to be added to the synapse configurations. + Thread.sleep(30000); } } catch (Exception e) { handleException("Fail to start carbon server ", e); diff --git a/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/user/UserManagement.java b/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/user/UserManagement.java index debc6222..080f0241 100644 --- a/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/user/UserManagement.java +++ b/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/user/UserManagement.java @@ -24,13 +24,18 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.wso2.carbon.automation.engine.context.TestUserMode; import org.wso2.carbon.automation.test.utils.http.client.HttpResponse; -import org.wso2.iot.integration.common.*; +import org.wso2.iot.integration.common.AssertUtil; +import org.wso2.iot.integration.common.Constants; +import org.wso2.iot.integration.common.OAuthUtil; +import org.wso2.iot.integration.common.PayloadGenerator; +import org.wso2.iot.integration.common.RestClient; +import org.wso2.iot.integration.common.TestBase; /** * This class contains integration tests for user management backend services. */ public class UserManagement extends TestBase { - + private String NON_EXISTING_USERNAME = "non_exiting"; private RestClient client; @BeforeClass(alwaysRun = true, groups = { Constants.UserManagement.USER_MANAGEMENT_GROUP}) @@ -52,11 +57,11 @@ public class UserManagement extends TestBase { @Test(description = "Test update user.", dependsOnMethods = {"testAddUser"}) public void testUpdateUser() throws Exception { - String url = GetURL(Constants.UserManagement.USER_ENDPOINT); + String url = Constants.UserManagement.USER_ENDPOINT + "/" + Constants.UserManagement.USER_NAME; HttpResponse response = client.put(url, PayloadGenerator.getJsonPayload(Constants.UserManagement.USER_PAYLOAD_FILE_NAME, Constants.HTTP_METHOD_PUT).toString()); - Assert.assertEquals(HttpStatus.SC_CREATED, response.getResponseCode()); + Assert.assertEquals(HttpStatus.SC_OK, response.getResponseCode()); AssertUtil.jsonPayloadCompare(PayloadGenerator.getJsonPayload(Constants.UserManagement.USER_RESPONSE_PAYLOAD_FILE_NAME, Constants.HTTP_METHOD_PUT).toString(), response.getData().toString(), true); @@ -64,25 +69,26 @@ public class UserManagement extends TestBase { @Test(description = "Test view user.", dependsOnMethods = {"testUpdateUser"}) public void testViewUser() throws Exception { - String url = GetURL(Constants.UserManagement.VIEW_USER_ENDPOINT); + String url = Constants.UserManagement.USER_ENDPOINT + "/" + Constants.UserManagement.USER_NAME; HttpResponse response = client.get(url); Assert.assertEquals(HttpStatus.SC_OK, response.getResponseCode()); AssertUtil.jsonPayloadCompare(PayloadGenerator.getJsonPayload(Constants.UserManagement.USER_RESPONSE_PAYLOAD_FILE_NAME, Constants.HTTP_METHOD_GET).toString(), response.getData().toString(), true); } - @Test(description = "Test remove user.", dependsOnMethods = {"testViewUser"}) - public void testRemoveUser() throws Exception { - String url = GetURL(Constants.UserManagement.USER_ENDPOINT); - HttpResponse response = client.delete(url); + @Test(description = "Test getting user roles.", dependsOnMethods = {"testViewUser"}) + public void testGetUserRoles() throws Exception { + String url = Constants.UserManagement.USER_ENDPOINT + "/" + Constants.UserManagement.USER_NAME + "/roles"; + HttpResponse response = client.get(url); Assert.assertEquals(HttpStatus.SC_OK, response.getResponseCode()); AssertUtil.jsonPayloadCompare(PayloadGenerator.getJsonPayload(Constants.UserManagement.USER_RESPONSE_PAYLOAD_FILE_NAME, - Constants.HTTP_METHOD_DELETE).toString(), response.getData().toString(), true); - + Constants.UserManagement.GET_ROLES_METHOD).toString(), response.getData().toString(), true); } - private String GetURL(String endPoint) { - return endPoint + "?username=" + Constants.UserManagement.USER_NAME; + @Test(description = "Test remove user.", dependsOnMethods = {"testGetUserRoles"}) + public void testRemoveUser() throws Exception { + String url = Constants.UserManagement.USER_ENDPOINT + "/" + Constants.UserManagement.USER_NAME; + HttpResponse response = client.delete(url); + Assert.assertEquals(HttpStatus.SC_OK, response.getResponseCode()); } - } diff --git a/modules/integration/tests-integration/src/test/resources/client/modules/addressing-1.6.1-wso2v20.mar b/modules/integration/tests-integration/src/test/resources/client/modules/addressing-1.6.1-wso2v20.mar new file mode 100644 index 0000000000000000000000000000000000000000..d28b3a08eb720b7937ee9fc702d69ca7bb946f74 GIT binary patch literal 31342 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 K{jY`+=>GsnMhZy) literal 0 HcmV?d00001 diff --git a/modules/integration/tests-integration/src/test/resources/payloads/user-response-payloads.json b/modules/integration/tests-integration/src/test/resources/payloads/user-response-payloads.json index 1c7279e6..7b09aa00 100644 --- a/modules/integration/tests-integration/src/test/resources/payloads/user-response-payloads.json +++ b/modules/integration/tests-integration/src/test/resources/payloads/user-response-payloads.json @@ -1,24 +1,24 @@ { "POST": { - "statusCode": 201, - "messageFromServer": "User by username: PRIMARY/username123 was successfully added." + "username":"PRIMARY/username123", + "firstname":"userfirstname", + "lastname":"userlastname", + "emailAddress":"user123@gmail.com" }, "PUT": { - "statusCode": 201, - "messageFromServer": "User by username: username123 was successfully updated." + "username":"username123", + "firstname":"userfname", + "lastname":"userlname", + "emailAddress":"user1234@gmail.com" }, "GET": { - "statusCode": 200, - "messageFromServer": "User information was retrieved successfully.", - "responseContent": { - "username": "username123", - "firstname": "userfname", - "lastname": "userlname", - "emailAddress": "user1234@gmail.com" - } + "username": "username123", + "firstname": "userfname", + "lastname": "userlname", + "emailAddress": "user1234@gmail.com" }, - "DELETE": { - "statusCode": 200, - "messageFromServer": "User by username: username123 was successfully removed." + "GET_ROLES": { + "roles": ["admin"], + "count": 0 } } \ No newline at end of file diff --git a/modules/integration/tests-integration/src/test/resources/testng.xml b/modules/integration/tests-integration/src/test/resources/testng.xml index 7e3bfa15..bec338d2 100644 --- a/modules/integration/tests-integration/src/test/resources/testng.xml +++ b/modules/integration/tests-integration/src/test/resources/testng.xml @@ -28,21 +28,21 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + @@ -73,11 +73,11 @@ - - - - - + + + + + diff --git a/modules/integration/tests-iot-web-ui/src/test/resources/client/modules/addressing-1.6.1-wso2v20.mar b/modules/integration/tests-iot-web-ui/src/test/resources/client/modules/addressing-1.6.1-wso2v20.mar new file mode 100644 index 0000000000000000000000000000000000000000..d28b3a08eb720b7937ee9fc702d69ca7bb946f74 GIT binary patch literal 31342 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 K{jY`+=>GsnMhZy) literal 0 HcmV?d00001 From 828c59d0dd687d960ecb9fbb7cdfbea483e5897d Mon Sep 17 00:00:00 2001 From: megala21 Date: Mon, 17 Apr 2017 16:19:57 +0530 Subject: [PATCH 2/3] Fixing test cases role management and user management --- .../iot/integration/common/Constants.java | 16 +- .../iot/integration/common/OAuthUtil.java | 28 ++++ .../wso2/iot/integration/common/TestBase.java | 11 +- .../iot/integration/role/RoleManagement.java | 79 ++++++++-- .../iot/integration/user/UserManagement.java | 141 +++++++++++++++--- .../resources/payloads/role-payloads.json | 8 +- .../payloads/role-response-payloads.json | 10 ++ .../resources/payloads/user-payloads.json | 4 + .../payloads/user-response-payloads.json | 4 + .../src/test/resources/testng.xml | 44 +++--- 10 files changed, 281 insertions(+), 64 deletions(-) create mode 100644 modules/integration/tests-integration/src/test/resources/payloads/role-response-payloads.json diff --git a/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/Constants.java b/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/Constants.java index c434981a..8eba5498 100644 --- a/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/Constants.java +++ b/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/Constants.java @@ -57,7 +57,11 @@ public final class Constants { public static final class APIApplicationRegistration { public static final String API_APP_REGISTRATION_ENDPOINT = "/api-application-registration/register"; public static final String TOKEN_ENDPOINT = "/token"; - public static final String OAUTH_TOKEN_PAYLOAD = "username=admin&password=admin&grant_type=password&scope=perm:android:enroll perm:android:wipe perm:android:ring perm:android:lock-devices perm:android:configure-vpn perm:android:configure-wifi perm:android:enroll perm:android:uninstall-application perm:android:manage-configuration perm:android:location perm:android:install-application perm:android:mute perm:android:change-lock-code perm:android:blacklist-applications perm:android:set-password-policy perm:android:encrypt-storage perm:android:clear-password perm:android:enterprise-wipe perm:android:info perm:android:view-configuration perm:android:upgrade-firmware perm:android:set-webclip perm:android:send-notification perm:android:disenroll perm:android:update-application perm:android:unlock-devices perm:android:control-camera perm:android:reboot perm:android:logcat appm:subscribe perm:sign-csr perm:admin:devices:view perm:roles:add perm:roles:add-users perm:roles:update perm:roles:permissions perm:roles:details perm:roles:view perm:roles:create-combined-role perm:roles:delete perm:dashboard:vulnerabilities perm:dashboard:non-compliant-count perm:dashboard:non-compliant perm:dashboard:by-groups perm:dashboard:device-counts perm:dashboard:feature-non-compliant perm:dashboard:count-overview perm:dashboard:filtered-count perm:dashboard:details perm:get-activity perm:devices:delete perm:devices:applications perm:devices:effective-policy perm:devices:compliance-data perm:devices:features perm:devices:operations perm:devices:search perm:devices:details perm:devices:update perm:devices:view perm:view-configuration perm:manage-configuration perm:policies:remove perm:policies:priorities perm:policies:deactivate perm:policies:get-policy-details perm:policies:manage perm:policies:activate perm:policies:update perm:policies:changes perm:policies:get-details perm:users:add perm:users:details perm:users:count perm:users:delete perm:users:roles perm:users:user-details perm:users:credentials perm:users:search perm:users:is-exist perm:users:update perm:users:send-invitation perm:admin-users:view perm:groups:devices perm:groups:update perm:groups:add perm:groups:device perm:groups:devices-count perm:groups:remove perm:groups:groups perm:groups:groups-view perm:groups:share perm:groups:count perm:groups:roles perm:groups:devices-remove perm:groups:devices-add perm:groups:assign perm:device-types:features perm:device-types:types perm:applications:install perm:applications:uninstall perm:admin-groups:count perm:admin-groups:view perm:notifications:mark-checked perm:notifications:view perm:admin:certificates:delete perm:admin:certificates:details perm:admin:certificates:view perm:admin:certificates:add perm:admin:certificates:verify perm:ios:enroll perm:ios:view-device perm:ios:apn perm:ios:ldap perm:ios:enterprise-app perm:ios:store-application perm:ios:remove-application perm:ios:app-list perm:ios:profile-list perm:ios:lock perm:ios:enterprise-wipe perm:ios:device-info perm:ios:restriction perm:ios:email perm:ios:cellular perm:ios:applications perm:ios:wifi perm:ios:ring perm:ios:location perm:ios:notification perm:ios:airplay perm:ios:caldav perm:ios:cal-subscription perm:ios:passcode-policy perm:ios:webclip perm:ios:vpn perm:ios:per-app-vpn perm:ios:app-to-per-app-vpn perm:ios:app-lock perm:ios:clear-passcode perm:ios:remove-profile perm:ios:get-restrictions perm:ios:wipe-data perm:admin"; + public static final String MULTI_TENANT_OAUTH_TOKEN_PAYLOAD = "&grant_type=password&scope=perm:android:enroll" + + " perm:android:wipe perm:android:ring perm:android:lock-devices perm:android:configure-vpn perm:android:configure-wifi perm:android:enroll perm:android:uninstall-application perm:android:manage-configuration perm:android:location perm:android:install-application perm:android:mute perm:android:change-lock-code perm:android:blacklist-applications perm:android:set-password-policy perm:android:encrypt-storage perm:android:clear-password perm:android:enterprise-wipe perm:android:info perm:android:view-configuration perm:android:upgrade-firmware perm:android:set-webclip perm:android:send-notification perm:android:disenroll perm:android:update-application perm:android:unlock-devices perm:android:control-camera perm:android:reboot perm:android:logcat appm:subscribe perm:sign-csr perm:admin:devices:view perm:roles:add perm:roles:add-users perm:roles:update perm:roles:permissions perm:roles:details perm:roles:view perm:roles:create-combined-role perm:roles:delete perm:dashboard:vulnerabilities perm:dashboard:non-compliant-count perm:dashboard:non-compliant perm:dashboard:by-groups perm:dashboard:device-counts perm:dashboard:feature-non-compliant perm:dashboard:count-overview perm:dashboard:filtered-count perm:dashboard:details perm:get-activity perm:devices:delete perm:devices:applications perm:devices:effective-policy perm:devices:compliance-data perm:devices:features perm:devices:operations perm:devices:search perm:devices:details perm:devices:update perm:devices:view perm:view-configuration perm:manage-configuration perm:policies:remove perm:policies:priorities perm:policies:deactivate perm:policies:get-policy-details perm:policies:manage perm:policies:activate perm:policies:update perm:policies:changes perm:policies:get-details perm:users:add perm:users:details perm:users:count perm:users:delete perm:users:roles perm:users:user-details perm:users:credentials perm:users:search perm:users:is-exist perm:users:update perm:users:send-invitation perm:admin-users:view perm:groups:devices perm:groups:update perm:groups:add perm:groups:device perm:groups:devices-count perm:groups:remove perm:groups:groups perm:groups:groups-view perm:groups:share perm:groups:count perm:groups:roles perm:groups:devices-remove perm:groups:devices-add perm:groups:assign perm:device-types:features perm:device-types:types perm:applications:install perm:applications:uninstall perm:admin-groups:count perm:admin-groups:view perm:notifications:mark-checked perm:notifications:view perm:admin:certificates:delete perm:admin:certificates:details perm:admin:certificates:view perm:admin:certificates:add perm:admin:certificates:verify perm:ios:enroll perm:ios:view-device perm:ios:apn perm:ios:ldap perm:ios:enterprise-app perm:ios:store-application perm:ios:remove-application perm:ios:app-list perm:ios:profile-list perm:ios:lock perm:ios:enterprise-wipe perm:ios:device-info perm:ios:restriction perm:ios:email perm:ios:cellular perm:ios:applications perm:ios:wifi perm:ios:ring perm:ios:location perm:ios:notification perm:ios:airplay perm:ios:caldav perm:ios:cal-subscription perm:ios:passcode-policy perm:ios:webclip perm:ios:vpn perm:ios:per-app-vpn perm:ios:app-to-per-app-vpn perm:ios:app-lock perm:ios:clear-passcode perm:ios:remove-profile perm:ios:get-restrictions perm:ios:wipe-data perm:admin"; + + public static final String OAUTH_TOKEN_PAYLOAD = "username=admin&password=admin" + + MULTI_TENANT_OAUTH_TOKEN_PAYLOAD; private static StringBuffer dynamicClientPayloadBuffer = new StringBuffer(); public static final String API_APP_REGISTRATION_PAYLOAD = dynamicClientPayloadBuffer.append("{ \n" + " \"applicationName\":\"app_123456\",\n" + " \"isAllowedToAllDomains\":false,\n" @@ -313,7 +317,7 @@ public final class Constants { public static final String USER_PAYLOAD_FILE_NAME = "user-payloads.json"; public static final String USER_RESPONSE_PAYLOAD_FILE_NAME = "user-response-payloads.json"; public static final String GET_ROLES_METHOD = "GET_ROLES"; - + public static final String RESET_PASSWORD_PAYLOAD = "RESET_PASSWORD"; private UserManagement() { throw new AssertionError(); } @@ -322,12 +326,10 @@ public final class Constants { public static final class RoleManagement { public static final String ROLE_MANAGEMENT_GROUP = "role-mgt"; - public static final String ADD_ROLE_ENDPOINT = "/mdm-admin/roles"; + public static final String ROLE_MANAGEMENT_END_POINT = "/api/device-mgt/v1.0/roles"; public static final String ROLE_PAYLOAD_FILE_NAME = "role-payloads.json"; - public static final String UPDATE_ROLE_PERMISSION_ENDPOINT = "/mdm-admin/roles?rolename=administration"; - public static final String UPDATE_ROLE_PERMISSION_PAYLOAD_FILE_NAME = "role-payloads.json"; - public static final String REMOVE_ROLE_ENDPOINT = "/mdm-admin/roles?rolename=administration"; - + public static final String ROLE_RESPONSE_PAYLOAD_FILE_NAME = "role-response-payloads.json"; + public static final String GET_FILTERED_ROLED_METHOD = "GET_FILTERED_ROLES"; private RoleManagement() { throw new AssertionError(); } diff --git a/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/OAuthUtil.java b/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/OAuthUtil.java index 7935d017..e6823bf0 100644 --- a/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/OAuthUtil.java +++ b/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/OAuthUtil.java @@ -20,6 +20,7 @@ package org.wso2.iot.integration.common; import org.apache.commons.net.util.Base64; import org.json.JSONObject; +import org.wso2.carbon.automation.engine.context.AutomationContext; import org.wso2.carbon.automation.test.utils.http.client.HttpResponse; /** @@ -53,4 +54,31 @@ public class OAuthUtil { jsonObj = new JSONObject(oAuthData.getData()); return jsonObj; } + + /** + * To get the oauth token pair for the given auth string which is encoded in base64 format. + * @param authString encoded auth string + * @param backendHTTPURL backend http URL + * @param backendHTTPSURL backend https URL + * @return a JSON object which consist of oauth token pair + * @throws Exception Exception + */ + public static String getOAuthTokenPair(String authString, String backendHTTPURL, String backendHTTPSURL, + String username, String password) throws Exception { + RestClient client = new RestClient(backendHTTPURL, Constants.APPLICATION_JSON, "Basic " + authString); + HttpResponse oAuthData = client.post(Constants.APIApplicationRegistration.API_APP_REGISTRATION_ENDPOINT, + Constants.APIApplicationRegistration.API_APP_REGISTRATION_PAYLOAD); + JSONObject jsonObj = new JSONObject(oAuthData.getData()); + String clientId = jsonObj.get(Constants.OAUTH_CLIENT_ID).toString(); + String clientSecret = jsonObj.get(Constants.OAUTH_CLIENT_SECRET).toString(); + byte[] bytesEncoded = Base64.encodeBase64((clientId + ":" + clientSecret).getBytes()); + String basicAuthString = "Basic " + new String(bytesEncoded); + //Initiate a RestClient to get OAuth token + client = new RestClient(backendHTTPSURL, Constants.APPLICATION_URL_ENCODED, basicAuthString); + oAuthData = client.post(Constants.APIApplicationRegistration.TOKEN_ENDPOINT, + "username=" + username + "&password=" + password + Constants.APIApplicationRegistration.MULTI_TENANT_OAUTH_TOKEN_PAYLOAD); + jsonObj = new JSONObject(oAuthData.getData()); + return jsonObj.get(Constants.OAUTH_ACCESS_TOKEN).toString(); + + } } diff --git a/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/TestBase.java b/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/TestBase.java index a4f2c05e..e092cbb9 100644 --- a/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/TestBase.java +++ b/modules/integration/tests-common/integration-common/src/main/java/org/wso2/iot/integration/common/TestBase.java @@ -34,10 +34,11 @@ public class TestBase { protected void init(TestUserMode userMode) throws Exception { automationContext = new AutomationContext(Constants.AUTOMATION_CONTEXT, userMode); - backendHTTPSURL = automationContext.getContextUrls().getWebAppURLHttps().replace("9443", String.valueOf(Constants - .HTTPS_GATEWAY_PORT)); + String tenantDomain = automationContext.getContextTenant().getDomain(); + backendHTTPSURL = automationContext.getContextUrls().getWebAppURLHttps().replace("9443", String.valueOf(Constants + .HTTPS_GATEWAY_PORT)).replace("/t/" + tenantDomain , ""); backendHTTPURL = automationContext.getContextUrls().getWebAppURL().replace("9763", String.valueOf(Constants - .HTTP_GATEWAY_PORT)); + .HTTP_GATEWAY_PORT)).replace("/t/" + tenantDomain , ""); } protected void initPublisher(String productGroupName, String instanceName, @@ -68,6 +69,10 @@ public class TestBase { return automationContext.getContextUrls().getServiceUrl(); } + protected AutomationContext getAutomationContext() { + return automationContext; + } + protected String getTestArtifactLocation() { return FrameworkPathUtil.getSystemResourceLocation(); } diff --git a/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/role/RoleManagement.java b/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/role/RoleManagement.java index 185bca4c..9e6c8deb 100644 --- a/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/role/RoleManagement.java +++ b/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/role/RoleManagement.java @@ -19,44 +19,103 @@ package org.wso2.iot.integration.role; import junit.framework.Assert; import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.net.util.Base64; import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Factory; import org.testng.annotations.Test; import org.wso2.carbon.automation.engine.context.TestUserMode; +import org.wso2.carbon.automation.engine.context.beans.User; import org.wso2.iot.integration.common.*; +import javax.xml.xpath.XPathExpressionException; +import java.io.FileNotFoundException; + /** * This class contains integration tests for role management backend services. */ public class RoleManagement extends TestBase { - private IOTHttpClient client; + private TestUserMode userMode; + + @Factory(dataProvider = "userModeProvider") + public RoleManagement(TestUserMode userMode) { + this.userMode = userMode; + } @BeforeClass(alwaysRun = true, groups = { Constants.RoleManagement.ROLE_MANAGEMENT_GROUP}) public void initTest() throws Exception { - super.init(TestUserMode.SUPER_TENANT_ADMIN); - String accessTokenString = "Bearer " + OAuthUtil.getOAuthToken(backendHTTPSURL, backendHTTPSURL); + super.init(userMode); + User currentUser = getAutomationContext().getContextTenant().getContextUser(); + byte[] bytesEncoded = Base64 + .encodeBase64((currentUser.getUserName() + ":" + currentUser.getPassword()).getBytes()); + String encoded = new String(bytesEncoded); + String accessTokenString = "Bearer " + OAuthUtil + .getOAuthTokenPair(encoded, backendHTTPSURL, backendHTTPSURL, currentUser.getUserName(), + currentUser.getPassword()); this.client = new IOTHttpClient(backendHTTPSURL, Constants.APPLICATION_JSON, accessTokenString); } @Test(description = "Test add role.") - public void testAddRole() throws Exception { - IOTResponse response = client.post(Constants.RoleManagement.ADD_ROLE_ENDPOINT, + public void testAddRole() throws FileNotFoundException { + IOTResponse response = client.post(Constants.RoleManagement.ROLE_MANAGEMENT_END_POINT, PayloadGenerator.getJsonPayload(Constants.RoleManagement.ROLE_PAYLOAD_FILE_NAME, Constants.HTTP_METHOD_POST).toString()); Assert.assertEquals(HttpStatus.SC_CREATED, response.getStatus()); } @Test(description = "Test update permission role.", dependsOnMethods = {"testAddRole"}) - public void testUpdateRolePermission() throws Exception { - IOTResponse response = client.put(Constants.RoleManagement.UPDATE_ROLE_PERMISSION_ENDPOINT, - PayloadGenerator.getJsonPayload(Constants.RoleManagement.UPDATE_ROLE_PERMISSION_PAYLOAD_FILE_NAME, + public void testUpdateRolePermission() throws FileNotFoundException { + IOTResponse response = client.put(Constants.RoleManagement.ROLE_MANAGEMENT_END_POINT + "/administration", + PayloadGenerator.getJsonPayload(Constants.RoleManagement.ROLE_PAYLOAD_FILE_NAME, Constants.HTTP_METHOD_PUT).toString()); Assert.assertEquals(HttpStatus.SC_OK, response.getStatus()); } - @Test(description = "Test remove user.", dependsOnMethods = {"testUpdateRolePermission"}) + @Test(description = "Test get roles.", dependsOnMethods = {"testUpdateRolePermission"}) + public void testGetRoles() throws FileNotFoundException { + IOTResponse response = client.get(Constants.RoleManagement.ROLE_MANAGEMENT_END_POINT + "?offset=0&limit=2"); + Assert.assertEquals(HttpStatus.SC_OK, response.getStatus()); + AssertUtil.jsonPayloadCompare(PayloadGenerator + .getJsonPayload(Constants.RoleManagement.ROLE_RESPONSE_PAYLOAD_FILE_NAME, + Constants.UserManagement.GET_ROLES_METHOD).toString(), response.getBody(), true); + } + + @Test(description = "Test getting roles that has particular prefix.", dependsOnMethods = {"testGetRoles"}) + public void testGetFilteredRoles() throws FileNotFoundException { + IOTResponse response = client.get(Constants.RoleManagement.ROLE_MANAGEMENT_END_POINT + + "/filter/administ?offset=0&limit=2"); + Assert.assertEquals(HttpStatus.SC_OK, response.getStatus()); + AssertUtil.jsonPayloadCompare(PayloadGenerator + .getJsonPayload(Constants.RoleManagement.ROLE_RESPONSE_PAYLOAD_FILE_NAME, + Constants.RoleManagement.GET_FILTERED_ROLED_METHOD).toString(), response.getBody(), true); + } + + @Test(description = "Test getting permissions of a role.", dependsOnMethods = {"testGetFilteredRoles"}) + public void testGetRolePermissions() throws FileNotFoundException { + IOTResponse response = client + .get(Constants.RoleManagement.ROLE_MANAGEMENT_END_POINT + "/administration/permissions"); + Assert.assertEquals(HttpStatus.SC_OK, response.getStatus()); + } + + @Test(description = "Test getting role details.", dependsOnMethods = {"testGetRolePermissions"}) + public void testGetRole() throws FileNotFoundException { + IOTResponse response = client.get(Constants.RoleManagement.ROLE_MANAGEMENT_END_POINT + + "/administration"); + Assert.assertEquals(HttpStatus.SC_OK, response.getStatus()); + } + + @Test(description = "Test remove user.", dependsOnMethods = {"testGetRole"}) public void testRemoveRole() throws Exception { - IOTResponse response = client.delete(Constants.RoleManagement.REMOVE_ROLE_ENDPOINT); + IOTResponse response = client.delete(Constants.RoleManagement.ROLE_MANAGEMENT_END_POINT +"/administration"); Assert.assertEquals(HttpStatus.SC_OK, response.getStatus()); } + + @DataProvider + private static Object[][] userModeProvider() { + return new TestUserMode[][]{ + new TestUserMode[]{TestUserMode.SUPER_TENANT_ADMIN}, + new TestUserMode[]{TestUserMode.TENANT_ADMIN} + }; + } } \ No newline at end of file diff --git a/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/user/UserManagement.java b/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/user/UserManagement.java index 080f0241..bee86d5e 100644 --- a/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/user/UserManagement.java +++ b/modules/integration/tests-integration/src/test/java/org/wso2/iot/integration/user/UserManagement.java @@ -18,11 +18,18 @@ package org.wso2.iot.integration.user; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import junit.framework.Assert; import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.net.util.Base64; import org.testng.annotations.BeforeClass; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Factory; import org.testng.annotations.Test; import org.wso2.carbon.automation.engine.context.TestUserMode; +import org.wso2.carbon.automation.engine.context.beans.User; import org.wso2.carbon.automation.test.utils.http.client.HttpResponse; import org.wso2.iot.integration.common.AssertUtil; import org.wso2.iot.integration.common.Constants; @@ -37,34 +44,48 @@ import org.wso2.iot.integration.common.TestBase; public class UserManagement extends TestBase { private String NON_EXISTING_USERNAME = "non_exiting"; private RestClient client; + private TestUserMode userMode; + + @Factory(dataProvider = "userModeProvider") + public UserManagement(TestUserMode userMode) { + this.userMode = userMode; + } @BeforeClass(alwaysRun = true, groups = { Constants.UserManagement.USER_MANAGEMENT_GROUP}) public void initTest() throws Exception { - super.init(TestUserMode.SUPER_TENANT_ADMIN); - String accessTokenString = "Bearer " + OAuthUtil.getOAuthToken(backendHTTPSURL, backendHTTPSURL); + super.init(userMode); + User currentUser = getAutomationContext().getContextTenant().getContextUser(); + byte[] bytesEncoded = Base64 + .encodeBase64((currentUser.getUserName() + ":" + currentUser.getPassword()).getBytes()); + String encoded = new String(bytesEncoded); + String accessTokenString = "Bearer " + OAuthUtil + .getOAuthTokenPair(encoded, backendHTTPSURL, backendHTTPSURL, currentUser.getUserName(), + currentUser.getPassword()); this.client = new RestClient(backendHTTPSURL, Constants.APPLICATION_JSON, accessTokenString); } @Test(description = "Test add user.") public void testAddUser() throws Exception { - HttpResponse response = client.post(Constants.UserManagement.USER_ENDPOINT, - PayloadGenerator.getJsonPayload(Constants.UserManagement.USER_PAYLOAD_FILE_NAME, - Constants.HTTP_METHOD_POST).toString()); + // Add a user with the details and check whether that user is added correctly. + HttpResponse response = client.post(Constants.UserManagement.USER_ENDPOINT, PayloadGenerator + .getJsonPayload(Constants.UserManagement.USER_PAYLOAD_FILE_NAME, Constants.HTTP_METHOD_POST) + .toString()); Assert.assertEquals(HttpStatus.SC_CREATED, response.getResponseCode()); - AssertUtil.jsonPayloadCompare(PayloadGenerator.getJsonPayload(Constants.UserManagement.USER_RESPONSE_PAYLOAD_FILE_NAME, - Constants.HTTP_METHOD_POST).toString(), response.getData().toString(), true); + AssertUtil.jsonPayloadCompare(PayloadGenerator + .getJsonPayload(Constants.UserManagement.USER_RESPONSE_PAYLOAD_FILE_NAME, Constants.HTTP_METHOD_POST) + .toString(), response.getData(), true); } @Test(description = "Test update user.", dependsOnMethods = {"testAddUser"}) public void testUpdateUser() throws Exception { + // Update a existing user String url = Constants.UserManagement.USER_ENDPOINT + "/" + Constants.UserManagement.USER_NAME; - HttpResponse response = client.put(url, - PayloadGenerator.getJsonPayload(Constants.UserManagement.USER_PAYLOAD_FILE_NAME, - Constants.HTTP_METHOD_PUT).toString()); + HttpResponse response = client.put(url, PayloadGenerator + .getJsonPayload(Constants.UserManagement.USER_PAYLOAD_FILE_NAME, Constants.HTTP_METHOD_PUT).toString()); Assert.assertEquals(HttpStatus.SC_OK, response.getResponseCode()); - AssertUtil.jsonPayloadCompare(PayloadGenerator.getJsonPayload(Constants.UserManagement.USER_RESPONSE_PAYLOAD_FILE_NAME, - Constants.HTTP_METHOD_PUT).toString(), response.getData().toString(), true); - + AssertUtil.jsonPayloadCompare(PayloadGenerator + .getJsonPayload(Constants.UserManagement.USER_RESPONSE_PAYLOAD_FILE_NAME, Constants.HTTP_METHOD_PUT) + .toString(), response.getData(), true); } @Test(description = "Test view user.", dependsOnMethods = {"testUpdateUser"}) @@ -72,8 +93,9 @@ public class UserManagement extends TestBase { String url = Constants.UserManagement.USER_ENDPOINT + "/" + Constants.UserManagement.USER_NAME; HttpResponse response = client.get(url); Assert.assertEquals(HttpStatus.SC_OK, response.getResponseCode()); - AssertUtil.jsonPayloadCompare(PayloadGenerator.getJsonPayload(Constants.UserManagement.USER_RESPONSE_PAYLOAD_FILE_NAME, - Constants.HTTP_METHOD_GET).toString(), response.getData().toString(), true); + AssertUtil.jsonPayloadCompare(PayloadGenerator + .getJsonPayload(Constants.UserManagement.USER_RESPONSE_PAYLOAD_FILE_NAME, Constants.HTTP_METHOD_GET) + .toString(), response.getData(), true); } @Test(description = "Test getting user roles.", dependsOnMethods = {"testViewUser"}) @@ -81,14 +103,95 @@ public class UserManagement extends TestBase { String url = Constants.UserManagement.USER_ENDPOINT + "/" + Constants.UserManagement.USER_NAME + "/roles"; HttpResponse response = client.get(url); Assert.assertEquals(HttpStatus.SC_OK, response.getResponseCode()); - AssertUtil.jsonPayloadCompare(PayloadGenerator.getJsonPayload(Constants.UserManagement.USER_RESPONSE_PAYLOAD_FILE_NAME, - Constants.UserManagement.GET_ROLES_METHOD).toString(), response.getData().toString(), true); + AssertUtil.jsonPayloadCompare(PayloadGenerator + .getJsonPayload(Constants.UserManagement.USER_RESPONSE_PAYLOAD_FILE_NAME, + Constants.UserManagement.GET_ROLES_METHOD).toString(), response.getData(), true); + url = Constants.UserManagement.USER_ENDPOINT + "/" + NON_EXISTING_USERNAME + "/roles"; + response = client.get(url); + Assert.assertEquals(HttpStatus.SC_NOT_FOUND, response.getResponseCode()); + } + + @Test(description = "Test the API that checks whether user exist.", dependsOnMethods = {"testGetUserRoles"}) + public void testIsUserExist() throws Exception { + String url = Constants.UserManagement.USER_ENDPOINT + "/checkUser?username=" + Constants.UserManagement + .USER_NAME; + HttpResponse response = client.get(url); + Assert.assertEquals(HttpStatus.SC_OK, response.getResponseCode()); + Assert.assertEquals( + "CheckUser API return false even the user with the username " + Constants.UserManagement.USER_NAME + + "exists", true, Boolean.parseBoolean(response.getData())); + url = Constants.UserManagement.USER_ENDPOINT + "/checkUser?username=" + NON_EXISTING_USERNAME; + response = client.get(url); + Assert.assertEquals(HttpStatus.SC_OK, response.getResponseCode()); + Assert.assertEquals("CheckUser API return true but user with " + NON_EXISTING_USERNAME + "exists", false, + Boolean.parseBoolean(response.getData())); + } + + + @Test(description = "Test whether correct user count is returned.", dependsOnMethods = {"testIsUserExist"}) + public void testUserCount() throws Exception { + String url = Constants.UserManagement.USER_ENDPOINT + "/count"; + HttpResponse response = client.get(url); + Assert.assertEquals(HttpStatus.SC_OK, response.getResponseCode()); + + JsonObject jsonElement = new JsonParser().parse(response.getData()).getAsJsonObject(); + Assert.assertEquals("Actual user count does not match with the returned user count", 4, + jsonElement.get("count").getAsInt()); + } + + @Test(description = "Test whether the API that is used to get the users returns all the user details.", + dependsOnMethods = {"testUserCount"}) + public void testGetUsers() throws Exception { + String url = Constants.UserManagement.USER_ENDPOINT + "/?offset=0&limit=100"; + HttpResponse response = client.get(url); + Assert.assertEquals(HttpStatus.SC_OK, response.getResponseCode()); + JsonObject jsonElement = new JsonParser().parse(response.getData()).getAsJsonObject(); + Assert.assertEquals("All the users list is not returned", 4, jsonElement.get("users").getAsJsonArray().size()); } - @Test(description = "Test remove user.", dependsOnMethods = {"testGetUserRoles"}) + @Test(description = "Test whether the API that is used to get the users with particular filter returns all the " + + "user details that satisfy particular filter.", dependsOnMethods = {"testGetUsers"}) + public void testSearchUserNames() throws Exception { + String url = Constants.UserManagement.USER_ENDPOINT + "/search/usernames?filter=" + + Constants.UserManagement.USER_NAME; + HttpResponse response = client.get(url); + Assert.assertEquals(HttpStatus.SC_OK, response.getResponseCode()); + JsonArray jsonArray = new JsonParser().parse(response.getData()).getAsJsonArray(); + Assert.assertEquals("Relevant filtered user list in not returned correctly.", 1, + jsonArray.size()); + + url = Constants.UserManagement.USER_ENDPOINT + "/search/usernames?filter=" + NON_EXISTING_USERNAME; + response = client.get(url); + Assert.assertEquals(HttpStatus.SC_OK, response.getResponseCode()); + jsonArray = new JsonParser().parse(response.getData()).getAsJsonArray(); + Assert.assertEquals("Relevant filtered user list in not returned correctly. Return a list of users for " + + "non-existing username", 0, jsonArray.size()); + } + + @Test(description = "Test remove user.", dependsOnMethods = {"testSearchUserNames"}) public void testRemoveUser() throws Exception { - String url = Constants.UserManagement.USER_ENDPOINT + "/" + Constants.UserManagement.USER_NAME; + String url = Constants.UserManagement.USER_ENDPOINT + "/" + Constants.UserManagement.USER_NAME ; HttpResponse response = client.delete(url); Assert.assertEquals(HttpStatus.SC_OK, response.getResponseCode()); } + + @Test(description = "Test whether the API that is used to change the password works as expected.", + dependsOnMethods = {"testRemoveUser"}) + public void testChangePassword() throws Exception { + String url = Constants.UserManagement.USER_ENDPOINT + "/credentials"; + HttpResponse response = client.put(url, PayloadGenerator + .getJsonPayload(Constants.UserManagement.USER_PAYLOAD_FILE_NAME, + Constants.UserManagement.RESET_PASSWORD_PAYLOAD).toString()); + Assert.assertEquals(HttpStatus.SC_OK, response.getResponseCode()); + Assert.assertEquals("Password of the user cannot be changed", + "\"UserImpl password by " + "username: admin was successfully changed.\"", response.getData()); + } + + @DataProvider + private static Object[][] userModeProvider() { + return new TestUserMode[][]{ + new TestUserMode[]{TestUserMode.SUPER_TENANT_ADMIN}, + new TestUserMode[]{TestUserMode.TENANT_ADMIN} + }; + } } diff --git a/modules/integration/tests-integration/src/test/resources/payloads/role-payloads.json b/modules/integration/tests-integration/src/test/resources/payloads/role-payloads.json index 6d7ace6b..3ca61531 100644 --- a/modules/integration/tests-integration/src/test/resources/payloads/role-payloads.json +++ b/modules/integration/tests-integration/src/test/resources/payloads/role-payloads.json @@ -6,10 +6,12 @@ ] }, "PUT": { + "roleName": "administration", + "users": [ + "admin" + ], "permissions": [ - "permission/admin/device-mgt/android/operations/disenroll", - "permission/admin/device-mgt/android/operations/notification", - "/permission/admin/device-mgt/windows/operation/lock" + "/permission/admin/device-mgt/admin/groups" ] } } \ No newline at end of file diff --git a/modules/integration/tests-integration/src/test/resources/payloads/role-response-payloads.json b/modules/integration/tests-integration/src/test/resources/payloads/role-response-payloads.json new file mode 100644 index 00000000..fe79224b --- /dev/null +++ b/modules/integration/tests-integration/src/test/resources/payloads/role-response-payloads.json @@ -0,0 +1,10 @@ +{ + "GET_ROLES": { + "roles": ["admin", "administration"], + "count": 2 + }, + "GET_FILTERED_ROLES": { + "roles": ["administration"], + "count": 1 + } +} \ No newline at end of file diff --git a/modules/integration/tests-integration/src/test/resources/payloads/user-payloads.json b/modules/integration/tests-integration/src/test/resources/payloads/user-payloads.json index 94d37f88..381dcfdc 100644 --- a/modules/integration/tests-integration/src/test/resources/payloads/user-payloads.json +++ b/modules/integration/tests-integration/src/test/resources/payloads/user-payloads.json @@ -18,5 +18,9 @@ "admin", "Internal/everyone" ] + }, + "RESET_PASSWORD" : { + "oldPassword" : "admin", + "newPassword" : "admin" } } \ No newline at end of file diff --git a/modules/integration/tests-integration/src/test/resources/payloads/user-response-payloads.json b/modules/integration/tests-integration/src/test/resources/payloads/user-response-payloads.json index 7b09aa00..b27f0abd 100644 --- a/modules/integration/tests-integration/src/test/resources/payloads/user-response-payloads.json +++ b/modules/integration/tests-integration/src/test/resources/payloads/user-response-payloads.json @@ -20,5 +20,9 @@ "GET_ROLES": { "roles": ["admin"], "count": 0 + }, + "GET_USERS": { + "users": ["admin"], + "count": 3 } } \ No newline at end of file diff --git a/modules/integration/tests-integration/src/test/resources/testng.xml b/modules/integration/tests-integration/src/test/resources/testng.xml index bec338d2..fb3c0230 100644 --- a/modules/integration/tests-integration/src/test/resources/testng.xml +++ b/modules/integration/tests-integration/src/test/resources/testng.xml @@ -28,21 +28,21 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + @@ -73,16 +73,11 @@ - + - + - - - - - @@ -108,4 +103,9 @@ + + + + + \ No newline at end of file From ef551d7706c1bb2eecdcf1c4080c749c89cbfcdb Mon Sep 17 00:00:00 2001 From: megala21 Date: Mon, 17 Apr 2017 16:22:03 +0530 Subject: [PATCH 3/3] Updating carbon-device-mgt version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 801e63bc..ba9c41ec 100644 --- a/pom.xml +++ b/pom.xml @@ -1518,7 +1518,7 @@ - 2.0.42 + 2.0.43 [2.0.0, 3.0.0)