rastrillo / native Public

Clone
git clone https://amadan.net/rastrillo/native

Plain git — no account needed to clone.

Download

Download this file

1import Foundation
2import RastrilloNative
3import RastrilloTestSupport
4import XCTest
5
6final class FaultingBlobStoreTests: XCTestCase {
7 func testACrashFreezesTheCommittedViewAndEverythingAfterFails() throws {
8 let store = FaultingBlobStore(crashAt: 2)
9 try store.write(Data("a".utf8), to: "x/1")
10 try store.write(Data("b".utf8), to: "x/2")
11 XCTAssertThrowsError(try store.write(Data("c".utf8), to: "x/3")) { XCTAssertEqual($0 as? SimulatedCrash, SimulatedCrash(operation: 2)) }
12 XCTAssertThrowsError(try store.read("x/1"), "A dead process does nothing more") { XCTAssertTrue($0 is SimulatedCrash) }
13 XCTAssertTrue(store.hasCrashed)
14 XCTAssertEqual(store.committed.contents.keys.sorted(), ["x/1", "x/2"], "The crashed write never happened")
15 XCTAssertEqual(store.operations, [.write("x/1"), .write("x/2")])
16 }
17
18 func testCrashAfterCountsFromNow() throws {
19 let store = FaultingBlobStore()
20 try store.write(Data("a".utf8), to: "x/1")
21 store.crash(after: 1)
22 try store.remove("x/1")
23 XCTAssertThrowsError(try store.list("x"))
24 XCTAssertEqual(store.committed.contents, [:])
25 }
26
27 func testUnavailableAnswersEveryOperationAndChangesNothing() throws {
28 let store = FaultingBlobStore()
29 try store.write(Data("a".utf8), to: "x/1")
30 store.unavailable = true
31 XCTAssertThrowsError(try store.read("x/1")) { XCTAssertEqual($0 as? BlobStoreError, .unavailable) }
32 XCTAssertThrowsError(try store.remove("x/1")) { XCTAssertEqual($0 as? BlobStoreError, .unavailable) }
33 XCTAssertThrowsError(try store.list("x")) { XCTAssertEqual($0 as? BlobStoreError, .unavailable) }
34 store.unavailable = false
35 XCTAssertEqual(try store.read("x/1"), Data("a".utf8))
36 }
37
38 func testMemoryStoreListsOneLevelAndRemovesDirectories() throws {
39 let store = MemoryBlobStore()
40 try store.write(Data(), to: "outbox/1.entry")
41 try store.write(Data(), to: "outbox/2.entry")
42 try store.write(Data(), to: "cache/docs/a/replica")
43 XCTAssertEqual(try store.list("outbox"), ["1.entry", "2.entry"])
44 XCTAssertEqual(try store.list("cache/docs"), [])
45 try store.remove("cache")
46 XCTAssertEqual(store.contents.keys.sorted(), ["outbox/1.entry", "outbox/2.entry"])
47 }
48}
49