class FindDifferencesTestCase(TestCase): def setUp(self): self.t = DirectoryScanner() self.builder = DirectoryTreeBuilder() # construct a known directory structure, suitable for testing - it includes files, directories, ACL's, etc self.contents_path = self.builder.make_dir("AA/TextEdit.app/Contents", 0755) self.builder.make_dir("AA/TextEdit.app/Contents/Resources", 0755) self.builder.make_dir("AA/TextEdit.app/Contents/Frameworks", 0755) self.dbName = "find-diffs.sqlite" self.removeDB() # produce a single scan of the fake file-system entries self.p = PersistentScanningState(self.dbName) self.t.addPathsForScanning([self.builder.rootDir]) self.initialScan() def tearDown(self): self.p = None self.t = None self.builder = None self.removeDB() def removeDB(self): try: if os.path.exists(self.dbName): os.unlink(self.dbName) except Exception: logger.critical("all bets are off - could not delete {0}".format( self.dbName)) def initialScan(self): for value in self.p.storeFilesystemSnapshot(self.t): pass self.assertTrue(self.p.scanInfo().files_scanned > 0) self.assertEqual(0, self.p.scanInfo().files_merged) def mergeScan(self): for value in self.p.storeSecondScan(self.t): pass self.assertTrue(self.p.scanInfo().files_merged > 0) def test_parent_child_relationships_in_file_system(self): # fetch the root FileSystemSnapshot object, grab its children path = FileSystemHelper.convertedPath('%AA/TextEdit.app/Contents') root = self.p.session.query(FileSystemSnapshot).filter( FileSystemSnapshot.abs_path.like(path)).one() self.assertTrue(root is not None) children = root.children for child in children: logger.info("{0}".format(child)) def test_find_new_directory(self): self.builder.make_dir("AA/NewDirectory", 0777) self.mergeScan() ms = self.p.session.query(FileSystemMerge).filter( FileSystemMerge.abs_path.like('%NewDirectory')).one() logger.info("row, after add: {0}".format(ms.abs_path)) self.assertEqual(Qt.Checked, ms.checked) self.assertEqual(PersistentScanningState.ITEM_ADDED, ms.flags) # now find AA, it should be partial because NewDirectory is well, new, and other stuff is marked as Qt.Unchecked fs_parent = self.p.session.query(FileSystemSnapshot).get( ms.parent.abs_path) self.assertTrue(fs_parent is not None) has_parent_changed = fs_parent.path_info != ms.parent.path_info if has_parent_changed: self.assertEqual(Qt.PartiallyChecked, ms.parent.checked) self.assertEqual(PersistentScanningState.ITEM_MODIFIED, ms.parent.flags) else: self.assertEqual(PersistentScanningState.ITEM_UNCHANGED, ms.parent.flags) def test_find_deleted_directory(self): self.builder.del_dir("AA/TextEdit.app/Contents/Frameworks") self.mergeScan() ms = self.p.session.query(FileSystemMerge).filter( FileSystemMerge.abs_path.like('%Frameworks')).one() self.assertTrue( ms.abs_path.endswith( FileSystemHelper.convertedPath( "AA/TextEdit.app/Contents/Frameworks"))) self.assertEqual(PersistentScanningState.ITEM_DELETED, ms.flags) self.assertEqual(Qt.Unchecked, ms.checked) @skipIf(Platform.isWindows, "POSIX tests cannot run on Windows") def test_modified_directory_owner(self): self.builder.change_posix("AA/TextEdit.app/Contents", 0500) self.mergeScan() query = self.p.session.query("ct", "flags", "checked").from_statement( "SELECT count(*) as ct, flags, checked FROM file_system_merge WHERE abs_path LIKE '%Contents'" ).one() count = query.ct flags = query.flags checked = query.checked # even though the two folders UNDER this one are unchanged, the fact that this folder is modified takes precedence self.assertEqual(count, 1) self.assertEqual(flags, PersistentScanningState.ITEM_MODIFIED) self.assertEqual(checked, Qt.Checked) def test_root_scan_paths_are_in_persistent_document(self): paths = self.p.pathsBeingScanned() self.assertEqual(paths[0].abs_path, self.builder.rootDir) # run a merge scan to produce content in the FileSystemMerge table self.mergeScan() # and that this path is explicitly available from the FileSystemMerge model... root_path = self.p.session.query(FileSystemMerge).filter( FileSystemMerge.abs_path == self.builder.rootDir).one() self.assertTrue(root_path is not None) self.assertEqual(root_path.abs_path, self.builder.rootDir) def test_find_modified_directories_and_files(self): pass