RACTargetQueueSchedulerSpec.m 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. //
  2. // RACTargetQueueSchedulerSpec.m
  3. // ReactiveCocoa
  4. //
  5. // Created by Josh Abernathy on 6/7/13.
  6. // Copyright (c) 2013 GitHub, Inc. All rights reserved.
  7. //
  8. #import <Quick/Quick.h>
  9. #import <Nimble/Nimble.h>
  10. #import "RACTargetQueueScheduler.h"
  11. #import <libkern/OSAtomic.h>
  12. QuickSpecBegin(RACTargetQueueSchedulerSpec)
  13. qck_it(@"should have a valid current scheduler", ^{
  14. dispatch_queue_t queue = dispatch_queue_create("test-queue", DISPATCH_QUEUE_SERIAL);
  15. RACScheduler *scheduler = [[RACTargetQueueScheduler alloc] initWithName:@"test-scheduler" targetQueue:queue];
  16. __block RACScheduler *currentScheduler;
  17. [scheduler schedule:^{
  18. currentScheduler = RACScheduler.currentScheduler;
  19. }];
  20. expect(currentScheduler).toEventually(equal(scheduler));
  21. });
  22. qck_it(@"should schedule blocks FIFO even when given a concurrent queue", ^{
  23. dispatch_queue_t queue = dispatch_queue_create("test-queue", DISPATCH_QUEUE_CONCURRENT);
  24. RACScheduler *scheduler = [[RACTargetQueueScheduler alloc] initWithName:@"test-scheduler" targetQueue:queue];
  25. __block volatile int32_t startedCount = 0;
  26. __block volatile uint32_t waitInFirst = 1;
  27. [scheduler schedule:^{
  28. OSAtomicIncrement32Barrier(&startedCount);
  29. while (waitInFirst == 1) ;
  30. }];
  31. [scheduler schedule:^{
  32. OSAtomicIncrement32Barrier(&startedCount);
  33. }];
  34. expect(@(startedCount)).toEventually(equal(@1));
  35. OSAtomicAnd32Barrier(0, &waitInFirst);
  36. expect(@(startedCount)).toEventually(equal(@2));
  37. });
  38. QuickSpecEnd