import static play.test.Helpers.contentAsString; import static play.test.Helpers.routeAndCall; import static play.test.Helpers.running; import java.util.ArrayList; import java.util.List; import java.util.UUID; import javax.ws.rs.core.MediaType; import org.apache.http.protocol.HTTP; import org.junit.Assert; import org.junit.Test; import com.baasbox.service.logging.BaasBoxLogger; import play.libs.Json; import play.mvc.Result; import play.mvc.Http.Status; import play.test.FakeRequest; import com.baasbox.controllers.CustomHttpCode; import com.baasbox.dao.UserDao; import com.baasbox.dao.exception.SqlInjectionException; import com.baasbox.exception.InvalidAppCodeException; import com.baasbox.security.SessionKeys; import com.baasbox.service.user.UserService; import com.fasterxml.jackson.databind.JsonNode; import com.orientechnologies.orient.core.db.record.ODatabaseRecordTx; import com.orientechnologies.orient.core.metadata.security.OUser; import com.orientechnologies.orient.core.record.impl.ODocument; import com.orientechnologies.orient.core.serialization.serializer.OJSONWriter; import core.AbstractTest; import core.TestConfig; public class RegisterDeviceTest extends AbstractTest { @Test public void RegisterDevice(){ running ( getFakeApplicationWithDefaultConf(), new Runnable() { public void run() { // Create user String sFakeUserA = "testRegisterDeviceA_" + UUID.randomUUID(); String sFakeUserB = "testRegisterDeviceB_" + UUID.randomUUID(); // Prepare test for user A JsonNode node = updatePayloadFieldValue("/adminUserCreatePayload.json", "username", sFakeUserA); String sPwd = getPayloadFieldValue("/adminUserCreatePayload.json", "password"); String sAuthEnc = TestConfig.encodeAuth(sFakeUserA, sPwd); // Create user A FakeRequest request = new FakeRequest("POST", "/user"); request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE); request = request.withJsonBody(node, "POST"); Result result = routeAndCall(request); assertRoute(result, "routeCreateUser check username", Status.CREATED, "name\":\""+sFakeUserA+"\"", true); //Register DEVICE for user testRegisterDeviceA with os 'ios' and pushToken pushToken String os="ios"; String pushToken="pushToken"; request = new FakeRequest("PUT", "/push/enable/"+os+"/"+pushToken); request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE); request = request.withHeader(TestConfig.KEY_AUTH, sAuthEnc); result = routeAndCall(request); if (BaasBoxLogger.isDebugEnabled()) BaasBoxLogger.debug("userAregisterDevice1 request: " + request.getWrappedRequest().headers()); if (BaasBoxLogger.isDebugEnabled()) BaasBoxLogger.debug("userAregisterDevice1 result: " + contentAsString(result)); assertRoute(result, "User A register 1st device", Status.OK, "{\"result\":\"ok\",\"data\":\"\",\"http_code\":"+Status.OK+"}", true); //Register DEVICE for user testRegisterDeviceA with os android and pushToken pushToken1 os="android"; pushToken="pushToken1"; request = new FakeRequest("PUT", "/push/enable/"+os+"/"+pushToken); request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE); request = request.withHeader(TestConfig.KEY_AUTH, sAuthEnc); result = routeAndCall(request); if (BaasBoxLogger.isDebugEnabled()) BaasBoxLogger.debug("userAregisterDevice2 request: " + request.getWrappedRequest().headers()); if (BaasBoxLogger.isDebugEnabled()) BaasBoxLogger.debug("userAregisterDevice2 result: " + contentAsString(result)); assertRoute(result, "User A register 2nd device", Status.OK, "{\"result\":\"ok\",\"data\":\"\",\"http_code\":"+Status.OK+"}", true); ODatabaseRecordTx db = null; try{ try { db = com.baasbox.db.DbHelper.getOrOpenConnection(TestConfig.VALUE_APPCODE, TestConfig.ADMIN_USERNAME, TestConfig.AUTH_ADMIN_PASS); } catch (InvalidAppCodeException e) { // TODO Auto-generated catch block e.printStackTrace(); } List<ODocument> sqlresult = (List<ODocument>) com.baasbox.db.DbHelper.genericSQLStatementExecute("select from _BB_UserAttributes where login_info contains (pushToken = '"+pushToken+"') AND login_info contains (os = '"+os+"')",null); ODocument userA = null; try { userA = UserService.getUserProfilebyUsername(sFakeUserA); } catch (SqlInjectionException e) { Assert.fail("Error with RegisterDevice Test"); e.printStackTrace(); } //com.baasbox.db.DbHelper.reconnectAsAdmin(); ODocument systemProps=userA.field(UserDao.ATTRIBUTES_SYSTEM); ArrayList<ODocument> loginInfos=systemProps.field(UserDao.USER_LOGIN_INFO); boolean found=false; for (ODocument loginInfo : loginInfos){ if (loginInfo.field(UserDao.USER_PUSH_TOKEN).equals(pushToken) && loginInfo.field(UserDao.USER_DEVICE_OS).equals(os)){ found=true; } } if (!found){ Assert.fail("Error with test RegisterDevice"); } // Prepare test for user B node = updatePayloadFieldValue("/adminUserCreatePayload.json", "username", sFakeUserB); sPwd = getPayloadFieldValue("/adminUserCreatePayload.json", "password"); sAuthEnc = TestConfig.encodeAuth(sFakeUserB, sPwd); // Create user B request = new FakeRequest("POST", "/user"); request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE); request = request.withJsonBody(node, "POST"); result = routeAndCall(request); assertRoute(result, "routeCreateUser B check username", Status.CREATED, "name\":\""+sFakeUserB+"\"", true); //Register DEVICE for user testRegisterDeviceA with os os and pushToken pushToken os="os"; pushToken="pushToken"; request = new FakeRequest("PUT", "/push/enable/"+os+"/"+pushToken); request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE); request = request.withHeader(TestConfig.KEY_AUTH, sAuthEnc); result = routeAndCall(request); if (BaasBoxLogger.isDebugEnabled()) BaasBoxLogger.debug("userAregisterDevice1 request: " + request.getWrappedRequest().headers()); if (BaasBoxLogger.isDebugEnabled()) BaasBoxLogger.debug("userAregisterDevice1 result: " + contentAsString(result)); assertRoute(result, "User B register device", Status.OK, "{\"result\":\"ok\",\"data\":\"\",\"http_code\":"+Status.OK+"}", true); try { userA = UserService.getUserProfilebyUsername(sFakeUserA); } catch (SqlInjectionException e) { Assert.fail("Error with RegisterDevice Test"); e.printStackTrace(); } systemProps=userA.field(UserDao.ATTRIBUTES_SYSTEM); loginInfos=systemProps.field(UserDao.USER_LOGIN_INFO); for (ODocument loginInfo : loginInfos){ if (loginInfo.field(UserDao.USER_PUSH_TOKEN).equals(pushToken) && loginInfo.field(UserDao.USER_DEVICE_OS).equals(os)){ Assert.fail("Error with test RegisterDevice"); } } }finally{ com.baasbox.db.DbHelper.close(db); } //admin can load the login_info structure request = new FakeRequest("GET", "/admin/user/" + sFakeUserA); request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE); request = request.withHeader(TestConfig.KEY_AUTH, TestConfig.AUTH_ADMIN_ENC); result = routeAndCall(request); assertRoute(result, "Admin can load login_info", Status.OK, "system\":{\"login_info\":[{\"pushToken\":\"", true); } } ); } @Test public void RegisterDeviceSameToken(){ running ( getFakeApplicationWithDefaultConf(), new Runnable() { public void run() { // Create user String sFakeUserA = "testRegisterDeviceA_" + UUID.randomUUID(); // Prepare test for user A JsonNode node = updatePayloadFieldValue("/adminUserCreatePayload.json", "username", sFakeUserA); String sPwd = getPayloadFieldValue("/adminUserCreatePayload.json", "password"); String sAuthEnc = TestConfig.encodeAuth(sFakeUserA, sPwd); // Create user A FakeRequest request = new FakeRequest("POST", "/user"); request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE); request = request.withJsonBody(node, "POST"); Result result = routeAndCall(request); assertRoute(result, "routeCreateUser check username", Status.CREATED, "name\":\""+sFakeUserA+"\"", true); //Register DEVICE for user testRegisterDeviceA with os 'ios' and pushToken pushToken String os="ios"; String pushToken="pushToken"; request = new FakeRequest("PUT", "/push/enable/"+os+"/"+pushToken); request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE); request = request.withHeader(TestConfig.KEY_AUTH, sAuthEnc); result = routeAndCall(request); if (BaasBoxLogger.isDebugEnabled()) BaasBoxLogger.debug("userAregisterDevice1 request: " + request.getWrappedRequest().headers()); if (BaasBoxLogger.isDebugEnabled()) BaasBoxLogger.debug("userAregisterDevice1 result: " + contentAsString(result)); assertRoute(result, "User A register 1st device", Status.OK, "{\"result\":\"ok\",\"data\":\"\",\"http_code\":"+Status.OK+"}", true); //Now.... Register DEVICE for user testRegisterDeviceA with os 'ios' and pushToken pushToken... AGAIN! request = new FakeRequest("PUT", "/push/enable/"+os+"/"+pushToken); request = request.withHeader(TestConfig.KEY_APPCODE, TestConfig.VALUE_APPCODE); request = request.withHeader(TestConfig.KEY_AUTH, sAuthEnc); result = routeAndCall(request); if (BaasBoxLogger.isDebugEnabled()) BaasBoxLogger.debug("userAregisterDevice1 request: " + request.getWrappedRequest().headers()); if (BaasBoxLogger.isDebugEnabled()) BaasBoxLogger.debug("userAregisterDevice1 result: " + contentAsString(result)); assertRoute(result, "User A register 1st device", Status.OK, "{\"result\":\"ok\",\"data\":\"\",\"http_code\":"+Status.OK+"}", true); ODatabaseRecordTx db = null; try{ try { db = com.baasbox.db.DbHelper.getOrOpenConnection(TestConfig.VALUE_APPCODE, TestConfig.ADMIN_USERNAME, TestConfig.AUTH_ADMIN_PASS); } catch (InvalidAppCodeException e) { // TODO Auto-generated catch block e.printStackTrace(); } List<ODocument> sqlresult = (List<ODocument>) com.baasbox.db.DbHelper.genericSQLStatementExecute("select from _BB_UserAttributes where login_info contains (pushToken = '"+pushToken+"') AND login_info contains (os = '"+os+"')",null); Assert.assertTrue("OS/Token not found !!", sqlresult.size() != 0); Assert.assertTrue("OS/Token pair is present more than once !!", sqlresult.size() == 1 ); List<ODocument> sqlresultCheckUsername = (List<ODocument>) com.baasbox.db.DbHelper.genericSQLStatementExecute( "select user.name as username from _bb_user where system = " + sqlresult.get(0).getRecord().getIdentity() ,null); Assert.assertTrue("The OS/Token pair is not belonging to any user", sqlresultCheckUsername.size() != 0); Assert.assertTrue("The OS/Token pair belongs to more than one user: " + OJSONWriter.listToJSON(sqlresultCheckUsername, null), sqlresultCheckUsername.size() == 1); Assert.assertTrue("OS/Token pair is belonging to the wrong user. Aspected: " + sFakeUserA + " found: " + sqlresultCheckUsername.get(0).field("username") , sqlresultCheckUsername.get(0).field("username").equals(sFakeUserA) ); }finally{ if (db != null) db.close(); } } } ); } @Override public String getRouteAddress() { // TODO Auto-generated method stub return null; } @Override public String getMethod() { // TODO Auto-generated method stub return null; } @Override protected void assertContent(String s) { // TODO Auto-generated method stub } }