|
|
@ -26,28 +26,42 @@ from tests.testhelper import * |
|
|
|
|
|
|
|
|
|
|
|
class TestPar2Parsing: |
|
|
|
def test_parse_par2_file(self): |
|
|
|
# These files are all <16k so the MD5 of the whole file is the same as the 16k one |
|
|
|
assert {"random.bin": b"\xbf\xe0\xe4\x10\xa2#\xf5\xbeN\x7f2\xe5\x9e\xdd\t\x03"} == parse_par2_file( |
|
|
|
os.path.join(SAB_DATA_DIR, "deobfuscate_filenames", "rename.par2"), {} |
|
|
|
) |
|
|
|
assert {"frènch_german_demö.rar": b"C\t\x1d\xbd\xdf\x8c\xb5w \xcco\xbf~L)\xc2"} == parse_par2_file( |
|
|
|
os.path.join(SAB_DATA_DIR, "test_win_unicode", "frènch_german_demö.rar.vol0+1.par2"), {} |
|
|
|
) |
|
|
|
assert { |
|
|
|
"我喜欢编程.part5.rar": b"\x19\xe7\xb7\xb3\xbc\x17\xc4\xefo\x96*+x\x0c]M", |
|
|
|
"我喜欢编程.part6.rar": b"M\x8c.{\xae\x15\xb7\xa1\x8c\xc7\x1f\x8a\xb3^`\xd9", |
|
|
|
"我喜欢编程.part4.rar": b"\xb8D:r\xd8\x04\x98\xb3\xc2\x89\xed\xc1\x90\xe445", |
|
|
|
"我喜欢编程.part2.rar": b"aN#\x04*\x86\xd96|PoDV\xa6S\xa8", |
|
|
|
"我喜欢编程.part3.rar": b"\xc5\x1ep\xeb\x94\xa7\x12\xa1e\x8c\xc5\xda\xda\xae1 ", |
|
|
|
"我喜欢编程.part1.rar": b'_tJ\x15\x1a3;1\xaao\xa9n\n"\xa5p', |
|
|
|
"我喜欢编程.part7.rar": b"M\x1c\x14\x9b\xacY\x81\x8d\x82 VV\x81&\x8eH", |
|
|
|
} == parse_par2_file(os.path.join(SAB_DATA_DIR, "unicode_rar", "我喜欢编程.par2"), {}) |
|
|
|
|
|
|
|
def test_parse_par2_file_16k(self): |
|
|
|
# This file is 18k, so it's md5 of the first 16k is actually different |
|
|
|
md5of16k = {} |
|
|
|
assert {"rss_feed_test.xml": b"\xf8\x8f\x88\x91\xae{\x03\xc8\xad\xcb\xb4Y\xa0+\x06\xf6"} == parse_par2_file( |
|
|
|
os.path.join(SAB_DATA_DIR, "par2file", "basic_16k.par2"), md5of16k |
|
|
|
) |
|
|
|
assert md5of16k == {b"'ky\xd7\xd1\xd3wF\xed\x9c\xf7\x9b\x90\x93\x106": "rss_feed_test.xml"} |
|
|
|
def test_parse_par2_file(self, caplog): |
|
|
|
# To capture the par2-creator, we need to capture the logging |
|
|
|
with caplog.at_level(logging.DEBUG): |
|
|
|
# These files are all <16k so the MD5 of the whole file is the same as the 16k one |
|
|
|
assert {"random.bin": b"\xbf\xe0\xe4\x10\xa2#\xf5\xbeN\x7f2\xe5\x9e\xdd\t\x03"} == parse_par2_file( |
|
|
|
os.path.join(SAB_DATA_DIR, "deobfuscate_filenames", "rename.par2"), {} |
|
|
|
) |
|
|
|
assert "Par2-creator of rename.par2 is: QuickPar 0.9" in caplog.text |
|
|
|
caplog.clear() |
|
|
|
|
|
|
|
assert {"frènch_german_demö.rar": b"C\t\x1d\xbd\xdf\x8c\xb5w \xcco\xbf~L)\xc2"} == parse_par2_file( |
|
|
|
os.path.join(SAB_DATA_DIR, "test_win_unicode", "frènch_german_demö.rar.vol0+1.par2"), {} |
|
|
|
) |
|
|
|
assert "Par2-creator of frènch_german_demö.rar.vol0+1.par2 is: QuickPar 0.9" in caplog.text |
|
|
|
caplog.clear() |
|
|
|
|
|
|
|
assert { |
|
|
|
"我喜欢编程.part5.rar": b"\x19\xe7\xb7\xb3\xbc\x17\xc4\xefo\x96*+x\x0c]M", |
|
|
|
"我喜欢编程.part6.rar": b"M\x8c.{\xae\x15\xb7\xa1\x8c\xc7\x1f\x8a\xb3^`\xd9", |
|
|
|
"我喜欢编程.part4.rar": b"\xb8D:r\xd8\x04\x98\xb3\xc2\x89\xed\xc1\x90\xe445", |
|
|
|
"我喜欢编程.part2.rar": b"aN#\x04*\x86\xd96|PoDV\xa6S\xa8", |
|
|
|
"我喜欢编程.part3.rar": b"\xc5\x1ep\xeb\x94\xa7\x12\xa1e\x8c\xc5\xda\xda\xae1 ", |
|
|
|
"我喜欢编程.part1.rar": b'_tJ\x15\x1a3;1\xaao\xa9n\n"\xa5p', |
|
|
|
"我喜欢编程.part7.rar": b"M\x1c\x14\x9b\xacY\x81\x8d\x82 VV\x81&\x8eH", |
|
|
|
} == parse_par2_file(os.path.join(SAB_DATA_DIR, "unicode_rar", "我喜欢编程.par2"), {}) |
|
|
|
assert "Par2-creator of 我喜欢编程.par2 is: ParPar v0.3.2" in caplog.text |
|
|
|
caplog.clear() |
|
|
|
|
|
|
|
def test_parse_par2_file_16k(self, caplog): |
|
|
|
# Capture logging of the par2-creator |
|
|
|
with caplog.at_level(logging.DEBUG): |
|
|
|
# This file is 18k, so it's md5 of the first 16k is actually different |
|
|
|
md5of16k = {} |
|
|
|
assert {"rss_feed_test.xml": b"\xf8\x8f\x88\x91\xae{\x03\xc8\xad\xcb\xb4Y\xa0+\x06\xf6"} == parse_par2_file( |
|
|
|
os.path.join(SAB_DATA_DIR, "par2file", "basic_16k.par2"), md5of16k |
|
|
|
) |
|
|
|
assert md5of16k == {b"'ky\xd7\xd1\xd3wF\xed\x9c\xf7\x9b\x90\x93\x106": "rss_feed_test.xml"} |
|
|
|
assert "Par2-creator of basic_16k.par2 is: QuickPar 0.9" in caplog.text |
|
|
|
caplog.clear() |
|
|
|