184 lines
7.0 KiB
Swift
184 lines
7.0 KiB
Swift
|
//
|
||
|
// PermissionsTests.swift
|
||
|
// UnzipKitTests
|
||
|
//
|
||
|
// Created by Dov Frankel on 6/24/19.
|
||
|
// Copyright © 2019 Abbey Code. All rights reserved.
|
||
|
//
|
||
|
|
||
|
import XCTest
|
||
|
|
||
|
class PermissionsTests: UZKArchiveTestCase {
|
||
|
|
||
|
#if os(OSX)
|
||
|
func testReadFileInfo() {
|
||
|
let permissionLevelsToTest: [Int16] = [
|
||
|
0o777,
|
||
|
0o707,
|
||
|
0o770,
|
||
|
0o477,
|
||
|
0o666,
|
||
|
0o606,
|
||
|
0o660,
|
||
|
0o466,
|
||
|
]
|
||
|
|
||
|
let fileURLs: [URL] = permissionLevelsToTest.map {
|
||
|
let textFile = self.emptyTextFile(ofLength: 20)!
|
||
|
try! FileManager.default.setAttributes([.posixPermissions: $0],
|
||
|
ofItemAtPath: textFile.path)
|
||
|
return textFile
|
||
|
}
|
||
|
|
||
|
let archiveURL = self.archive(withFiles: fileURLs)!
|
||
|
let archive = try! UZKArchive(url: archiveURL)
|
||
|
|
||
|
let fileInfo = try! archive.listFileInfo()
|
||
|
|
||
|
let expectedPermissions = zip(
|
||
|
fileURLs.map { $0.lastPathComponent },
|
||
|
permissionLevelsToTest
|
||
|
)
|
||
|
.reduce(into: [String:Int16]()) { result, pair in
|
||
|
result[pair.0] = pair.1
|
||
|
}
|
||
|
let actualPermissions = fileInfo.reduce([String: Int16]()) {
|
||
|
var resultDict = $0
|
||
|
resultDict[$1.filename] = $1.posixPermissions
|
||
|
return resultDict
|
||
|
}
|
||
|
|
||
|
XCTAssertEqual(actualPermissions, expectedPermissions)
|
||
|
}
|
||
|
|
||
|
func testExtraction() {
|
||
|
let permissionLevelsToTest: [Int16] = [
|
||
|
0o777,
|
||
|
0o707,
|
||
|
0o770,
|
||
|
0o477,
|
||
|
0o666,
|
||
|
0o606,
|
||
|
0o660,
|
||
|
0o466,
|
||
|
]
|
||
|
|
||
|
let fileURLs: [URL] = permissionLevelsToTest.map {
|
||
|
let textFile = self.emptyTextFile(ofLength: 20)!
|
||
|
try! FileManager.default.setAttributes([.posixPermissions: $0],
|
||
|
ofItemAtPath: textFile.path)
|
||
|
return textFile
|
||
|
}
|
||
|
|
||
|
let archiveURL = self.archive(withFiles: fileURLs)!
|
||
|
let archive = try! UZKArchive(url: archiveURL)
|
||
|
|
||
|
let extractDirectory = self.randomDirectory(withPrefix: "PermissionsTest")!
|
||
|
let extractURL = self.tempDirectory.appendingPathComponent(extractDirectory)
|
||
|
|
||
|
try! archive.extractFiles(to: extractURL.path, overwrite: false)
|
||
|
NSLog("Extracted to \(extractURL.path)")
|
||
|
|
||
|
let expectedPermissions = zip(
|
||
|
fileURLs.map { extractURL.appendingPathComponent($0.lastPathComponent).path },
|
||
|
permissionLevelsToTest
|
||
|
)
|
||
|
|
||
|
for (path, expectedPermissionLevel) in expectedPermissions {
|
||
|
let actualPermissions = try! FileManager.default.attributesOfItem(atPath: path)[.posixPermissions] as! NSNumber
|
||
|
XCTAssertEqual(actualPermissions.int16Value, expectedPermissionLevel, "Permissions mismatch for \(path)")
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
func testWriteData_Default() {
|
||
|
let testArchiveURL = tempDirectory.appendingPathComponent("PermissionsTestWriteData.zip")
|
||
|
let testFilename = nonZipTestFilePaths.first as! String
|
||
|
let testFileURL = testFileURLs[testFilename] as! URL
|
||
|
let testFileData = try! Data(contentsOf: testFileURL)
|
||
|
|
||
|
let writeArchive = try! UZKArchive(url: testArchiveURL)
|
||
|
|
||
|
try! writeArchive.write(testFileData, filePath: testFilename)
|
||
|
|
||
|
let readArchive = try! UZKArchive(url: testArchiveURL)
|
||
|
let fileList = try! readArchive.listFileInfo()
|
||
|
|
||
|
let writtenFileInfo = fileList.first { $0.filename == testFilename }
|
||
|
let actualPermissions = writtenFileInfo!.posixPermissions
|
||
|
|
||
|
XCTAssertEqual(actualPermissions, 0o644)
|
||
|
}
|
||
|
|
||
|
func testWriteData_NonDefault() {
|
||
|
let testArchiveURL = tempDirectory.appendingPathComponent("PermissionsTestWriteData.zip")
|
||
|
let testFilename = nonZipTestFilePaths.first as! String
|
||
|
let testFileURL = testFileURLs[testFilename] as! URL
|
||
|
let testFileData = try! Data(contentsOf: testFileURL)
|
||
|
|
||
|
let writeArchive = try! UZKArchive(url: testArchiveURL)
|
||
|
|
||
|
let expectedPermissions: Int16 = 0o742
|
||
|
|
||
|
try! writeArchive.write(testFileData, filePath: testFilename, fileDate: nil, posixPermissions: expectedPermissions,
|
||
|
compressionMethod: .default, password: nil, overwrite: true)
|
||
|
|
||
|
let readArchive = try! UZKArchive(url: testArchiveURL)
|
||
|
let fileList = try! readArchive.listFileInfo()
|
||
|
|
||
|
let writtenFileInfo = fileList.first { $0.filename == testFilename }
|
||
|
let actualPermissions = writtenFileInfo!.posixPermissions
|
||
|
|
||
|
XCTAssertEqual(actualPermissions, expectedPermissions)
|
||
|
}
|
||
|
|
||
|
func testWriteIntoBuffer_Default() {
|
||
|
let testArchiveURL = tempDirectory.appendingPathComponent("PermissionsTestWriteBufferedData.zip")
|
||
|
let testFilename = nonZipTestFilePaths.first as! String
|
||
|
let testFileURL = testFileURLs[testFilename] as! URL
|
||
|
let testFileData = try! Data(contentsOf: testFileURL)
|
||
|
|
||
|
let writeArchive = try! UZKArchive(url: testArchiveURL)
|
||
|
try! writeArchive.write(intoBuffer: testFilename) { (writeDataHandler, error) in
|
||
|
testFileData.withUnsafeBytes({ buffer in
|
||
|
writeDataHandler(buffer, UInt32(testFileData.count))
|
||
|
})
|
||
|
}
|
||
|
|
||
|
let readArchive = try! UZKArchive(url: testArchiveURL)
|
||
|
let fileList = try! readArchive.listFileInfo()
|
||
|
|
||
|
let writtenFileInfo = fileList.first { $0.filename == testFilename }
|
||
|
let actualPermissions = writtenFileInfo!.posixPermissions
|
||
|
|
||
|
XCTAssertEqual(actualPermissions, 0o644)
|
||
|
}
|
||
|
|
||
|
func testWriteIntoBuffer_NonDefault() {
|
||
|
let testArchiveURL = tempDirectory.appendingPathComponent("PermissionsTestWriteBufferedData_CustomPermissions.zip")
|
||
|
let testFilename = nonZipTestFilePaths.first as! String
|
||
|
let testFileURL = testFileURLs[testFilename] as! URL
|
||
|
let testFileData = try! Data(contentsOf: testFileURL)
|
||
|
|
||
|
let expectedPermissions: Int16 = 0o764
|
||
|
|
||
|
let writeArchive = try! UZKArchive(url: testArchiveURL)
|
||
|
try! writeArchive.write(intoBuffer: testFilename, fileDate: nil, posixPermissions: expectedPermissions,
|
||
|
compressionMethod: .default, overwrite: false, crc: 0, password: nil)
|
||
|
{ (writeDataHandler, error) in
|
||
|
testFileData.withUnsafeBytes({ buffer in
|
||
|
writeDataHandler(buffer, UInt32(testFileData.count))
|
||
|
})
|
||
|
}
|
||
|
|
||
|
let readArchive = try! UZKArchive(url: testArchiveURL)
|
||
|
let fileList = try! readArchive.listFileInfo()
|
||
|
|
||
|
let writtenFileInfo = fileList.first { $0.filename == testFilename }
|
||
|
let actualPermissions = writtenFileInfo!.posixPermissions
|
||
|
|
||
|
XCTAssertEqual(actualPermissions, expectedPermissions)
|
||
|
}
|
||
|
|
||
|
}
|