Сценарий модульного тестирования XCode с функциями objc_sync_
У меня есть класс MyClass
как следующее:
public class MyClass {
private var syncObject = NSObject()
public func myMethod(timeout: NSTimeInterval) -> AnyObject? {
var obj: AnyObject? = nil
objc_sync_enter(self.elementsSyncObject)
if self.count > 0 {
//obj = ...
}
objc_sync_exit(self.elementsSyncObject)
if obj != nil {
return obj
}
let beginWaitDate = NSDate()
objc_sync_enter(self.elementsSyncObject)
if NSDate().timeIntervalSinceDate(beginWaitDate) <= timeout && self.count > 0 {
//obj = ...
}
objc_sync_exit(self.elementsSyncObject)
return obj
}
}
Цель этой функции - заблокировать объект (чтобы обеспечить безопасность потоков) и извлечь что-либо, если оно доступно. Но когда это не так, функция снимает блокировку, чтобы дать другим ожидающим потокам возможность заблокировать ее, затем пытается снова заблокировать и извлечь что-то еще, но не, если прошло слишком много времени в ожидании этой второй блокировки.
Функция работает нормально. Но я хотел бы проверить это тщательно, в XCTest.
Что мне удается сделать, это следующий тест:
func testAsync() {
let expectation = expectationWithDescription("Desc")
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
XCTAssertNotNil(myObject.myMethod(2))
expectation.fulfill()
}
myObject.myLongRunningMethod() // <-- method that is locking the same object and is measured to be running for more than 4 seconds
waitForExpectationsWithTimeout(10, handler: nil)
}
Но я не могу гарантировать, что замок от myLongRunningMethod
может произойти "между" myMethod
из них.
Есть идеи, ребята?