@Test
  public void testRenameAndCheckIfMultiChunksAreDownloaded() throws Exception {
    // Setup
    Connection testConnection = TestConfigUtil.createTestLocalConnection();
    TestClient clientA = new TestClient("A", testConnection);
    TestClient clientB = new TestClient("B", testConnection);

    // Run

    // Prepare, create file at A, sync it to B
    clientA.createNewFile("A-file1");
    clientA.sync();
    clientB.sync();

    // Now move file, and sync
    clientA.moveFile("A-file1", "A-file-moved1");
    clientA.up();

    DownOperationResult downOperationResult = clientB.down();
    assertEquals(
        "No multichunks should have been downloaded.",
        0,
        downOperationResult.getDownloadedMultiChunks().size());
    assertTrue("Moved files should exist.", clientB.getLocalFile("A-file-moved1").exists());
    assertFileListEquals(clientA.getLocalFiles(), clientB.getLocalFiles());
    assertDatabaseFileEquals(
        clientA.getLocalDatabaseFile(),
        clientB.getLocalDatabaseFile(),
        clientA.getConfig().getTransformer());

    // Tear down
    clientA.cleanup();
    clientB.cleanup();
  }
  @Test
  public void testDirtyDatabase() throws Exception {
    // Setup
    Connection testConnection = TestConfigUtil.createTestLocalConnection();

    TestClient clientA = new TestClient("A", testConnection);
    TestClient clientB = new TestClient("B", testConnection);

    // Run
    UpOperationOptions upOptionsForceEnabled = new UpOperationOptions();
    upOptionsForceEnabled.setForceUploadEnabled(true);

    clientA.createNewFile("A-file1.jpg", 50 * 1024);
    clientA.up(upOptionsForceEnabled);

    clientB.createNewFile("A-file1.jpg", 50 * 1024);
    clientB.up(upOptionsForceEnabled);

    clientB.down(); // This creates a dirty database	
    assertTrue("Dirty database should exist.", clientB.getDirtyDatabaseFile().exists());
    assertFileEquals(
        "Files should be identical",
        clientA.getLocalFile("A-file1.jpg"),
        clientB.getLocalFile("A-file1.jpg"));
    assertConflictingFileExists("A-file1.jpg", clientB.getLocalFilesExcludeLockedAndNoRead());

    clientB.up(); // This deletes the dirty database file
    assertFalse("Dirty database should NOT exist.", clientB.getDirtyDatabaseFile().exists());

    clientA.down(); // This pulls down the conflicting file
    assertFileListEquals(
        clientA.getLocalFilesExcludeLockedAndNoRead(),
        clientB.getLocalFilesExcludeLockedAndNoRead());
    assertDatabaseFileEquals(
        clientA.getLocalDatabaseFile(),
        clientB.getLocalDatabaseFile(),
        clientA.getConfig().getTransformer());
    assertConflictingFileExists("A-file1.jpg", clientA.getLocalFilesExcludeLockedAndNoRead());

    // Tear down
    clientA.cleanup();
    clientB.cleanup();
  }
  @Test
  public void testChangedModifiedDate() throws Exception {
    // Setup
    Connection testConnection = TestConfigUtil.createTestLocalConnection();

    TestClient clientA = new TestClient("A", testConnection);
    TestClient clientB = new TestClient("B", testConnection);

    // Run

    // A, create two files with identical content and change mod. date of one of them
    clientA.createNewFile("A-file1.jpg", 50 * 1024);
    clientA.copyFile("A-file1.jpg", "A-file1-with-different-modified-date.jpg");
    clientA.getLocalFile("A-file1.jpg").setLastModified(0);
    clientA.up();

    // B, down, then move BOTH files
    clientB.down();
    assertFileListEquals(clientA.getLocalFiles(), clientB.getLocalFiles());
    assertDatabaseFileEquals(
        clientA.getLocalDatabaseFile(),
        clientB.getLocalDatabaseFile(),
        clientA.getConfig().getTransformer());

    clientB.moveFile("A-file1.jpg", "A-file1-moved.jpg");
    clientB.moveFile(
        "A-file1-with-different-modified-date.jpg",
        "A-file1-with-different-modified-date-moved.jpg");
    clientB.up();

    Database clientDatabaseB = clientB.loadLocalDatabase();

    PartialFileHistory file1Orig = clientDatabaseB.getFileHistory("A-file1-moved.jpg");
    PartialFileHistory file1WithDiffLastModDate =
        clientDatabaseB.getFileHistory("A-file1-with-different-modified-date-moved.jpg");

    assertNotNull(file1Orig);
    assertNotNull(file1WithDiffLastModDate);

    FileVersion fileVersion1OrigV1 = file1Orig.getFileVersion(1);
    FileVersion fileVersion1OrigV2 = file1Orig.getFileVersion(2);

    FileVersion fileVersion1WithDiffLastModDateV1 = file1WithDiffLastModDate.getFileVersion(1);
    FileVersion fileVersion1WithDiffLastModDateV2 = file1WithDiffLastModDate.getFileVersion(2);

    assertNotNull(fileVersion1OrigV1);
    assertNotNull(fileVersion1OrigV2);
    assertNotNull(fileVersion1WithDiffLastModDateV1);
    assertNotNull(fileVersion1WithDiffLastModDateV2);

    assertEquals("A-file1.jpg", fileVersion1OrigV1.getName());
    assertEquals("A-file1-moved.jpg", fileVersion1OrigV2.getName());
    assertEquals(
        "A-file1-with-different-modified-date.jpg", fileVersion1WithDiffLastModDateV1.getName());
    assertEquals(
        "A-file1-with-different-modified-date-moved.jpg",
        fileVersion1WithDiffLastModDateV2.getName());

    // Tear down
    clientA.cleanup();
    clientB.cleanup();
  }