Сценарий модульного тестирования 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 из них.

Есть идеи, ребята?

0 ответов

Другие вопросы по тегам