diff --git a/tests/Boundary/swen90006/passbook/BoundaryTests.java b/tests/Boundary/swen90006/passbook/BoundaryTests.java old mode 100644 new mode 100755 diff --git a/tests/Partitioning/swen90006/passbook/PartitioningTests.java b/tests/Partitioning/swen90006/passbook/PartitioningTests.java old mode 100644 new mode 100755 index e7a6efd37025b6e88fed7b30d618c3c430105ad5..bf9969877fe226ce6c72056fe8be9c20b724b630 --- a/tests/Partitioning/swen90006/passbook/PartitioningTests.java +++ b/tests/Partitioning/swen90006/passbook/PartitioningTests.java @@ -1,5 +1,7 @@ package swen90006.passbook; +import java.net.MalformedURLException; +import java.net.URL; import java.util.List; import java.util.ArrayList; import java.nio.charset.Charset; @@ -8,6 +10,8 @@ import java.nio.file.Files; import java.nio.file.FileSystems; import org.junit.*; +import swen90006.passbook.original.swen90006.passbook.*; + import static org.junit.Assert.*; public class PartitioningTests @@ -28,6 +32,624 @@ public class PartitioningTests } //Any method annotation with "@Test" is executed as a test. + +//------------------------------addUser Test Cases------------------------------------- + + //DuplicateUserTest Test Cases + + //Existed Username in PASSBOOK + @Test public void DuplicateUserTest() throws WeakPassphraseException, DuplicateUserException { + boolean DuplicateUserException = false; + String passbookUsername = "ALexTina"; + String passbookphrase = "Abcd1234"; + try{ + pb.addUser(passbookUsername, passbookphrase); + pb.addUser(passbookUsername, passbookphrase); + } + catch(DuplicateUserException e){ + DuplicateUserException = true; + } + assertTrue (DuplicateUserException) ; + + } + + //Not Existed Username in PASSBOOK + @Test public void DuplicateUserTest2() throws WeakPassphraseException, DuplicateUserException { + boolean DuplicateUserException = false; + String passbookUsername = "ALexTina"; + String passbookphrase = "Abcd1234"; + String passbookUsername2 = "TinaAlex"; + String passbookphrase2 = "1234Abcd"; + try{ + pb.addUser(passbookUsername, passbookphrase); + pb.addUser(passbookUsername2, passbookphrase2); + } + catch(DuplicateUserException e){ + DuplicateUserException = true; + } + assertFalse (DuplicateUserException); ; + + } + + + //WeakPassphraseException Test cases + + //0 < Passphrase < 8 + @Test public void WeakPassphraseException() throws DuplicateUserException{ + boolean WeakPassphraseException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "Ab23"; + try{ + pb.addUser(passbookUsername,passbookphrase); + } + catch (WeakPassphraseException e){ + WeakPassphraseException = true; + } + assertTrue(WeakPassphraseException); + } + + //Passphrase = 8 + @Test public void WeakPassphraseException2() throws DuplicateUserException{ + boolean WeakPassphraseException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "Ab23sda2"; + try{ + pb.addUser(passbookUsername,passbookphrase); + } + catch (WeakPassphraseException e){ + WeakPassphraseException = true; + } + assertFalse(WeakPassphraseException); + } + + //Passphrase > 8 + @Test public void WeakPassphraseException3() throws DuplicateUserException{ + boolean WeakPassphraseException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "Ab23sda2dsaldaskljdkasl"; + try{ + pb.addUser(passbookUsername,passbookphrase); + } + catch (WeakPassphraseException e){ + WeakPassphraseException = true; + } + assertFalse(WeakPassphraseException); + } + + // passphrase.length = 8 && passphrase only contain one kind factory in Lower, Upper and Number + + @Test public void Contains() throws DuplicateUserException + { + boolean WeakPassphraseException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "AAAABBBC"; + try{ + pb.addUser(passbookUsername,passbookphrase); + } + catch (WeakPassphraseException e){ + WeakPassphraseException = true; + } + assertTrue(WeakPassphraseException); + } + + // passphrase.length = 8 && passphrase only contain two kind factory in Lower, Upper and Number + + @Test public void Contains2() throws DuplicateUserException + { + boolean WeakPassphraseException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "AAA2232C"; + try{ + pb.addUser(passbookUsername,passbookphrase); + } + catch (WeakPassphraseException e){ + WeakPassphraseException = true; + } + assertTrue(WeakPassphraseException); + } + + // passphrase.length = 8 && passphrase contain no kind factory in Lower, Upper and Number + + @Test public void Contains3() throws DuplicateUserException + { + boolean WeakPassphraseException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "^&*($%@#"; + try{ + pb.addUser(passbookUsername,passbookphrase); + } + catch (WeakPassphraseException e){ + WeakPassphraseException = true; + } + assertTrue(WeakPassphraseException); + } + + // passphrase.length = 8 && passphrase contain all kinds factory in Lower, Upper and Number + + @Test public void Contains4() throws DuplicateUserException + { + boolean WeakPassphraseException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "Ab23cd54"; + try{ + pb.addUser(passbookUsername,passbookphrase); + } + catch (WeakPassphraseException e){ + WeakPassphraseException = true; + } + assertFalse(WeakPassphraseException); + } + + + // passphrase.length > 8 && passphrase only contain one kind factory in Lower, Upper and Number + + @Test public void Contains5() throws DuplicateUserException + { + boolean WeakPassphraseException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "123456789212"; + try{ + pb.addUser(passbookUsername,passbookphrase); + } + catch (WeakPassphraseException e){ + WeakPassphraseException = true; + } + assertTrue(WeakPassphraseException); + } + + // passphrase.length > 8 && passphrase only contain two kind factory in Lower, Upper and Number + + @Test public void Contains6() throws DuplicateUserException + { + boolean WeakPassphraseException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "AAA223293289312C"; + try{ + pb.addUser(passbookUsername,passbookphrase); + } + catch (WeakPassphraseException e){ + WeakPassphraseException = true; + } + assertTrue(WeakPassphraseException); + } + + // passphrase.length > 8 && passphrase contain no kind factory in Lower, Upper and Number + + @Test public void Contains7() throws DuplicateUserException + { + boolean WeakPassphraseException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "^&*($%@#%^&*("; + try{ + pb.addUser(passbookUsername,passbookphrase); + } + catch (WeakPassphraseException e){ + WeakPassphraseException = true; + } + assertTrue(WeakPassphraseException); + } + + // passphrase.length > 8 && passphrase contain all kinds factory in Lower, Upper and Number + + @Test public void Contains8() throws DuplicateUserException + { + boolean WeakPassphraseException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "Ab23cd54vhuy67"; + try{ + pb.addUser(passbookUsername,passbookphrase); + } + catch (WeakPassphraseException e){ + WeakPassphraseException = true; + } + assertFalse(WeakPassphraseException); + } + +//------------------------------loginUser Test Cases------------------------------------- + + // user is in passbook + @Test public void NoSuchUserException() throws NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, WeakPassphraseException, DuplicateUserException { + boolean NoSuchUserException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "Abc234hg"; + try { + pb.addUser(passbookUsername,passbookphrase); + pb.loginUser(passbookUsername,passbookphrase); + } + catch (NoSuchUserException e){ + NoSuchUserException = true; + } + assertFalse(NoSuchUserException); + } + + // user is not in passbook + @Test public void NoSuchUserException2() throws NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, WeakPassphraseException, DuplicateUserException { + boolean NoSuchUserException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "Abc234hg"; + String passbookUsername2 = "AlesTina"; + String passbookphrase2 = "Abc234hg"; + try { + pb.addUser(passbookUsername,passbookphrase); + pb.loginUser(passbookUsername2,passbookphrase2); + } + catch (NoSuchUserException e){ + NoSuchUserException = true; + } + assertTrue(NoSuchUserException); + } + + // username is NULL + @Test public void NoSuchUserException3() throws NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, WeakPassphraseException, DuplicateUserException { + boolean NoSuchUserException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "Abc234hg"; + String passbookUsername2 = ""; + String passbookphrase2 = "Abc234hg"; + try { + pb.addUser(passbookUsername,passbookphrase); + pb.loginUser(passbookUsername2,passbookphrase2); + } + catch (NoSuchUserException e){ + NoSuchUserException = true; + } + assertTrue(NoSuchUserException); + } + + //passphrase is not equale to the saved one + @Test public void IncorrectPassphraseException() throws WeakPassphraseException, DuplicateUserException, AlreadyLoggedInException, IncorrectPassphraseException, NoSuchUserException { + boolean IncorrectPassphraseException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "Abc234hg"; + String passbookUsername2 = "AlexTina"; + String passbookphrase2 = "Abc23444hg"; + try { + pb.addUser(passbookUsername,passbookphrase); + pb.loginUser(passbookUsername2,passbookphrase2); + } + catch (IncorrectPassphraseException e){ + IncorrectPassphraseException = true; + } + assertTrue(IncorrectPassphraseException); + } + + //passphrase is equale to the saved one + @Test public void IncorrectPassphraseException2() throws WeakPassphraseException, DuplicateUserException, AlreadyLoggedInException, IncorrectPassphraseException, NoSuchUserException { + boolean IncorrectPassphraseException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "Abc234hg"; + String passbookUsername2 = "AlexTina"; + String passbookphrase2 = "Abc234hg"; + try { + pb.addUser(passbookUsername,passbookphrase); + pb.loginUser(passbookUsername2,passbookphrase2); + } + catch (IncorrectPassphraseException e){ + IncorrectPassphraseException = true; + } + assertFalse(IncorrectPassphraseException); + } + //passphrase is NULL + @Test public void IncorrectPassphraseException3() throws WeakPassphraseException, DuplicateUserException, AlreadyLoggedInException, IncorrectPassphraseException, NoSuchUserException { + boolean IncorrectPassphraseException = false; + String passbookUsername = "AlexTina"; + String passbookphrase = "Abc234hg"; + String passbookUsername2 = "AlexTina"; + String passbookphrase2 = ""; + try { + pb.addUser(passbookUsername,passbookphrase); + pb.loginUser(passbookUsername2,passbookphrase2); + } + catch (IncorrectPassphraseException e){ + IncorrectPassphraseException = true; + } + assertTrue(IncorrectPassphraseException); + } + +//------------------------------updateDetails Test Cases------------------------------------- + + //InvalidSessionIDException + +// sessionID exist +@Test public void InvalidSessionIDException() throws WeakPassphraseException, DuplicateUserException, NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, MalformedURLException, InvalidSessionIDException { + boolean InvalidSessionIDException = false; + Integer sessionID ; + URL url = new URL ("http:AlexTinaAbc234hg"); + String Username = "AlexTina"; + String Password = "Abc234hg"; + String urlUsername = "AlexTina"; + String urlPassword = "Abc234hg"; + pb.addUser(Username,Password); + sessionID = pb.loginUser(Username,Password); + try{ + pb.updateDetails(sessionID,url,urlUsername,urlPassword); + }catch (InvalidSessionIDException e){ + InvalidSessionIDException = true; + } + assertFalse(InvalidSessionIDException); + +} + // sessionID not exist + @Test public void InvalidSessionIDException2() throws WeakPassphraseException, DuplicateUserException, NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, MalformedURLException, InvalidSessionIDException { + boolean InvalidSessionIDException = false; + Integer sessionID = -1 ; + URL url = new URL ("http:AlexTinaAbc234hg"); + String Username = "AlexTina"; + String Password = "Abc234hg"; + String urlUsername = "AlexTina"; + String urlPassword = "Abc234hg"; + pb.addUser(Username,Password); + + try{ + pb.updateDetails(sessionID,url,urlUsername,urlPassword); + }catch (InvalidSessionIDException e){ + InvalidSessionIDException = true; + } + assertTrue(InvalidSessionIDException); + + } + + + +//MalformedURLException + //Protocol = [http,https] + + @Test public void MalformedURLException() throws MalformedURLException, WeakPassphraseException, DuplicateUserException, NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, InvalidSessionIDException { + boolean MalformedURLException = false; + Integer sessionID ; + String Username = "AlexTina"; + String Password = "Abc234hg"; + String urlUsername = "AlexTina"; + String urlPassword = "Abc234hg"; + pb.addUser(Username,Password); + sessionID = pb.loginUser(Username,Password); + try{ + URL url = new URL ("http:AlexTinaAbc234hg"); + pb.updateDetails(sessionID,url,urlUsername,urlPassword); + }catch (MalformedURLException e){ + MalformedURLException = true; + } + assertFalse(MalformedURLException); + } + + //Protocol != [http,https] + + @Test public void MalformedURLException2() throws MalformedURLException, WeakPassphraseException, DuplicateUserException, NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, InvalidSessionIDException { + boolean MalformedURLException = false; + Integer sessionID ; + String Username = "AlexTina"; + String Password = "Abc234hg"; + String urlUsername = "AlexTina"; + String urlPassword = "Abc234hg"; + pb.addUser(Username,Password); + sessionID = pb.loginUser(Username,Password); + try{ + URL url = new URL ("TPP:AlexTinaAbc234hg"); + pb.updateDetails(sessionID,url,urlUsername,urlPassword); + }catch ( MalformedURLException e){ + MalformedURLException = true; + } + assertTrue(MalformedURLException); + } + + // check the urlusername or password whether are null + + //urlUsername != null && urlPassword !=null + @Test public void checkRemove() throws WeakPassphraseException, DuplicateUserException, NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, InvalidSessionIDException, MalformedURLException, NoSuchURLException { + boolean NoSuchUserException = false; + Integer sessionID ; + String Username = "AlexTina"; + String Password = "Abc234hg"; + String urlUsername = "AlexTina"; + String urlPassword = "Abc234hg"; + pb.addUser(Username,Password); + sessionID = pb.loginUser(Username,Password); + try{ + URL url = new URL ("http:AlexTinaAbc234hg"); + pb.updateDetails(sessionID,url,urlUsername,urlPassword); + pb.retrieveDetails(sessionID,url); + } + catch (NoSuchURLException e){ + NoSuchUserException = true; + } + assertFalse(NoSuchUserException); + } + + //urlUsername = null || urlPassword !=null + @Test public void checkRemove2() throws WeakPassphraseException, DuplicateUserException, NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, InvalidSessionIDException, MalformedURLException, NoSuchURLException { + boolean NoSuchUserException = false; + Integer sessionID ; + String Username = "AlexTina"; + String Password = "Abc234hg"; + String urlUsername = null; + String urlPassword = "Abc234hg"; + pb.addUser(Username,Password); + sessionID = pb.loginUser(Username,Password); + try{ + URL url = new URL ("http:AlexTinaAbc234hg"); + pb.updateDetails(sessionID,url,urlUsername,urlPassword); + pb.retrieveDetails(sessionID,url); + } + catch (NoSuchURLException e){ + NoSuchUserException = true; + } + assertTrue(NoSuchUserException); + } + //urlUsername != null || urlPassword =null + @Test public void checkRemove3() throws WeakPassphraseException, DuplicateUserException, NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, InvalidSessionIDException, MalformedURLException, NoSuchURLException { + boolean NoSuchUserException = false; + Integer sessionID ; + String Username = "AlexTina"; + String Password = "Abc234hg"; + String urlUsername = "AlexTina"; + String urlPassword = null; + pb.addUser(Username,Password); + sessionID = pb.loginUser(Username,Password); + try{ + URL url = new URL ("http:AlexTinaAbc234hg"); + pb.updateDetails(sessionID,url,urlUsername,urlPassword); + pb.retrieveDetails(sessionID,url); + } + catch (NoSuchURLException e){ + NoSuchUserException = true; + } + assertTrue(NoSuchUserException); + } + //urlUsername != null || urlPassword !=null + @Test public void checkRemove4() throws WeakPassphraseException, DuplicateUserException, NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, InvalidSessionIDException, MalformedURLException, NoSuchURLException { + boolean NoSuchUserException = false; + Integer sessionID ; + String Username = "AlexTina"; + String Password = "Abc234hg"; + String urlUsername = null; + String urlPassword = null; + pb.addUser(Username,Password); + sessionID = pb.loginUser(Username,Password); + try{ + URL url = new URL ("http:AlexTinaAbc234hg"); + pb.updateDetails(sessionID,url,urlUsername,urlPassword); + pb.retrieveDetails(sessionID,url); + } + catch (NoSuchURLException e){ + NoSuchUserException = true; + } + assertTrue(NoSuchUserException); + } + +//------------------------------retrieveDetails Test Cases------------------------------------- + //InvalidSessionIDException + + // sessionID exist + @Test public void InvalidSessionIDExceptionRE() throws WeakPassphraseException, DuplicateUserException, NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, MalformedURLException, NoSuchURLException { + boolean InvalidSessionIDException = false; + Integer sessionID ; + + String Username = "AlexTina"; + String Password = "Abc234hg"; + String urlUsername = "AlexTina"; + String urlPassword = "Abc234hg"; + pb.addUser(Username,Password); + sessionID = pb.loginUser(Username,Password); + try{ + URL url = new URL ("http:AlexTinaAbc234hg"); + pb.updateDetails(sessionID,url,urlUsername,urlPassword); + pb.retrieveDetails(sessionID,url); + }catch (InvalidSessionIDException e){ + InvalidSessionIDException = true; + } + assertFalse(InvalidSessionIDException); + + } + // sessionID not exist + @Test public void InvalidSessionIDExceptionRE2() throws WeakPassphraseException, DuplicateUserException, NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, MalformedURLException, NoSuchURLException { + boolean InvalidSessionIDException = false; + Integer sessionID = -1; + + String Username = "AlexTina"; + String Password = "Abc234hg"; + String urlUsername = "AlexTina"; + String urlPassword = "Abc234hg"; + pb.addUser(Username,Password); + + try{ + URL url = new URL ("http:AlexTinaAbc234hg"); + pb.updateDetails(sessionID,url,urlUsername,urlPassword); + pb.retrieveDetails(sessionID,url); + }catch (InvalidSessionIDException e){ + InvalidSessionIDException = true; + } + assertTrue(InvalidSessionIDException); + + } + // NoSuchURLException + // pt!=null + @Test public void NoSuchURLException() throws WeakPassphraseException, DuplicateUserException, NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, InvalidSessionIDException, MalformedURLException, NoSuchURLException { + boolean NoSuchURLException = false; + Integer sessionID ; + String Username = "AlexTina"; + String Password = "Abc234hg"; + String urlUsername = "AlexTina"; + String urlPassword = "Abc234hg"; + pb.addUser(Username,Password); + sessionID = pb.loginUser(Username,Password); + try{ + URL url = new URL ("http:AlexTinaAbc234hg"); + pb.updateDetails(sessionID,url,urlUsername,urlPassword); + pb.retrieveDetails(sessionID,url); + } + catch (NoSuchURLException e){ + NoSuchURLException = true; + } + assertFalse(NoSuchURLException); + } + //pt==null + @Test public void NoSuchURLException2() throws WeakPassphraseException, DuplicateUserException, NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, InvalidSessionIDException, MalformedURLException, NoSuchURLException { + boolean NoSuchURLException = false; + Integer sessionID ; + String Username = "AlexTina"; + String Password = "Abc234hg"; + String urlUsername = null; + String urlPassword = "Abc234hg"; + pb.addUser(Username,Password); + sessionID = pb.loginUser(Username,Password); + try{ + URL url = new URL ("http:AlexTinaAbc234hg"); + pb.updateDetails(sessionID,url,urlUsername,urlPassword); + pb.retrieveDetails(sessionID,url); + } + catch (NoSuchURLException e){ + NoSuchURLException = true; + } + assertTrue(NoSuchURLException); + } + + //NoSuchURLException + // pair = null + @Test public void NoSuchURLExceptionPair() throws WeakPassphraseException, DuplicateUserException, NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, InvalidSessionIDException, MalformedURLException, NoSuchURLException { + boolean NoSuchURLException = false; + Integer sessionID ; + String Username = "AlexTina"; + String Password = "Abc234hg"; + String urlUsername = "AlexTina"; + String urlPassword = "Abc234hg"; + pb.addUser(Username,Password); + sessionID = pb.loginUser(Username,Password); + try{ + URL url = new URL ("http:AlexTinaAbc234hg"); + pb.retrieveDetails(sessionID,url); + } + catch (NoSuchURLException e){ + NoSuchURLException = true; + } + assertTrue(NoSuchURLException); + } + + //pair != null + @Test public void NoSuchURLExceptionPair2() throws WeakPassphraseException, DuplicateUserException, NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException, InvalidSessionIDException, MalformedURLException, NoSuchURLException { + boolean NoSuchURLException = false; + Integer sessionID ; + String Username = "AlexTina"; + String Password = "Abc234hg"; + String urlUsername = "AlexTina"; + String urlPassword = "Abc234hg"; + pb.addUser(Username,Password); + sessionID = pb.loginUser(Username,Password); + try{ + URL url = new URL ("http:AlexTinaAbc234hg"); + pb.updateDetails(sessionID,url,urlUsername,urlPassword); + pb.retrieveDetails(sessionID,url); + } + catch (NoSuchURLException e){ + NoSuchURLException = true; + } + assertFalse(NoSuchURLException); + } + + + + + + @Test public void aTest() { //the assertEquals method used to check whether two values are diff --git a/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/AlreadyLoggedInException.java b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/AlreadyLoggedInException.java new file mode 100755 index 0000000000000000000000000000000000000000..2113d05193f3509be45d59c5e280121431802c89 --- /dev/null +++ b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/AlreadyLoggedInException.java @@ -0,0 +1,9 @@ +package swen90006.passbook.original.swen90006.passbook; + +public class AlreadyLoggedInException extends Exception +{ + public AlreadyLoggedInException(String username) + { + super("Username already logged in: " + username); + } +} diff --git a/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/DuplicateUserException.java b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/DuplicateUserException.java new file mode 100755 index 0000000000000000000000000000000000000000..6d98e94afa10ca65ffdf3626fdc4041c9c410a74 --- /dev/null +++ b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/DuplicateUserException.java @@ -0,0 +1,9 @@ +package swen90006.passbook.original.swen90006.passbook; + +public class DuplicateUserException extends Exception +{ + public DuplicateUserException(String username) + { + super("Username already exists: " + username); + } +} diff --git a/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/IncorrectPassphraseException.java b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/IncorrectPassphraseException.java new file mode 100755 index 0000000000000000000000000000000000000000..4aa54bebae1ca7ec1ae42bcc37431fabb503cc58 --- /dev/null +++ b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/IncorrectPassphraseException.java @@ -0,0 +1,9 @@ +package swen90006.passbook.original.swen90006.passbook; + +public class IncorrectPassphraseException extends Exception +{ + public IncorrectPassphraseException(String username, String passphrase) + { + super("Incorrect passphrase: " + passphrase + " for user " + username); + } +} diff --git a/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/InvalidSessionIDException.java b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/InvalidSessionIDException.java new file mode 100755 index 0000000000000000000000000000000000000000..52cfbf9dbc4dd944a86f5c44a60bc5b30e959791 --- /dev/null +++ b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/InvalidSessionIDException.java @@ -0,0 +1,9 @@ +package swen90006.passbook.original.swen90006.passbook; + +public class InvalidSessionIDException extends Exception +{ + public InvalidSessionIDException(Integer sessionID) + { + super("Invalid session ID: " + sessionID); + } +} diff --git a/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/NoSuchURLException.java b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/NoSuchURLException.java new file mode 100755 index 0000000000000000000000000000000000000000..21204f48663b98e1bbdf8305e1a7b020283a2768 --- /dev/null +++ b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/NoSuchURLException.java @@ -0,0 +1,11 @@ +package swen90006.passbook.original.swen90006.passbook; + +import java.net.URL; + +public class NoSuchURLException extends Exception +{ + public NoSuchURLException (String username, URL url) + { + super("User " + username + " does not have password for URL " + url.toString()); + } +} diff --git a/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/NoSuchUserException.java b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/NoSuchUserException.java new file mode 100755 index 0000000000000000000000000000000000000000..04ac877df36d018cb460e2b477860b96338041f4 --- /dev/null +++ b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/NoSuchUserException.java @@ -0,0 +1,9 @@ +package swen90006.passbook.original.swen90006.passbook; + +public class NoSuchUserException extends Exception +{ + public NoSuchUserException (String username) + { + super("Username does not exist: " + username); + } +} diff --git a/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/Pair.java b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/Pair.java new file mode 100755 index 0000000000000000000000000000000000000000..f2f5dfec7b91d4cc4a394410599e01f8fad0760a --- /dev/null +++ b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/Pair.java @@ -0,0 +1,31 @@ +package swen90006.passbook.original.swen90006.passbook; + +/** + * A pair of objects. + */ +public class Pair<X, Y> +{ + private X first; + private Y second; + + public Pair(X first, Y second) + { + this.first = first; + this.second = second; + } + + public X getFirst() + { + return this.first; + } + + public Y getSecond() + { + return this.second; + } + + public boolean equals(Pair<X, Y> other) + { + return first.equals(other.first) && second.equals(other.second); + } +} diff --git a/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/PassBook.java b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/PassBook.java new file mode 100755 index 0000000000000000000000000000000000000000..2415833c4f1ec44b6b70638c9803ce20d76e4308 --- /dev/null +++ b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/PassBook.java @@ -0,0 +1,261 @@ +package swen90006.passbook.original.swen90006.passbook; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +/** + * PassBook is a (fictional) online password manager. A password + * manager is a software application that generates, stores, and + * retrieves login details for users. + * + * A user has an account with PassBook. This account is protected by a + * master password, or passphrase. Each user can store login details + * for multiple websites, identified by their URL. A user can add a + * login details for a given website. The passphrase is used to + * encrypt all passwords, but for this implementation, we have ignored + * encryption. + * + * The PassBook passphrase must conform to the following requirements: + * Must be at least eight characters long and contain at + * least one digit (range 0-9), one letter in the range 'a'-'z', and + * one letter in the range 'A'-'Z'. + * + * Username and passwords for stored URLs have no password + * requirements. + * + * When a user logs into PassBook, they are given a session ID. This + * session ID is used to identify them for all transactions until they + * log out. + */ +public class PassBook +{ + /** The minimum length of a passphrase */ + public final static int MINIMUM_PASSPHRASE_LENGTH = 8; + + /** Valid URL protocols for the passbook */ + public final static String [] VALID_URL_PROTOCOLS = {"http", "https"}; + + //The passphrases (master passwords) for all users + private Map<String, String> passphrases; + + //The login details for all users and the URLs they have stored + private Map<String, PasswordTable> details; + + //Mapping from session IDs to usernames + private Map<Integer, String> userIDs; + + //Mapping from usernames to sessionIDs + private Map<String, Integer> sessionIDs; + + /** + * Constructs an empty passbook. + */ + public PassBook() + { + passphrases = new HashMap<String, String>(); + details = new HashMap<String, PasswordTable>(); + userIDs = new HashMap<Integer, String>(); + sessionIDs = new HashMap<String, Integer>(); + } + + /** + * Adds a new user to the passbook. + * + * @param passbookUsername the username for the user to be added + * @param passphrase the passphrase (master password) for the user + * @throws DuplicateUserException if the username is already in the passbook + * @throws WeakPassphraseException if the password does not fit the passphrase + rules (see class documentation) + * + * Assumption: passbookUsername and passphrase are non-null + */ + public void addUser(String passbookUsername, String passphrase) + throws DuplicateUserException, WeakPassphraseException + { + //Check if this user exists + if (passphrases.containsKey(passbookUsername)) { + throw new DuplicateUserException(passbookUsername); + } + //check the passphrase strength + else { + if (passphrase.length() < MINIMUM_PASSPHRASE_LENGTH) { + throw new WeakPassphraseException(passphrase); + } + + boolean containsLowerCase = false; + boolean containsUpperCase = false; + boolean containsNumber = false; + for (int i = 0; i < passphrase.length(); i++) { + + if ('a' <= passphrase.charAt(i) && passphrase.charAt(i) <= 'z') { + containsLowerCase = true; + } + else if ('A' <= passphrase.charAt(i) && passphrase.charAt(i) <= 'Z') { + containsUpperCase = true; + } + else if ('0' <= passphrase.charAt(i) && passphrase.charAt(i) <= '9') { + containsNumber = true; + } + } + + if (!containsLowerCase || !containsUpperCase || !containsNumber) { + throw new WeakPassphraseException(passphrase); + } + } + + passphrases.put(passbookUsername, passphrase); // map.put() => connect passbookUsername with passphrase + PasswordTable pt = new PasswordTable(); + details.put(passbookUsername, pt); + } + + /** + * Checks if a user exists + * @param passbookUsername the passbookUsername + * @return true if and only if this user is in the passbook + * + * Assumption: passbookUsername is non-null + */ + public boolean isUser(String passbookUsername) + { + return passphrases.containsKey(passbookUsername); + } + + /** + * Logs a user into the passbook. + * + * @param passbookUsername the passbookUsername for the user + * @param passphrase the passphrase (master password) for the user + * @returns a session ID greater than or equal to 0 + * @throws NoSuchUserException if the user does not exist in the passbook + * @throws AlreadyLoggedInException if the user is already logged in + * @throws IncorrectPassphraseException if the passphrase is incorrect for this user + * + * Assumption: passbookUsername and passphrase are non-null + */ + public int loginUser(String passbookUsername, String passphrase) + throws NoSuchUserException, AlreadyLoggedInException, IncorrectPassphraseException + { + //check that the user exists + if (!passphrases.containsKey(passbookUsername)) { + throw new NoSuchUserException(passbookUsername); + } + else if (sessionIDs.get(passbookUsername) != null) { + throw new AlreadyLoggedInException(passbookUsername); + } + else if (!passphrases.get(passbookUsername).equals(passphrase)) { + throw new IncorrectPassphraseException(passbookUsername, passphrase); + } + + //generate a random session ID that is not already taken + int sessionID = new Random().nextInt(Integer.MAX_VALUE); + while (userIDs.containsKey(sessionID)) { //detect whether the map has the sessionID(key) + sessionID = new Random().nextInt(Integer.MAX_VALUE); + } + + //add the session ID + sessionIDs.put(passbookUsername, sessionID); + userIDs.put(sessionID, passbookUsername); + + return sessionID; + } + + /** + * Logs out a user based on session ID. Has no affect if the session ID does not exist. + * + * @param sessionID the session ID to be terminated + * + * Assumption: session ID is non-null + */ + public void logoutUser(Integer sessionID) + { + sessionIDs.remove(userIDs.get(sessionID)); + userIDs.remove(sessionID); + } + + /** + * Updates the login details for a URL of a user. If the url + * username or password are null, the login details for this URL + * must be removed. + * + * @param sessionID the session ID for the logged-in user + * @param urlUsername the username for the user to be added + * @param url the URL for the username/password pair + * @param urlPassword the password to be add + * @throws InvalidSessionIDException if the session ID does not exists + * @throws MalformedURLException if the protocol is not 'http' or 'https' + * + * Assumption: url is non-null and a valid URL object + * Assumption: sessionID is non-null + */ + public void updateDetails(Integer sessionID, URL url, String urlUsername, String urlPassword) + throws InvalidSessionIDException, MalformedURLException + { + //check that the session ID exists + String passbookUsername = userIDs.get(sessionID); + if (passbookUsername == null) { + throw new InvalidSessionIDException(sessionID); + } + else if (!Arrays.asList(VALID_URL_PROTOCOLS).contains(url.getProtocol())) { + throw new MalformedURLException(passbookUsername); + } + + PasswordTable pt = details.get(passbookUsername); + + if (urlUsername == null || urlPassword == null) { + pt.remove(url); + } + else { + pt.put(url, new Pair<String, String> (urlUsername, urlPassword)); + details.put(passbookUsername, pt); + } + } + + + /** + * Retrieves login details for a given URL and user. + * + * @param sessionID the session ID + * @param url the URL for the password being retrieved. + * @returns the username and password for a given url for the corresponding user + * @throws NoSuchUserException if the username does not exist in the passbook + * @throws MalformedURLException if the syntax is invalid (see class documentation) + * @throws NoSuchURLException if user does not have login for this URL + * + * Assumption: url is non-null and a valid URL object + * Assumption: sessionID is non-null + */ + public Pair<String, String> retrieveDetails(Integer sessionID, URL url) + throws InvalidSessionIDException, MalformedURLException, NoSuchURLException + { + //check that the session ID exists + String passbookUsername = userIDs.get(sessionID); + if (passbookUsername == null) { + throw new InvalidSessionIDException(sessionID); + } + else if (!Arrays.asList(VALID_URL_PROTOCOLS).contains(url.getProtocol())) { + throw new MalformedURLException(passbookUsername); + } + + PasswordTable pt = details.get(passbookUsername); + //if this returned nothing, the user has no details for any url + if (pt == null) { + throw new NoSuchURLException(passbookUsername, url); + } + + Pair<String, String> pair = pt.get(url); + + //if this returned nothing, the user does not have a login for this url + if (pair == null) { + throw new NoSuchURLException(passbookUsername, url); + } + + return pair; + } + + //A simple label to improve code readability + private class PasswordTable extends HashMap<URL, Pair<String, String>> {} +} diff --git a/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/WeakPassphraseException.java b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/WeakPassphraseException.java new file mode 100755 index 0000000000000000000000000000000000000000..853b30b8ebd1d61b91cb72eedd2a2a2e041e90d7 --- /dev/null +++ b/tests/Partitioning/swen90006/passbook/original/swen90006/passbook/WeakPassphraseException.java @@ -0,0 +1,14 @@ +package swen90006.passbook.original.swen90006.passbook; + +public class WeakPassphraseException extends Exception +{ + public WeakPassphraseException (String passphrase) + { + super("Passphrase does not comply with the PassBook rules\n" + + "\t- must contains at least " + + PassBook.MINIMUM_PASSPHRASE_LENGTH + " characters\n" + + "\t- must contain at least one numeric character\n" + + "\t- must contain at least one lower case letter\n" + + "\t- must contain at least one upper case letter\n"); + } +} diff --git a/tests/tests.iml b/tests/tests.iml new file mode 100644 index 0000000000000000000000000000000000000000..3a2202643078d1878d45b5462649c68a088c1670 --- /dev/null +++ b/tests/tests.iml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="JAVA_MODULE" version="4"> + <component name="NewModuleRootManager" inherit-compiler-output="true"> + <exclude-output /> + <content url="file://$MODULE_DIR$"> + <sourceFolder url="file://$MODULE_DIR$/Boundary" isTestSource="true" /> + <sourceFolder url="file://$MODULE_DIR$/Partitioning" isTestSource="true" /> + </content> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + <orderEntry type="library" name="lib" level="project" /> + </component> +</module> \ No newline at end of file