Emcee
102 строки · 3.3 Кб
1import Foundation
2import FileLock
3import XCTest
4
5final class FileLockTests: XCTestCase {
6let tmp = NSTemporaryDirectory() as NSString
7lazy var uniqueTempFile = tmp.appendingPathComponent(ProcessInfo.processInfo.globallyUniqueString + ".lock")
8
9func test__lock_unlock() throws {
10let fileLock = try FileLock(lockFilePath: uniqueTempFile)
11
12XCTAssertNoThrow(try fileLock.lock())
13XCTAssertNoThrow(try fileLock.unlock())
14}
15
16func test__paired_lock_and_unlock() throws {
17let fileLock = try FileLock(lockFilePath: uniqueTempFile)
18
19XCTAssertNoThrow(try fileLock.lock())
20XCTAssertNoThrow(try fileLock.unlock())
21
22XCTAssertNoThrow(try fileLock.lock())
23XCTAssertNoThrow(try fileLock.unlock())
24}
25
26func test__recursive_lock() throws {
27let fileLock = try FileLock(lockFilePath: uniqueTempFile)
28
29XCTAssertNoThrow(try fileLock.lock())
30XCTAssertNoThrow(try fileLock.lock())
31
32XCTAssertTrue(fileLock.isLocked)
33XCTAssertNoThrow(try fileLock.unlock())
34XCTAssertTrue(fileLock.isLocked)
35XCTAssertNoThrow(try fileLock.unlock())
36XCTAssertFalse(fileLock.isLocked)
37}
38
39func test__lock_on_same_file_from_different_locks() throws {
40let fileLock = try FileLock(lockFilePath: uniqueTempFile)
41let otherSameFileLock = try FileLock(lockFilePath: uniqueTempFile)
42
43XCTAssertNoThrow(try fileLock.lock())
44XCTAssertFalse(otherSameFileLock.tryToLock())
45XCTAssertNoThrow(try fileLock.unlock())
46
47XCTAssertTrue(otherSameFileLock.tryToLock())
48XCTAssertNoThrow(try otherSameFileLock.unlock())
49}
50
51func test__try_lock() throws {
52let fileLock = try FileLock(lockFilePath: uniqueTempFile)
53
54XCTAssertTrue(fileLock.tryToLock())
55XCTAssertTrue(fileLock.isLocked)
56XCTAssertNoThrow(try fileLock.unlock())
57}
58
59func test__unbalanced_calls() throws {
60let fileLock = try FileLock(lockFilePath: uniqueTempFile)
61
62XCTAssertThrowsError(try fileLock.unlock())
63}
64
65func test__unexisting_path_throws() throws {
66XCTAssertThrowsError(
67try FileLock(lockFilePath: tmp.appendingPathComponent("\(UUID().uuidString)/\(ProcessInfo.processInfo.globallyUniqueString)"))
68)
69}
70
71func test__while_locked() throws {
72let fileLock = try FileLock(lockFilePath: uniqueTempFile)
73
74try fileLock.whileLocked {
75XCTAssertTrue(fileLock.isLocked)
76}
77
78XCTAssertFalse(fileLock.isLocked)
79}
80
81func test__while_locked_throws___on_unbalanced_unlock() throws {
82let fileLock = try FileLock(lockFilePath: uniqueTempFile)
83
84XCTAssertThrowsError(
85try fileLock.whileLocked {
86XCTAssertNoThrow(try fileLock.unlock())
87}
88)
89}
90
91func test__while_locked_correctly_unlocks___when_closure_throws_error() throws {
92let fileLock = try FileLock(lockFilePath: uniqueTempFile)
93
94XCTAssertThrowsError(
95try fileLock.whileLocked {
96throw CocoaError.error(CocoaError.Code.fileReadCorruptFile, userInfo: nil, url: nil)
97}
98)
99
100XCTAssertFalse(fileLock.isLocked)
101}
102}
103
104