From e352c5abd69a71fc62efef435994a024ba326770 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Fri, 30 Jun 2017 23:55:58 +0300 Subject: [PATCH] Added tests for XZ multi-unarchive. --- SWCompression.xcodeproj/project.pbxproj | 8 ++ Tests/Test Files/XZ/test_multi.xz | 3 + Tests/Test Files/XZ/test_multi_pad.xz | 3 + Tests/XzTests.swift | 135 ++++++++++++++++++++++++ 4 files changed, 149 insertions(+) create mode 100644 Tests/Test Files/XZ/test_multi.xz create mode 100644 Tests/Test Files/XZ/test_multi_pad.xz diff --git a/SWCompression.xcodeproj/project.pbxproj b/SWCompression.xcodeproj/project.pbxproj index ec869655..7c405c31 100644 --- a/SWCompression.xcodeproj/project.pbxproj +++ b/SWCompression.xcodeproj/project.pbxproj @@ -9,6 +9,8 @@ /* Begin PBXBuildFile section */ 061FCE2D1DBCC6A30052F7BE /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 061FCE2C1DBCC6A30052F7BE /* Constants.swift */; }; 0621E5181F0451C200C0003F /* test_multi.gz in Resources */ = {isa = PBXBuildFile; fileRef = 0621E5171F0451C200C0003F /* test_multi.gz */; }; + 063336B71F06F0B6009EC0A3 /* test_multi_pad.xz in Resources */ = {isa = PBXBuildFile; fileRef = 063336B51F06F0B6009EC0A3 /* test_multi_pad.xz */; }; + 063336B81F06F0B6009EC0A3 /* test_multi.xz in Resources */ = {isa = PBXBuildFile; fileRef = 063336B61F06F0B6009EC0A3 /* test_multi.xz */; }; 063DF10A1DE1F07800F38082 /* DataWithPointer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063DF1051DE1F07800F38082 /* DataWithPointer.swift */; }; 063DF10B1DE1F07800F38082 /* DataWithPointer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063DF1051DE1F07800F38082 /* DataWithPointer.swift */; }; 063DF10C1DE1F07800F38082 /* DataWithPointer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 063DF1051DE1F07800F38082 /* DataWithPointer.swift */; }; @@ -162,6 +164,8 @@ 061FCE251DBCC4BE0052F7BE /* Deflate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Deflate.swift; sourceTree = ""; }; 061FCE2C1DBCC6A30052F7BE /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; 0621E5171F0451C200C0003F /* test_multi.gz */ = {isa = PBXFileReference; lastKnownFileType = archive.gzip; path = test_multi.gz; sourceTree = ""; }; + 063336B51F06F0B6009EC0A3 /* test_multi_pad.xz */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_multi_pad.xz; sourceTree = ""; }; + 063336B61F06F0B6009EC0A3 /* test_multi.xz */ = {isa = PBXFileReference; lastKnownFileType = file; path = test_multi.xz; sourceTree = ""; }; 063364E21DC52979007E313F /* GzipArchive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GzipArchive.swift; sourceTree = ""; }; 063DF1051DE1F07800F38082 /* DataWithPointer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DataWithPointer.swift; path = Sources/DataWithPointer.swift; sourceTree = SOURCE_ROOT; }; 063DF1061DE1F07800F38082 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = Sources/Extensions.swift; sourceTree = SOURCE_ROOT; }; @@ -476,6 +480,8 @@ 06D07AA21EB64EE800BC8C65 /* XZ */ = { isa = PBXGroup; children = ( + 063336B51F06F0B6009EC0A3 /* test_multi_pad.xz */, + 063336B61F06F0B6009EC0A3 /* test_multi.xz */, 06D07AA31EB64EE800BC8C65 /* test1.xz */, 06D07AA41EB64EE800BC8C65 /* test2.xz */, 06D07AA51EB64EE800BC8C65 /* test3.xz */, @@ -726,6 +732,7 @@ 06D07AB31EB64EE800BC8C65 /* test8.xz in Resources */, 069DCEA11EB64D0300ADC374 /* test6.answer in Resources */, 06D07AAF1EB64EE800BC8C65 /* test4.xz in Resources */, + 063336B81F06F0B6009EC0A3 /* test_multi.xz in Resources */, 06D07AAC1EB64EE800BC8C65 /* test1.xz in Resources */, 06BD0D231E3D0C630054AA5C /* SWCompressionSourceCode.zip in Resources */, 06D07AB11EB64EE800BC8C65 /* test6.xz in Resources */, @@ -738,6 +745,7 @@ 06D07AB21EB64EE800BC8C65 /* test7.xz in Resources */, 069DCEA31EB64D0300ADC374 /* test8.answer in Resources */, 06D07A9F1EB64E7A00BC8C65 /* test7.bz2 in Resources */, + 063336B71F06F0B6009EC0A3 /* test_multi_pad.xz in Resources */, 06991C711E05A9F70030FF07 /* test10.lzma in Resources */, 069DCEA01EB64D0300ADC374 /* test5.answer in Resources */, 069DCE8A1EB64B1500ADC374 /* test2.gz in Resources */, diff --git a/Tests/Test Files/XZ/test_multi.xz b/Tests/Test Files/XZ/test_multi.xz new file mode 100644 index 00000000..c98fd11a --- /dev/null +++ b/Tests/Test Files/XZ/test_multi.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51ee35d4d70fecaa0267c3c171849e2cf30f6d96f708e46295bbd0ca72a9f3ce +size 4276 diff --git a/Tests/Test Files/XZ/test_multi_pad.xz b/Tests/Test Files/XZ/test_multi_pad.xz new file mode 100644 index 00000000..257d8512 --- /dev/null +++ b/Tests/Test Files/XZ/test_multi_pad.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3e52e286d7e453c2c4dfcf912864c44b00c3ffcb4aab6b544bf712212c09aaf +size 4292 diff --git a/Tests/XzTests.swift b/Tests/XzTests.swift index 530b8a39..94e147e9 100644 --- a/Tests/XzTests.swift +++ b/Tests/XzTests.swift @@ -85,4 +85,139 @@ class XZTests: XCTestCase { func testXz9() { self.perform(test: "test9") } + + func testMultiUnarchive() { + // Doesn't contain any padding. + guard let testURL = Constants.url(forTest: "test_multi", withType: XZTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { + XCTFail("Unable to load test archive.") + return + } + + guard let members = try? XZArchive.multiUnarchive(archive: testData) else { + XCTFail("Unable to unarchive.") + return + } + + XCTAssertEqual(members.count, 4) + + for i in 1...4 { + guard let answerURL = Constants.url(forAnswer: "test\(i)") else { + XCTFail("Unable to get answer's URL.") + return + } + + guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { + XCTFail("Unable to load answer.") + return + } + + XCTAssertEqual(members[i - 1], answerData) + } + } + + func testMultiUnarchiveWithPadding() { + // After first stream - no padding. + // After second - 4 bytes of padding. + // Third - 8 bytes. + // At the end - 4 bytes. + + guard let testURL = Constants.url(forTest: "test_multi_pad", withType: XZTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { + XCTFail("Unable to load test archive.") + return + } + + guard let members = try? XZArchive.multiUnarchive(archive: testData) else { + XCTFail("Unable to unarchive.") + return + } + + XCTAssertEqual(members.count, 4) + + for i in 1...4 { + guard let answerURL = Constants.url(forAnswer: "test\(i)") else { + XCTFail("Unable to get answer's URL.") + return + } + + guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { + XCTFail("Unable to load answer.") + return + } + + XCTAssertEqual(members[i - 1], answerData) + } + } + + func testMultiUnarchiveRedundant1() { + guard let testURL = Constants.url(forTest: "test4", withType: XZTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { + XCTFail("Unable to load test archive.") + return + } + + guard let members = try? XZArchive.multiUnarchive(archive: testData) else { + XCTFail("Unable to unarchive.") + return + } + + XCTAssertEqual(members.count, 1) + + guard let answerURL = Constants.url(forAnswer: "test4") else { + XCTFail("Unable to get answer's URL.") + return + } + + guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { + XCTFail("Unable to load answer.") + return + } + + XCTAssertEqual(members[0], answerData) + } + + func testMultiUnarchiveRedundant2() { + guard let testURL = Constants.url(forTest: "test1", withType: XZTests.testType) else { + XCTFail("Unable to get test's URL.") + return + } + + guard let testData = try? Data(contentsOf: testURL, options: .mappedIfSafe) else { + XCTFail("Unable to load test archive.") + return + } + + guard let members = try? XZArchive.multiUnarchive(archive: testData) else { + XCTFail("Unable to unarchive.") + return + } + + XCTAssertEqual(members.count, 1) + + guard let answerURL = Constants.url(forAnswer: "test1") else { + XCTFail("Unable to get answer's URL.") + return + } + + guard let answerData = try? Data(contentsOf: answerURL, options: .mappedIfSafe) else { + XCTFail("Unable to load answer.") + return + } + + XCTAssertEqual(members[0], answerData) + } + }