def test_unused_path(self): """ Test the get_unused_path helper """ test_folder = os.path.join(self.tank_temp, "unused_tests") # Basic test with a simple name path = os.path.join(test_folder, "foo") self.assertEqual(fs.get_unused_path(path), path) # Create the target path and check it is detected fs.ensure_folder_exists(path) self.assertEqual(fs.get_unused_path(path), "%s_1" % path) # Test we insert the number in the right place if we have some "." in the # base path. path = os.path.join(test_folder, "foo.0020.exr") self.assertEqual(fs.get_unused_path(path), path) fs.touch_file(path) self.assertEqual(fs.get_unused_path(path), os.path.join(test_folder, "foo_1.0020.exr")) # Test multiple iterations fs.touch_file(os.path.join(test_folder, "foo_1.0020.exr")) fs.touch_file(os.path.join(test_folder, "foo_2.0020.exr")) fs.touch_file(os.path.join(test_folder, "foo_3.0020.exr")) fs.touch_file(os.path.join(test_folder, "foo_4.0020.exr")) self.assertEqual(fs.get_unused_path(path), os.path.join(test_folder, "foo_5.0020.exr")) # Clean up fs.safe_delete_folder(test_folder)
def test_13_cleanup_path_cache(self): """ Cleans up the path cache and filesystem locations so we don't get data from previous test runs. """ # Delete all filesystem location from previous test runs to not confuse # path cache related tests. self.local_storage["path"] for fsl in self.sg.find("FilesystemLocation", [["project", "is", self.project]]): self.sg.delete(fsl["type"], fsl["id"]) # Remove any files from disk to not confuse the path cache related tests. if os.path.exists(self.local_storage["path"]): filesystem.safe_delete_folder(self.local_storage["path"]) os.makedirs(self.local_storage["path"]) output = self.run_tank_cmd( self.pipeline_location, "synchronize_folders", extra_cmd_line_arguments=["--full"], ) self.assertRegex(output, r"Doing a full sync.") self.assertRegex(output, r"Local folder information has been synchronized.")
def test_unused_path(self): """ Test the get_unused_path helper """ test_folder = os.path.join(self.tank_temp, "unused_tests") # Basic test with a simple name path = os.path.join(test_folder, "foo") self.assertEqual(fs.get_unused_path(path), path) # Create the target path and check it is detected fs.ensure_folder_exists(path) self.assertEqual(fs.get_unused_path(path), "%s_1" % path) # Test we insert the number in the right place if we have some "." in the # base path. path = os.path.join(test_folder, "foo.0020.exr") self.assertEqual(fs.get_unused_path(path), path) fs.touch_file(path) self.assertEqual(fs.get_unused_path(path), os.path.join(test_folder, "foo_1.0020.exr")) # Test multiple iterations fs.touch_file(os.path.join(test_folder, "foo_1.0020.exr")) fs.touch_file(os.path.join(test_folder, "foo_2.0020.exr")) fs.touch_file(os.path.join(test_folder, "foo_3.0020.exr")) fs.touch_file(os.path.join(test_folder, "foo_4.0020.exr")) self.assertEqual(fs.get_unused_path(path), os.path.join(test_folder, "foo_5.0020.exr")) # Clean up fs.safe_delete_folder(test_folder)
def test_safe_delete_folder_with_file_in_use(self): """ Check that delete folder will delete as much as it can, even when it encounters errors like failures to delete some of the items in the folder """ src_folder = os.path.join( self.util_filesystem_test_folder_location, "delete_folder" ) dst_folder = os.path.join(self.tank_temp, "folder_in_use") shutil.copytree(src_folder, dst_folder) self.assertTrue(os.path.exists(dst_folder)) # open a file in the directory to remove ... with open(os.path.join(dst_folder, "ReadWrite.txt")) as f: # ... and check that a failure occurs fs.safe_delete_folder(dst_folder) if is_windows(): # A failure occurred, folder should still be there self.assertTrue( os.path.exists(dst_folder) ) # on Windows removal of in-use files behaves differently than... else: self.assertFalse( os.path.exists(dst_folder) ) # ... on Unix, see comments for https://docs.python.org/2/library/os.html#os.remove
def test_safe_delete_non_existing_folder(self): """ Check that a non-existing folder deletion fails """ dst_folder = os.path.join(self.tank_temp, "non_existing_folder") self.assertFalse(os.path.exists(dst_folder)) fs.safe_delete_folder(dst_folder) self.assertFalse(os.path.exists(dst_folder))
def test_safe_delete_non_existing_folder(self): """ Check that a non-existing folder deletion fails """ dst_folder = os.path.join(self.tank_temp, "non_existing_folder") self.assertFalse(os.path.exists(dst_folder)) fs.safe_delete_folder(dst_folder) self.assertFalse(os.path.exists(dst_folder))
def test_safe_delete_folder(self): """ Check that the test folder and all its contents are deleted recursively """ src_folder = os.path.join(self.util_filesystem_test_folder_location, "delete_folder") dst_folder = os.path.join(self.tank_temp, "folder") shutil.copytree(src_folder, dst_folder) self.assertTrue(os.path.exists(dst_folder)) fs.safe_delete_folder(dst_folder) self.assertFalse(os.path.exists(dst_folder))
def test_safe_delete_folder(self): """ Check that the test folder and all its contents are deleted recursively """ src_folder = os.path.join(self.util_filesystem_test_folder_location, "delete_folder") dst_folder = os.path.join(self.tank_temp, "folder") shutil.copytree(src_folder, dst_folder) self.assertTrue(os.path.exists(dst_folder)) fs.safe_delete_folder(dst_folder) self.assertFalse(os.path.exists(dst_folder))
def test_safe_delete_folder_with_file_in_use(self): """ Check that delete folder will delete as much as it can, even when it encounters errors like failures to delete some of the items in the folder """ src_folder = os.path.join(self.util_filesystem_test_folder_location, "delete_folder") dst_folder = os.path.join(self.tank_temp, "folder_in_use") shutil.copytree(src_folder, dst_folder) self.assertTrue(os.path.exists(dst_folder)) # open a file in the directory to remove ... with open(os.path.join(dst_folder, "ReadWrite.txt")) as f: # ... and check that a failure occurs fs.safe_delete_folder(dst_folder) if sys.platform == "win32": # A failure occurred, folder should still be there self.assertTrue(os.path.exists(dst_folder)) # on Windows removal of in-use files behaves differently than... else: self.assertFalse(os.path.exists(dst_folder)) # ... on Unix, see comments for https://docs.python.org/2/library/os.html#os.remove
def test_safe_delete_folder_with_read_only_items(self): """ Check that safe_delete_folder will delete all items in the folder, even read only ones """ src_folder = os.path.join(self.util_filesystem_test_folder_location, "delete_folder") dst_folder = os.path.join(self.tank_temp, "folder_with_read_only_items") shutil.copytree(src_folder, dst_folder) self.assertTrue(os.path.exists(dst_folder)) # make folder items read-only read_only_filename = os.path.join(dst_folder, "ReadOnly.txt") file_permissions = os.stat(read_only_filename)[stat.ST_MODE] os.chmod(read_only_filename, file_permissions & ~stat.S_IWRITE) if sys.platform == "win32": folder_permissions = os.stat(dst_folder)[stat.ST_MODE] os.chmod(dst_folder, folder_permissions & ~stat.S_IWRITE) fs.safe_delete_folder(dst_folder) # check that the folder is deleted successfully self.assertFalse(os.path.exists(dst_folder))
def test_safe_delete_folder_with_read_only_items(self): """ Check that safe_delete_folder will delete all items in the folder, even read only ones """ src_folder = os.path.join(self.util_filesystem_test_folder_location, "delete_folder") dst_folder = os.path.join(self.tank_temp, "folder_with_read_only_items") shutil.copytree(src_folder, dst_folder) self.assertTrue(os.path.exists(dst_folder)) # make folder items read-only read_only_filename = os.path.join(dst_folder, "ReadOnly.txt") file_permissions = os.stat(read_only_filename)[stat.ST_MODE] os.chmod(read_only_filename, file_permissions & ~stat.S_IWRITE) if is_windows(): folder_permissions = os.stat(dst_folder)[stat.ST_MODE] os.chmod(dst_folder, folder_permissions & ~stat.S_IWRITE) fs.safe_delete_folder(dst_folder) # check that the folder is deleted successfully self.assertFalse(os.path.exists(dst_folder))
def test_copy_file_and_folder(self): """ Test the copy_file helper """ # A root folder copy_test_root_folder = os.path.join(self.tank_temp, "copy_tests") fs.ensure_folder_exists(copy_test_root_folder, permissions=0o777) # Copy src file copy_test_basename = "copy_file.txt" copy_test_file = os.path.join(copy_test_root_folder, copy_test_basename) fs.touch_file(copy_test_file, permissions=0o777) # Copy dst folder copy_test_dst_folder = os.path.join( copy_test_root_folder, "copy_test_dst_folder" ) fs.ensure_folder_exists(copy_test_dst_folder, permissions=0o777) # Copy dst file copy_test_dst_file = os.path.join(copy_test_dst_folder, "copied_file.txt") # Tests # Test folder name dst argument fs.copy_file( os.path.join(copy_test_root_folder, copy_test_basename), copy_test_dst_folder, permissions=0o777, ) self.assertTrue( os.path.exists(os.path.join(copy_test_dst_folder, copy_test_basename)) ) # Test file name dst argument fs.copy_file( os.path.join(copy_test_root_folder, copy_test_basename), copy_test_dst_file ) self.assertTrue(os.path.exists(copy_test_dst_file)) # Clean up fs.safe_delete_folder(copy_test_root_folder)
# to set it up themselves. if options.test_root: python_test_root = os.path.join(options.test_root, "python") if os.path.exists(python_test_root): sys.path.insert(0, python_test_root) ret_val = _run_tests(options.test_root, test_names) if options.coverage: _finalize_coverage(cov) # Exit value determined by failures and errors if ret_val.errors or ret_val.failures: exit_val = 1 except Exception as e: print("Unexpected exception: %s" % e) # signal failure exit_val = 1 finally: from tank.util.filesystem import safe_delete_folder # Note: Relying on own value rather than tempfile.tempdir # being global it MIGHT be changed by anyone test if new_base_tempdir and os.path.isdir(new_base_tempdir): print("\nCleaning up '%s'" % (new_base_tempdir)) safe_delete_folder(new_base_tempdir) sys.exit(exit_val)
# to set it up themselves. if options.test_root: python_test_root = os.path.join(options.test_root, "python") if os.path.exists(python_test_root): sys.path.insert(0, python_test_root) ret_val = _run_tests(options.test_root, test_names) if options.coverage: _finalize_coverage(cov) # Exit value determined by failures and errors if ret_val.errors or ret_val.failures: exit_val = 1 except Exception as e: print("Unexpected exception: %s" % e) # signal failure exit_val = 1 finally: from tank.util.filesystem import safe_delete_folder # Note: Relying on own value rather than tempfile.tempdir # being global it MIGHT be changed by anyone test if new_base_tempdir and os.path.isdir(new_base_tempdir): print("\nCleaning up '%s'" % (new_base_tempdir)) safe_delete_folder(new_base_tempdir) sys.exit(exit_val)