From 9d19cdd261989031f7eb6e4dd56415d4f69a442a Mon Sep 17 00:00:00 2001 From: Winston Li Date: Tue, 23 Aug 2016 22:32:50 +0100 Subject: [PATCH] Implement and test DBStore swap_table functionality --- .../bridge/db/sqlite/SQLUpdate.java | 8 +- .../bridge/db/sqlite/SqliteDBStore.java | 16 ++-- .../db/sqlite/query/GetOldestProjectName.java | 30 +++++++ .../sqlite/query/GetProjectNamesSQLQuery.java | 6 -- .../create/CreateIndexURLIndexStore.java | 11 +-- .../create/CreateProjectsTableSQLUpdate.java | 8 -- .../sqlite/update/create/CreateSwapTable.java | 27 ++++++ .../update/create/CreateSwapTableIndex.java | 19 ++++ .../create/CreateURLIndexStoreSQLUpdate.java | 14 ++- .../DeleteFilesForProjectSQLUpdate.java | 11 ++- .../update/insert/AddURLIndexSQLUpdate.java | 11 ++- .../insert/SetProjectLastAccessedTime.java | 47 ++++++++++ .../update/insert/SetProjectSQLUpdate.java | 3 +- .../bridge/db/sqlite/SqliteDBStoreTest.java | 88 +++++++++++++++++++ 14 files changed, 252 insertions(+), 47 deletions(-) create mode 100644 services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetOldestProjectName.java create mode 100644 services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTable.java create mode 100644 services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTableIndex.java create mode 100644 services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTime.java create mode 100644 services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStoreTest.java diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SQLUpdate.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SQLUpdate.java index b550c6f7ef..167be212c0 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SQLUpdate.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SQLUpdate.java @@ -8,7 +8,11 @@ import java.sql.SQLException; */ public interface SQLUpdate { - public String getSQL(); - public void addParametersToStatement(PreparedStatement statement) throws SQLException; + String getSQL(); + default void addParametersToStatement( + PreparedStatement statement + ) throws SQLException { + + } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStore.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStore.java index 576881cd16..f37eb0d1e2 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStore.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStore.java @@ -3,14 +3,14 @@ package uk.ac.ic.wlgitbridge.bridge.db.sqlite; import uk.ac.ic.wlgitbridge.bridge.db.DBInitException; import uk.ac.ic.wlgitbridge.bridge.db.DBStore; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.query.GetLatestVersionForProjectSQLQuery; +import uk.ac.ic.wlgitbridge.bridge.db.sqlite.query.GetOldestProjectName; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.query.GetPathForURLInProjectSQLQuery; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.query.GetProjectNamesSQLQuery; -import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create.CreateIndexURLIndexStore; -import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create.CreateProjectsTableSQLUpdate; -import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create.CreateURLIndexStoreSQLUpdate; +import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create.*; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.delete.DeleteFilesForProjectSQLUpdate; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.insert.AddURLIndexSQLUpdate; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.insert.SetProjectSQLUpdate; +import uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.insert.SetProjectLastAccessedTime; import java.io.File; import java.sql.*; @@ -80,15 +80,15 @@ public class SqliteDBStore implements DBStore { @Override public String getOldestUnswappedProject() { - throw new UnsupportedOperationException(); + return query(new GetOldestProjectName()); } @Override public void setLastAccessedTime( String projectName, - Timestamp time + Timestamp lastAccessed ) { - throw new UnsupportedOperationException(); + update(new SetProjectLastAccessedTime(projectName, lastAccessed)); } private Connection openConnectionTo(File dbFile) { @@ -117,7 +117,9 @@ public class SqliteDBStore implements DBStore { Stream.of( new CreateProjectsTableSQLUpdate(), new CreateURLIndexStoreSQLUpdate(), - new CreateIndexURLIndexStore() + new CreateIndexURLIndexStore(), + new CreateSwapTable(), + new CreateSwapTableIndex() ).forEach(this::update); } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetOldestProjectName.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetOldestProjectName.java new file mode 100644 index 0000000000..4f0438df1a --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetOldestProjectName.java @@ -0,0 +1,30 @@ +package uk.ac.ic.wlgitbridge.bridge.db.sqlite.query; + +import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SQLQuery; + +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Created by winston on 23/08/2016. + */ +public class GetOldestProjectName implements SQLQuery { + + private static final String GET_OLDEST_PROJECT_NAME = + "SELECT `project_name`, MIN(`last_accessed`)\n" + + " FROM `swap_table`"; + + @Override + public String getSQL() { + return GET_OLDEST_PROJECT_NAME; + } + + @Override + public String processResultSet(ResultSet resultSet) throws SQLException { + while (resultSet.next()) { + return resultSet.getString("project_name"); + } + return null; + } + +} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetProjectNamesSQLQuery.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetProjectNamesSQLQuery.java index 97fbb1ace4..902b0244ea 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetProjectNamesSQLQuery.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/query/GetProjectNamesSQLQuery.java @@ -2,7 +2,6 @@ package uk.ac.ic.wlgitbridge.bridge.db.sqlite.query; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SQLQuery; -import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.LinkedList; @@ -30,9 +29,4 @@ public class GetProjectNamesSQLQuery implements SQLQuery> { return GET_URL_INDEXES_FOR_PROJECT_NAME; } - @Override - public void addParametersToStatement(PreparedStatement statement) throws SQLException { - - } - } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateIndexURLIndexStore.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateIndexURLIndexStore.java index 516a5c297f..26cf1884bf 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateIndexURLIndexStore.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateIndexURLIndexStore.java @@ -2,25 +2,18 @@ package uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SQLUpdate; -import java.sql.PreparedStatement; -import java.sql.SQLException; - /** * Created by Winston on 21/02/15. */ public class CreateIndexURLIndexStore implements SQLUpdate { public static final String CREATE_INDEX_URL_INDEX_STORE = - "CREATE UNIQUE INDEX IF NOT EXISTS `project_path_index` ON `url_index_store`(`project_name`, `path`);\n"; + "CREATE UNIQUE INDEX IF NOT EXISTS `project_path_index` " + + "ON `url_index_store`(`project_name`, `path`);\n"; @Override public String getSQL() { return CREATE_INDEX_URL_INDEX_STORE; } - @Override - public void addParametersToStatement(PreparedStatement statement) throws SQLException { - - } - } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateProjectsTableSQLUpdate.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateProjectsTableSQLUpdate.java index 649c863059..6c89a2915a 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateProjectsTableSQLUpdate.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateProjectsTableSQLUpdate.java @@ -2,9 +2,6 @@ package uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SQLUpdate; -import java.sql.PreparedStatement; -import java.sql.SQLException; - /** * Created by Winston on 20/11/14. */ @@ -21,9 +18,4 @@ public class CreateProjectsTableSQLUpdate implements SQLUpdate { return CREATE_PROJECTS_TABLE; } - @Override - public void addParametersToStatement(PreparedStatement statement) throws SQLException { - - } - } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTable.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTable.java new file mode 100644 index 0000000000..4d3c583ea9 --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTable.java @@ -0,0 +1,27 @@ +package uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create; + +import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SQLUpdate; + +/** + * Created by winston on 23/08/2016. + */ +public class CreateSwapTable implements SQLUpdate { + + private static final String CREATE_SWAP_TABLE = + "CREATE TABLE IF NOT EXISTS `swap_table` (\n" + + " `project_name` VARCHAR NOT NULL DEFAULT '',\n" + + " `last_accessed` DATETIME NULL DEFAULT 0,\n" + + " PRIMARY KEY (`project_name`),\n" + + " CONSTRAINT `swap_table_fk_1`\n" + + " FOREIGN KEY (`project_name`)\n" + + " REFERENCES `projects`(`name`)\n" + + " ON DELETE CASCADE\n" + + " ON UPDATE CASCADE\n" + + ")"; + + @Override + public String getSQL() { + return CREATE_SWAP_TABLE; + } + +} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTableIndex.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTableIndex.java new file mode 100644 index 0000000000..05d7d5f1e5 --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateSwapTableIndex.java @@ -0,0 +1,19 @@ +package uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create; + +import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SQLUpdate; + +/** + * Created by winston on 23/08/2016. + */ +public class CreateSwapTableIndex implements SQLUpdate { + + private static final String CREATE_SWAP_TABLE_INDEX = + "CREATE INDEX IF NOT EXISTS `swap_table_index`\n" + + " ON `swap_table`(`last_accessed`)"; + + @Override + public String getSQL() { + return CREATE_SWAP_TABLE_INDEX; + } + +} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateURLIndexStoreSQLUpdate.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateURLIndexStoreSQLUpdate.java index d98c5b5ec0..3ca0e9cf4c 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateURLIndexStoreSQLUpdate.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/create/CreateURLIndexStoreSQLUpdate.java @@ -2,9 +2,6 @@ package uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.create; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SQLUpdate; -import java.sql.PreparedStatement; -import java.sql.SQLException; - /** * Created by Winston on 20/11/14. */ @@ -16,7 +13,11 @@ public class CreateURLIndexStoreSQLUpdate implements SQLUpdate { " `url` text NOT NULL,\n"+ " `path` text NOT NULL,\n"+ " PRIMARY KEY (`project_name`,`url`),\n"+ - " CONSTRAINT `url_index_store_ibfk_1` FOREIGN KEY (`project_name`) REFERENCES `projects` (`name`) ON DELETE CASCADE ON UPDATE CASCADE\n"+ + " CONSTRAINT `url_index_store_ibfk_1` " + + "FOREIGN KEY (`project_name`) " + + "REFERENCES `projects` (`name`) " + + "ON DELETE CASCADE " + + "ON UPDATE CASCADE\n"+ ");\n"; @Override @@ -24,9 +25,4 @@ public class CreateURLIndexStoreSQLUpdate implements SQLUpdate { return CREATE_URL_INDEX_STORE; } - @Override - public void addParametersToStatement(PreparedStatement statement) throws SQLException { - - } - } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/delete/DeleteFilesForProjectSQLUpdate.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/delete/DeleteFilesForProjectSQLUpdate.java index 24683dca33..78d3e60d72 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/delete/DeleteFilesForProjectSQLUpdate.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/delete/DeleteFilesForProjectSQLUpdate.java @@ -11,7 +11,8 @@ import java.sql.SQLException; public class DeleteFilesForProjectSQLUpdate implements SQLUpdate { private static final String DELETE_URL_INDEXES_FOR_PROJECT_NAME = - "DELETE FROM `url_index_store` WHERE `project_name` = ? AND path IN ("; + "DELETE FROM `url_index_store` " + + "WHERE `project_name` = ? AND path IN ("; private final String projectName; private final String[] paths; @@ -23,7 +24,9 @@ public class DeleteFilesForProjectSQLUpdate implements SQLUpdate { @Override public String getSQL() { - StringBuilder sb = new StringBuilder(DELETE_URL_INDEXES_FOR_PROJECT_NAME); + StringBuilder sb = new StringBuilder( + DELETE_URL_INDEXES_FOR_PROJECT_NAME + ); for (int i = 0; i < paths.length; i++) { sb.append("?"); if (i < paths.length - 1) { @@ -35,7 +38,9 @@ public class DeleteFilesForProjectSQLUpdate implements SQLUpdate { } @Override - public void addParametersToStatement(PreparedStatement statement) throws SQLException { + public void addParametersToStatement( + PreparedStatement statement + ) throws SQLException { statement.setString(1, projectName); for (int i = 0; i < paths.length; i++) { statement.setString(i + 2, paths[i]); diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/AddURLIndexSQLUpdate.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/AddURLIndexSQLUpdate.java index 7112ea1bd6..5c337bed7a 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/AddURLIndexSQLUpdate.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/AddURLIndexSQLUpdate.java @@ -11,7 +11,12 @@ import java.sql.SQLException; public class AddURLIndexSQLUpdate implements SQLUpdate { private static final String ADD_URL_INDEX = - "INSERT OR REPLACE INTO `url_index_store` (`project_name`, `url`, `path`) VALUES (?, ?, ?);\n"; + "INSERT OR REPLACE INTO `url_index_store`(" + + "`project_name`, " + + "`url`, " + + "`path`" + + ") VALUES " + + "(?, ?, ?)\n"; private final String projectName; private final String url; @@ -29,7 +34,9 @@ public class AddURLIndexSQLUpdate implements SQLUpdate { } @Override - public void addParametersToStatement(PreparedStatement statement) throws SQLException { + public void addParametersToStatement( + PreparedStatement statement + ) throws SQLException { statement.setString(1, projectName); statement.setString(2, url); statement.setString(3, path); diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTime.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTime.java new file mode 100644 index 0000000000..71151d0abb --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectLastAccessedTime.java @@ -0,0 +1,47 @@ +package uk.ac.ic.wlgitbridge.bridge.db.sqlite.update.insert; + +import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SQLUpdate; + +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Timestamp; + +/** + * Created by winston on 23/08/2016. + */ +public class SetProjectLastAccessedTime implements SQLUpdate { + + private static final String SET_PROJECT_LAST_ACCESSED_TIME = + "INSERT OR REPLACE INTO `swap_table`(\n" + + " `project_name`,\n" + + " `last_accessed`\n" + + ") VALUES (\n" + + " ?,\n" + + " ?\n" + + ")"; + + private final String projectName; + private final Timestamp lastAccessed; + + public SetProjectLastAccessedTime( + String projectName, + Timestamp lastAccessed + ) { + this.projectName = projectName; + this.lastAccessed = lastAccessed; + } + + @Override + public String getSQL() { + return SET_PROJECT_LAST_ACCESSED_TIME; + } + + @Override + public void addParametersToStatement( + PreparedStatement statement + ) throws SQLException { + statement.setString(1, projectName); + statement.setTimestamp(2, lastAccessed); + } + +} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectSQLUpdate.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectSQLUpdate.java index f75ee9a973..cada0fb089 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectSQLUpdate.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/update/insert/SetProjectSQLUpdate.java @@ -11,7 +11,8 @@ import java.sql.SQLException; public class SetProjectSQLUpdate implements SQLUpdate { private static final String SET_PROJECT = - "INSERT OR REPLACE INTO `projects`(`name`, `version_id`) VALUES (?, ?);\n"; + "INSERT OR REPLACE INTO `projects`(`name`, `version_id`) " + + "VALUES (?, ?);\n"; private final String projectName; private final int versionID; diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStoreTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStoreTest.java new file mode 100644 index 0000000000..e85256f8cf --- /dev/null +++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/bridge/db/sqlite/SqliteDBStoreTest.java @@ -0,0 +1,88 @@ +package uk.ac.ic.wlgitbridge.bridge.db.sqlite; + +import org.junit.Before; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import java.io.IOException; +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +/** + * Created by winston on 23/08/2016. + */ +public class SqliteDBStoreTest { + + private SqliteDBStore dbStore; + + @Before + public void setup() throws IOException { + TemporaryFolder tmpFolder = new TemporaryFolder(); + tmpFolder.create(); + dbStore = new SqliteDBStore(tmpFolder.newFile("dbStore.db")); + } + + @Test + public void swapTableStartsOutEmpty() { + assertNull(dbStore.getOldestUnswappedProject()); + } + + @Test + public void testGetOldestUnswappedProject() { + dbStore.setLatestVersionForProject("older", 3); + dbStore.setLastAccessedTime( + "older", + Timestamp.valueOf( + LocalDateTime.now().minus(5, ChronoUnit.SECONDS) + ) + ); + dbStore.setLatestVersionForProject("asdf", 1); + dbStore.setLastAccessedTime( + "asdf", + Timestamp.valueOf( + LocalDateTime.now().minus(1, ChronoUnit.SECONDS) + ) + ); + assertEquals("older", dbStore.getOldestUnswappedProject()); + dbStore.setLastAccessedTime( + "older", + Timestamp.valueOf( + LocalDateTime.now() + ) + ); + assertEquals("asdf", dbStore.getOldestUnswappedProject()); + } + + @Test + public void noOldestProjectIfAllEvicated() { + dbStore.setLatestVersionForProject("older", 3); + dbStore.setLastAccessedTime("older", null); + assertNull(dbStore.getOldestUnswappedProject()); + } + + @Test + public void nullLastAccessedTimesDoNotCount() { + dbStore.setLatestVersionForProject("older", 2); + dbStore.setLastAccessedTime( + "older", + Timestamp.valueOf( + LocalDateTime.now().minus(5, ChronoUnit.SECONDS) + ) + ); + dbStore.setLatestVersionForProject("newer", 3); + dbStore.setLastAccessedTime( + "newer", + Timestamp.valueOf( + LocalDateTime.now() + ) + ); + assertEquals("older", dbStore.getOldestUnswappedProject()); + dbStore.setLastAccessedTime("older", null); + assertEquals("newer", dbStore.getOldestUnswappedProject()); + } + +} \ No newline at end of file