diff --git a/syncany-lib/src/main/java/org/syncany/config/Config.java b/syncany-lib/src/main/java/org/syncany/config/Config.java index 4b037ec8f..fb33e91a8 100644 --- a/syncany-lib/src/main/java/org/syncany/config/Config.java +++ b/syncany-lib/src/main/java/org/syncany/config/Config.java @@ -304,6 +304,14 @@ public File getLocalDir() { public File getDatabaseDir() { return databaseDir; } + + public File getLogDir() { + return logDir; + } + + public File getStateDir() { + return stateDir; + } public SaltedSecretKey getMasterKey() { return masterKey; @@ -321,7 +329,5 @@ public File getCleanupFile() { return new File(stateDir, FILE_CLEANUP); } - public File getLogDir() { - return logDir; - } + } diff --git a/syncany-lib/src/test/java/org/syncany/tests/operations/CleanupOperationTest.java b/syncany-lib/src/test/java/org/syncany/tests/operations/CleanupOperationTest.java index 5899372e1..f2a67c6d9 100644 --- a/syncany-lib/src/test/java/org/syncany/tests/operations/CleanupOperationTest.java +++ b/syncany-lib/src/test/java/org/syncany/tests/operations/CleanupOperationTest.java @@ -435,4 +435,107 @@ public void testCleanupAfterFailedUpOperation() throws Exception { clientA.deleteTestData(); clientB.deleteTestData(); } + + @Test + public void testCleanupMaxDatabaseFiles() throws Exception { + // Setup + LocalConnection testConnection = (LocalConnection) TestConfigUtil.createTestLocalConnection(); + TestClient clientA = new TestClient("A", testConnection); + + CleanupOperationOptions options = new CleanupOperationOptions(); + options.setMergeRemoteFiles(true); + options.setRemoveOldVersions(true); + options.setKeepVersionsCount(10); + options.setMaxDatabaseFiles(3); + + // Run + + // A: Create some file versions + clientA.createNewFile("file.jpg"); + for (int i=1; i<=4; i++) { + clientA.changeFile("file.jpg"); + clientA.upWithForceChecksum(); + } + + + // B: Cleanup + CleanupOperationResult cleanupOperationResult = clientA.cleanup(options); + assertEquals(CleanupResultCode.OK, cleanupOperationResult.getResultCode()); + assertEquals(4, cleanupOperationResult.getMergedDatabaseFilesCount()); + assertEquals(0, cleanupOperationResult.getRemovedMultiChunks().size()); + assertEquals(0, cleanupOperationResult.getRemovedOldVersionsCount()); + + TestClient clientB = new TestClient("B", testConnection); + clientB.down(); + + + // B: Create some file versions + clientB.createNewFile("file-B.jpg"); + for (int i=1; i<=6; i++) { + clientB.changeFile("file-B.jpg"); + clientB.upWithForceChecksum(); + } + + // B: Cleanup (2 clients, so 7 databases is too much) + cleanupOperationResult = clientB.cleanup(options); + assertEquals(CleanupResultCode.OK, cleanupOperationResult.getResultCode()); + assertEquals(7, cleanupOperationResult.getMergedDatabaseFilesCount()); + assertEquals(0, cleanupOperationResult.getRemovedMultiChunks().size()); + assertEquals(0, cleanupOperationResult.getRemovedOldVersionsCount()); + + // Tear down + clientA.deleteTestData(); + clientB.deleteTestData(); + } + + + @Test + public void testQuickDoubleCleanup() throws Exception { + // Setup + LocalConnection testConnection = (LocalConnection) TestConfigUtil.createTestLocalConnection(); + TestClient clientA = new TestClient("A", testConnection); + + CleanupOperationOptions options = new CleanupOperationOptions(); + options.setMergeRemoteFiles(true); + options.setRemoveOldVersions(false); + options.setMinSecondsBetweenCleanups(40000000); + + // Run + + // A: Create some file versions + clientA.createNewFile("file.jpg"); + for (int i=1; i<=16; i++) { + clientA.changeFile("file.jpg"); + clientA.upWithForceChecksum(); + } + + + // B: Cleanup + CleanupOperationResult cleanupOperationResult = clientA.cleanup(options); + assertEquals(CleanupResultCode.OK, cleanupOperationResult.getResultCode()); + assertEquals(16, cleanupOperationResult.getMergedDatabaseFilesCount()); + assertEquals(0, cleanupOperationResult.getRemovedMultiChunks().size()); + assertEquals(0, cleanupOperationResult.getRemovedOldVersionsCount()); + + for (int i=1; i<=15; i++) { + clientA.changeFile("file.jpg"); + clientA.upWithForceChecksum(); + } + + // Because of minimum timeout, this cleanup should not do anything + cleanupOperationResult = clientA.cleanup(options); + assertEquals(CleanupResultCode.OK_NOTHING_DONE, cleanupOperationResult.getResultCode()); + + // When force is on, the cleanup should go through + options.setForce(true); + + cleanupOperationResult = clientA.cleanup(options); + assertEquals(CleanupResultCode.OK, cleanupOperationResult.getResultCode()); + assertEquals(16, cleanupOperationResult.getMergedDatabaseFilesCount()); + assertEquals(0, cleanupOperationResult.getRemovedMultiChunks().size()); + assertEquals(0, cleanupOperationResult.getRemovedOldVersionsCount()); + + // Tear down + clientA.deleteTestData(); + } } diff --git a/syncany-lib/src/test/java/org/syncany/tests/util/TestConfigUtil.java b/syncany-lib/src/test/java/org/syncany/tests/util/TestConfigUtil.java index d024f3a3d..b9e62daad 100644 --- a/syncany-lib/src/test/java/org/syncany/tests/util/TestConfigUtil.java +++ b/syncany-lib/src/test/java/org/syncany/tests/util/TestConfigUtil.java @@ -212,6 +212,7 @@ public static Config createTestLocalConfig(String machineName, TransferSettings config.getCacheDir().mkdirs(); config.getDatabaseDir().mkdirs(); config.getLogDir().mkdirs(); + config.getStateDir().mkdirs(); // Write to config folder (required for some tests) new Persister().write(configTO, new File(config.getAppDir()+"/"+Config.FILE_CONFIG));