package com.tresorit.zerokit; import android.content.Context; import android.content.pm.PackageManager; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import com.tresorit.zerokit.call.Response; import com.tresorit.zerokit.response.IdentityTokens; import com.tresorit.zerokit.response.ResponseAdminApiError; import com.tresorit.zerokit.response.ResponseAdminApiInitUserRegistration; import com.tresorit.zerokit.response.ResponseAdminApiLoginByCode; import com.tresorit.zerokit.response.ResponseZerokitChangePassword; import com.tresorit.zerokit.response.ResponseZerokitError; import com.tresorit.zerokit.response.ResponseZerokitInvitationLinkInfo; import com.tresorit.zerokit.response.ResponseZerokitLogin; import com.tresorit.zerokit.response.ResponseZerokitRegister; import com.tresorit.zerokit.util.JSONObject; import junit.framework.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.util.Properties; import java.util.UUID; import static com.tresorit.zerokit.Zerokit.API_ROOT; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; /** * Instrumentation test, which will execute on an Android device. * * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> */ @RunWith(AndroidJUnit4.class) public class InstrumentedTest { static private Zerokit zerokit; static private AdminApi adminApi; @Before public void init() throws Throwable { Context targetContext = InstrumentationRegistry.getTargetContext(); if (adminApi == null) { Properties properties = new Properties(); properties.load(targetContext.getAssets().open("zerokit.properties")); adminApi = new AdminApi(properties.getProperty("appbackend", ""), properties.getProperty("clientid", "")); } if (zerokit == null) { try { String url = targetContext.getPackageManager().getApplicationInfo(targetContext.getPackageName(), PackageManager.GET_META_DATA).metaData.getString(API_ROOT); Zerokit.init(targetContext, url); zerokit = Zerokit.getInstance(); } catch (PackageManager.NameNotFoundException e) { throw new IllegalStateException("No ApiRoot definition found in the AndroidManifest.xml"); } } assertNotNull(adminApi); assertNotNull(zerokit); adminApi.clearToken(); logout(); assertEquals(whoAmI(), "null"); } private static final String USER_01_ALIAS = "test-user01"; private static final String USER_02_ALIAS = "test-user02"; private static final String USER_01_PASS = "password01"; private static final String USER_02_PASS = "password02"; private String getUserName(String userName) { return String.format("%s-%s", userName, UUID.randomUUID()); } @Test public void testEncrypteDecrypt () { String pass01 = USER_01_PASS; String user01 = getUserName(USER_01_ALIAS); user01 = registrationTest(user01, pass01); loginTest(user01, pass01); encryptTest(createTresor(), "\"{\"\\}"); logoutTest(); } @Test public void testLogin() { String pass01 = USER_01_PASS; String user01 = getUserName(USER_01_ALIAS); user01 = registrationTest(user01, pass01); loginTest(user01, pass01); logoutTest(); } @Test public void testChangePasswordLoggedIn() { String pass01 = USER_01_PASS; String user01 = registrationTest(getUserName(USER_01_ALIAS), pass01); loginTest(user01, pass01); changePasswordTestWithLoggedIn(user01, pass01); logoutTest(); } @Test public void testChangePasswordLoggedOut() { String pass01 = USER_01_PASS; String user01 = registrationTest(getUserName(USER_01_ALIAS), pass01); loginTest(user01, pass01); changePasswordTestWithLoggedOut(user01, pass01); logoutTest(); } @Test public void testCreateTresorAndEncryptText() { String pass01 = USER_01_PASS; String user01 = registrationTest(getUserName(USER_01_ALIAS), pass01); loginTest(user01, pass01); String tresor01 = createTresor(); String textToEncrypt01 = "textToEncrypt01"; encryptTest(tresor01, textToEncrypt01); logoutTest(); } @Test public void testShareTresorAndDecryptText() { String pass01 = USER_01_PASS; String user01 = registrationTest(getUserName(USER_01_ALIAS), pass01); String pass02 = USER_02_PASS; String user02 = registrationTest(getUserName(USER_02_ALIAS), pass02); loginTest(user01, pass01); String tresor01 = createTresor(); String textToEncrypt01 = "textToEncrypt01"; String cipherText01 = encryptTest(tresor01, textToEncrypt01); shareTresor(tresor01, user02); logoutTest(); loginTest(user02, pass02); assertEquals(decrypt(cipherText01), textToEncrypt01); logoutTest(); } @Test public void testKickFromTresorAndTryDecryptText() { String pass01 = USER_01_PASS; String user01 = registrationTest(getUserName(USER_01_ALIAS), pass01); String pass02 = USER_02_PASS; String user02 = registrationTest(getUserName(USER_02_ALIAS), pass02); loginTest(user01, pass01); String tresor01 = createTresor(); String textToEncrypt01 = "textToEncrypt01"; String cipherText01 = encryptTest(tresor01, textToEncrypt01); shareTresor(tresor01, user02); logoutTest(); loginTest(user02, pass02); assertEquals(decrypt(cipherText01), textToEncrypt01); logoutTest(); loginTest(user01, pass01); kickFromTresor(tresor01, user02); logoutTest(); loginTest(user02, pass02); Assert.assertTrue(decrypt_noassert(cipherText01).isError()); logoutTest(); } public void testShareTresorWithLinkAndDecryptText() { // String pass01 = USER_01_PASS; // String user01 = registrationTest(USER_01_ALIAS, pass01); // String pass02 = USER_02_PASS; // String user02 = registrationTest(USER_02_ALIAS, pass02); // // loginTest(user01, pass01); // // String tresor01 = createTresor(); // // String textToEncrypt01 = "textToEncrypt01"; // String cipherText01 = encryptTest(tresor01, textToEncrypt01); // // String url = createInvitationLinkNoPasswordTest(user01, "", tresor01, "message"); // // logoutTest(); // // loginTest(user02, pass02); // // acceptInvitationLinkNoPasswordTest(url); // // assertEquals(decrypt(cipherText01), textToEncrypt01); // // logoutTest(); } public void testKickFromLinkSharedTresorAndTryDecryptText() { // String pass01 = USER_01_PASS; // String user01 = registrationTest(USER_01_ALIAS, pass01); // String pass02 = USER_02_PASS; // String user02 = registrationTest(USER_02_ALIAS, pass02); // // loginTest(user01, pass01); // // String tresor01 = createTresor(); // // String textToEncrypt01 = "textToEncrypt01"; // String cipherText01 = encryptTest(tresor01, textToEncrypt01); // // String url = createInvitationLinkNoPasswordTest(user01, "", tresor01, "message"); // // logoutTest(); // // loginTest(user02, pass02); // // acceptInvitationLinkNoPasswordTest(url); // // assertEquals(decrypt(cipherText01), textToEncrypt01); // // logoutTest(); // // loginTest(user01, pass01); // // kickFromTresor(tresor01, user02); // // logoutTest(); // // loginTest(user02, pass02); // // Assert.assertTrue(decrypt_noassert(cipherText01).isError()); // // logoutTest(); } public void testShareTresorWithLinkAndPasswordAndDecryptText() { // String pass01 = USER_01_PASS; // String user01 = registrationTest(USER_01_ALIAS, pass01); // String pass02 = USER_02_PASS; // String user02 = registrationTest(USER_02_ALIAS, pass02); // // loginTest(user01, pass01); // // String tresor01 = createTresor(); // // String textToEncrypt01 = "textToEncrypt01"; // String cipherText01 = encryptTest(tresor01, textToEncrypt01); // // String url = createInvitationLinTest(user01, "", tresor01, "message", "password"); // // logoutTest(); // // loginTest(user02, pass02); // // acceptInvitationLinkTest(url, "password"); // // assertEquals(decrypt(cipherText01), textToEncrypt01); // // logoutTest(); } public void testKickFromLinkSharedTresorWithPasswordAndTryDecryptText() { // String pass01 = USER_01_PASS; // String user01 = registrationTest(USER_01_ALIAS, pass01); // String pass02 = USER_02_PASS; // String user02 = registrationTest(USER_02_ALIAS, pass02); // // loginTest(user01, pass01); // // String tresor01 = createTresor(); // // String textToEncrypt01 = "textToEncrypt01"; // String cipherText01 = encryptTest(tresor01, textToEncrypt01); // // String url = createInvitationLinTest(user01, "", tresor01, "message", "password"); // // logoutTest(); // // loginTest(user02, pass02); // // acceptInvitationLinkTest(url, "password"); // // assertEquals(decrypt(cipherText01), textToEncrypt01); // // logoutTest(); // // loginTest(user01, pass01); // // kickFromTresor(tresor01, user02); // // logoutTest(); // // loginTest(user02, pass02); // // Assert.assertTrue(decrypt_noassert(cipherText01).isError()); // // logoutTest(); } @Test public void testLoginWithRememberMe() { String pass01 = USER_01_PASS; String user01 = registrationTest(getUserName(USER_01_ALIAS), pass01); loginTest(user01, pass01, true); logoutTest(false); loginTest(user01); logoutTest(true); Assert.assertTrue(login_noassert(user01).isError()); assertEquals(whoAmI(), "null"); } @Test public void testLoginWithRememberMeAndChangePassword() { String pass01 = USER_01_PASS; String user01 = registrationTest(getUserName(USER_01_ALIAS), pass01); loginTest(user01, pass01, true); changePasswordTestSmall(pass01); logoutTest(false); loginTest(user01); logoutTest(); } private String registrationTest(String alias, String pass) { String userId = register(alias, pass); assertNotNull(userId); // assertEquals(userId, getUserId(alias)); loginTest(userId, pass); logoutTest(); return userId; } public void changePasswordTestWithLoggedIn(String user, String pass) { logoutTest(); loginTest(user, pass); changePassword(pass, pass + "new"); assertEquals(whoAmI(), user); logoutTest(); loginTest(user, pass + "new"); changePassword(user, pass + "new", pass); assertEquals(whoAmI(), user); logoutTest(); loginTest(user, pass); logoutTest(); } public void changePasswordTestWithLoggedOut(String user, String pass) { logoutTest(); changePassword(user, pass, pass + "new"); assertEquals(whoAmI(), "null"); loginTest(user, pass + "new"); logoutTest(); changePassword(user, pass + "new", pass); assertEquals(whoAmI(), "null"); loginTest(user, pass); logoutTest(); } public void changePasswordTestSmall(String pass) { changePassword(pass, pass + "new"); changePassword(pass + "new", pass); } private void loginTest(String user, String pass) { loginTest(user, pass, false); } private void loginTest(String user) { login(user); assertEquals(whoAmI(), user); saveToken(); } private void loginTest(String user, String pass, boolean rememberMe) { login(user, pass, rememberMe); assertEquals(whoAmI(), user); saveToken(); } private void saveToken() { String authCode = getAuthCode(adminApi.getClientId()); assertNotNull(authCode); String token = loginWithCode(authCode); assertNotNull(token); adminApi.setToken(token); } private String encryptTest(String tresorId, String text) { String cipherText = encrypt(tresorId, text); String decryptedText = decrypt(cipherText); assertEquals(text, decryptedText); return cipherText; } // private String createInvitationLinkNoPasswordTest(String userId, String linkBase, String tresorId, String message) { // String url = createInvitationLinkNoPassword(linkBase, tresorId, message); // ResponseZerokitInvitationLinkInfo invitationLinkInfo = getInvitationLinkInfo(url.substring(1)); // assertEquals(invitationLinkInfo.getMessage(), message); // assertEquals(invitationLinkInfo.getCreatorUserId(), userId); // Assert.assertFalse(invitationLinkInfo.getPasswordProtected()); // return url; // } // // private String createInvitationLinTest(String userId, String linkBase, String tresorId, String message, String password) { // String url = createInvitationLink(linkBase, tresorId, message, password); // ResponseZerokitInvitationLinkInfo invitationLinkInfo = getInvitationLinkInfo(url.substring(1)); // assertEquals(invitationLinkInfo.getMessage(), message); // assertEquals(invitationLinkInfo.getCreatorUserId(), userId); // Assert.assertTrue(invitationLinkInfo.getPasswordProtected()); // return url; // } // private void acceptInvitationLinkNoPasswordTest(String url) { // ResponseZerokitInvitationLinkInfo invitationLinkInfo = getInvitationLinkInfo(url.substring(1)); // acceptInvitationLinkNoPassword(invitationLinkInfo.getToken()); // } // // private void acceptInvitationLinkTest(String url, String password) { // ResponseZerokitInvitationLinkInfo invitationLinkInfo = getInvitationLinkInfo(url.substring(1)); // acceptInvitationLink(invitationLinkInfo.getToken(), password); // } private void logoutTest() { logout(); assertEquals(whoAmI(), "null"); adminApi.clearToken(); } private void logoutTest(boolean deleteRememberMe) { logout(deleteRememberMe); assertEquals(whoAmI(), "null"); adminApi.clearToken(); } //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// public void assertFalse(boolean condition, ResponseZerokitError zerokitError) { Assert.assertFalse(condition ? zerokitError.toString() : "", condition); } public void assertFalse(boolean condition, ResponseAdminApiError adminApiError) { Assert.assertFalse(condition ? adminApiError.toString() : "", condition); } public void assertTrue(boolean condition, ResponseZerokitError adminApiError) { Assert.assertTrue(condition ? adminApiError.toString() : "", condition); } public void assertTrue(boolean condition, ResponseAdminApiError adminApiError) { Assert.assertTrue(condition ? adminApiError.toString() : "", condition); } private void login(String username, String password) { login(username, password.getBytes()); } private void login(String username, String password, boolean rememberMe) { login(username, password.getBytes(), rememberMe); } private void login(String username, byte[] password) { login(username, password, false); } private void login(String username, byte[] password, boolean rememberMes) { Response<ResponseZerokitLogin, ResponseZerokitError> response = zerokit.login(username, password, rememberMes).execute(); assertFalse(response.isError(), response.getError()); } private void login(String username) { Response<String, ResponseZerokitError> response = zerokit.login(username).execute(); assertFalse(response.isError(), response.getError()); } private String loginWithCode(String code) { Response<ResponseAdminApiLoginByCode, ResponseAdminApiError> response = adminApi.login(code).execute(); assertFalse(response.isError(), response.getError()); return response.getResult().getId(); } private Response<String, ResponseZerokitError> login_noassert(String username) { return zerokit.login(username).execute(); } private String getUserId(String alias) { Response<String, ResponseAdminApiError> response = adminApi.getUserId(alias).execute(); assertFalse(response.isError(), response.getError()); return response.getResult(); } private String register(String alias, String password) { final Response<ResponseAdminApiInitUserRegistration, ResponseAdminApiError> responseInit = adminApi.initReg(alias, new JSONObject() .put("autoValidate", true) .put("canCreateTresor", true) .toString()).execute(); assertFalse(responseInit.isError(), responseInit.getError()); ResponseAdminApiInitUserRegistration resultInit = responseInit.getResult(); final Response<ResponseZerokitRegister, ResponseZerokitError> responseRegister = zerokit.register(resultInit.getUserId(), resultInit.getRegSessionId(), password.getBytes()).execute(); assertFalse(responseRegister.isError(), responseRegister.getError()); Response<Void, ResponseAdminApiError> responseValidateUser = adminApi.finishReg(resultInit.getUserId(), responseRegister.getResult().getRegValidationVerifier()).execute(); assertFalse(responseValidateUser.isError(), responseValidateUser.getError()); return resultInit.getUserId(); } private void logout() { Response<String, ResponseZerokitError> response = zerokit.logout().execute(); assertFalse(response.isError(), response.getError()); } private void logout(boolean deleteRememberMe) { Response<String, ResponseZerokitError> response = zerokit.logout(deleteRememberMe).execute(); Assert.assertFalse(response.isError()); } private String whoAmI() { Response<String, ResponseZerokitError> response = zerokit.whoAmI().execute(); Assert.assertFalse(response.isError()); return response.getResult(); } private String getAuthCode(String clientId) { Response<IdentityTokens, ResponseZerokitError> response = zerokit.getIdentityTokens(clientId).execute(); assertFalse(response.isError(), response.getError()); return response.getResult().getAuthorizationCode(); } private String createTresor() { Response<String, ResponseZerokitError> response = zerokit.createTresor().execute(); Assert.assertFalse(response.isError()); Response<Void, ResponseAdminApiError> responseApprove = adminApi.createdTresor(response.getResult()).execute(); assertFalse(responseApprove.isError(), responseApprove.getError()); return response.getResult(); } private String decrypt(String textToDecrypt) { Response<String, ResponseZerokitError> response = zerokit.decrypt(textToDecrypt).execute(); Assert.assertFalse(response.isError()); return response.getResult(); } private Response<String, ResponseZerokitError> decrypt_noassert(String textToDecrypt) { return zerokit.decrypt(textToDecrypt).execute(); } private String encrypt(String tresorId, String textToEncrypt) { Response<String, ResponseZerokitError> response = zerokit.encrypt(tresorId, textToEncrypt).execute(); Assert.assertFalse(response.isError()); return response.getResult(); } private ResponseZerokitInvitationLinkInfo getInvitationLinkInfo(String secret) { Response<ResponseZerokitInvitationLinkInfo, ResponseZerokitError> response = zerokit.getInvitationLinkInfo(secret).execute(); Assert.assertFalse(response.isError()); return response.getResult(); } // private void acceptInvitationLinkNoPassword(String token) { // Result<String, ResponseZerokitError> response = zerokit.acceptInvitationLinkNoPassword(token).execute(); // Assert.assertFalse(response.isError()); // Result<String, ResponseAdminApiError> responseApprove = adminApi.approveInvitationLinkAcception(response.getResult()).execute(); // Assert.assertFalse(responseApprove.isError()); // } // // private void acceptInvitationLink(String token, String password) { // Result<String, ResponseZerokitError> response = zerokit.acceptInvitationLink(token, password.getBytes()).execute(); // Assert.assertFalse(response.isError()); // Result<String, ResponseAdminApiError> responseApprove = adminApi.approveInvitationLinkAcception(response.getResult()).execute(); // Assert.assertFalse(responseApprove.isError()); // } private void changePassword(String userId, String oldPassword, String newPassword) { Response<ResponseZerokitChangePassword, ResponseZerokitError> response = zerokit.changePassword(userId, oldPassword.getBytes(), newPassword.getBytes()).execute(); assertFalse(response.isError(), response.getError()); } private void changePassword(String oldPassword, String newPassword) { Response<ResponseZerokitChangePassword, ResponseZerokitError> response = zerokit.changePassword(oldPassword.getBytes(), newPassword.getBytes()).execute(); assertFalse(response.isError(), response.getError()); } private void shareTresor(String tresorId, String userId) { Response<String, ResponseZerokitError> response = zerokit.shareTresor(tresorId, userId).execute(); Assert.assertFalse(response.isError()); Response<Void, ResponseAdminApiError> responseApprove = adminApi.sharedTresor(response.getResult()).execute(); assertFalse(responseApprove.isError(), responseApprove.getError()); } private void kickFromTresor(String tresorId, String userId) { Response<String, ResponseZerokitError> response = zerokit.kickFromTresor(tresorId, userId).execute(); Assert.assertFalse(response.isError()); Response<Void, ResponseAdminApiError> responseApprove = adminApi.kickedUser(response.getResult()).execute(); assertFalse(responseApprove.isError(), responseApprove.getError()); } // private String createInvitationLinkNoPassword(String linkBase, String tresorId, String message) { // Result<ResponseZerokitCreateInvitationLink, ResponseZerokitError> response = zerokit.createInvitationLinkNoPassword(linkBase, tresorId, message).execute(); // Assert.assertFalse(response.isError()); // Result<String, ResponseAdminApiError> responseApprove = adminApi.approveCreateInvitationLink(response.getResult().getId()).execute(); // Assert.assertFalse(responseApprove.isError()); // return response.getResult().getUrl(); // } // private String createInvitationLink(final String linkBase, final String tresorId, final String message, final String password) { // Result<ResponseZerokitCreateInvitationLink, ResponseZerokitError> response = zerokit.createInvitationLink(linkBase, tresorId, message, password.getBytes()).execute(); // Assert.assertFalse(response.isError()); // Result<String, ResponseAdminApiError> responseApprove = adminApi.approveCreateInvitationLink(response.getResult().getId()).execute(); // Assert.assertFalse(responseApprove.isError()); // return response.getResult().getUrl(); // } }