def test_resolve_local(self): opts = {"resolve": "local", "verbose": self.verbose} stats = self.do_run_suite(BiDirSynchronizer, opts) # self._dump_de_facto_results(stats) # We resolve all conflicts by using the local version. self.assertEqual(stats["files_written"], 12) self.assertEqual(stats["download_files_written"], 3) self.assertEqual(stats["upload_files_written"], 9) self.assertEqual(stats["files_deleted"], 3) self.assertEqual(stats["dirs_deleted"], 4) self.assertEqual(stats["conflict_files"], 7) expect_local = { 'file1.txt': {'content': 'local1', 'date': '2014-01-01 12:00:00'}, 'file2.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'file4.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'file6.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'file7.txt': {'content': 'local 13:00:05', 'date': '2014-01-01 13:00:05'}, 'file9.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'folder1/file1_1.txt': {'content': 'local1_1', 'date': '2014-01-01 12:00:00'}, 'folder2/file2_1.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'folder5/file5_1.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file1.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file2.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file3.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file4.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file5.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file6.txt': {'content': 'local 13:00:05', 'date': '2014-01-01 13:00:05'}, } self.assert_test_folder_equal(get_test_folder("local"), expect_local) self.assert_test_folder_equal(get_test_folder("remote"), expect_local)
def test_default(self): opts = {"verbose": self.verbose} # default options, i.e. 'skip' conflicts # Default options: expect 4 unresolved conflicts stats = self.do_run_suite(DownloadSynchronizer, opts) self._dump_de_facto_results(stats) # We expect 7 conflicts, and leave them unresolved (i.e. skip them all) # Also deletes are not performed self.assertEqual(stats["files_written"], 3) self.assertEqual(stats["download_files_written"], 3) self.assertEqual(stats["upload_files_written"], 0) self.assertEqual(stats["files_deleted"], 0) self.assertEqual(stats["dirs_deleted"], 0) self.assertEqual(stats["conflict_files"], 7) self.assertEqual(stats["conflict_files_skipped"], 7) # We expect that remote remains unmodified self.assert_test_folder_equal( get_test_folder("remote"), _SyncTestBase.remote_fixture_modified ) expect_local = { "file1.txt": {"content": "local1", "date": "2014-01-01 12:00:00"}, "file2.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "file4.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "file5.txt": {"content": "local5", "date": "2014-01-01 12:00:00"}, "file6.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "file7.txt": {"content": "local 13:00:05", "date": "2014-01-01 13:00:05"}, "file9.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "folder1/file1_1.txt": { "content": "local1_1", "date": "2014-01-01 12:00:00", }, "folder2/file2_1.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00", }, "folder5/file5_1.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00", }, "folder6/file6_1.txt": { "content": "local6_1", "date": "2014-01-01 12:00:00", }, "folder7/file7_1.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00", }, "new_file1.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file2.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "new_file3.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file4.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file5.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file6.txt": { "content": "local 13:00:05", "date": "2014-01-01 13:00:05", }, } self.assert_test_folder_equal(get_test_folder("local"), expect_local)
def test_prepare_initial_synced_fixture(self): # """Test that fixture set up code worked.""" # Fixtures are initialized to 9 top-level files and 7 folders, all 12:00:00 self.assert_test_folder_equal( get_test_folder("local"), _SyncTestBase.local_fixture_unmodified ) # setUp() should have created a copy of /local in /remote self.assert_test_folder_equal( get_test_folder("remote"), _SyncTestBase.local_fixture_unmodified ) # Metadata files are created on local target only self.assertTrue(is_test_file("local/" + DirMetadata.META_FILE_NAME)) self.assertTrue(not is_test_file("remote/" + DirMetadata.META_FILE_NAME)) # Local meta data file contains peer sync info meta = get_metadata("local") remote_path = os.path.join(PYFTPSYNC_TEST_FOLDER, "remote") assert "peer_sync" in meta meta = meta["peer_sync"] assert remote_path in meta meta = meta[remote_path] assert "file1.txt" in meta assert "folder7" in meta # Subfolders also contain peer_sync info meta = get_metadata("local/folder7") assert "file7_1.txt" in meta["peer_sync"][remote_path]
def test_prepare_initial_synced_fixture(self): # """Test that fixture set up code worked.""" # Fixtures are initialized to 9 top-level files and 7 folders, all 12:00:00 self.assert_test_folder_equal(get_test_folder("local"), _SyncTestBase.local_fixture_unmodified) # setUp() should have created a copy of /local in /remote self.assert_test_folder_equal(get_test_folder("remote"), _SyncTestBase.local_fixture_unmodified) # Metadata files are created on local target only self.assertTrue(is_test_file("local/" + DirMetadata.META_FILE_NAME)) self.assertTrue(not is_test_file("remote/" + DirMetadata.META_FILE_NAME)) # Local meta data file contains peer sync info meta = get_metadata("local") remote_path = os.path.join(PYFTPSYNC_TEST_FOLDER, "remote") assert "peer_sync" in meta meta = meta["peer_sync"] assert remote_path in meta meta = meta[remote_path] assert "file1.txt" in meta assert "folder7" in meta # Subfolders also contain peer_sync info meta = get_metadata("local/folder7") assert "file7_1.txt" in meta["peer_sync"][remote_path]
def test_delete(self): opts = { "verbose": self.verbose, "resolve": "skip", "delete": True, # "delete_unmatched": True, # "force": True, # "match": "*1.txt", } stats = self.do_run_suite(DownloadSynchronizer, opts) self._dump_de_facto_results(stats) # We expect 7 conflicts, and leave them unresolved (i.e. skip them all) # self.assertEqual(stats["files_written"], 3) # self.assertEqual(stats["download_files_written"], 0) self.assertEqual(stats["upload_files_written"], 0) self.assertEqual(stats["files_deleted"], 2) self.assertEqual(stats["dirs_deleted"], 2) # self.assertEqual(stats["conflict_files"], 7) # self.assertEqual(stats["conflict_files_skipped"], 7) # We expect that remote remains unmodified self.assert_test_folder_equal( get_test_folder("remote"), _SyncTestBase.remote_fixture_modified ) # We expect that local only contains files that match '*1.txt' expect_local = { "file1.txt": {"content": "local1", "date": "2014-01-01 12:00:00"}, "file2.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "file4.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "file6.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "file7.txt": {"content": "local 13:00:05", "date": "2014-01-01 13:00:05"}, "file9.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "folder1/file1_1.txt": { "content": "local1_1", "date": "2014-01-01 12:00:00", }, "folder2/file2_1.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00", }, "folder5/file5_1.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00", }, "new_file2.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "new_file3.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file4.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file5.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file6.txt": { "content": "local 13:00:05", "date": "2014-01-01 13:00:05", }, } self.assert_test_folder_equal(get_test_folder("local"), expect_local)
def test_delete_unmatched(self): opts = { "verbose": self.verbose, "resolve": "local", "delete": True, "delete_unmatched": True, "force": True, "match": "*1.txt", } stats = self.do_run_suite(UploadSynchronizer, opts) self._dump_de_facto_results(stats) # We expect 7 conflicts, and leave them unresolved (i.e. skip them all) # self.assertEqual(stats["files_written"], 3) # self.assertEqual(stats["download_files_written"], 0) # self.assertEqual(stats["upload_files_written"], 3) # self.assertEqual(stats["files_deleted"], 1) # self.assertEqual(stats["dirs_deleted"], 2) # self.assertEqual(stats["conflict_files"], 7) # self.assertEqual(stats["conflict_files_skipped"], 7) self.assert_test_folder_equal(get_test_folder("local"), _SyncTestBase.local_fixture_modified) # We expect that remote only contains files that match '*1.txt' expect_remote = { 'file1.txt': { 'content': 'local1', 'date': '2014-01-01 12:00:00' }, 'folder1/file1_1.txt': { 'content': 'local1_1', 'date': '2014-01-01 12:00:00' }, 'folder2/file2_1.txt': { 'content': 'local 13:00', 'date': '2014-01-01 13:00:00' }, 'folder5/file5_1.txt': { 'content': 'local5_1', 'date': '2014-01-01 12:00:00' }, 'folder6/file6_1.txt': { 'content': 'local6_1', 'date': '2014-01-01 12:00:00' }, 'folder7/file7_1.txt': { 'content': 'local 13:00', 'date': '2014-01-01 13:00:00' }, 'new_file1.txt': { 'content': 'local 13:00', 'date': '2014-01-01 13:00:00' }, } self.assert_test_folder_equal(get_test_folder("remote"), expect_remote)
def test_no_metadata(self): """Synchronize with absent .pyftpsync-meta.json.""" # Reset setUp fixture and re-create without using a synchronizer self._prepare_synced_fixture_without_meta() opts = {"verbose": self.verbose} self.do_run_suite(BiDirSynchronizer, opts) # self._dump_de_facto_results(stats) # NOTE: # Since we don't have meta data, the synchronizer treats missing files on # either side as 'new'. # Also modifications on both sides are not recognized as conflict. Instead the # newer file wins. (Only exception is new_file4.txt` which has identical time # but different size) # => So we basically get a union of both targets. # self.assertEqual(stats["files_written"], 18) # self.assertEqual(stats["download_files_written"], 9) # self.assertEqual(stats["upload_files_written"], 9) # self.assertEqual(stats["files_deleted"], 0) # self.assertEqual(stats["dirs_deleted"], 0) # self.assertEqual(stats["conflict_files"], 1) expect_local = { 'file1.txt': {'content': 'local1', 'date': '2014-01-01 12:00:00'}, 'file2.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'file3.txt': {'content': 'local3', 'date': '2014-01-01 12:00:00'}, 'file4.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'file5.txt': {'content': 'local5', 'date': '2014-01-01 12:00:00'}, 'file6.txt': {'content': 'remote 13:00:05', 'date': '2014-01-01 13:00:05'}, 'file7.txt': {'content': 'local 13:00:05', 'date': '2014-01-01 13:00:05'}, 'file8.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'file9.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'folder1/file1_1.txt': {'content': 'local1_1', 'date': '2014-01-01 12:00:00'}, 'folder2/file2_1.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'folder3/file3_1.txt': {'content': 'local3_1', 'date': '2014-01-01 12:00:00'}, 'folder4/file4_1.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'folder5/file5_1.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'folder6/file6_1.txt': {'content': 'local6_1', 'date': '2014-01-01 12:00:00'}, 'folder7/file7_1.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file1.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file2.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file3.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file4.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file5.txt': {'content': 'remote 13:00:05', 'date': '2014-01-01 13:00:05'}, 'new_file6.txt': {'content': 'local 13:00:05', 'date': '2014-01-01 13:00:05'}, } expect_remote = expect_local.copy() expect_remote.update({ 'new_file4.txt': {'content': 'remote 13:00 with other content', 'date': '2014-01-01 13:00:00'}, }) self.assert_test_folder_equal(get_test_folder("local"), expect_local) self.assert_test_folder_equal(get_test_folder("remote"), expect_remote)
def test_delete_unmatched(self): opts = { "verbose": self.verbose, "resolve": "remote", "delete": True, "delete_unmatched": True, "force": True, "match": "*1.txt", } stats = self.do_run_suite(DownloadSynchronizer, opts) self._dump_de_facto_results(stats) # We expect 7 conflicts, and leave them unresolved (i.e. skip them all) # self.assertEqual(stats["files_written"], 3) # self.assertEqual(stats["download_files_written"], 0) # self.assertEqual(stats["upload_files_written"], 3) # self.assertEqual(stats["files_deleted"], 1) # self.assertEqual(stats["dirs_deleted"], 2) # self.assertEqual(stats["conflict_files"], 7) # self.assertEqual(stats["conflict_files_skipped"], 7) # We expect that remote remains unmodified self.assert_test_folder_equal(get_test_folder("remote"), _SyncTestBase.remote_fixture_modified) # We expect that local only contains files that match '*1.txt' expect_local = { "file1.txt": { "content": "local1", "date": "2014-01-01 12:00:00" }, "folder1/file1_1.txt": { "content": "local1_1", "date": "2014-01-01 12:00:00", }, "folder2/file2_1.txt": { "content": "local2_1", "date": "2014-01-01 12:00:00", }, "folder3/file3_1.txt": { "content": "local3_1", "date": "2014-01-01 12:00:00", }, "folder4/file4_1.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00", }, "folder5/file5_1.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00", }, } self.assert_test_folder_equal(get_test_folder("local"), expect_local)
def test_dry_run(self): opts = {"verbose": self.verbose, "resolve": "local", "dry_run": True} stats = self.do_run_suite(BiDirSynchronizer, opts) # DRY-RUN: We expect no changes self.assertEqual(stats["bytes_written"], 0) self.assert_test_folder_equal(get_test_folder("local"), _SyncTestBase.local_fixture_modified) self.assert_test_folder_equal(get_test_folder("remote"), _SyncTestBase.remote_fixture_modified)
def test_default(self): opts = {"verbose": self.verbose} # default options, i.e. 'skip' conflicts # Default options: expect 4 unresolved conflicts stats = self.do_run_suite(BiDirSynchronizer, opts) # self._dump_de_facto_results(stats) # We expect 7 conflicts, and leave them unresolved (i.e. skip them all) self.assertEqual(stats["files_written"], 6) self.assertEqual(stats["download_files_written"], 3) self.assertEqual(stats["upload_files_written"], 3) self.assertEqual(stats["files_deleted"], 2) self.assertEqual(stats["dirs_deleted"], 4) self.assertEqual(stats["conflict_files"], 7) expect_local = { 'file1.txt': {'content': 'local1', 'date': '2014-01-01 12:00:00'}, 'file2.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'file4.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'file6.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'file7.txt': {'content': 'local 13:00:05', 'date': '2014-01-01 13:00:05'}, 'file9.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'folder1/file1_1.txt': {'content': 'local1_1', 'date': '2014-01-01 12:00:00'}, 'folder2/file2_1.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'folder5/file5_1.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file1.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file2.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file3.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file4.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file5.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file6.txt': {'content': 'local 13:00:05', 'date': '2014-01-01 13:00:05'}, } expect_remote = { 'file1.txt': {'content': 'local1', 'date': '2014-01-01 12:00:00'}, 'file2.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'file4.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'file6.txt': {'content': 'remote 13:00:05', 'date': '2014-01-01 13:00:05'}, 'file7.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'file8.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'folder1/file1_1.txt': {'content': 'local1_1', 'date': '2014-01-01 12:00:00'}, 'folder2/file2_1.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'folder5/file5_1.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file1.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file2.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file3.txt': {'content': 'local 13:00', 'date': '2014-01-01 13:00:00'}, 'new_file4.txt': {'content': 'remote 13:00 with other content', 'date': '2014-01-01 13:00:00'}, 'new_file5.txt': {'content': 'remote 13:00:05', 'date': '2014-01-01 13:00:05'}, 'new_file6.txt': {'content': 'remote 13:00', 'date': '2014-01-01 13:00:00'}, } self.assert_test_folder_equal(get_test_folder("local"), expect_local) self.assert_test_folder_equal(get_test_folder("remote"), expect_remote)
def test_prepare_modified_fixture(self): # """Test that fixture set up code worked.""" # self._prepare_modified_fixture() self.assert_test_folder_equal(get_test_folder("local"), _SyncTestBase.local_fixture_modified) self.assert_test_folder_equal(get_test_folder("remote"), _SyncTestBase.remote_fixture_modified) # Metadata files are created on local target only self.assertTrue(is_test_file("local/" + DirMetadata.META_FILE_NAME)) self.assertTrue(not is_test_file("remote/" + DirMetadata.META_FILE_NAME))
def test_resolve_remote(self): opts = {"resolve": "remote", "verbose": self.verbose} stats = self.do_run_suite(BiDirSynchronizer, opts) # self._dump_de_facto_results(stats) # We resolve all conflicts by using the remote version. self.assertEqual(stats["files_written"], 12) self.assertEqual(stats["download_files_written"], 9) self.assertEqual(stats["upload_files_written"], 3) self.assertEqual(stats["files_deleted"], 3) self.assertEqual(stats["dirs_deleted"], 4) self.assertEqual(stats["conflict_files"], 7) expect_local = { "file1.txt": {"content": "local1", "date": "2014-01-01 12:00:00"}, "file2.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "file4.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "file6.txt": {"content": "remote 13:00:05", "date": "2014-01-01 13:00:05"}, "file7.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "file8.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "folder1/file1_1.txt": { "content": "local1_1", "date": "2014-01-01 12:00:00", }, "folder2/file2_1.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00", }, "folder5/file5_1.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00", }, "new_file1.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file2.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "new_file3.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file4.txt": { "content": "remote 13:00 with other content", "date": "2014-01-01 13:00:00", }, "new_file5.txt": { "content": "remote 13:00:05", "date": "2014-01-01 13:00:05", }, "new_file6.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, } self.assert_test_folder_equal(get_test_folder("local"), expect_local) self.assert_test_folder_equal(get_test_folder("remote"), expect_local)
def test_dry_run(self): opts = {"verbose": self.verbose, "resolve": "local", "dry_run": True} stats = self.do_run_suite(BiDirSynchronizer, opts) # DRY-RUN: We expect no changes self.assertEqual(stats["bytes_written"], 0) self.assert_test_folder_equal( get_test_folder("local"), _SyncTestBase.local_fixture_modified ) self.assert_test_folder_equal( get_test_folder("remote"), _SyncTestBase.remote_fixture_modified )
def test_mirror(self): opts = { "verbose": self.verbose, "resolve": "local", "delete": True, "force": True, } self.do_run_suite(UploadSynchronizer, opts) # We expect that local is mirrored 1:1 to remote self.assert_test_folder_equal(get_test_folder("local"), _SyncTestBase.local_fixture_modified) self.assert_test_folder_equal(get_test_folder("remote"), _SyncTestBase.local_fixture_modified)
def test_prepare_modified_fixture(self): # """Test that fixture set up code worked.""" # self._prepare_modified_fixture() self.assert_test_folder_equal( get_test_folder("local"), _SyncTestBase.local_fixture_modified ) self.assert_test_folder_equal( get_test_folder("remote"), _SyncTestBase.remote_fixture_modified ) # Metadata files are created on local target only self.assertTrue(is_test_file("local/" + DirMetadata.META_FILE_NAME)) self.assertTrue(not is_test_file("remote/" + DirMetadata.META_FILE_NAME))
def test_mirror(self): opts = { "verbose": self.verbose, "resolve": "remote", "delete": True, "force": True, } self.do_run_suite(DownloadSynchronizer, opts) # We expect that remote is mirrored 1:1 to local self.assert_test_folder_equal( get_test_folder("local"), _SyncTestBase.remote_fixture_modified ) self.assert_test_folder_equal( get_test_folder("remote"), _SyncTestBase.remote_fixture_modified )
def test_folder_conflict(self): """Delete a folder on one side, but change content on other side.""" write_test_file("local/folder1/file1_1.txt", dt="2014-01-01 13:00:00", content="local 13:00") remove_test_folder("remote/folder1") opts = {"verbose": self.verbose} stats = self._sync_test_folders(BiDirSynchronizer, opts) # Note: currently we do NOT detect this kind of conflicts! # This is what we can expect right now: self.assertEqual(stats["dirs_deleted"], 1) self.assertEqual(stats["conflict_files"], 0) raise SkipTest("Currently we do NOT detect this kind of conflicts.") self.assertEqual(stats["files_written"], 0) self.assertEqual(stats["download_files_written"], 0) self.assertEqual(stats["upload_files_written"], 0) self.assertEqual(stats["files_deleted"], 0) self.assertEqual(stats["dirs_deleted"], 0) self.assertEqual(stats["conflict_files"], 1) expect_local = { 'file1.txt': {'content': 'local1', 'date': '2014-01-01 12:00:00'}, 'file2.txt': {'content': 'local2', 'date': '2014-01-01 12:00:00'}, 'file3.txt': {'content': 'local3', 'date': '2014-01-01 12:00:00'}, 'file4.txt': {'content': 'local4', 'date': '2014-01-01 12:00:00'}, 'file5.txt': {'content': 'local5', 'date': '2014-01-01 12:00:00'}, 'file6.txt': {'content': 'local6', 'date': '2014-01-01 12:00:00'}, 'file7.txt': {'content': 'local7', 'date': '2014-01-01 12:00:00'}, 'file8.txt': {'content': 'local8', 'date': '2014-01-01 12:00:00'}, 'file9.txt': {'content': 'local9', 'date': '2014-01-01 12:00:00'}, 'folder2/file2_1.txt': {'content': 'local2_1', 'date': '2014-01-01 12:00:00'}, 'folder3/file3_1.txt': {'content': 'local3_1', 'date': '2014-01-01 12:00:00'}, 'folder4/file4_1.txt': {'content': 'local4_1', 'date': '2014-01-01 12:00:00'}, 'folder5/file5_1.txt': {'content': 'local5_1', 'date': '2014-01-01 12:00:00'}, 'folder6/file6_1.txt': {'content': 'local6_1', 'date': '2014-01-01 12:00:00'}, 'folder7/file7_1.txt': {'content': 'local7_1', 'date': '2014-01-01 12:00:00'}, } self.assert_test_folder_equal(get_test_folder("local"), expect_local) self.assert_test_folder_equal(get_test_folder("remote"), expect_local)
def test_resolve_remote(self): opts = {"resolve": "remote", "verbose": self.verbose} stats = self.do_run_suite(BiDirSynchronizer, opts) # self._dump_de_facto_results(stats) # We resolve all conflicts by using the remote version. self.assertEqual(stats["files_written"], 12) self.assertEqual(stats["download_files_written"], 9) self.assertEqual(stats["upload_files_written"], 3) self.assertEqual(stats["files_deleted"], 3) self.assertEqual(stats["dirs_deleted"], 4) self.assertEqual(stats["conflict_files"], 7) expect_local = { "file1.txt": { "content": "local1", "date": "2014-01-01 12:00:00" }, "file2.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00" }, "file4.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00" }, "file6.txt": { "content": "remote 13:00:05", "date": "2014-01-01 13:00:05" }, "file7.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00" }, "file8.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00" }, "folder1/file1_1.txt": { "content": "local1_1", "date": "2014-01-01 12:00:00", }, "folder2/file2_1.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00", }, "folder5/file5_1.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00", }, "new_file1.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00" }, "new_file2.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00" }, "new_file3.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00" }, "new_file4.txt": { "content": "remote 13:00 with other content", "date": "2014-01-01 13:00:00", }, "new_file5.txt": { "content": "remote 13:00:05", "date": "2014-01-01 13:00:05", }, "new_file6.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00" }, } self.assert_test_folder_equal(get_test_folder("local"), expect_local) self.assert_test_folder_equal(get_test_folder("remote"), expect_local)
def test_default(self): opts = { "verbose": self.verbose } # default options, i.e. 'skip' conflicts # Default options: expect 4 unresolved conflicts stats = self.do_run_suite(UploadSynchronizer, opts) self._dump_de_facto_results(stats) # We expect 7 conflicts, and leave them unresolved (i.e. skip them all) self.assertEqual(stats["files_written"], 3) self.assertEqual(stats["download_files_written"], 0) self.assertEqual(stats["upload_files_written"], 3) self.assertEqual(stats["files_deleted"], 0) self.assertEqual(stats["dirs_deleted"], 0) self.assertEqual(stats["conflict_files"], 7) self.assertEqual(stats["conflict_files_skipped"], 7) # We expect that local remains unmodified self.assert_test_folder_equal(get_test_folder("local"), _SyncTestBase.local_fixture_modified) expect_remote = { "file1.txt": { "content": "local1", "date": "2014-01-01 12:00:00" }, "file2.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00" }, "file3.txt": { "content": "local3", "date": "2014-01-01 12:00:00" }, "file4.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00" }, "file6.txt": { "content": "remote 13:00:05", "date": "2014-01-01 13:00:05" }, "file7.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00" }, "file8.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00" }, "folder1/file1_1.txt": { "content": "local1_1", "date": "2014-01-01 12:00:00", }, "folder2/file2_1.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00", }, "folder3/file3_1.txt": { "content": "local3_1", "date": "2014-01-01 12:00:00", }, "folder4/file4_1.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00", }, "folder5/file5_1.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00", }, "new_file1.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00" }, "new_file2.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00" }, "new_file3.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00" }, "new_file4.txt": { "content": "remote 13:00 with other content", "date": "2014-01-01 13:00:00", }, "new_file5.txt": { "content": "remote 13:00:05", "date": "2014-01-01 13:00:05", }, "new_file6.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00" }, } self.assert_test_folder_equal(get_test_folder("remote"), expect_remote)
def test_delete(self): opts = {"verbose": self.verbose, "resolve": "skip", "delete": True} stats = self.do_run_suite(UploadSynchronizer, opts) self._dump_de_facto_results(stats) # We expect 7 conflicts, and leave them unresolved (i.e. skip them all) self.assertEqual(stats["files_written"], 3) self.assertEqual(stats["download_files_written"], 0) self.assertEqual(stats["upload_files_written"], 3) self.assertEqual(stats["files_deleted"], 2) self.assertEqual(stats["dirs_deleted"], 2) self.assertEqual(stats["conflict_files"], 7) self.assertEqual(stats["conflict_files_skipped"], 7) self.assert_test_folder_equal(get_test_folder("local"), _SyncTestBase.local_fixture_modified) # We expect that remote only contains files that match '*1.txt' expect_remote = { "file1.txt": { "content": "local1", "date": "2014-01-01 12:00:00" }, "file2.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00" }, "file4.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00" }, "file6.txt": { "content": "remote 13:00:05", "date": "2014-01-01 13:00:05" }, "file7.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00" }, "file8.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00" }, "folder1/file1_1.txt": { "content": "local1_1", "date": "2014-01-01 12:00:00", }, "folder2/file2_1.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00", }, "folder5/file5_1.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00", }, "new_file1.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00" }, "new_file3.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00" }, "new_file4.txt": { "content": "remote 13:00 with other content", "date": "2014-01-01 13:00:00", }, "new_file5.txt": { "content": "remote 13:00:05", "date": "2014-01-01 13:00:05", }, "new_file6.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00" }, } self.assert_test_folder_equal(get_test_folder("remote"), expect_remote)
def test_default(self): opts = {"verbose": self.verbose} # default options, i.e. 'skip' conflicts # Default options: expect 4 unresolved conflicts stats = self.do_run_suite(BiDirSynchronizer, opts) # self._dump_de_facto_results(stats) # We expect 7 conflicts, and leave them unresolved (i.e. skip them all) self.assertEqual(stats["files_written"], 6) self.assertEqual(stats["download_files_written"], 3) self.assertEqual(stats["upload_files_written"], 3) self.assertEqual(stats["files_deleted"], 2) self.assertEqual(stats["dirs_deleted"], 4) self.assertEqual(stats["conflict_files"], 7) expect_local = { "file1.txt": {"content": "local1", "date": "2014-01-01 12:00:00"}, "file2.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "file4.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "file6.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "file7.txt": {"content": "local 13:00:05", "date": "2014-01-01 13:00:05"}, "file9.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "folder1/file1_1.txt": { "content": "local1_1", "date": "2014-01-01 12:00:00", }, "folder2/file2_1.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00", }, "folder5/file5_1.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00", }, "new_file1.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file2.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "new_file3.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file4.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file5.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file6.txt": { "content": "local 13:00:05", "date": "2014-01-01 13:00:05", }, } expect_remote = { "file1.txt": {"content": "local1", "date": "2014-01-01 12:00:00"}, "file2.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "file4.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "file6.txt": {"content": "remote 13:00:05", "date": "2014-01-01 13:00:05"}, "file7.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "file8.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "folder1/file1_1.txt": { "content": "local1_1", "date": "2014-01-01 12:00:00", }, "folder2/file2_1.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00", }, "folder5/file5_1.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00", }, "new_file1.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file2.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "new_file3.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file4.txt": { "content": "remote 13:00 with other content", "date": "2014-01-01 13:00:00", }, "new_file5.txt": { "content": "remote 13:00:05", "date": "2014-01-01 13:00:05", }, "new_file6.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, } self.assert_test_folder_equal(get_test_folder("local"), expect_local) self.assert_test_folder_equal(get_test_folder("remote"), expect_remote)
def test_no_metadata(self): """Synchronize with absent .pyftpsync-meta.json.""" # Reset setUp fixture and re-create without using a synchronizer self._prepare_synced_fixture_without_meta() opts = {"verbose": self.verbose} self.do_run_suite(BiDirSynchronizer, opts) # self._dump_de_facto_results(stats) # NOTE: # Since we don't have meta data, the synchronizer treats missing files on # either side as 'new'. # Also modifications on both sides are not recognized as conflict. Instead the # newer file wins. (Only exception is new_file4.txt` which has identical time # but different size) # => So we basically get a union of both targets. # self.assertEqual(stats["files_written"], 18) # self.assertEqual(stats["download_files_written"], 9) # self.assertEqual(stats["upload_files_written"], 9) # self.assertEqual(stats["files_deleted"], 0) # self.assertEqual(stats["dirs_deleted"], 0) # self.assertEqual(stats["conflict_files"], 1) expect_local = { "file1.txt": {"content": "local1", "date": "2014-01-01 12:00:00"}, "file2.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "file3.txt": {"content": "local3", "date": "2014-01-01 12:00:00"}, "file4.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "file5.txt": {"content": "local5", "date": "2014-01-01 12:00:00"}, "file6.txt": {"content": "remote 13:00:05", "date": "2014-01-01 13:00:05"}, "file7.txt": {"content": "local 13:00:05", "date": "2014-01-01 13:00:05"}, "file8.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "file9.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "folder1/file1_1.txt": { "content": "local1_1", "date": "2014-01-01 12:00:00", }, "folder2/file2_1.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00", }, "folder3/file3_1.txt": { "content": "local3_1", "date": "2014-01-01 12:00:00", }, "folder4/file4_1.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00", }, "folder5/file5_1.txt": { "content": "remote 13:00", "date": "2014-01-01 13:00:00", }, "folder6/file6_1.txt": { "content": "local6_1", "date": "2014-01-01 12:00:00", }, "folder7/file7_1.txt": { "content": "local 13:00", "date": "2014-01-01 13:00:00", }, "new_file1.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file2.txt": {"content": "remote 13:00", "date": "2014-01-01 13:00:00"}, "new_file3.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file4.txt": {"content": "local 13:00", "date": "2014-01-01 13:00:00"}, "new_file5.txt": { "content": "remote 13:00:05", "date": "2014-01-01 13:00:05", }, "new_file6.txt": { "content": "local 13:00:05", "date": "2014-01-01 13:00:05", }, } expect_remote = expect_local.copy() expect_remote.update( { "new_file4.txt": { "content": "remote 13:00 with other content", "date": "2014-01-01 13:00:00", } } ) self.assert_test_folder_equal(get_test_folder("local"), expect_local) self.assert_test_folder_equal(get_test_folder("remote"), expect_remote)