blob: b19384443edbdf4f67431a73f3dfd6f970008b7e [file] [log] [blame] [edit]
//
// RACTargetQueueSchedulerSpec.m
// ReactiveCocoa
//
// Created by Josh Abernathy on 6/7/13.
// Copyright (c) 2013 GitHub, Inc. All rights reserved.
//
#import "RACTargetQueueScheduler.h"
#import <libkern/OSAtomic.h>
SpecBegin(RACTargetQueueScheduler)
it(@"should have a valid current scheduler", ^{
dispatch_queue_t queue = dispatch_queue_create("test-queue", DISPATCH_QUEUE_SERIAL);
RACScheduler *scheduler = [[RACTargetQueueScheduler alloc] initWithName:@"test-scheduler" targetQueue:queue];
__block RACScheduler *currentScheduler;
[scheduler schedule:^{
currentScheduler = RACScheduler.currentScheduler;
}];
expect(currentScheduler).will.equal(scheduler);
dispatch_release(queue);
});
it(@"should schedule blocks FIFO even when given a concurrent queue", ^{
dispatch_queue_t queue = dispatch_queue_create("test-queue", DISPATCH_QUEUE_CONCURRENT);
RACScheduler *scheduler = [[RACTargetQueueScheduler alloc] initWithName:@"test-scheduler" targetQueue:queue];
__block volatile int32_t startedCount = 0;
__block volatile uint32_t waitInFirst = 1;
[scheduler schedule:^{
OSAtomicIncrement32Barrier(&startedCount);
while (waitInFirst == 1) ;
}];
[scheduler schedule:^{
OSAtomicIncrement32Barrier(&startedCount);
}];
expect(startedCount).will.equal(1);
OSAtomicAnd32Barrier(0, &waitInFirst);
expect(startedCount).will.equal(2);
dispatch_release(queue);
});
SpecEnd