diff --git a/modules/distribution/src/assembly/bin.xml b/modules/distribution/src/assembly/bin.xml index 151a48fd..f871c013 100755 --- a/modules/distribution/src/assembly/bin.xml +++ b/modules/distribution/src/assembly/bin.xml @@ -1605,6 +1605,14 @@ ${pom.artifactId}-${pom.version}/conf/identity + + + ../p2-profile/iot-core-profile/target/wso2carbon-core-${carbon.kernel.version}/wso2/resources/lifecycles/MobileAppLifeCycle.xml + + + ${pom.artifactId}-${pom.version}/repository/resources/lifecycles + + diff --git a/modules/distribution/src/core/plugins/plugins-deployer.xml b/modules/distribution/src/core/plugins/plugins-deployer.xml index 3c3c5d3b..8f32e26c 100644 --- a/modules/distribution/src/core/plugins/plugins-deployer.xml +++ b/modules/distribution/src/core/plugins/plugins-deployer.xml @@ -207,6 +207,6 @@ - 3.0.21 + 3.0.22 - \ No newline at end of file + 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..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" @@ -309,11 +313,11 @@ 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"; + 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-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/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 debc6222..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,71 +18,180 @@ 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.*; +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; + 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 { - String url = GetURL(Constants.UserManagement.USER_ENDPOINT); - 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()); - AssertUtil.jsonPayloadCompare(PayloadGenerator.getJsonPayload(Constants.UserManagement.USER_RESPONSE_PAYLOAD_FILE_NAME, - Constants.HTTP_METHOD_PUT).toString(), response.getData().toString(), true); - + // 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()); + 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(), true); } @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(), true); + } + + @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.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()); - AssertUtil.jsonPayloadCompare(PayloadGenerator.getJsonPayload(Constants.UserManagement.USER_RESPONSE_PAYLOAD_FILE_NAME, - Constants.HTTP_METHOD_GET).toString(), response.getData().toString(), true); + + 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 remove user.", dependsOnMethods = {"testViewUser"}) + @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 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 = GetURL(Constants.UserManagement.USER_ENDPOINT); + String url = Constants.UserManagement.USER_ENDPOINT + "/" + Constants.UserManagement.USER_NAME ; HttpResponse response = client.delete(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); - } - private String GetURL(String endPoint) { - return endPoint + "?username=" + Constants.UserManagement.USER_NAME; + @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/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 00000000..d28b3a08 Binary files /dev/null and b/modules/integration/tests-integration/src/test/resources/client/modules/addressing-1.6.1-wso2v20.mar differ 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 1c7279e6..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 @@ -1,24 +1,28 @@ { "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 + }, + "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 7e3bfa15..fb3c0230 100644 --- a/modules/integration/tests-integration/src/test/resources/testng.xml +++ b/modules/integration/tests-integration/src/test/resources/testng.xml @@ -73,16 +73,11 @@ - - - - - - - - - - + + + + + @@ -108,4 +103,9 @@ + + + + + \ No newline at end of file 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 00000000..d28b3a08 Binary files /dev/null and b/modules/integration/tests-iot-web-ui/src/test/resources/client/modules/addressing-1.6.1-wso2v20.mar differ diff --git a/pom.xml b/pom.xml index 45d1ceed..ba9c41ec 100644 --- a/pom.xml +++ b/pom.xml @@ -1518,7 +1518,7 @@ - 2.0.38 + 2.0.43 [2.0.0, 3.0.0) @@ -1526,7 +1526,7 @@ - 3.0.21 + 3.0.22 6.1.80