xref: /aosp_15_r20/external/grpc-grpc/src/objective-c/tests/UnitTests/RxLibraryUnitTests.m (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
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