CommandLineToolkit
80 строк · 2.5 Кб
1import Foundation
2import JSONStream
3import XCTest
4
5class BlockingArrayBasedJSONStreamTests: XCTestCase {
6func testReadBlocksUntilNewDataComes() {
7let readQueue = OperationQueue()
8let writeQeuue = OperationQueue()
9let stream = BlockingArrayBasedJSONStream()
10stream.append(string: "1")
11
12var byte: UInt8?
13readQueue.addOperation {
14byte = stream.read()
15// next call will block until writeQueue updates the stream with new data
16byte = stream.read()
17}
18
19writeQeuue.addOperation {
20Thread.sleep(forTimeInterval: 0.3)
21stream.append(string: "2")
22}
23
24readQueue.waitUntilAllOperationsAreFinished()
25writeQeuue.waitUntilAllOperationsAreFinished()
26
27XCTAssertEqual(byte, 0x32)
28}
29
30func testReadBlocksUntilFlagFlips() {
31let readQueue = OperationQueue()
32let writeQeuue = OperationQueue()
33let stream = BlockingArrayBasedJSONStream()
34stream.append(string: "1")
35
36var byte: UInt8?
37readQueue.addOperation {
38byte = stream.read() // == 1
39// next call will block until writeQueue flips the flag that data is over
40byte = stream.read()
41}
42
43writeQeuue.addOperation {
44Thread.sleep(forTimeInterval: 0.3)
45stream.close()
46}
47
48readQueue.waitUntilAllOperationsAreFinished()
49writeQeuue.waitUntilAllOperationsAreFinished()
50
51XCTAssertNil(byte)
52}
53
54func testReadBlocksMultipleThreadsUntilNewDataComes() {
55let readQueue1 = OperationQueue()
56let readQueue2 = OperationQueue()
57let writeQeuue = OperationQueue()
58let stream = BlockingArrayBasedJSONStream()
59
60var byte1: UInt8?
61var byte2: UInt8?
62
63readQueue1.addOperation { byte1 = stream.read() }
64readQueue2.addOperation { byte2 = stream.read() }
65
66writeQeuue.addOperation {
67Thread.sleep(forTimeInterval: 0.3)
68stream.append(string: "12")
69}
70
71readQueue1.waitUntilAllOperationsAreFinished()
72readQueue2.waitUntilAllOperationsAreFinished()
73writeQeuue.waitUntilAllOperationsAreFinished()
74
75// both byte1 and byte2 might have "1" or "2" values depending on the order of execution of the operations
76XCTAssertNotNil(byte1)
77XCTAssertNotNil(byte2)
78XCTAssertNotEqual(byte1, byte2)
79}
80}
81