|  |  |  | #import "TestUtil.h" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | NSObject* churnLock(void) { | 
					
						
							|  |  |  |     static NSObject* shared = nil; | 
					
						
							|  |  |  |     if (shared == nil) { | 
					
						
							|  |  |  |         shared = [NSObject new]; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return shared; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | bool _testChurnHelper(int (^condition)(), NSTimeInterval delay) { | 
					
						
							|  |  |  |     NSTimeInterval t = [TimeUtil time] + delay; | 
					
						
							|  |  |  |     while ([TimeUtil time] < t) { | 
					
						
							|  |  |  |         @synchronized(churnLock()) { | 
					
						
							|  |  |  |             if (condition()) return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         [NSRunLoop.currentRunLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     @synchronized(churnLock()) { | 
					
						
							|  |  |  |         return condition(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | NSData* increasingData(NSUInteger n) { | 
					
						
							|  |  |  |     return increasingDataFrom(0, n); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | NSData* increasingDataFrom(NSUInteger offset, NSUInteger n) { | 
					
						
							|  |  |  |     uint8_t v[n]; | 
					
						
							|  |  |  |     for (NSUInteger i = 0; i < n; i++) | 
					
						
							|  |  |  |         v[i] = (uint8_t)((i+offset) & 0xFF); | 
					
						
							|  |  |  |     return [NSData dataWithBytes:v length:n]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | NSData* sineWave(double frequency, double sampleRate, NSUInteger sampleCount) { | 
					
						
							|  |  |  |     double tau = 6.283; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     int16_t samples[sampleCount]; | 
					
						
							|  |  |  |     for (NSUInteger i = 0; i < sampleCount; i++) { | 
					
						
							|  |  |  |         samples[i] = (int16_t)(sin(frequency/sampleRate*i*tau)*(1<<15)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     return [NSData dataWithBytes:samples length:sizeof(samples)]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | NSData* generatePseudoRandomData(NSUInteger length) { | 
					
						
							|  |  |  |     NSMutableData* r = [NSMutableData dataWithLength:length]; | 
					
						
							|  |  |  |     for (int i = 0; i < 16; i++) { | 
					
						
							|  |  |  |         ((uint8_t*)[r mutableBytes])[i] = (uint8_t)arc4random_uniform(256); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return r; | 
					
						
							|  |  |  | } |