mirror of
https://github.com/Virtual-World-RE/NeoGF.git
synced 2024-11-15 08:45:33 +01:00
Update afstest.py
empty blocks tests
This commit is contained in:
parent
cd81ee3853
commit
a322ed9d54
37
afstest.py
37
afstest.py
|
@ -8,7 +8,8 @@ import shutil
|
||||||
from time import time
|
from time import time
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
__version__ = "0.0.6"
|
|
||||||
|
__version__ = "0.0.7"
|
||||||
__author__ = "rigodron, algoflash, GGLinnk"
|
__author__ = "rigodron, algoflash, GGLinnk"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__status__ = "developpement"
|
__status__ = "developpement"
|
||||||
|
@ -44,7 +45,7 @@ class AfsTest(afstool.Afs):
|
||||||
resolver = afstool.FilenameResolver(sys_path)
|
resolver = afstool.FilenameResolver(sys_path)
|
||||||
|
|
||||||
offsets_names_map = [(0, "SYS TOC")]
|
offsets_names_map = [(0, "SYS TOC")]
|
||||||
for i in range(0, self._Afs__file_count):
|
for i in range(self._Afs__file_count):
|
||||||
filename = resolver.resolve_from_index(i, self._Afs__get_file_name(i)) if self._Afs__filenamedirectory else f"{i:08}"
|
filename = resolver.resolve_from_index(i, self._Afs__get_file_name(i)) if self._Afs__filenamedirectory else f"{i:08}"
|
||||||
offsets_names_map.append( (self._Afs__get_file_offset(i), filename) )
|
offsets_names_map.append( (self._Afs__get_file_offset(i), filename) )
|
||||||
if self._Afs__filenamedirectory:
|
if self._Afs__filenamedirectory:
|
||||||
|
@ -128,7 +129,7 @@ def patch_all_bytes(file_path:Path, max_len:int = None):
|
||||||
max_len = len(file_data)
|
max_len = len(file_data)
|
||||||
elif max_len < len(file_data):
|
elif max_len < len(file_data):
|
||||||
file_data = file_data[:max_len]
|
file_data = file_data[:max_len]
|
||||||
for i in range(0, len(file_data)):
|
for i in range(len(file_data)):
|
||||||
file_data[i] = (file_data[i] + 1) % 255
|
file_data[i] = (file_data[i] + 1) % 255
|
||||||
if max_len > len(file_data):
|
if max_len > len(file_data):
|
||||||
file_data.extend(b"\x01"*(max_len - len(file_data)))
|
file_data.extend(b"\x01"*(max_len - len(file_data)))
|
||||||
|
@ -146,7 +147,7 @@ def patch_unpackedfiles_in_folder(folder_path:Path, bool_len:bool = False):
|
||||||
for file_path in afsfolder_path.glob("root/*"):
|
for file_path in afsfolder_path.glob("root/*"):
|
||||||
max_len = None
|
max_len = None
|
||||||
# Search by resolved name and get begin offset of next file / SYS File
|
# Search by resolved name and get begin offset of next file / SYS File
|
||||||
for i in range(0, len(offsets_names_map)):
|
for i in range(len(offsets_names_map)):
|
||||||
if offsets_names_map[i][1] == file_path.name:
|
if offsets_names_map[i][1] == file_path.name:
|
||||||
if i+1 < len(offsets_names_map):
|
if i+1 < len(offsets_names_map):
|
||||||
max_len = offsets_names_map[i+1][0] - offsets_names_map[i][0]
|
max_len = offsets_names_map[i+1][0] - offsets_names_map[i][0]
|
||||||
|
@ -213,7 +214,7 @@ def mk_rebuild_filesys(unpacked_path:Path, files:list, afs_rebuild_conf:dict, af
|
||||||
def test_except(afs_rebuild_conf:dict, exception, rebuild_csv_data=""):
|
def test_except(afs_rebuild_conf:dict, exception, rebuild_csv_data=""):
|
||||||
global i
|
global i
|
||||||
i += 1
|
i += 1
|
||||||
rebuild_path = unpack_path / f"rebuild_{i:02}"
|
rebuild_path = unpack_path / f"rebuild_{i:03}"
|
||||||
mk_rebuild_filesys(rebuild_path, [("a.bin", 0x500),("b.bin", 0x600),("c.bin", 0x700)], afs_rebuild_conf, rebuild_csv_data)
|
mk_rebuild_filesys(rebuild_path, [("a.bin", 0x500),("b.bin", 0x600),("c.bin", 0x700)], afs_rebuild_conf, rebuild_csv_data)
|
||||||
a = afstool.Afs()
|
a = afstool.Afs()
|
||||||
try:
|
try:
|
||||||
|
@ -226,7 +227,7 @@ def test_except(afs_rebuild_conf:dict, exception, rebuild_csv_data=""):
|
||||||
def test_rebuild_repack(afs_rebuild_conf:dict, files:list, raw_data:bytes, rebuild_csv_data:str = "", raw_fd_data:bytes = None):
|
def test_rebuild_repack(afs_rebuild_conf:dict, files:list, raw_data:bytes, rebuild_csv_data:str = "", raw_fd_data:bytes = None):
|
||||||
global i
|
global i
|
||||||
i += 1
|
i += 1
|
||||||
rebuild_path = unpack_path / f"rebuild_{i:02}"
|
rebuild_path = unpack_path / f"rebuild_{i:03}"
|
||||||
mk_rebuild_filesys(rebuild_path, files, afs_rebuild_conf, rebuild_csv_data)
|
mk_rebuild_filesys(rebuild_path, files, afs_rebuild_conf, rebuild_csv_data)
|
||||||
|
|
||||||
rebuilded_repack_path = repack_path / Path(rebuild_path.stem).with_suffix(".afs")
|
rebuilded_repack_path = repack_path / Path(rebuild_path.stem).with_suffix(".afs")
|
||||||
|
@ -241,6 +242,7 @@ def test_rebuild_repack(afs_rebuild_conf:dict, files:list, raw_data:bytes, rebui
|
||||||
mtime.hour.to_bytes(2,"little")+mtime.minute.to_bytes(2,"little")+mtime.second.to_bytes(2,"little")
|
mtime.hour.to_bytes(2,"little")+mtime.minute.to_bytes(2,"little")+mtime.second.to_bytes(2,"little")
|
||||||
raw_data += raw_fd_data.ljust(0x800, b"\x00")
|
raw_data += raw_fd_data.ljust(0x800, b"\x00")
|
||||||
a.pack(rebuild_path, rebuilded_repack_path)
|
a.pack(rebuild_path, rebuilded_repack_path)
|
||||||
|
Path("tmp.afs").write_bytes(raw_data)
|
||||||
if rebuilded_repack_path.read_bytes() != raw_data:
|
if rebuilded_repack_path.read_bytes() != raw_data:
|
||||||
raise Exception(f"Error - Not the expected repack {rebuilded_repack_path}.")
|
raise Exception(f"Error - Not the expected repack {rebuilded_repack_path}.")
|
||||||
print(f"Success - {rebuild_path}.")
|
print(f"Success - {rebuild_path}.")
|
||||||
|
@ -397,7 +399,6 @@ for afs_path in afss_path.glob("*"):
|
||||||
for folder_path in unpack_path.glob("*"):
|
for folder_path in unpack_path.glob("*"):
|
||||||
afstool_rebuild(folder_path)
|
afstool_rebuild(folder_path)
|
||||||
|
|
||||||
|
|
||||||
config = ConfigParser()
|
config = ConfigParser()
|
||||||
# pack unpack_path repack_path
|
# pack unpack_path repack_path
|
||||||
for folder_path in unpack_path.glob("*"):
|
for folder_path in unpack_path.glob("*"):
|
||||||
|
@ -459,7 +460,6 @@ for afs_rebuild_conf in [afs_rebuild_conf1, afs_rebuild_conf2]:
|
||||||
test_except(afs_rebuild_conf, afstool.AfsInvalidFilesRebuildStrategy)
|
test_except(afs_rebuild_conf, afstool.AfsInvalidFilesRebuildStrategy)
|
||||||
afs_rebuild_conf["Default"]["files_rebuild_strategy"] = "auto"
|
afs_rebuild_conf["Default"]["files_rebuild_strategy"] = "auto"
|
||||||
|
|
||||||
|
|
||||||
test_except(afs_rebuild_conf, afstool.AfsInvalidFilePathError, "d.bin/0x1/0x1000/d.bin")
|
test_except(afs_rebuild_conf, afstool.AfsInvalidFilePathError, "d.bin/0x1/0x1000/d.bin")
|
||||||
test_except(afs_rebuild_conf, afstool.AfsInvalidFieldsCountError, "b.bin/0x1/0x1000/b.bin/d")
|
test_except(afs_rebuild_conf, afstool.AfsInvalidFieldsCountError, "b.bin/0x1/0x1000/b.bin/d")
|
||||||
for tmp_conf in ["index", "mixed"]:
|
for tmp_conf in ["index", "mixed"]:
|
||||||
|
@ -474,6 +474,13 @@ for afs_rebuild_conf in [afs_rebuild_conf1, afs_rebuild_conf2]:
|
||||||
test_except(afs_rebuild_conf, afstool.AfsOffsetAlignError, "b.bin/0x1/0x555/b.bin")
|
test_except(afs_rebuild_conf, afstool.AfsOffsetAlignError, "b.bin/0x1/0x555/b.bin")
|
||||||
test_except(afs_rebuild_conf, afstool.AfsOffsetCollisionError, "b.bin/0x1/0x8000/b.bin\nc.bin/0x2/0x8000/c.bin")
|
test_except(afs_rebuild_conf, afstool.AfsOffsetCollisionError, "b.bin/0x1/0x8000/b.bin\nc.bin/0x2/0x8000/c.bin")
|
||||||
|
|
||||||
|
for tmp_conf in ["auto", "index", "offset", "mixed"]:
|
||||||
|
afs_rebuild_conf["Default"]["files_rebuild_strategy"] = tmp_conf
|
||||||
|
test_except(afs_rebuild_conf, afstool.AfsEmptyBlockValueError, "123/0x800")
|
||||||
|
test_except(afs_rebuild_conf, afstool.AfsEmptyBlockValueError, "0x800/123")
|
||||||
|
test_except(afs_rebuild_conf, afstool.AfsEmptyBlockAlignError, "0x800/0x7ff")
|
||||||
|
test_except(afs_rebuild_conf, afstool.AfsEmptyBlockAlignError, "0x7ff/0x800")
|
||||||
|
|
||||||
afs_rebuild_conf1["Default"]["files_rebuild_strategy"] = "auto"
|
afs_rebuild_conf1["Default"]["files_rebuild_strategy"] = "auto"
|
||||||
afs_rebuild_conf2["Default"]["files_rebuild_strategy"] = "auto"
|
afs_rebuild_conf2["Default"]["files_rebuild_strategy"] = "auto"
|
||||||
afs_rebuild_conf = afs_rebuild_conf2
|
afs_rebuild_conf = afs_rebuild_conf2
|
||||||
|
@ -498,7 +505,7 @@ print("#########################################################################
|
||||||
print(f"# TEST 10/{TEST_COUNT}")
|
print(f"# TEST 10/{TEST_COUNT}")
|
||||||
print("# Testing rebuild - (afs_rebuild.conf & afs_rebuild.csv).")
|
print("# Testing rebuild - (afs_rebuild.conf & afs_rebuild.csv).")
|
||||||
print("###############################################################################")
|
print("###############################################################################")
|
||||||
tmp_count = 9
|
tmp_count = 10
|
||||||
raw_data = tmp_count * [None]
|
raw_data = tmp_count * [None]
|
||||||
raw_header_data = tmp_count * [None]
|
raw_header_data = tmp_count * [None]
|
||||||
raw_fd_header = tmp_count * [None]
|
raw_fd_header = tmp_count * [None]
|
||||||
|
@ -552,6 +559,11 @@ raw_header_data[8] = b"\x41\x46\x53\x00"+list_bytes([0x3, 0x1000, 0x601, 0x800,
|
||||||
raw_fd_header[8] = list_bytes([0x2000, 0x90])
|
raw_fd_header[8] = list_bytes([0x2000, 0x90])
|
||||||
raw_files_data[8] = (b"\xff"*0x702).ljust(0x800, b"\x00") + (b"\xff"*0x601).ljust(0x800, b"\x00") + (b"\xff"*0x500).ljust(0x800, b"\x00")
|
raw_files_data[8] = (b"\xff"*0x702).ljust(0x800, b"\x00") + (b"\xff"*0x601).ljust(0x800, b"\x00") + (b"\xff"*0x500).ljust(0x800, b"\x00")
|
||||||
raw_fd_data[8] = raw_fd_data[2]
|
raw_fd_data[8] = raw_fd_data[2]
|
||||||
|
# toc: abc - content: abc empty_blocks : 0x800 -> 0x2800 a 0x3000 -> 0x6000 b 0x7000 -> 0x8800 c
|
||||||
|
raw_header_data[9] = b"\x41\x46\x53\x00"+list_bytes([0x3, 0x2800, 0x601, 0x6000, 0x702, 0x8800, 0x803])
|
||||||
|
raw_fd_header[9] = list_bytes([0x9800, 0x90])
|
||||||
|
raw_files_data[9] = b"\x00"*0x2000+(b"\xff"*0x601).ljust(0x800, b"\x00") + b"\x00"*0x3000 + (b"\xff"*0x702).ljust(0x800, b"\x00") + b"\x00"*0x2000 + (b"\xff"*0x803).ljust(0x1000, b"\x00")
|
||||||
|
raw_fd_data[9] = raw_fd_data[3]
|
||||||
|
|
||||||
afs_rebuild_conf3 = copy.deepcopy(afs_rebuild_conf2)
|
afs_rebuild_conf3 = copy.deepcopy(afs_rebuild_conf2)
|
||||||
afs_rebuild_conf3["FilenameDirectory"]["toc_offset_of_fd_offset"] = "0x500"
|
afs_rebuild_conf3["FilenameDirectory"]["toc_offset_of_fd_offset"] = "0x500"
|
||||||
|
@ -559,7 +571,7 @@ afs_rebuild_conf4 = copy.deepcopy(afs_rebuild_conf2)
|
||||||
afs_rebuild_conf4["FilenameDirectory"]["toc_offset_of_fd_offset"] = "0x7f8"
|
afs_rebuild_conf4["FilenameDirectory"]["toc_offset_of_fd_offset"] = "0x7f8"
|
||||||
|
|
||||||
for afs_rebuild_conf in [afs_rebuild_conf1, afs_rebuild_conf2, afs_rebuild_conf3, afs_rebuild_conf4]:
|
for afs_rebuild_conf in [afs_rebuild_conf1, afs_rebuild_conf2, afs_rebuild_conf3, afs_rebuild_conf4]:
|
||||||
for j in range(0, len(raw_data)):
|
for j in range(len(raw_data)):
|
||||||
raw_data[j] = raw_header_data[j]
|
raw_data[j] = raw_header_data[j]
|
||||||
if afs_rebuild_conf["Default"]["filename_directory"] == "True":
|
if afs_rebuild_conf["Default"]["filename_directory"] == "True":
|
||||||
pad_len = int(afs_rebuild_conf["FilenameDirectory"]["toc_offset_of_fd_offset"][2:], 16) if afs_rebuild_conf["FilenameDirectory"]["toc_offset_of_fd_offset"] != "auto" else 0
|
pad_len = int(afs_rebuild_conf["FilenameDirectory"]["toc_offset_of_fd_offset"][2:], 16) if afs_rebuild_conf["FilenameDirectory"]["toc_offset_of_fd_offset"] != "auto" else 0
|
||||||
|
@ -571,7 +583,7 @@ for afs_rebuild_conf in [afs_rebuild_conf1, afs_rebuild_conf2, afs_rebuild_conf3
|
||||||
afs_rebuild_conf["Default"]["AFS_MAGIC"] = "0x41465300"
|
afs_rebuild_conf["Default"]["AFS_MAGIC"] = "0x41465300"
|
||||||
test_rebuild_repack(afs_rebuild_conf, [("00000000", 0x800)], raw_data[1], raw_fd_data=raw_fd_data[1])
|
test_rebuild_repack(afs_rebuild_conf, [("00000000", 0x800)], raw_data[1], raw_fd_data=raw_fd_data[1])
|
||||||
|
|
||||||
for tmp_conf in ["mixed", "index"]:
|
for tmp_conf in ["index", "mixed"]:
|
||||||
afs_rebuild_conf["Default"]["files_rebuild_strategy"] = tmp_conf
|
afs_rebuild_conf["Default"]["files_rebuild_strategy"] = tmp_conf
|
||||||
test_rebuild_repack(afs_rebuild_conf, [("a.bin", 0x500),("b.bin", 0x600),("c.bin", 0x700)], raw_data[2], "b.bin/0x0/auto/b.bin", raw_fd_data=raw_fd_data[2])
|
test_rebuild_repack(afs_rebuild_conf, [("a.bin", 0x500),("b.bin", 0x600),("c.bin", 0x700)], raw_data[2], "b.bin/0x0/auto/b.bin", raw_fd_data=raw_fd_data[2])
|
||||||
for tmp_conf in ["offset", "mixed"]:
|
for tmp_conf in ["offset", "mixed"]:
|
||||||
|
@ -585,6 +597,9 @@ for afs_rebuild_conf in [afs_rebuild_conf1, afs_rebuild_conf2, afs_rebuild_conf3
|
||||||
test_rebuild_repack(afs_rebuild_conf, [("a.bin", 0x902),("b.bin", 0x1901),("c.bin", 0x700)], raw_data[7], "c.bin/0x0/0x3800/c.bin\nb.bin/0x1/auto/b.bin\na.bin/0x2/auto/a.bin", raw_fd_data=raw_fd_data[7])
|
test_rebuild_repack(afs_rebuild_conf, [("a.bin", 0x902),("b.bin", 0x1901),("c.bin", 0x700)], raw_data[7], "c.bin/0x0/0x3800/c.bin\nb.bin/0x1/auto/b.bin\na.bin/0x2/auto/a.bin", raw_fd_data=raw_fd_data[7])
|
||||||
test_rebuild_repack(afs_rebuild_conf, [("a.bin", 0x702),("b.bin", 0x601),("c.bin", 0x500)], raw_data[8], "c.bin/auto/0x1800/c.bin\nb.bin/auto/0x1000/b.bin\na.bin/0x1/0x800/a.bin", raw_fd_data=raw_fd_data[8])
|
test_rebuild_repack(afs_rebuild_conf, [("a.bin", 0x702),("b.bin", 0x601),("c.bin", 0x500)], raw_data[8], "c.bin/auto/0x1800/c.bin\nb.bin/auto/0x1000/b.bin\na.bin/0x1/0x800/a.bin", raw_fd_data=raw_fd_data[8])
|
||||||
|
|
||||||
|
for tmp_conf in ["auto", "index", "offset", "mixed"]:
|
||||||
|
afs_rebuild_conf["Default"]["files_rebuild_strategy"] = tmp_conf
|
||||||
|
test_rebuild_repack(afs_rebuild_conf, [("a.bin", 0x601),("b.bin", 0x702),("c.bin", 0x803)], raw_data[9], "0x800/0x2000\n0x3000/0x3000\n0x7000/0x1800", raw_fd_data=raw_fd_data[9])
|
||||||
|
|
||||||
print("###############################################################################")
|
print("###############################################################################")
|
||||||
print("# Cleaning test folders.")
|
print("# Cleaning test folders.")
|
||||||
|
|
Loading…
Reference in New Issue
Block a user