1*cc02d7e2SAndroid Build Coastguard Worker/* 2*cc02d7e2SAndroid Build Coastguard Worker * 3*cc02d7e2SAndroid Build Coastguard Worker * Copyright 2015 gRPC authors. 4*cc02d7e2SAndroid Build Coastguard Worker * 5*cc02d7e2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 6*cc02d7e2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 7*cc02d7e2SAndroid Build Coastguard Worker * You may obtain a copy of the License at 8*cc02d7e2SAndroid Build Coastguard Worker * 9*cc02d7e2SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 10*cc02d7e2SAndroid Build Coastguard Worker * 11*cc02d7e2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 12*cc02d7e2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 13*cc02d7e2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*cc02d7e2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 15*cc02d7e2SAndroid Build Coastguard Worker * limitations under the License. 16*cc02d7e2SAndroid Build Coastguard Worker * 17*cc02d7e2SAndroid Build Coastguard Worker */ 18*cc02d7e2SAndroid Build Coastguard Worker 19*cc02d7e2SAndroid Build Coastguard Worker#import <XCTest/XCTest.h> 20*cc02d7e2SAndroid Build Coastguard Worker 21*cc02d7e2SAndroid Build Coastguard Worker#import <RxLibrary/GRXBufferedPipe.h> 22*cc02d7e2SAndroid Build Coastguard Worker#import <RxLibrary/GRXWriteable.h> 23*cc02d7e2SAndroid Build Coastguard Worker#import <RxLibrary/GRXWriter.h> 24*cc02d7e2SAndroid Build Coastguard Worker 25*cc02d7e2SAndroid Build Coastguard Worker#define TEST_TIMEOUT 1 26*cc02d7e2SAndroid Build Coastguard Worker 27*cc02d7e2SAndroid Build Coastguard Worker// A mock of a GRXSingleValueHandler block that can be queried for how many times it was called and 28*cc02d7e2SAndroid Build Coastguard Worker// what were the last values passed to it. 29*cc02d7e2SAndroid Build Coastguard Worker// 30*cc02d7e2SAndroid Build Coastguard Worker// TODO(jcanizales): Move this to a test util library, and add tests for it. 31*cc02d7e2SAndroid Build Coastguard Worker@interface CapturingSingleValueHandler : NSObject 32*cc02d7e2SAndroid Build Coastguard Worker@property(nonatomic, readonly) void (^block)(id value, NSError *errorOrNil); 33*cc02d7e2SAndroid Build Coastguard Worker@property(nonatomic, readonly) NSUInteger timesCalled; 34*cc02d7e2SAndroid Build Coastguard Worker@property(nonatomic, readonly) id value; 35*cc02d7e2SAndroid Build Coastguard Worker@property(nonatomic, readonly) NSError *errorOrNil; 36*cc02d7e2SAndroid Build Coastguard Worker+ (instancetype)handler; 37*cc02d7e2SAndroid Build Coastguard Worker@end 38*cc02d7e2SAndroid Build Coastguard Worker 39*cc02d7e2SAndroid Build Coastguard Worker@implementation CapturingSingleValueHandler 40*cc02d7e2SAndroid Build Coastguard Worker+ (instancetype)handler { 41*cc02d7e2SAndroid Build Coastguard Worker return [[self alloc] init]; 42*cc02d7e2SAndroid Build Coastguard Worker} 43*cc02d7e2SAndroid Build Coastguard Worker 44*cc02d7e2SAndroid Build Coastguard Worker- (GRXSingleHandler)block { 45*cc02d7e2SAndroid Build Coastguard Worker return ^(id value, NSError *errorOrNil) { 46*cc02d7e2SAndroid Build Coastguard Worker ++self->_timesCalled; 47*cc02d7e2SAndroid Build Coastguard Worker self->_value = value; 48*cc02d7e2SAndroid Build Coastguard Worker self->_errorOrNil = errorOrNil; 49*cc02d7e2SAndroid Build Coastguard Worker }; 50*cc02d7e2SAndroid Build Coastguard Worker} 51*cc02d7e2SAndroid Build Coastguard Worker@end 52*cc02d7e2SAndroid Build Coastguard Worker 53*cc02d7e2SAndroid Build Coastguard Worker// TODO(jcanizales): Split into one file per tested class. 54*cc02d7e2SAndroid Build Coastguard Worker 55*cc02d7e2SAndroid Build Coastguard Worker@interface RxLibraryUnitTests : XCTestCase 56*cc02d7e2SAndroid Build Coastguard Worker@end 57*cc02d7e2SAndroid Build Coastguard Worker 58*cc02d7e2SAndroid Build Coastguard Worker@implementation RxLibraryUnitTests 59*cc02d7e2SAndroid Build Coastguard Worker 60*cc02d7e2SAndroid Build Coastguard Worker+ (void)setUp { 61*cc02d7e2SAndroid Build Coastguard Worker NSLog(@"GRPCClientTests Started"); 62*cc02d7e2SAndroid Build Coastguard Worker} 63*cc02d7e2SAndroid Build Coastguard Worker 64*cc02d7e2SAndroid Build Coastguard Worker#pragma mark Writeable 65*cc02d7e2SAndroid Build Coastguard Worker 66*cc02d7e2SAndroid Build Coastguard Worker- (void)testWriteableSingleHandlerIsCalledForValue { 67*cc02d7e2SAndroid Build Coastguard Worker // Given: 68*cc02d7e2SAndroid Build Coastguard Worker CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler]; 69*cc02d7e2SAndroid Build Coastguard Worker id anyValue = @7; 70*cc02d7e2SAndroid Build Coastguard Worker 71*cc02d7e2SAndroid Build Coastguard Worker // If: 72*cc02d7e2SAndroid Build Coastguard Worker id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleHandler:handler.block]; 73*cc02d7e2SAndroid Build Coastguard Worker [writeable writeValue:anyValue]; 74*cc02d7e2SAndroid Build Coastguard Worker [writeable writesFinishedWithError:nil]; 75*cc02d7e2SAndroid Build Coastguard Worker 76*cc02d7e2SAndroid Build Coastguard Worker // Then: 77*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqual(handler.timesCalled, 1); 78*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqualObjects(handler.value, anyValue); 79*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqualObjects(handler.errorOrNil, nil); 80*cc02d7e2SAndroid Build Coastguard Worker} 81*cc02d7e2SAndroid Build Coastguard Worker 82*cc02d7e2SAndroid Build Coastguard Worker- (void)testWriteableSingleHandlerIsCalledForError { 83*cc02d7e2SAndroid Build Coastguard Worker // Given: 84*cc02d7e2SAndroid Build Coastguard Worker CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler]; 85*cc02d7e2SAndroid Build Coastguard Worker NSError *anyError = [NSError errorWithDomain:@"domain" code:7 userInfo:nil]; 86*cc02d7e2SAndroid Build Coastguard Worker 87*cc02d7e2SAndroid Build Coastguard Worker // If: 88*cc02d7e2SAndroid Build Coastguard Worker id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleHandler:handler.block]; 89*cc02d7e2SAndroid Build Coastguard Worker [writeable writesFinishedWithError:anyError]; 90*cc02d7e2SAndroid Build Coastguard Worker 91*cc02d7e2SAndroid Build Coastguard Worker // Then: 92*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqual(handler.timesCalled, 1); 93*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqualObjects(handler.value, nil); 94*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqualObjects(handler.errorOrNil, anyError); 95*cc02d7e2SAndroid Build Coastguard Worker} 96*cc02d7e2SAndroid Build Coastguard Worker 97*cc02d7e2SAndroid Build Coastguard Worker- (void)testWriteableSingleHandlerIsCalledOnlyOnce_ValueThenError { 98*cc02d7e2SAndroid Build Coastguard Worker // Given: 99*cc02d7e2SAndroid Build Coastguard Worker CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler]; 100*cc02d7e2SAndroid Build Coastguard Worker id anyValue = @7; 101*cc02d7e2SAndroid Build Coastguard Worker NSError *anyError = [NSError errorWithDomain:@"domain" code:7 userInfo:nil]; 102*cc02d7e2SAndroid Build Coastguard Worker 103*cc02d7e2SAndroid Build Coastguard Worker // If: 104*cc02d7e2SAndroid Build Coastguard Worker id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleHandler:handler.block]; 105*cc02d7e2SAndroid Build Coastguard Worker [writeable writeValue:anyValue]; 106*cc02d7e2SAndroid Build Coastguard Worker [writeable writesFinishedWithError:anyError]; 107*cc02d7e2SAndroid Build Coastguard Worker 108*cc02d7e2SAndroid Build Coastguard Worker // Then: 109*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqual(handler.timesCalled, 1); 110*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqualObjects(handler.value, anyValue); 111*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqualObjects(handler.errorOrNil, nil); 112*cc02d7e2SAndroid Build Coastguard Worker} 113*cc02d7e2SAndroid Build Coastguard Worker 114*cc02d7e2SAndroid Build Coastguard Worker- (void)testWriteableSingleHandlerIsCalledOnlyOnce_ValueThenValue { 115*cc02d7e2SAndroid Build Coastguard Worker // Given: 116*cc02d7e2SAndroid Build Coastguard Worker CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler]; 117*cc02d7e2SAndroid Build Coastguard Worker id anyValue = @7; 118*cc02d7e2SAndroid Build Coastguard Worker 119*cc02d7e2SAndroid Build Coastguard Worker // If: 120*cc02d7e2SAndroid Build Coastguard Worker id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleHandler:handler.block]; 121*cc02d7e2SAndroid Build Coastguard Worker [writeable writeValue:anyValue]; 122*cc02d7e2SAndroid Build Coastguard Worker [writeable writeValue:anyValue]; 123*cc02d7e2SAndroid Build Coastguard Worker [writeable writesFinishedWithError:nil]; 124*cc02d7e2SAndroid Build Coastguard Worker 125*cc02d7e2SAndroid Build Coastguard Worker // Then: 126*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqual(handler.timesCalled, 1); 127*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqualObjects(handler.value, anyValue); 128*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqualObjects(handler.errorOrNil, nil); 129*cc02d7e2SAndroid Build Coastguard Worker} 130*cc02d7e2SAndroid Build Coastguard Worker 131*cc02d7e2SAndroid Build Coastguard Worker- (void)testWriteableSingleHandlerFailsOnEmptyWriter { 132*cc02d7e2SAndroid Build Coastguard Worker // Given: 133*cc02d7e2SAndroid Build Coastguard Worker CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler]; 134*cc02d7e2SAndroid Build Coastguard Worker 135*cc02d7e2SAndroid Build Coastguard Worker // If: 136*cc02d7e2SAndroid Build Coastguard Worker id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleHandler:handler.block]; 137*cc02d7e2SAndroid Build Coastguard Worker [writeable writesFinishedWithError:nil]; 138*cc02d7e2SAndroid Build Coastguard Worker 139*cc02d7e2SAndroid Build Coastguard Worker // Then: 140*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqual(handler.timesCalled, 1); 141*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqualObjects(handler.value, nil); 142*cc02d7e2SAndroid Build Coastguard Worker XCTAssertNotNil(handler.errorOrNil); 143*cc02d7e2SAndroid Build Coastguard Worker} 144*cc02d7e2SAndroid Build Coastguard Worker 145*cc02d7e2SAndroid Build Coastguard Worker#pragma mark BufferedPipe 146*cc02d7e2SAndroid Build Coastguard Worker 147*cc02d7e2SAndroid Build Coastguard Worker- (void)testBufferedPipePropagatesValue { 148*cc02d7e2SAndroid Build Coastguard Worker __weak XCTestExpectation *expectation = [self expectationWithDescription:@"Response received"]; 149*cc02d7e2SAndroid Build Coastguard Worker // Given: 150*cc02d7e2SAndroid Build Coastguard Worker CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler]; 151*cc02d7e2SAndroid Build Coastguard Worker id<GRXWriteable> writeable = 152*cc02d7e2SAndroid Build Coastguard Worker [GRXWriteable writeableWithSingleHandler:^(id value, NSError *errorOrNil) { 153*cc02d7e2SAndroid Build Coastguard Worker handler.block(value, errorOrNil); 154*cc02d7e2SAndroid Build Coastguard Worker [expectation fulfill]; 155*cc02d7e2SAndroid Build Coastguard Worker }]; 156*cc02d7e2SAndroid Build Coastguard Worker 157*cc02d7e2SAndroid Build Coastguard Worker id anyValue = @7; 158*cc02d7e2SAndroid Build Coastguard Worker 159*cc02d7e2SAndroid Build Coastguard Worker // If: 160*cc02d7e2SAndroid Build Coastguard Worker GRXBufferedPipe *pipe = [GRXBufferedPipe pipe]; 161*cc02d7e2SAndroid Build Coastguard Worker [pipe startWithWriteable:writeable]; 162*cc02d7e2SAndroid Build Coastguard Worker [pipe writeValue:anyValue]; 163*cc02d7e2SAndroid Build Coastguard Worker [pipe writesFinishedWithError:nil]; 164*cc02d7e2SAndroid Build Coastguard Worker 165*cc02d7e2SAndroid Build Coastguard Worker // Then: 166*cc02d7e2SAndroid Build Coastguard Worker [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil]; 167*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqual(handler.timesCalled, 1); 168*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqualObjects(handler.value, anyValue); 169*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqualObjects(handler.errorOrNil, nil); 170*cc02d7e2SAndroid Build Coastguard Worker} 171*cc02d7e2SAndroid Build Coastguard Worker 172*cc02d7e2SAndroid Build Coastguard Worker- (void)testBufferedPipePropagatesError { 173*cc02d7e2SAndroid Build Coastguard Worker __weak XCTestExpectation *expectation = [self expectationWithDescription:@"Response received"]; 174*cc02d7e2SAndroid Build Coastguard Worker // Given: 175*cc02d7e2SAndroid Build Coastguard Worker CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler]; 176*cc02d7e2SAndroid Build Coastguard Worker id<GRXWriteable> writeable = 177*cc02d7e2SAndroid Build Coastguard Worker [GRXWriteable writeableWithSingleHandler:^(id value, NSError *errorOrNil) { 178*cc02d7e2SAndroid Build Coastguard Worker handler.block(value, errorOrNil); 179*cc02d7e2SAndroid Build Coastguard Worker [expectation fulfill]; 180*cc02d7e2SAndroid Build Coastguard Worker }]; 181*cc02d7e2SAndroid Build Coastguard Worker NSError *anyError = [NSError errorWithDomain:@"domain" code:7 userInfo:nil]; 182*cc02d7e2SAndroid Build Coastguard Worker 183*cc02d7e2SAndroid Build Coastguard Worker // If: 184*cc02d7e2SAndroid Build Coastguard Worker GRXBufferedPipe *pipe = [GRXBufferedPipe pipe]; 185*cc02d7e2SAndroid Build Coastguard Worker [pipe startWithWriteable:writeable]; 186*cc02d7e2SAndroid Build Coastguard Worker [pipe writesFinishedWithError:anyError]; 187*cc02d7e2SAndroid Build Coastguard Worker 188*cc02d7e2SAndroid Build Coastguard Worker // Then: 189*cc02d7e2SAndroid Build Coastguard Worker [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil]; 190*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqual(handler.timesCalled, 1); 191*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqualObjects(handler.value, nil); 192*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqualObjects(handler.errorOrNil, anyError); 193*cc02d7e2SAndroid Build Coastguard Worker} 194*cc02d7e2SAndroid Build Coastguard Worker 195*cc02d7e2SAndroid Build Coastguard Worker- (void)testBufferedPipeFinishWriteWhilePaused { 196*cc02d7e2SAndroid Build Coastguard Worker __weak XCTestExpectation *expectation = [self expectationWithDescription:@"Response received"]; 197*cc02d7e2SAndroid Build Coastguard Worker // Given: 198*cc02d7e2SAndroid Build Coastguard Worker CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler]; 199*cc02d7e2SAndroid Build Coastguard Worker id<GRXWriteable> writeable = 200*cc02d7e2SAndroid Build Coastguard Worker [GRXWriteable writeableWithSingleHandler:^(id value, NSError *errorOrNil) { 201*cc02d7e2SAndroid Build Coastguard Worker handler.block(value, errorOrNil); 202*cc02d7e2SAndroid Build Coastguard Worker [expectation fulfill]; 203*cc02d7e2SAndroid Build Coastguard Worker }]; 204*cc02d7e2SAndroid Build Coastguard Worker id anyValue = @7; 205*cc02d7e2SAndroid Build Coastguard Worker 206*cc02d7e2SAndroid Build Coastguard Worker // If: 207*cc02d7e2SAndroid Build Coastguard Worker GRXBufferedPipe *pipe = [GRXBufferedPipe pipe]; 208*cc02d7e2SAndroid Build Coastguard Worker // Write something, then finish 209*cc02d7e2SAndroid Build Coastguard Worker [pipe writeValue:anyValue]; 210*cc02d7e2SAndroid Build Coastguard Worker [pipe writesFinishedWithError:nil]; 211*cc02d7e2SAndroid Build Coastguard Worker // then start the writeable 212*cc02d7e2SAndroid Build Coastguard Worker [pipe startWithWriteable:writeable]; 213*cc02d7e2SAndroid Build Coastguard Worker 214*cc02d7e2SAndroid Build Coastguard Worker // Then: 215*cc02d7e2SAndroid Build Coastguard Worker [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil]; 216*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqual(handler.timesCalled, 1); 217*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqualObjects(handler.value, anyValue); 218*cc02d7e2SAndroid Build Coastguard Worker XCTAssertEqualObjects(handler.errorOrNil, nil); 219*cc02d7e2SAndroid Build Coastguard Worker} 220*cc02d7e2SAndroid Build Coastguard Worker 221*cc02d7e2SAndroid Build Coastguard Worker#define WRITE_ROUNDS (1000) 222*cc02d7e2SAndroid Build Coastguard Worker- (void)testBufferedPipeResumeWhenDealloc { 223*cc02d7e2SAndroid Build Coastguard Worker id anyValue = @7; 224*cc02d7e2SAndroid Build Coastguard Worker id<GRXWriteable> writeable = 225*cc02d7e2SAndroid Build Coastguard Worker [GRXWriteable writeableWithSingleHandler:^(id value, NSError *errorOrNil){ 226*cc02d7e2SAndroid Build Coastguard Worker }]; 227*cc02d7e2SAndroid Build Coastguard Worker 228*cc02d7e2SAndroid Build Coastguard Worker // Release after alloc; 229*cc02d7e2SAndroid Build Coastguard Worker GRXBufferedPipe *pipe = [GRXBufferedPipe pipe]; 230*cc02d7e2SAndroid Build Coastguard Worker pipe = nil; 231*cc02d7e2SAndroid Build Coastguard Worker 232*cc02d7e2SAndroid Build Coastguard Worker // Release after write but before start 233*cc02d7e2SAndroid Build Coastguard Worker pipe = [GRXBufferedPipe pipe]; 234*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < WRITE_ROUNDS; i++) { 235*cc02d7e2SAndroid Build Coastguard Worker [pipe writeValue:anyValue]; 236*cc02d7e2SAndroid Build Coastguard Worker } 237*cc02d7e2SAndroid Build Coastguard Worker pipe = nil; 238*cc02d7e2SAndroid Build Coastguard Worker 239*cc02d7e2SAndroid Build Coastguard Worker // Release after start but not write 240*cc02d7e2SAndroid Build Coastguard Worker pipe = [GRXBufferedPipe pipe]; 241*cc02d7e2SAndroid Build Coastguard Worker [pipe startWithWriteable:writeable]; 242*cc02d7e2SAndroid Build Coastguard Worker pipe = nil; 243*cc02d7e2SAndroid Build Coastguard Worker 244*cc02d7e2SAndroid Build Coastguard Worker // Release after start and write 245*cc02d7e2SAndroid Build Coastguard Worker pipe = [GRXBufferedPipe pipe]; 246*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < WRITE_ROUNDS; i++) { 247*cc02d7e2SAndroid Build Coastguard Worker [pipe writeValue:anyValue]; 248*cc02d7e2SAndroid Build Coastguard Worker } 249*cc02d7e2SAndroid Build Coastguard Worker [pipe startWithWriteable:writeable]; 250*cc02d7e2SAndroid Build Coastguard Worker pipe = nil; 251*cc02d7e2SAndroid Build Coastguard Worker 252*cc02d7e2SAndroid Build Coastguard Worker // Release after start, write and pause 253*cc02d7e2SAndroid Build Coastguard Worker pipe = [GRXBufferedPipe pipe]; 254*cc02d7e2SAndroid Build Coastguard Worker [pipe startWithWriteable:writeable]; 255*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < WRITE_ROUNDS; i++) { 256*cc02d7e2SAndroid Build Coastguard Worker [pipe writeValue:anyValue]; 257*cc02d7e2SAndroid Build Coastguard Worker } 258*cc02d7e2SAndroid Build Coastguard Worker pipe.state = GRXWriterStatePaused; 259*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < WRITE_ROUNDS; i++) { 260*cc02d7e2SAndroid Build Coastguard Worker [pipe writeValue:anyValue]; 261*cc02d7e2SAndroid Build Coastguard Worker } 262*cc02d7e2SAndroid Build Coastguard Worker pipe = nil; 263*cc02d7e2SAndroid Build Coastguard Worker 264*cc02d7e2SAndroid Build Coastguard Worker // Release after start, write, pause and finish 265*cc02d7e2SAndroid Build Coastguard Worker pipe = [GRXBufferedPipe pipe]; 266*cc02d7e2SAndroid Build Coastguard Worker [pipe startWithWriteable:writeable]; 267*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < WRITE_ROUNDS; i++) { 268*cc02d7e2SAndroid Build Coastguard Worker [pipe writeValue:anyValue]; 269*cc02d7e2SAndroid Build Coastguard Worker } 270*cc02d7e2SAndroid Build Coastguard Worker pipe.state = GRXWriterStatePaused; 271*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < WRITE_ROUNDS; i++) { 272*cc02d7e2SAndroid Build Coastguard Worker [pipe writeValue:anyValue]; 273*cc02d7e2SAndroid Build Coastguard Worker } 274*cc02d7e2SAndroid Build Coastguard Worker [pipe finishWithError:nil]; 275*cc02d7e2SAndroid Build Coastguard Worker pipe = nil; 276*cc02d7e2SAndroid Build Coastguard Worker 277*cc02d7e2SAndroid Build Coastguard Worker // Release after start, write, pause, finish and resume 278*cc02d7e2SAndroid Build Coastguard Worker pipe = [GRXBufferedPipe pipe]; 279*cc02d7e2SAndroid Build Coastguard Worker [pipe startWithWriteable:writeable]; 280*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < WRITE_ROUNDS; i++) { 281*cc02d7e2SAndroid Build Coastguard Worker [pipe writeValue:anyValue]; 282*cc02d7e2SAndroid Build Coastguard Worker } 283*cc02d7e2SAndroid Build Coastguard Worker pipe.state = GRXWriterStatePaused; 284*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < WRITE_ROUNDS; i++) { 285*cc02d7e2SAndroid Build Coastguard Worker [pipe writeValue:anyValue]; 286*cc02d7e2SAndroid Build Coastguard Worker } 287*cc02d7e2SAndroid Build Coastguard Worker [pipe finishWithError:nil]; 288*cc02d7e2SAndroid Build Coastguard Worker pipe.state = GRXWriterStateStarted; 289*cc02d7e2SAndroid Build Coastguard Worker pipe = nil; 290*cc02d7e2SAndroid Build Coastguard Worker} 291*cc02d7e2SAndroid Build Coastguard Worker 292*cc02d7e2SAndroid Build Coastguard Worker@end 293