def test_disconnect_modify_connect(udf_name, sd1, sd2, sd3, prefix): """Test 13: Create UDF, disconnect the SD, do stuff, and then reconnect.""" folder = yield create_udf(udf_name, sd1, prefix) folder_path = folder['path'] other_dir = os.path.join(folder_path, 'other_dir') os.mkdir(other_dir) third_dir = os.path.join(folder_path, 'third_dir') os.mkdir(third_dir) yield sd1.sdt.wait_for_nirvana(.5) debug(prefix, 'Disconnecting SD1.') yield sd1.sdt.disconnect() # disconnect SD1 debug(prefix, 'Doing stuff in the file system of SD1.') # do stuff in the file system xyz_dir = os.path.join(folder_path, 'x', 'y', 'z') os.makedirs(xyz_dir) create_file_and_add_content(os.path.join(xyz_dir, 'new.txt')) # move a file within the UDF os.rename(os.path.join(folder_path, 'a_dir', 'a_file.txt'), os.path.join(xyz_dir, 'renamed_file.txt')) # move a folder outside the UDF to the root dir os.rename(os.path.join(folder_path, 'other_dir'), os.path.join(sd1.rootdir, udf_name + 'renamed_other_dir')) # move a folder outside the UDF to the home dir renamed_third_dir = os.path.join(sd1.homedir, 'renamed_third_dir') os.rename(os.path.join(folder_path, 'third_dir'), renamed_third_dir) expected = set(walk_and_list_dir(sd1.homedir)) debug(prefix, "Expected to have", expected) debug(prefix, 'Re connecting SD1.') yield sd1.sdt.connect() # re-connect SD1 yield sd1.sdt.wait_for_nirvana(.5) debug(prefix, 'Waiting for nirvana for SD2.') yield sd2.sdt.wait_for_nirvana(.5) # wait for SD2 to get all the changes actual = set(walk_and_list_dir(sd2.homedir)) debug(prefix, "Currently found", actual) debug(prefix, 'expected sym diff actual', expected.symmetric_difference(actual)) assert expected.difference(actual) == set([u'renamed_third_dir']), \ 'SD1 home must have the same as SD2 except for renamed_third_dir.' assert actual.difference(expected) == set([]), \ 'SD2 home must have nothing extra than the SD1\'s.'
def create_udf(udf_name, sd, prefix, basedir=None): """Create an UDF on SD's home.""" if basedir is None: basedir = sd.homedir folderdir = os.path.join(basedir, udf_name) os.mkdir(folderdir) dirpath = os.path.join(folderdir, 'a_dir') os.makedirs(dirpath) filepath = os.path.join(dirpath, 'a_file.txt') create_file_and_add_content(filepath) debug(prefix, 'Attempting to create folder for path %r' % folderdir) folder = yield sd.sdt.create_folder(path=folderdir) folder, = folder debug(prefix, 'folder created with id %s' % (folder['volume_id'],)) yield sd.sdt.wait_for_nirvana(.5) defer.returnValue(folder)
def test_merge_directories_with_overlap(udf_name, sd1, sd2, sd3, prefix): """Test 5: Assert directories are correctly merge with overlapping.""" # Structure to start # # client 1: # .../a # .../a/conflict.txt (content random) # .../a/noconflict.txt (same content that 2) # .../a/bar.txt # .../b # # client 2: # .../a # .../a/conflict.txt (content random) # .../a/noconflict.txt (same content that 1) # .../a/beer.txt # .../c # # Result after UDF creation and merge: # # .../a/bar.txt and .../b are synced to client 2 # .../a/beer.txt and .../c are synced to client 1 # .../a/conflict.txt stays the same in one client, and in the other it # goes to conflict (depending on which got first to the server) # .../a/noconflict.txt stays ok in both clients # folderdir1 = os.path.join(sd1.homedir, udf_name) folderdir2 = os.path.join(sd2.homedir, udf_name) os.mkdir(folderdir1) # add folders and files to folderdir1 dirpath = os.path.join(folderdir1, 'a') os.makedirs(dirpath) filepath = os.path.join(dirpath, 'conflict.txt') create_file_and_add_content(filepath, content='content from SD1') filepath = os.path.join(dirpath, 'noconflict.txt') with open(filepath, "w") as fh: fh.write("same content") filepath = os.path.join(dirpath, 'bar.txt') create_file_and_add_content(filepath) dirpath = os.path.join(folderdir1, 'b') os.makedirs(dirpath) os.mkdir(folderdir2) # add folders and files to folderdir2 dirpath = os.path.join(folderdir2, 'a') os.makedirs(dirpath) filepath = os.path.join(dirpath, 'conflict.txt') create_file_and_add_content(filepath, content='content from SD2') filepath = os.path.join(dirpath, 'noconflict.txt') with open(filepath, "w") as fh: fh.write("same content") filepath = os.path.join(dirpath, 'beer.txt') create_file_and_add_content(filepath) dirpath = os.path.join(folderdir1, 'c') os.makedirs(dirpath) # wait for all changes to settle down yield sd2.sdt.wait_for_nirvana(.5) yield sd1.sdt.wait_for_nirvana(.5) # prepare the info to compare expected_no_conflict = ['a', 'b', 'c', os.path.join('a', 'bar.txt'), os.path.join('a', 'beer.txt'), os.path.join('a', 'noconflict.txt'), os.path.join('a', 'conflict.txt')] expected_no_conflict.sort() debug(prefix, 'expected without conflict', expected_no_conflict) expected_with_conflict = copy(expected_no_conflict) expected_with_conflict.append(os.path.join('a', 'conflict.txt.u1conflict')) expected_with_conflict.sort() debug(prefix, 'expected with conflict', expected_with_conflict) # create the UDF and wait everything to stop yield sd1.sdt.create_folder(path=folderdir1) yield sd2.sdt.wait_for_nirvana(.5) yield sd1.sdt.wait_for_nirvana(.5) actual1 = walk_and_list_dir(folderdir1) debug(prefix, 'actual content from SD1', actual1) actual2 = walk_and_list_dir(folderdir2) debug(prefix, 'actual content from SD2', actual2) # we don't know which client will enter in conflict, so we # tested both ways. if actual1 != expected_no_conflict: assert actual1 == expected_with_conflict, \ 'directory merge must be correct for SD1' assert actual2 == expected_no_conflict, \ 'directory merge must be correct for SD2' else: assert actual1 == expected_no_conflict, \ 'directory merge must be correct for SD1' assert actual2 == expected_with_conflict, \ 'directory merge must be correct for SD2'