package nodash.test.functional; import static org.junit.Assert.*; import java.security.PublicKey; import java.util.Arrays; import nodash.core.NoAdapter; import nodash.core.NoCore; import nodash.core.NoDefaultAdapter; import nodash.exceptions.NoAdapterException; import nodash.exceptions.NoSessionAlreadyAwaitingConfirmationException; import nodash.exceptions.NoSessionConfirmedException; import nodash.exceptions.NoSessionExpiredException; import nodash.exceptions.NoSessionNotAwaitingConfirmationException; import nodash.exceptions.NoSessionNotChangedException; import nodash.exceptions.NoUserAlreadyOnlineException; import nodash.exceptions.NoUserNotValidException; import nodash.models.NoRegister; import nodash.test.functional.implementations.TestJustTouchStaticField; import nodash.test.functional.implementations.TestNoUser; import nodash.test.functional.implementations.TestRequestFunds; import nodash.test.functional.implementations.TestRequestRiskyFunds; import nodash.test.functional.implementations.TestSendFunds; import nodash.test.functional.implementations.TestSendFundsReceipted; import nodash.test.functional.implementations.TestSendFundsSourced; import org.junit.Test; public class NoRoutineTest { private byte[] getCopy(byte[] data) { return Arrays.copyOf(data, data.length); } private byte[] registerAndConfirm(TestNoUser user, String password) throws NoSessionExpiredException, NoSessionConfirmedException, NoSessionNotAwaitingConfirmationException, NoUserNotValidException { NoCore core = new NoCore(new NoDefaultAdapter(), TestNoUser.class); NoRegister registration = core.register(user, password.toCharArray()); core.confirm(getCopy(registration.cookie), password.toCharArray(), getCopy(registration.data)); return getCopy(registration.data); } @Test public void testUserChangeOwnData() throws NoSessionExpiredException, NoSessionConfirmedException, NoSessionNotAwaitingConfirmationException, NoUserNotValidException, NoUserAlreadyOnlineException, NoSessionNotChangedException, NoSessionAlreadyAwaitingConfirmationException, NoAdapterException { final byte[] userFile = registerAndConfirm(new TestNoUser("username"), "password"); NoAdapter adapter = new NoDefaultAdapter(); NoCore core = new NoCore(adapter, TestNoUser.class); byte[] cookie = core.login(getCopy(userFile), "password".toCharArray()); TestNoUser userRegistered = (TestNoUser) core.getNoUser(Arrays.copyOf(cookie, cookie.length)); assertEquals("username", userRegistered.getUsername()); userRegistered.setUsername("newsername"); byte[] data = core.save(getCopy(cookie), "password2".toCharArray()); core.confirm(getCopy(cookie), "password2".toCharArray(), getCopy(data)); try { core.login(getCopy(data), "password-bad".toCharArray()); fail("Did not throw exception on login with bad password."); } catch (NoUserNotValidException e) { // Do nothing, correct } cookie = core.login(getCopy(data), "password2".toCharArray()); TestNoUser userChanged = (TestNoUser) core.getNoUser(getCopy(cookie)); assertEquals("newsername", userChanged.getUsername()); assertEquals(0, userChanged.getMoney()); assertTrue(adapter.isOnline(userChanged.createHash())); core.shred(getCopy(cookie)); assertFalse(adapter.isOnline(userChanged.createHash())); } @Test public void testUserAction() throws NoSessionExpiredException, NoSessionConfirmedException, NoSessionNotAwaitingConfirmationException, NoUserNotValidException, NoUserAlreadyOnlineException, NoSessionNotChangedException, NoSessionAlreadyAwaitingConfirmationException { // testing TestJustTouchStaticField byte[] userFile = registerAndConfirm(new TestNoUser("username"), "password"); NoCore core = new NoCore(new NoDefaultAdapter(), TestNoUser.class); int touchCount = TestJustTouchStaticField.touchMe; byte[] noSaveCookie = core.login(getCopy(userFile), "password".toCharArray()); TestNoUser noSaveUser = (TestNoUser) core.getNoUser(getCopy(noSaveCookie)); noSaveUser.addAction(new TestJustTouchStaticField()); core.shred(noSaveCookie); // Assert action did not occur at shred. assertTrue(TestJustTouchStaticField.touchMe == touchCount); byte[] noConfirmCookie = core.login(getCopy(userFile), "password".toCharArray()); TestNoUser noConfirmUser = (TestNoUser) core.getNoUser(getCopy(noConfirmCookie)); noConfirmUser.addAction(new TestJustTouchStaticField()); core.save(getCopy(noConfirmCookie), "password".toCharArray()); // Assert action did not occur at save assertTrue(TestJustTouchStaticField.touchMe == touchCount); core.shred(getCopy(noConfirmCookie)); byte[] confirmCookie = core.login(getCopy(userFile), "password".toCharArray()); TestNoUser confirmUser = (TestNoUser) core.getNoUser(getCopy(confirmCookie)); confirmUser.addAction(new TestJustTouchStaticField()); byte[] saveConfirmFile = core.save(getCopy(confirmCookie), "password".toCharArray()); core.confirm(getCopy(confirmCookie), "password".toCharArray(), getCopy(saveConfirmFile)); // Assert action fired after confirm assertTrue(TestJustTouchStaticField.touchMe > touchCount); } @Test public void testUserErrorableActionWithoutError() throws NoSessionExpiredException, NoSessionConfirmedException, NoSessionNotAwaitingConfirmationException, NoUserNotValidException, NoUserAlreadyOnlineException, NoSessionNotChangedException, NoSessionAlreadyAwaitingConfirmationException { // testing TestRequestFunds byte[] requesterFile = registerAndConfirm(new TestNoUser("requester"), "password"); NoCore core = new NoCore(new NoDefaultAdapter(), TestNoUser.class); byte[] requesterCookie = core.login(getCopy(requesterFile), "password".toCharArray()); TestNoUser requester = (TestNoUser) core.getNoUser(getCopy(requesterCookie)); requester.addAction(new TestRequestFunds(requester.getRsaPublicKey())); byte[] confirmFile = core.save(getCopy(requesterCookie), "password".toCharArray()); core.confirm(getCopy(requesterCookie), "password".toCharArray(), getCopy(confirmFile)); requesterCookie = core.login(getCopy(confirmFile), "password".toCharArray()); requester = (TestNoUser) core.getNoUser(getCopy(requesterCookie)); assertTrue(requester.getMoney() == 100); } @Test public void testUserErrorableActionWithError() throws NoSessionExpiredException, NoSessionConfirmedException, NoSessionNotAwaitingConfirmationException, NoUserNotValidException, NoUserAlreadyOnlineException, NoSessionNotChangedException, NoSessionAlreadyAwaitingConfirmationException { // testing TestRequestFunds byte[] requesterFile = registerAndConfirm(new TestNoUser("requester"), "password"); NoCore core = new NoCore(new NoDefaultAdapter(), TestNoUser.class); byte[] requesterCookie = core.login(getCopy(requesterFile), "password".toCharArray()); TestNoUser requester = (TestNoUser) core.getNoUser(getCopy(requesterCookie)); requester.addAction(new TestRequestRiskyFunds(requester.getRsaPublicKey())); byte[] confirmFile = core.save(getCopy(requesterCookie), "password".toCharArray()); core.confirm(getCopy(requesterCookie), "password".toCharArray(), getCopy(confirmFile)); assertTrue(requester.getMoney() == 0); assertTrue(requester.getReceipts().size() == 0); requesterCookie = core.login(getCopy(confirmFile), "password".toCharArray()); requester = (TestNoUser) core.getNoUser(getCopy(requesterCookie)); assertTrue(requester.getMoney() == 0); assertTrue(requester.getReceipts().size() == 1); assertEquals(requester.getReceipts().get(0), "Could not request."); } @Test public void testUserTargetedAction() throws NoSessionExpiredException, NoSessionConfirmedException, NoSessionNotAwaitingConfirmationException, NoUserNotValidException, NoUserAlreadyOnlineException, NoSessionNotChangedException, NoSessionAlreadyAwaitingConfirmationException { // testing TestSendFunds byte[] fundSenderFile = registerAndConfirm(new TestNoUser("fund-sender"), "password1"); byte[] fundGetterFile = registerAndConfirm(new TestNoUser("fund-getter"), "password2"); NoCore core = new NoCore(new NoDefaultAdapter(), TestNoUser.class); byte[] senderCookie = core.login(getCopy(fundSenderFile), "password1".toCharArray()); TestNoUser sender = (TestNoUser) core.getNoUser(senderCookie); sender.setMoney(1000); fundSenderFile = core.save(getCopy(senderCookie), "password1".toCharArray()); core.confirm(getCopy(senderCookie), "password1".toCharArray(), getCopy(fundSenderFile)); sender = null; byte[] getterCookie = core.login(getCopy(fundGetterFile), "password2".toCharArray()); TestNoUser getter = (TestNoUser) core.getNoUser(getterCookie); PublicKey getterAddress = getter.getRsaPublicKey(); core.shred(getterCookie); getter = null; senderCookie = core.login(getCopy(fundSenderFile), "password1".toCharArray()); sender = (TestNoUser) core.getNoUser(getCopy(senderCookie)); sender.setMoney(500); sender.addAction(new TestSendFunds(getterAddress, 500)); fundSenderFile = core.save(getCopy(senderCookie), "password1".toCharArray()); core.confirm(getCopy(senderCookie), "password1".toCharArray(), getCopy(fundSenderFile)); getterCookie = core.login(getCopy(fundGetterFile), "password2".toCharArray()); getter = (TestNoUser) core.getNoUser(getCopy(getterCookie)); assertTrue(getter.getMoney() == 500); core.shred(getCopy(getterCookie)); getterCookie = core.login(getCopy(fundGetterFile), "password2".toCharArray()); getter = (TestNoUser) core.getNoUser(getCopy(getterCookie)); assertTrue(getter.getMoney() == 500); fundGetterFile = core.save(getCopy(getterCookie), "password2".toCharArray()); core.confirm(getCopy(getterCookie), "password2".toCharArray(), getCopy(fundGetterFile)); getterCookie = core.login(getCopy(fundGetterFile), "password2".toCharArray()); getter = (TestNoUser) core.getNoUser(getCopy(getterCookie)); assertTrue(getter.getMoney() == 500); core.shred(getCopy(getterCookie)); senderCookie = core.login(getCopy(fundSenderFile), "password1".toCharArray()); sender = (TestNoUser) core.getNoUser(getCopy(senderCookie)); assertTrue(sender.getMoney() == 500); } @Test public void testUserHandshakeAction() throws NoUserNotValidException, NoUserAlreadyOnlineException, NoSessionExpiredException, NoSessionConfirmedException, NoSessionNotAwaitingConfirmationException, NoSessionNotChangedException, NoSessionAlreadyAwaitingConfirmationException { // testing TestSendFundsReceipted byte[] fundSenderFile = registerAndConfirm(new TestNoUser("fund-sender"), "password1"); byte[] fundGetterFile = registerAndConfirm(new TestNoUser("fund-getter"), "password2"); NoCore core = new NoCore(new NoDefaultAdapter(), TestNoUser.class); byte[] senderCookie = core.login(getCopy(fundSenderFile), "password1".toCharArray()); TestNoUser sender = (TestNoUser) core.getNoUser(senderCookie); sender.setMoney(1000); fundSenderFile = core.save(getCopy(senderCookie), "password1".toCharArray()); core.confirm(getCopy(senderCookie), "password1".toCharArray(), getCopy(fundSenderFile)); sender = null; byte[] getterCookie = core.login(getCopy(fundGetterFile), "password2".toCharArray()); TestNoUser getter = (TestNoUser) core.getNoUser(getterCookie); PublicKey getterAddress = getter.getRsaPublicKey(); core.shred(getterCookie); getter = null; senderCookie = core.login(getCopy(fundSenderFile), "password1".toCharArray()); sender = (TestNoUser) core.getNoUser(getCopy(senderCookie)); sender.setMoney(500); sender.addAction(new TestSendFundsReceipted(getterAddress, sender.getRsaPublicKey(), 500)); fundSenderFile = core.save(getCopy(senderCookie), "password1".toCharArray()); core.confirm(getCopy(senderCookie), "password1".toCharArray(), getCopy(fundSenderFile)); getterCookie = core.login(getCopy(fundGetterFile), "password2".toCharArray()); getter = (TestNoUser) core.getNoUser(getCopy(getterCookie)); assertTrue(getter.getMoney() == 500); assertTrue(getter.getNoActions().size() == 1); core.shred(getCopy(getterCookie)); getterCookie = core.login(getCopy(fundGetterFile), "password2".toCharArray()); getter = (TestNoUser) core.getNoUser(getCopy(getterCookie)); assertTrue(getter.getMoney() == 500); assertTrue(getter.getNoActions().size() == 1); fundGetterFile = core.save(getCopy(getterCookie), "password2".toCharArray()); core.confirm(getCopy(getterCookie), "password2".toCharArray(), getCopy(fundGetterFile)); getterCookie = core.login(getCopy(fundGetterFile), "password2".toCharArray()); getter = (TestNoUser) core.getNoUser(getCopy(getterCookie)); assertTrue(getter.getMoney() == 500); assertTrue(getter.getNoActions().size() == 0); assertTrue(getter.getReceipts().size() == 0); core.shred(getCopy(getterCookie)); senderCookie = core.login(getCopy(fundSenderFile), "password1".toCharArray()); sender = (TestNoUser) core.getNoUser(getCopy(senderCookie)); assertTrue(sender.getMoney() == 500); assertTrue(sender.getReceipts().size() == 2); assertEquals(sender.getReceipts().get(0), "Sent funds to " + getterAddress.toString()); assertEquals(sender.getReceipts().get(1), "Money received - fund-getter"); } @Test public void testUserSourcedAction() throws NoSessionExpiredException, NoSessionConfirmedException, NoSessionNotChangedException, NoSessionAlreadyAwaitingConfirmationException, NoSessionNotAwaitingConfirmationException, NoUserNotValidException, NoUserAlreadyOnlineException { // testing TestSendFundsSourced byte[] fundSenderFile = registerAndConfirm(new TestNoUser("fund-sender"), "password1"); byte[] fundGetterFile = registerAndConfirm(new TestNoUser("fund-getter"), "password2"); NoCore core = new NoCore(new NoDefaultAdapter(), TestNoUser.class); byte[] senderCookie = core.login(getCopy(fundSenderFile), "password1".toCharArray()); TestNoUser sender = (TestNoUser) core.getNoUser(senderCookie); sender.setMoney(1000); fundSenderFile = core.save(getCopy(senderCookie), "password1".toCharArray()); core.confirm(getCopy(senderCookie), "password1".toCharArray(), getCopy(fundSenderFile)); sender = null; byte[] getterCookie = core.login(getCopy(fundGetterFile), "password2".toCharArray()); TestNoUser getter = (TestNoUser) core.getNoUser(getterCookie); PublicKey getterAddress = getter.getRsaPublicKey(); core.shred(getterCookie); getter = null; senderCookie = core.login(getCopy(fundSenderFile), "password1".toCharArray()); sender = (TestNoUser) core.getNoUser(getCopy(senderCookie)); sender.setMoney(500); sender.addAction(new TestSendFundsSourced(getterAddress, sender.getRsaPublicKey(), 500)); fundSenderFile = core.save(getCopy(senderCookie), "password1".toCharArray()); core.confirm(getCopy(senderCookie), "password1".toCharArray(), getCopy(fundSenderFile)); getterCookie = core.login(getCopy(fundGetterFile), "password2".toCharArray()); getter = (TestNoUser) core.getNoUser(getCopy(getterCookie)); assertTrue(getter.getMoney() == 500); assertTrue(getter.getReceipts().size() == 1); assertEquals(getter.getReceipts().get(0), "Given money by " + sender.getRsaPublicKey().toString()); assertTrue(getter.getNoActions().size() == 0); core.shred(getCopy(getterCookie)); getterCookie = core.login(getCopy(fundGetterFile), "password2".toCharArray()); getter = (TestNoUser) core.getNoUser(getCopy(getterCookie)); assertTrue(getter.getMoney() == 500); assertTrue(getter.getReceipts().size() == 1); assertEquals(getter.getReceipts().get(0), "Given money by " + sender.getRsaPublicKey().toString()); assertTrue(getter.getNoActions().size() == 0); fundGetterFile = core.save(getCopy(getterCookie), "password2".toCharArray()); core.confirm(getCopy(getterCookie), "password2".toCharArray(), getCopy(fundGetterFile)); getterCookie = core.login(getCopy(fundGetterFile), "password2".toCharArray()); getter = (TestNoUser) core.getNoUser(getCopy(getterCookie)); assertTrue(getter.getMoney() == 500); assertTrue(getter.getNoActions().size() == 0); assertTrue(getter.getReceipts().size() == 1); core.shred(getCopy(getterCookie)); senderCookie = core.login(getCopy(fundSenderFile), "password1".toCharArray()); sender = (TestNoUser) core.getNoUser(getCopy(senderCookie)); assertTrue(sender.getMoney() == 500); assertTrue(sender.getReceipts().size() == 0); } }