def test_get_absolute_path(self): root = fsobjects.File("root", "root", fsobjects.DIRECTORY) self.assertEqual(root.get_absolute_path(), "root") folder1 = fsobjects.File("Folder1", "Folder1", fsobjects.DIRECTORY) folder1.parent = root self.assertEqual(folder1.get_absolute_path(), "root/Folder1") folder2 = fsobjects.File("Folder2", "Folder2", fsobjects.DIRECTORY) folder2.parent = folder1 self.assertEqual(folder2.get_absolute_path(), "root/Folder1/Folder2")
def test_cd_fail_not_a_directory(self): d = fsobjects.File("DIR", "", fsobjects.DIRECTORY) d1 = fsobjects.File("DIR1", "", fsobjects.DIRECTORY) d.content = [d1] names = ["File1.txt", "File2.txt", "File3.txt"] d1.content = list(generate_files_from_names(names)) db = dirbrowser.DirectoryBrowser(root=d) with self.assertRaises(dirbrowser.DirectoryBrowserError): db.change_directory("DIR1/File1.txt")
def test_cd(self): d = fsobjects.File("DIR", "", fsobjects.DIRECTORY) d1 = fsobjects.File("DIR1", "", fsobjects.DIRECTORY) d.content = [d1] names = ["File1.txt", "File2.txt", "File3.txt"] d1.content = list(generate_files_from_names(names)) db = dirbrowser.DirectoryBrowser(root=d) db.change_directory("DIR1") self.assertEqual(db.current, d1)
def test_attr_str_part(self): file = fsobjects.File("file", "file", fsobjects.READ_ONLY | fsobjects.HIDDEN | fsobjects.ARCHIVE) self.assertEqual("read_only, hidden, archive", file.get_attributes_str())
def parse_file_info(entry_parser, long_file_name_buffer=""): attributes = entry_parser.parse_int_unsigned(11, 1) is_directory = bool(attributes & fsobjects.DIRECTORY) name_part = entry_parser.parse_string(0, 8, "cp866", "strict").strip() extension_part = entry_parser.parse_string(8, 3, "cp866", "strict").strip() short_name = name_part + ( ('.' + extension_part) if not is_directory else "") debug("\tshort_name: " + short_name) creation_datetime = parse_creation_datetime(entry_parser) try: last_access_date = entry_parser.parse_date(18) except ValueError: last_access_date = None try: last_modification_datetime = entry_parser.parse_time_date(22) except ValueError: last_modification_datetime = None file_size_bytes = entry_parser.parse_int_unsigned(0 + 28, 4) return fsobjects.File(short_name, long_file_name_buffer, attributes, creation_datetime, last_access_date, last_modification_datetime, file_size_bytes)
def test_get_dir_content_names(self): names = ["File1.txt", "File2.txt", "File3.txt"] d = fsobjects.File("DIR", "", fsobjects.DIRECTORY) d.content = list(generate_files_from_names(names)) self.assertEqual(list(dirbrowser._get_dir_content_names(d)), names)
def get_root_directory(self): if self.log_clusters_usage or self.log_clusters_usage_adv: for cluster in self._get_cluster_chain( self.root_catalog_first_cluster): self.used_clusters[cluster] = True root = fsobjects.File("", "", fsobjects.DIRECTORY, None, None, None, 0, self.root_catalog_first_cluster) root.content = self._parse_dir_files( self.get_data_from_cluster_chain(self.root_catalog_first_cluster), root) return root
def test_attr_str_full(self): file = fsobjects.File("file", "file", fsobjects.READ_ONLY | fsobjects.HIDDEN | fsobjects.SYSTEM | fsobjects.VOLUME_ID | fsobjects.DIRECTORY | fsobjects.ARCHIVE) self.assertEqual("read_only, hidden, system, " "volume_id, directory, archive" , file.get_attributes_str())
def write_to_image(self, external_path, internal_path, directory=None) -> fsobjects.File: """ Writes file to image, returns File """ path = pathlib.Path(external_path) if not path.exists(): raise FileNotFoundError(str(path) + " not found.") if directory is None: directory = find_directory(self.get_root_directory(), internal_path) name = ("/" + str(path.absolute()).replace("\\", "/")).split("/")[-1] short_name = fsobjects.get_short_name(name, directory=directory) attributes = fsobjects.DIRECTORY if path.is_dir() else 0 creation_datetime, last_access_date, modification_datetime = \ get_time_stamps(external_path) file = fsobjects.File( long_name=name, short_name=short_name, create_datetime=creation_datetime, change_datetime=modification_datetime, last_open_date=last_access_date, attributes=attributes) file.parent = directory first_cluster, size_bytes = self._write_external_file_content(path, file) file._start_cluster = first_cluster file._size_bytes = size_bytes self._append_content_to_dir(directory, file.to_directory_entries()) if DEBUG_MODE: print(BytesParser(self.get_data_from_cluster_chain( directory._start_cluster)).hex_readable(0, BYTES_PER_DIR_ENTRY)) return file
def test_file_parse(self): file_expected = fsobjects.File('SHORT.TXT', '', fsobjects.ARCHIVE, datetime.datetime(day=29, month=7, year=2017, hour=14, minute=53, second=16, microsecond=76000), datetime.date(day=29, month=7, year=2017), datetime.datetime(day=14, month=7, year=2017, hour=20, minute=24, second=10), 1699) parser = BytesParser( b'\x53\x48\x4F\x52\x54\x20\x20\x20\x54\x58\x54\x20\x18\x4C\xA8\x76' b'\xFD\x4A\xFD\x4A\x00\x00\x05\xA3\xEE\x4A\x55\x00\xA3\x06\x00\x00' ) file_actual = fateditor.parse_file_info(parser) self.assertEqual(file_actual, file_expected)
def test_attr_str_empty(self): file = fsobjects.File("file", "file") self.assertEqual("no attributes", file.get_attributes_str())
def test_size_format_gibibytes(self): file = fsobjects.File("file", "file", size_bytes=281382002220) self.assertEqual("262.06 GiB (281382002220 bytes)", file.get_size_str())
def test_size_format_mebibytes(self): file = fsobjects.File("file", "file", size_bytes=6389353) self.assertEqual("6.09 MiB (6389353 bytes)", file.get_size_str())
def test_size_format_kibibytes(self): file = fsobjects.File("file", "file", size_bytes=855310) self.assertEqual("835.26 KiB (855310 bytes)", file.get_size_str())
def test_size_format_bytes(self): file = fsobjects.File("file", "file", size_bytes=5) self.assertEqual("5 bytes", file.get_size_str())
def generate_files_from_names(names): for name in names: yield fsobjects.File("", name)
def test_get_dir_content_names_not_a_dir(self): file = fsobjects.File("", "File.txt") with self.assertRaises(NotADirectoryError): list(dirbrowser._get_dir_content_names(file))
def test_get_dir_content_names_empty_dir(self): d = fsobjects.File("DIR", "", fsobjects.DIRECTORY) d.content = [] self.assertEqual(list(dirbrowser._get_dir_content_names(d)), [])