Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: components/cronet/ios/test/cronet_bidirectional_stream_test.mm

Issue 2273403003: Moving gRPC support interfaces out of cronet and into a new component. (Closed)
Patch Set: Fix DEPS Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #import <Foundation/Foundation.h> 5 #import <Foundation/Foundation.h>
mef 2016/10/11 22:09:37 We should be able to move cronet_bidirectional_str
Garrett Casto 2016/10/12 00:23:36 Seems like you want two tests, one that verifies t
6 #include <stdint.h> 6 #include <stdint.h>
7 #include <list> 7 #include <list>
8 #include <map> 8 #include <map>
9 #include <string> 9 #include <string>
10 10
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/mac/scoped_nsobject.h" 12 #include "base/mac/scoped_nsobject.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/memory/ptr_util.h" 14 #include "base/memory/ptr_util.h"
15 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
16 #include "base/strings/sys_string_conversions.h" 16 #include "base/strings/sys_string_conversions.h"
17 #include "base/synchronization/waitable_event.h" 17 #include "base/synchronization/waitable_event.h"
18 #include "components/cronet/ios/cronet_c_for_grpc.h"
19 #include "components/cronet/ios/cronet_environment.h" 18 #include "components/cronet/ios/cronet_environment.h"
20 #include "components/cronet/ios/test/quic_test_server.h" 19 #include "components/cronet/ios/test/quic_test_server.h"
20 #include "components/grpc_support/include/c_for_grpc.h"
21 #include "net/base/mac/url_conversions.h" 21 #include "net/base/mac/url_conversions.h"
22 #include "net/base/net_errors.h" 22 #include "net/base/net_errors.h"
23 #include "net/cert/mock_cert_verifier.h" 23 #include "net/cert/mock_cert_verifier.h"
24 #include "net/test/test_data_directory.h" 24 #include "net/test/test_data_directory.h"
25 #include "testing/gtest/include/gtest/gtest.h" 25 #include "testing/gtest/include/gtest/gtest.h"
26 #include "testing/gtest_mac.h" 26 #include "testing/gtest_mac.h"
27 #include "url/gurl.h" 27 #include "url/gurl.h"
28 28
29 namespace { 29 namespace {
30 30
31 cronet_bidirectional_stream_header kTestHeaders[] = { 31 bidirectional_stream_header kTestHeaders[] = {
32 {"header1", "foo"}, 32 {"header1", "foo"},
33 {"header2", "bar"}, 33 {"header2", "bar"},
34 }; 34 };
35 const cronet_bidirectional_stream_header_array kTestHeadersArray = { 35 const bidirectional_stream_header_array kTestHeadersArray = {2, 2,
36 2, 2, kTestHeaders}; 36 kTestHeaders};
37 } // namespace 37 } // namespace
38 38
39 namespace cronet { 39 namespace cronet {
40 40
41 class CronetBidirectionalStreamTest : public ::testing::TestWithParam<bool> { 41 class CronetBidirectionalStreamTest : public ::testing::TestWithParam<bool> {
42 protected: 42 protected:
43 CronetBidirectionalStreamTest() {} 43 CronetBidirectionalStreamTest() {}
44 ~CronetBidirectionalStreamTest() override {} 44 ~CronetBidirectionalStreamTest() override {}
45 45
46 void SetUp() override { 46 void SetUp() override {
(...skipping 15 matching lines...) Expand all
62 62
63 cronet_environment_->set_cert_verifier(std::move(mock_cert_verifier)); 63 cronet_environment_->set_cert_verifier(std::move(mock_cert_verifier));
64 cronet_environment_->set_host_resolver_rules( 64 cronet_environment_->set_host_resolver_rules(
65 "MAP test.example.com 127.0.0.1," 65 "MAP test.example.com 127.0.0.1,"
66 "MAP notfound.example.com ~NOTFOUND"); 66 "MAP notfound.example.com ~NOTFOUND");
67 cronet_environment_->AddQuicHint(kTestServerDomain, kTestServerPort, 67 cronet_environment_->AddQuicHint(kTestServerDomain, kTestServerPort,
68 kTestServerPort); 68 kTestServerPort);
69 69
70 cronet_environment_->Start(); 70 cronet_environment_->Start();
71 71
72 cronet_engine_.obj = cronet_environment_; 72 stream_engine_.obj = cronet_environment_->GetURLRequestContextGetter();
73 } 73 }
74 74
75 StartQuicTestServer(); 75 StartQuicTestServer();
76 cronet_environment_->StartNetLog("cronet_netlog.json", true); 76 cronet_environment_->StartNetLog("cronet_netlog.json", true);
77 } 77 }
78 78
79 void TearDown() override { 79 void TearDown() override {
80 ShutdownQuicTestServer(); 80 ShutdownQuicTestServer();
81 cronet_environment_->StopNetLog(); 81 cronet_environment_->StopNetLog();
82 } 82 }
83 83
84 cronet_engine* engine() { return &cronet_engine_; } 84 stream_engine* engine() { return &stream_engine_; }
85 85
86 private: 86 private:
87 static CronetEnvironment* cronet_environment_; 87 static CronetEnvironment* cronet_environment_;
88 static cronet_engine cronet_engine_; 88 static stream_engine stream_engine_;
89 }; 89 };
90 90
91 CronetEnvironment* CronetBidirectionalStreamTest::cronet_environment_ = nullptr; 91 CronetEnvironment* CronetBidirectionalStreamTest::cronet_environment_ = nullptr;
92 cronet_engine CronetBidirectionalStreamTest::cronet_engine_ = {0}; 92 stream_engine CronetBidirectionalStreamTest::stream_engine_ = {0};
93 93
94 class TestBidirectionalStreamCallback { 94 class TestBidirectionalStreamCallback {
95 public: 95 public:
96 enum ResponseStep { 96 enum ResponseStep {
97 NOTHING, 97 NOTHING,
98 ON_STREAM_READY, 98 ON_STREAM_READY,
99 ON_RESPONSE_STARTED, 99 ON_RESPONSE_STARTED,
100 ON_READ_COMPLETED, 100 ON_READ_COMPLETED,
101 ON_WRITE_COMPLETED, 101 ON_WRITE_COMPLETED,
102 ON_TRAILERS, 102 ON_TRAILERS,
103 ON_CANCELED, 103 ON_CANCELED,
104 ON_FAILED, 104 ON_FAILED,
105 ON_SUCCEEDED 105 ON_SUCCEEDED
106 }; 106 };
107 107
108 struct WriteData { 108 struct WriteData {
109 std::string buffer; 109 std::string buffer;
110 // If |flush| is true, then cronet_bidirectional_stream_flush() will be 110 // If |flush| is true, then bidirectional_stream_flush() will be
111 // called after writing of the |buffer|. 111 // called after writing of the |buffer|.
112 bool flush; 112 bool flush;
113 113
114 WriteData(const std::string& buffer, bool flush); 114 WriteData(const std::string& buffer, bool flush);
115 ~WriteData(); 115 ~WriteData();
116 116
117 DISALLOW_COPY_AND_ASSIGN(WriteData); 117 DISALLOW_COPY_AND_ASSIGN(WriteData);
118 }; 118 };
119 119
120 cronet_bidirectional_stream* stream; 120 bidirectional_stream* stream;
121 base::WaitableEvent stream_done_event; 121 base::WaitableEvent stream_done_event;
122 122
123 // Test parameters. 123 // Test parameters.
124 std::map<std::string, std::string> request_headers; 124 std::map<std::string, std::string> request_headers;
125 std::list<std::unique_ptr<WriteData>> write_data; 125 std::list<std::unique_ptr<WriteData>> write_data;
126 std::string expected_negotiated_protocol; 126 std::string expected_negotiated_protocol;
127 ResponseStep cancel_from_step; 127 ResponseStep cancel_from_step;
128 size_t read_buffer_size; 128 size_t read_buffer_size;
129 129
130 // Test results. 130 // Test results.
(...skipping 14 matching lines...) Expand all
145 response_step(NOTHING), 145 response_step(NOTHING),
146 read_buffer(nullptr), 146 read_buffer(nullptr),
147 net_error(0) {} 147 net_error(0) {}
148 148
149 ~TestBidirectionalStreamCallback() { 149 ~TestBidirectionalStreamCallback() {
150 if (read_buffer) 150 if (read_buffer)
151 delete read_buffer; 151 delete read_buffer;
152 } 152 }
153 153
154 static TestBidirectionalStreamCallback* FromStream( 154 static TestBidirectionalStreamCallback* FromStream(
155 cronet_bidirectional_stream* stream) { 155 bidirectional_stream* stream) {
156 DCHECK(stream); 156 DCHECK(stream);
157 return (TestBidirectionalStreamCallback*)stream->annotation; 157 return (TestBidirectionalStreamCallback*)stream->annotation;
158 } 158 }
159 159
160 virtual bool MaybeCancel(cronet_bidirectional_stream* stream, 160 virtual bool MaybeCancel(bidirectional_stream* stream, ResponseStep step) {
161 ResponseStep step) {
162 DCHECK_EQ(stream, this->stream); 161 DCHECK_EQ(stream, this->stream);
163 response_step = step; 162 response_step = step;
164 DLOG(WARNING) << "Step: " << step; 163 DLOG(WARNING) << "Step: " << step;
165 164
166 if (step != cancel_from_step) 165 if (step != cancel_from_step)
167 return false; 166 return false;
168 167
169 cronet_bidirectional_stream_cancel(stream); 168 bidirectional_stream_cancel(stream);
170 cronet_bidirectional_stream_write(stream, "abc", 3, false); 169 bidirectional_stream_write(stream, "abc", 3, false);
171 170
172 return true; 171 return true;
173 } 172 }
174 173
175 void SignalDone() { stream_done_event.Signal(); } 174 void SignalDone() { stream_done_event.Signal(); }
176 175
177 void BlockForDone() { stream_done_event.Wait(); } 176 void BlockForDone() { stream_done_event.Wait(); }
178 177
179 void AddWriteData(const std::string& data) { AddWriteData(data, true); } 178 void AddWriteData(const std::string& data) { AddWriteData(data, true); }
180 void AddWriteData(const std::string& data, bool flush) { 179 void AddWriteData(const std::string& data, bool flush) {
181 write_data.push_back(base::MakeUnique<WriteData>(data, flush)); 180 write_data.push_back(base::MakeUnique<WriteData>(data, flush));
182 } 181 }
183 182
184 virtual void MaybeWriteNextData(cronet_bidirectional_stream* stream) { 183 virtual void MaybeWriteNextData(bidirectional_stream* stream) {
185 DCHECK_EQ(stream, this->stream); 184 DCHECK_EQ(stream, this->stream);
186 if (write_data.empty()) 185 if (write_data.empty())
187 return; 186 return;
188 for (const auto& data : write_data) { 187 for (const auto& data : write_data) {
189 cronet_bidirectional_stream_write(stream, data->buffer.c_str(), 188 bidirectional_stream_write(stream, data->buffer.c_str(),
190 data->buffer.size(), 189 data->buffer.size(),
191 data == write_data.back()); 190 data == write_data.back());
192 if (data->flush) { 191 if (data->flush) {
193 cronet_bidirectional_stream_flush(stream); 192 bidirectional_stream_flush(stream);
194 break; 193 break;
195 } 194 }
196 } 195 }
197 } 196 }
198 197
199 cronet_bidirectional_stream_callback* callback() const { return &s_callback; } 198 bidirectional_stream_callback* callback() const { return &s_callback; }
200 199
201 private: 200 private:
202 // C callbacks. 201 // C callbacks.
203 static void on_stream_ready_callback(cronet_bidirectional_stream* stream) { 202 static void on_stream_ready_callback(bidirectional_stream* stream) {
204 TestBidirectionalStreamCallback* test = FromStream(stream); 203 TestBidirectionalStreamCallback* test = FromStream(stream);
205 if (test->MaybeCancel(stream, ON_STREAM_READY)) 204 if (test->MaybeCancel(stream, ON_STREAM_READY))
206 return; 205 return;
207 test->MaybeWriteNextData(stream); 206 test->MaybeWriteNextData(stream);
208 } 207 }
209 208
210 static void on_response_headers_received_callback( 209 static void on_response_headers_received_callback(
211 cronet_bidirectional_stream* stream, 210 bidirectional_stream* stream,
212 const cronet_bidirectional_stream_header_array* headers, 211 const bidirectional_stream_header_array* headers,
213 const char* negotiated_protocol) { 212 const char* negotiated_protocol) {
214 TestBidirectionalStreamCallback* test = FromStream(stream); 213 TestBidirectionalStreamCallback* test = FromStream(stream);
215 ASSERT_EQ(test->expected_negotiated_protocol, 214 ASSERT_EQ(test->expected_negotiated_protocol,
216 std::string(negotiated_protocol)); 215 std::string(negotiated_protocol));
217 for (size_t i = 0; i < headers->count; ++i) { 216 for (size_t i = 0; i < headers->count; ++i) {
218 test->response_headers[headers->headers[i].key] = 217 test->response_headers[headers->headers[i].key] =
219 headers->headers[i].value; 218 headers->headers[i].value;
220 } 219 }
221 if (test->MaybeCancel(stream, ON_RESPONSE_STARTED)) 220 if (test->MaybeCancel(stream, ON_RESPONSE_STARTED))
222 return; 221 return;
223 test->read_buffer = new char[test->read_buffer_size]; 222 test->read_buffer = new char[test->read_buffer_size];
224 cronet_bidirectional_stream_read(stream, test->read_buffer, 223 bidirectional_stream_read(stream, test->read_buffer,
225 test->read_buffer_size); 224 test->read_buffer_size);
226 } 225 }
227 226
228 static void on_read_completed_callback(cronet_bidirectional_stream* stream, 227 static void on_read_completed_callback(bidirectional_stream* stream,
229 char* data, 228 char* data,
230 int count) { 229 int count) {
231 TestBidirectionalStreamCallback* test = FromStream(stream); 230 TestBidirectionalStreamCallback* test = FromStream(stream);
232 test->read_data.push_back(std::string(data, count)); 231 test->read_data.push_back(std::string(data, count));
233 if (test->MaybeCancel(stream, ON_READ_COMPLETED)) 232 if (test->MaybeCancel(stream, ON_READ_COMPLETED))
234 return; 233 return;
235 if (count == 0) 234 if (count == 0)
236 return; 235 return;
237 cronet_bidirectional_stream_read(stream, test->read_buffer, 236 bidirectional_stream_read(stream, test->read_buffer,
238 test->read_buffer_size); 237 test->read_buffer_size);
239 } 238 }
240 239
241 static void on_write_completed_callback(cronet_bidirectional_stream* stream, 240 static void on_write_completed_callback(bidirectional_stream* stream,
242 const char* data) { 241 const char* data) {
243 TestBidirectionalStreamCallback* test = FromStream(stream); 242 TestBidirectionalStreamCallback* test = FromStream(stream);
244 ASSERT_EQ(test->write_data.front()->buffer.c_str(), data); 243 ASSERT_EQ(test->write_data.front()->buffer.c_str(), data);
245 if (test->MaybeCancel(stream, ON_WRITE_COMPLETED)) 244 if (test->MaybeCancel(stream, ON_WRITE_COMPLETED))
246 return; 245 return;
247 bool continue_writing = test->write_data.front()->flush; 246 bool continue_writing = test->write_data.front()->flush;
248 test->write_data.pop_front(); 247 test->write_data.pop_front();
249 if (continue_writing) 248 if (continue_writing)
250 test->MaybeWriteNextData(stream); 249 test->MaybeWriteNextData(stream);
251 } 250 }
252 251
253 static void on_response_trailers_received_callback( 252 static void on_response_trailers_received_callback(
254 cronet_bidirectional_stream* stream, 253 bidirectional_stream* stream,
255 const cronet_bidirectional_stream_header_array* trailers) { 254 const bidirectional_stream_header_array* trailers) {
256 TestBidirectionalStreamCallback* test = FromStream(stream); 255 TestBidirectionalStreamCallback* test = FromStream(stream);
257 for (size_t i = 0; i < trailers->count; ++i) { 256 for (size_t i = 0; i < trailers->count; ++i) {
258 test->response_trailers[trailers->headers[i].key] = 257 test->response_trailers[trailers->headers[i].key] =
259 trailers->headers[i].value; 258 trailers->headers[i].value;
260 } 259 }
261 260
262 if (test->MaybeCancel(stream, ON_TRAILERS)) 261 if (test->MaybeCancel(stream, ON_TRAILERS))
263 return; 262 return;
264 } 263 }
265 264
266 static void on_succeded_callback(cronet_bidirectional_stream* stream) { 265 static void on_succeded_callback(bidirectional_stream* stream) {
267 TestBidirectionalStreamCallback* test = FromStream(stream); 266 TestBidirectionalStreamCallback* test = FromStream(stream);
268 ASSERT_TRUE(test->write_data.empty()); 267 ASSERT_TRUE(test->write_data.empty());
269 test->MaybeCancel(stream, ON_SUCCEEDED); 268 test->MaybeCancel(stream, ON_SUCCEEDED);
270 test->SignalDone(); 269 test->SignalDone();
271 } 270 }
272 271
273 static void on_failed_callback(cronet_bidirectional_stream* stream, 272 static void on_failed_callback(bidirectional_stream* stream, int net_error) {
274 int net_error) {
275 TestBidirectionalStreamCallback* test = FromStream(stream); 273 TestBidirectionalStreamCallback* test = FromStream(stream);
276 test->net_error = net_error; 274 test->net_error = net_error;
277 test->MaybeCancel(stream, ON_FAILED); 275 test->MaybeCancel(stream, ON_FAILED);
278 test->SignalDone(); 276 test->SignalDone();
279 } 277 }
280 278
281 static void on_canceled_callback(cronet_bidirectional_stream* stream) { 279 static void on_canceled_callback(bidirectional_stream* stream) {
282 TestBidirectionalStreamCallback* test = FromStream(stream); 280 TestBidirectionalStreamCallback* test = FromStream(stream);
283 test->MaybeCancel(stream, ON_CANCELED); 281 test->MaybeCancel(stream, ON_CANCELED);
284 test->SignalDone(); 282 test->SignalDone();
285 } 283 }
286 284
287 static cronet_bidirectional_stream_callback s_callback; 285 static bidirectional_stream_callback s_callback;
288 }; 286 };
289 287
290 cronet_bidirectional_stream_callback 288 bidirectional_stream_callback TestBidirectionalStreamCallback::s_callback = {
291 TestBidirectionalStreamCallback::s_callback = { 289 on_stream_ready_callback,
292 on_stream_ready_callback, 290 on_response_headers_received_callback,
293 on_response_headers_received_callback, 291 on_read_completed_callback,
294 on_read_completed_callback, 292 on_write_completed_callback,
295 on_write_completed_callback, 293 on_response_trailers_received_callback,
296 on_response_trailers_received_callback, 294 on_succeded_callback,
297 on_succeded_callback, 295 on_failed_callback,
298 on_failed_callback, 296 on_canceled_callback};
299 on_canceled_callback};
300 297
301 TestBidirectionalStreamCallback::WriteData::WriteData(const std::string& data, 298 TestBidirectionalStreamCallback::WriteData::WriteData(const std::string& data,
302 bool flush_after) 299 bool flush_after)
303 : buffer(data), flush(flush_after) {} 300 : buffer(data), flush(flush_after) {}
304 301
305 TestBidirectionalStreamCallback::WriteData::~WriteData() {} 302 TestBidirectionalStreamCallback::WriteData::~WriteData() {}
306 303
307 TEST_P(CronetBidirectionalStreamTest, StartExampleBidiStream) { 304 TEST_P(CronetBidirectionalStreamTest, StartExampleBidiStream) {
308 TestBidirectionalStreamCallback test; 305 TestBidirectionalStreamCallback test;
309 test.AddWriteData("Hello, "); 306 test.AddWriteData("Hello, ");
310 test.AddWriteData("world!"); 307 test.AddWriteData("world!");
311 // Use small read buffer size to test that response is split properly. 308 // Use small read buffer size to test that response is split properly.
312 test.read_buffer_size = 2; 309 test.read_buffer_size = 2;
313 test.stream = 310 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
314 cronet_bidirectional_stream_create(engine(), &test, test.callback());
315 DCHECK(test.stream); 311 DCHECK(test.stream);
316 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 312 bidirectional_stream_delay_request_headers_until_flush(test.stream,
317 GetParam()); 313 GetParam());
318 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST", 314 bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST",
319 &kTestHeadersArray, false); 315 &kTestHeadersArray, false);
320 test.BlockForDone(); 316 test.BlockForDone();
321 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]); 317 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]);
322 ASSERT_EQ(std::string(kHelloHeaderValue), 318 ASSERT_EQ(std::string(kHelloHeaderValue),
323 test.response_headers[kHelloHeaderName]); 319 test.response_headers[kHelloHeaderName]);
324 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step); 320 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step);
325 ASSERT_EQ(std::string(kHelloBodyValue, 2), test.read_data.front()); 321 ASSERT_EQ(std::string(kHelloBodyValue, 2), test.read_data.front());
326 // Verify that individual read data joined using empty separator match 322 // Verify that individual read data joined using empty separator match
327 // expected body. 323 // expected body.
328 ASSERT_EQ(std::string(kHelloBodyValue), base::JoinString(test.read_data, "")); 324 ASSERT_EQ(std::string(kHelloBodyValue), base::JoinString(test.read_data, ""));
329 ASSERT_EQ(std::string(kHelloTrailerValue), 325 ASSERT_EQ(std::string(kHelloTrailerValue),
330 test.response_trailers[kHelloTrailerName]); 326 test.response_trailers[kHelloTrailerName]);
331 cronet_bidirectional_stream_destroy(test.stream); 327 bidirectional_stream_destroy(test.stream);
332 } 328 }
333 329
334 TEST_P(CronetBidirectionalStreamTest, SimplePutWithEmptyWriteDataAtTheEnd) { 330 TEST_P(CronetBidirectionalStreamTest, SimplePutWithEmptyWriteDataAtTheEnd) {
335 TestBidirectionalStreamCallback test; 331 TestBidirectionalStreamCallback test;
336 test.AddWriteData("Hello, "); 332 test.AddWriteData("Hello, ");
337 test.AddWriteData("world!"); 333 test.AddWriteData("world!");
338 test.AddWriteData(""); 334 test.AddWriteData("");
339 test.stream = 335 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
340 cronet_bidirectional_stream_create(engine(), &test, test.callback());
341 DCHECK(test.stream); 336 DCHECK(test.stream);
342 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 337 bidirectional_stream_delay_request_headers_until_flush(test.stream,
343 GetParam()); 338 GetParam());
344 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "PUT", 339 bidirectional_stream_start(test.stream, kTestServerUrl, 0, "PUT",
345 &kTestHeadersArray, false); 340 &kTestHeadersArray, false);
346 test.BlockForDone(); 341 test.BlockForDone();
347 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]); 342 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]);
348 ASSERT_EQ(std::string(kHelloHeaderValue), 343 ASSERT_EQ(std::string(kHelloHeaderValue),
349 test.response_headers[kHelloHeaderName]); 344 test.response_headers[kHelloHeaderName]);
350 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step); 345 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step);
351 ASSERT_EQ(std::string(kHelloBodyValue), test.read_data.front()); 346 ASSERT_EQ(std::string(kHelloBodyValue), test.read_data.front());
352 ASSERT_EQ(std::string(kHelloTrailerValue), 347 ASSERT_EQ(std::string(kHelloTrailerValue),
353 test.response_trailers[kHelloTrailerName]); 348 test.response_trailers[kHelloTrailerName]);
354 cronet_bidirectional_stream_destroy(test.stream); 349 bidirectional_stream_destroy(test.stream);
355 } 350 }
356 351
357 TEST_P(CronetBidirectionalStreamTest, SimpleGetWithFlush) { 352 TEST_P(CronetBidirectionalStreamTest, SimpleGetWithFlush) {
358 TestBidirectionalStreamCallback test; 353 TestBidirectionalStreamCallback test;
359 test.stream = 354 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
360 cronet_bidirectional_stream_create(engine(), &test, test.callback());
361 DCHECK(test.stream); 355 DCHECK(test.stream);
362 cronet_bidirectional_stream_disable_auto_flush(test.stream, true); 356 bidirectional_stream_disable_auto_flush(test.stream, true);
363 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 357 bidirectional_stream_delay_request_headers_until_flush(test.stream,
364 GetParam()); 358 GetParam());
365 // Flush before start is ignored. 359 // Flush before start is ignored.
366 cronet_bidirectional_stream_flush(test.stream); 360 bidirectional_stream_flush(test.stream);
367 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "GET", 361 bidirectional_stream_start(test.stream, kTestServerUrl, 0, "GET",
368 &kTestHeadersArray, true); 362 &kTestHeadersArray, true);
369 test.BlockForDone(); 363 test.BlockForDone();
370 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]); 364 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]);
371 ASSERT_EQ(std::string(kHelloHeaderValue), 365 ASSERT_EQ(std::string(kHelloHeaderValue),
372 test.response_headers[kHelloHeaderName]); 366 test.response_headers[kHelloHeaderName]);
373 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step); 367 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step);
374 ASSERT_EQ(std::string(kHelloBodyValue), base::JoinString(test.read_data, "")); 368 ASSERT_EQ(std::string(kHelloBodyValue), base::JoinString(test.read_data, ""));
375 ASSERT_EQ(std::string(kHelloTrailerValue), 369 ASSERT_EQ(std::string(kHelloTrailerValue),
376 test.response_trailers[kHelloTrailerName]); 370 test.response_trailers[kHelloTrailerName]);
377 // Flush after done is ignored. 371 // Flush after done is ignored.
378 cronet_bidirectional_stream_flush(test.stream); 372 bidirectional_stream_flush(test.stream);
379 cronet_bidirectional_stream_destroy(test.stream); 373 bidirectional_stream_destroy(test.stream);
380 } 374 }
381 375
382 TEST_P(CronetBidirectionalStreamTest, SimplePostWithFlush) { 376 TEST_P(CronetBidirectionalStreamTest, SimplePostWithFlush) {
383 TestBidirectionalStreamCallback test; 377 TestBidirectionalStreamCallback test;
384 test.AddWriteData("Test String", false); 378 test.AddWriteData("Test String", false);
385 test.AddWriteData("1234567890", false); 379 test.AddWriteData("1234567890", false);
386 test.AddWriteData("woot!", true); 380 test.AddWriteData("woot!", true);
387 test.stream = 381 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
388 cronet_bidirectional_stream_create(engine(), &test, test.callback());
389 DCHECK(test.stream); 382 DCHECK(test.stream);
390 cronet_bidirectional_stream_disable_auto_flush(test.stream, true); 383 bidirectional_stream_disable_auto_flush(test.stream, true);
391 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 384 bidirectional_stream_delay_request_headers_until_flush(test.stream,
392 GetParam()); 385 GetParam());
393 // Flush before start is ignored. 386 // Flush before start is ignored.
394 cronet_bidirectional_stream_flush(test.stream); 387 bidirectional_stream_flush(test.stream);
395 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST", 388 bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST",
396 &kTestHeadersArray, false); 389 &kTestHeadersArray, false);
397 test.BlockForDone(); 390 test.BlockForDone();
398 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]); 391 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]);
399 ASSERT_EQ(std::string(kHelloHeaderValue), 392 ASSERT_EQ(std::string(kHelloHeaderValue),
400 test.response_headers[kHelloHeaderName]); 393 test.response_headers[kHelloHeaderName]);
401 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step); 394 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step);
402 ASSERT_EQ(std::string(kHelloBodyValue), base::JoinString(test.read_data, "")); 395 ASSERT_EQ(std::string(kHelloBodyValue), base::JoinString(test.read_data, ""));
403 ASSERT_EQ(std::string(kHelloTrailerValue), 396 ASSERT_EQ(std::string(kHelloTrailerValue),
404 test.response_trailers[kHelloTrailerName]); 397 test.response_trailers[kHelloTrailerName]);
405 // Flush after done is ignored. 398 // Flush after done is ignored.
406 cronet_bidirectional_stream_flush(test.stream); 399 bidirectional_stream_flush(test.stream);
407 cronet_bidirectional_stream_destroy(test.stream); 400 bidirectional_stream_destroy(test.stream);
408 } 401 }
409 402
410 TEST_P(CronetBidirectionalStreamTest, SimplePostWithFlushTwice) { 403 TEST_P(CronetBidirectionalStreamTest, SimplePostWithFlushTwice) {
411 TestBidirectionalStreamCallback test; 404 TestBidirectionalStreamCallback test;
412 test.AddWriteData("Test String", false); 405 test.AddWriteData("Test String", false);
413 test.AddWriteData("1234567890", false); 406 test.AddWriteData("1234567890", false);
414 test.AddWriteData("woot!", true); 407 test.AddWriteData("woot!", true);
415 test.AddWriteData("Test String", false); 408 test.AddWriteData("Test String", false);
416 test.AddWriteData("1234567890", false); 409 test.AddWriteData("1234567890", false);
417 test.AddWriteData("woot!", true); 410 test.AddWriteData("woot!", true);
418 test.stream = 411 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
419 cronet_bidirectional_stream_create(engine(), &test, test.callback());
420 DCHECK(test.stream); 412 DCHECK(test.stream);
421 cronet_bidirectional_stream_disable_auto_flush(test.stream, true); 413 bidirectional_stream_disable_auto_flush(test.stream, true);
422 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 414 bidirectional_stream_delay_request_headers_until_flush(test.stream,
423 GetParam()); 415 GetParam());
424 // Flush before start is ignored. 416 // Flush before start is ignored.
425 cronet_bidirectional_stream_flush(test.stream); 417 bidirectional_stream_flush(test.stream);
426 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST", 418 bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST",
427 &kTestHeadersArray, false); 419 &kTestHeadersArray, false);
428 test.BlockForDone(); 420 test.BlockForDone();
429 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]); 421 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]);
430 ASSERT_EQ(std::string(kHelloHeaderValue), 422 ASSERT_EQ(std::string(kHelloHeaderValue),
431 test.response_headers[kHelloHeaderName]); 423 test.response_headers[kHelloHeaderName]);
432 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step); 424 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step);
433 ASSERT_EQ(std::string(kHelloBodyValue), base::JoinString(test.read_data, "")); 425 ASSERT_EQ(std::string(kHelloBodyValue), base::JoinString(test.read_data, ""));
434 ASSERT_EQ(std::string(kHelloTrailerValue), 426 ASSERT_EQ(std::string(kHelloTrailerValue),
435 test.response_trailers[kHelloTrailerName]); 427 test.response_trailers[kHelloTrailerName]);
436 // Flush after done is ignored. 428 // Flush after done is ignored.
437 cronet_bidirectional_stream_flush(test.stream); 429 bidirectional_stream_flush(test.stream);
438 cronet_bidirectional_stream_destroy(test.stream); 430 bidirectional_stream_destroy(test.stream);
439 } 431 }
440 432
441 TEST_P(CronetBidirectionalStreamTest, SimplePostWithFlushAfterOneWrite) { 433 TEST_P(CronetBidirectionalStreamTest, SimplePostWithFlushAfterOneWrite) {
442 TestBidirectionalStreamCallback test; 434 TestBidirectionalStreamCallback test;
443 test.AddWriteData("Test String", false); 435 test.AddWriteData("Test String", false);
444 test.AddWriteData("1234567890", false); 436 test.AddWriteData("1234567890", false);
445 test.AddWriteData("woot!", true); 437 test.AddWriteData("woot!", true);
446 test.stream = 438 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
447 cronet_bidirectional_stream_create(engine(), &test, test.callback());
448 DCHECK(test.stream); 439 DCHECK(test.stream);
449 cronet_bidirectional_stream_disable_auto_flush(test.stream, true); 440 bidirectional_stream_disable_auto_flush(test.stream, true);
450 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 441 bidirectional_stream_delay_request_headers_until_flush(test.stream,
451 GetParam()); 442 GetParam());
452 // Flush before start is ignored. 443 // Flush before start is ignored.
453 cronet_bidirectional_stream_flush(test.stream); 444 bidirectional_stream_flush(test.stream);
454 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST", 445 bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST",
455 &kTestHeadersArray, false); 446 &kTestHeadersArray, false);
456 test.BlockForDone(); 447 test.BlockForDone();
457 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]); 448 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]);
458 ASSERT_EQ(std::string(kHelloHeaderValue), 449 ASSERT_EQ(std::string(kHelloHeaderValue),
459 test.response_headers[kHelloHeaderName]); 450 test.response_headers[kHelloHeaderName]);
460 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step); 451 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step);
461 ASSERT_EQ(std::string(kHelloBodyValue), base::JoinString(test.read_data, "")); 452 ASSERT_EQ(std::string(kHelloBodyValue), base::JoinString(test.read_data, ""));
462 ASSERT_EQ(std::string(kHelloTrailerValue), 453 ASSERT_EQ(std::string(kHelloTrailerValue),
463 test.response_trailers[kHelloTrailerName]); 454 test.response_trailers[kHelloTrailerName]);
464 // Flush after done is ignored. 455 // Flush after done is ignored.
465 cronet_bidirectional_stream_flush(test.stream); 456 bidirectional_stream_flush(test.stream);
466 cronet_bidirectional_stream_destroy(test.stream); 457 bidirectional_stream_destroy(test.stream);
467 } 458 }
468 459
469 TEST_P(CronetBidirectionalStreamTest, TestDelayedFlush) { 460 TEST_P(CronetBidirectionalStreamTest, TestDelayedFlush) {
470 class CustomTestBidirectionalStreamCallback 461 class CustomTestBidirectionalStreamCallback
471 : public TestBidirectionalStreamCallback { 462 : public TestBidirectionalStreamCallback {
472 void MaybeWriteNextData(cronet_bidirectional_stream* stream) override { 463 void MaybeWriteNextData(bidirectional_stream* stream) override {
473 DCHECK_EQ(stream, this->stream); 464 DCHECK_EQ(stream, this->stream);
474 if (write_data.empty()) 465 if (write_data.empty())
475 return; 466 return;
476 // Write all buffers when stream is ready. 467 // Write all buffers when stream is ready.
477 // Flush after "3" and "5". 468 // Flush after "3" and "5".
478 // EndOfStream is set with "6" but not flushed, so it is not sent. 469 // EndOfStream is set with "6" but not flushed, so it is not sent.
479 if (write_data.front()->buffer == "1") { 470 if (write_data.front()->buffer == "1") {
480 for (const auto& data : write_data) { 471 for (const auto& data : write_data) {
481 cronet_bidirectional_stream_write(stream, data->buffer.c_str(), 472 bidirectional_stream_write(stream, data->buffer.c_str(),
482 data->buffer.size(), 473 data->buffer.size(),
483 data == write_data.back()); 474 data == write_data.back());
484 if (data->flush) { 475 if (data->flush) {
485 cronet_bidirectional_stream_flush(stream); 476 bidirectional_stream_flush(stream);
486 } 477 }
487 } 478 }
488 } 479 }
489 // Flush the final buffer with endOfStream flag. 480 // Flush the final buffer with endOfStream flag.
490 if (write_data.front()->buffer == "6") 481 if (write_data.front()->buffer == "6")
491 cronet_bidirectional_stream_flush(stream); 482 bidirectional_stream_flush(stream);
492 } 483 }
493 }; 484 };
494 485
495 CustomTestBidirectionalStreamCallback test; 486 CustomTestBidirectionalStreamCallback test;
496 test.AddWriteData("1", false); 487 test.AddWriteData("1", false);
497 test.AddWriteData("2", false); 488 test.AddWriteData("2", false);
498 test.AddWriteData("3", true); 489 test.AddWriteData("3", true);
499 test.AddWriteData("4", false); 490 test.AddWriteData("4", false);
500 test.AddWriteData("5", true); 491 test.AddWriteData("5", true);
501 test.AddWriteData("6", false); 492 test.AddWriteData("6", false);
502 test.stream = 493 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
503 cronet_bidirectional_stream_create(engine(), &test, test.callback());
504 DCHECK(test.stream); 494 DCHECK(test.stream);
505 cronet_bidirectional_stream_disable_auto_flush(test.stream, true); 495 bidirectional_stream_disable_auto_flush(test.stream, true);
506 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 496 bidirectional_stream_delay_request_headers_until_flush(test.stream,
507 GetParam()); 497 GetParam());
508 // Flush before start is ignored. 498 // Flush before start is ignored.
509 cronet_bidirectional_stream_flush(test.stream); 499 bidirectional_stream_flush(test.stream);
510 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST", 500 bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST",
511 &kTestHeadersArray, false); 501 &kTestHeadersArray, false);
512 test.BlockForDone(); 502 test.BlockForDone();
513 // Flush after done is ignored. 503 // Flush after done is ignored.
514 cronet_bidirectional_stream_flush(test.stream); 504 bidirectional_stream_flush(test.stream);
515 cronet_bidirectional_stream_destroy(test.stream); 505 bidirectional_stream_destroy(test.stream);
516 } 506 }
517 507
518 TEST_P(CronetBidirectionalStreamTest, CancelOnRead) { 508 TEST_P(CronetBidirectionalStreamTest, CancelOnRead) {
519 TestBidirectionalStreamCallback test; 509 TestBidirectionalStreamCallback test;
520 test.stream = 510 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
521 cronet_bidirectional_stream_create(engine(), &test, test.callback());
522 DCHECK(test.stream); 511 DCHECK(test.stream);
523 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 512 bidirectional_stream_delay_request_headers_until_flush(test.stream,
524 GetParam()); 513 GetParam());
525 test.cancel_from_step = TestBidirectionalStreamCallback::ON_READ_COMPLETED; 514 test.cancel_from_step = TestBidirectionalStreamCallback::ON_READ_COMPLETED;
526 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST", 515 bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST",
527 &kTestHeadersArray, true); 516 &kTestHeadersArray, true);
528 test.BlockForDone(); 517 test.BlockForDone();
529 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]); 518 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]);
530 ASSERT_EQ(std::string(kHelloBodyValue), test.read_data.front()); 519 ASSERT_EQ(std::string(kHelloBodyValue), test.read_data.front());
531 ASSERT_EQ(TestBidirectionalStreamCallback::ON_CANCELED, test.response_step); 520 ASSERT_EQ(TestBidirectionalStreamCallback::ON_CANCELED, test.response_step);
532 cronet_bidirectional_stream_destroy(test.stream); 521 bidirectional_stream_destroy(test.stream);
533 } 522 }
534 523
535 TEST_P(CronetBidirectionalStreamTest, CancelOnResponse) { 524 TEST_P(CronetBidirectionalStreamTest, CancelOnResponse) {
536 TestBidirectionalStreamCallback test; 525 TestBidirectionalStreamCallback test;
537 test.stream = 526 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
538 cronet_bidirectional_stream_create(engine(), &test, test.callback());
539 DCHECK(test.stream); 527 DCHECK(test.stream);
540 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 528 bidirectional_stream_delay_request_headers_until_flush(test.stream,
541 GetParam()); 529 GetParam());
542 test.cancel_from_step = TestBidirectionalStreamCallback::ON_RESPONSE_STARTED; 530 test.cancel_from_step = TestBidirectionalStreamCallback::ON_RESPONSE_STARTED;
543 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST", 531 bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST",
544 &kTestHeadersArray, true); 532 &kTestHeadersArray, true);
545 test.BlockForDone(); 533 test.BlockForDone();
546 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]); 534 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]);
547 ASSERT_TRUE(test.read_data.empty()); 535 ASSERT_TRUE(test.read_data.empty());
548 ASSERT_EQ(TestBidirectionalStreamCallback::ON_CANCELED, test.response_step); 536 ASSERT_EQ(TestBidirectionalStreamCallback::ON_CANCELED, test.response_step);
549 cronet_bidirectional_stream_destroy(test.stream); 537 bidirectional_stream_destroy(test.stream);
550 } 538 }
551 539
552 TEST_P(CronetBidirectionalStreamTest, CancelOnSucceeded) { 540 TEST_P(CronetBidirectionalStreamTest, CancelOnSucceeded) {
553 TestBidirectionalStreamCallback test; 541 TestBidirectionalStreamCallback test;
554 test.stream = 542 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
555 cronet_bidirectional_stream_create(engine(), &test, test.callback());
556 DCHECK(test.stream); 543 DCHECK(test.stream);
557 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 544 bidirectional_stream_delay_request_headers_until_flush(test.stream,
558 GetParam()); 545 GetParam());
559 test.cancel_from_step = TestBidirectionalStreamCallback::ON_SUCCEEDED; 546 test.cancel_from_step = TestBidirectionalStreamCallback::ON_SUCCEEDED;
560 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST", 547 bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST",
561 &kTestHeadersArray, true); 548 &kTestHeadersArray, true);
562 test.BlockForDone(); 549 test.BlockForDone();
563 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]); 550 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]);
564 ASSERT_EQ(std::string(kHelloBodyValue), test.read_data.front()); 551 ASSERT_EQ(std::string(kHelloBodyValue), test.read_data.front());
565 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step); 552 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step);
566 cronet_bidirectional_stream_destroy(test.stream); 553 bidirectional_stream_destroy(test.stream);
567 } 554 }
568 555
569 TEST_P(CronetBidirectionalStreamTest, ReadFailsBeforeRequestStarted) { 556 TEST_P(CronetBidirectionalStreamTest, ReadFailsBeforeRequestStarted) {
570 TestBidirectionalStreamCallback test; 557 TestBidirectionalStreamCallback test;
571 test.stream = 558 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
572 cronet_bidirectional_stream_create(engine(), &test, test.callback());
573 DCHECK(test.stream); 559 DCHECK(test.stream);
574 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 560 bidirectional_stream_delay_request_headers_until_flush(test.stream,
575 GetParam()); 561 GetParam());
576 char read_buffer[1]; 562 char read_buffer[1];
577 cronet_bidirectional_stream_read(test.stream, read_buffer, 563 bidirectional_stream_read(test.stream, read_buffer, sizeof(read_buffer));
578 sizeof(read_buffer));
579 test.BlockForDone(); 564 test.BlockForDone();
580 ASSERT_TRUE(test.read_data.empty()); 565 ASSERT_TRUE(test.read_data.empty());
581 ASSERT_EQ(TestBidirectionalStreamCallback::ON_FAILED, test.response_step); 566 ASSERT_EQ(TestBidirectionalStreamCallback::ON_FAILED, test.response_step);
582 ASSERT_EQ(net::ERR_UNEXPECTED, test.net_error); 567 ASSERT_EQ(net::ERR_UNEXPECTED, test.net_error);
583 cronet_bidirectional_stream_destroy(test.stream); 568 bidirectional_stream_destroy(test.stream);
584 } 569 }
585 570
586 TEST_P(CronetBidirectionalStreamTest, 571 TEST_P(CronetBidirectionalStreamTest,
587 StreamFailBeforeReadIsExecutedOnNetworkThread) { 572 StreamFailBeforeReadIsExecutedOnNetworkThread) {
588 class CustomTestBidirectionalStreamCallback 573 class CustomTestBidirectionalStreamCallback
589 : public TestBidirectionalStreamCallback { 574 : public TestBidirectionalStreamCallback {
590 bool MaybeCancel(cronet_bidirectional_stream* stream, 575 bool MaybeCancel(bidirectional_stream* stream, ResponseStep step) override {
591 ResponseStep step) override {
592 if (step == ResponseStep::ON_READ_COMPLETED) { 576 if (step == ResponseStep::ON_READ_COMPLETED) {
593 // Shut down the server, and the stream should error out. 577 // Shut down the server, and the stream should error out.
594 // The second call to ShutdownQuicTestServer is no-op. 578 // The second call to ShutdownQuicTestServer is no-op.
595 ShutdownQuicTestServer(); 579 ShutdownQuicTestServer();
596 } 580 }
597 return TestBidirectionalStreamCallback::MaybeCancel(stream, step); 581 return TestBidirectionalStreamCallback::MaybeCancel(stream, step);
598 } 582 }
599 }; 583 };
600 584
601 CustomTestBidirectionalStreamCallback test; 585 CustomTestBidirectionalStreamCallback test;
602 test.AddWriteData("Hello, "); 586 test.AddWriteData("Hello, ");
603 test.AddWriteData("world!"); 587 test.AddWriteData("world!");
604 test.read_buffer_size = 2; 588 test.read_buffer_size = 2;
605 test.stream = 589 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
606 cronet_bidirectional_stream_create(engine(), &test, test.callback());
607 DCHECK(test.stream); 590 DCHECK(test.stream);
608 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 591 bidirectional_stream_delay_request_headers_until_flush(test.stream,
609 GetParam()); 592 GetParam());
610 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST", 593 bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST",
611 &kTestHeadersArray, false); 594 &kTestHeadersArray, false);
612 test.BlockForDone(); 595 test.BlockForDone();
613 ASSERT_EQ(TestBidirectionalStreamCallback::ON_FAILED, test.response_step); 596 ASSERT_EQ(TestBidirectionalStreamCallback::ON_FAILED, test.response_step);
614 ASSERT_EQ(net::ERR_QUIC_PROTOCOL_ERROR, test.net_error); 597 ASSERT_EQ(net::ERR_QUIC_PROTOCOL_ERROR, test.net_error);
615 cronet_bidirectional_stream_destroy(test.stream); 598 bidirectional_stream_destroy(test.stream);
616 } 599 }
617 600
618 TEST_P(CronetBidirectionalStreamTest, WriteFailsBeforeRequestStarted) { 601 TEST_P(CronetBidirectionalStreamTest, WriteFailsBeforeRequestStarted) {
619 TestBidirectionalStreamCallback test; 602 TestBidirectionalStreamCallback test;
620 test.stream = 603 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
621 cronet_bidirectional_stream_create(engine(), &test, test.callback());
622 DCHECK(test.stream); 604 DCHECK(test.stream);
623 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 605 bidirectional_stream_delay_request_headers_until_flush(test.stream,
624 GetParam()); 606 GetParam());
625 cronet_bidirectional_stream_write(test.stream, "1", 1, false); 607 bidirectional_stream_write(test.stream, "1", 1, false);
626 test.BlockForDone(); 608 test.BlockForDone();
627 ASSERT_TRUE(test.read_data.empty()); 609 ASSERT_TRUE(test.read_data.empty());
628 ASSERT_EQ(TestBidirectionalStreamCallback::ON_FAILED, test.response_step); 610 ASSERT_EQ(TestBidirectionalStreamCallback::ON_FAILED, test.response_step);
629 ASSERT_EQ(net::ERR_UNEXPECTED, test.net_error); 611 ASSERT_EQ(net::ERR_UNEXPECTED, test.net_error);
630 cronet_bidirectional_stream_destroy(test.stream); 612 bidirectional_stream_destroy(test.stream);
631 } 613 }
632 614
633 TEST_P(CronetBidirectionalStreamTest, StreamFailAfterStreamReadyCallback) { 615 TEST_P(CronetBidirectionalStreamTest, StreamFailAfterStreamReadyCallback) {
634 class CustomTestBidirectionalStreamCallback 616 class CustomTestBidirectionalStreamCallback
635 : public TestBidirectionalStreamCallback { 617 : public TestBidirectionalStreamCallback {
636 bool MaybeCancel(cronet_bidirectional_stream* stream, 618 bool MaybeCancel(bidirectional_stream* stream, ResponseStep step) override {
637 ResponseStep step) override {
638 if (step == ResponseStep::ON_STREAM_READY) { 619 if (step == ResponseStep::ON_STREAM_READY) {
639 // Shut down the server, and the stream should error out. 620 // Shut down the server, and the stream should error out.
640 // The second call to ShutdownQuicTestServer is no-op. 621 // The second call to ShutdownQuicTestServer is no-op.
641 ShutdownQuicTestServer(); 622 ShutdownQuicTestServer();
642 } 623 }
643 return TestBidirectionalStreamCallback::MaybeCancel(stream, step); 624 return TestBidirectionalStreamCallback::MaybeCancel(stream, step);
644 } 625 }
645 }; 626 };
646 627
647 CustomTestBidirectionalStreamCallback test; 628 CustomTestBidirectionalStreamCallback test;
648 test.AddWriteData("Test String"); 629 test.AddWriteData("Test String");
649 test.stream = 630 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
650 cronet_bidirectional_stream_create(engine(), &test, test.callback());
651 DCHECK(test.stream); 631 DCHECK(test.stream);
652 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 632 bidirectional_stream_delay_request_headers_until_flush(test.stream,
653 GetParam()); 633 GetParam());
654 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST", 634 bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST",
655 &kTestHeadersArray, false); 635 &kTestHeadersArray, false);
656 test.BlockForDone(); 636 test.BlockForDone();
657 ASSERT_EQ(TestBidirectionalStreamCallback::ON_FAILED, test.response_step); 637 ASSERT_EQ(TestBidirectionalStreamCallback::ON_FAILED, test.response_step);
658 ASSERT_TRUE(test.net_error == net::ERR_QUIC_PROTOCOL_ERROR || 638 ASSERT_TRUE(test.net_error == net::ERR_QUIC_PROTOCOL_ERROR ||
659 test.net_error == net::ERR_QUIC_HANDSHAKE_FAILED); 639 test.net_error == net::ERR_QUIC_HANDSHAKE_FAILED);
660 cronet_bidirectional_stream_destroy(test.stream); 640 bidirectional_stream_destroy(test.stream);
661 } 641 }
662 642
663 TEST_P(CronetBidirectionalStreamTest, 643 TEST_P(CronetBidirectionalStreamTest,
664 StreamFailBeforeWriteIsExecutedOnNetworkThread) { 644 StreamFailBeforeWriteIsExecutedOnNetworkThread) {
665 class CustomTestBidirectionalStreamCallback 645 class CustomTestBidirectionalStreamCallback
666 : public TestBidirectionalStreamCallback { 646 : public TestBidirectionalStreamCallback {
667 bool MaybeCancel(cronet_bidirectional_stream* stream, 647 bool MaybeCancel(bidirectional_stream* stream, ResponseStep step) override {
668 ResponseStep step) override {
669 if (step == ResponseStep::ON_WRITE_COMPLETED) { 648 if (step == ResponseStep::ON_WRITE_COMPLETED) {
670 // Shut down the server, and the stream should error out. 649 // Shut down the server, and the stream should error out.
671 // The second call to ShutdownQuicTestServer is no-op. 650 // The second call to ShutdownQuicTestServer is no-op.
672 ShutdownQuicTestServer(); 651 ShutdownQuicTestServer();
673 } 652 }
674 return TestBidirectionalStreamCallback::MaybeCancel(stream, step); 653 return TestBidirectionalStreamCallback::MaybeCancel(stream, step);
675 } 654 }
676 }; 655 };
677 656
678 CustomTestBidirectionalStreamCallback test; 657 CustomTestBidirectionalStreamCallback test;
679 test.AddWriteData("Test String"); 658 test.AddWriteData("Test String");
680 test.AddWriteData("1234567890"); 659 test.AddWriteData("1234567890");
681 test.AddWriteData("woot!"); 660 test.AddWriteData("woot!");
682 test.stream = 661 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
683 cronet_bidirectional_stream_create(engine(), &test, test.callback());
684 DCHECK(test.stream); 662 DCHECK(test.stream);
685 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 663 bidirectional_stream_delay_request_headers_until_flush(test.stream,
686 GetParam()); 664 GetParam());
687 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST", 665 bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST",
688 &kTestHeadersArray, false); 666 &kTestHeadersArray, false);
689 test.BlockForDone(); 667 test.BlockForDone();
690 ASSERT_EQ(TestBidirectionalStreamCallback::ON_FAILED, test.response_step); 668 ASSERT_EQ(TestBidirectionalStreamCallback::ON_FAILED, test.response_step);
691 ASSERT_TRUE(test.net_error == net::ERR_QUIC_PROTOCOL_ERROR || 669 ASSERT_TRUE(test.net_error == net::ERR_QUIC_PROTOCOL_ERROR ||
692 test.net_error == net::ERR_QUIC_HANDSHAKE_FAILED); 670 test.net_error == net::ERR_QUIC_HANDSHAKE_FAILED);
693 cronet_bidirectional_stream_destroy(test.stream); 671 bidirectional_stream_destroy(test.stream);
694 } 672 }
695 673
696 TEST_P(CronetBidirectionalStreamTest, FailedResolution) { 674 TEST_P(CronetBidirectionalStreamTest, FailedResolution) {
697 TestBidirectionalStreamCallback test; 675 TestBidirectionalStreamCallback test;
698 test.stream = 676 test.stream = bidirectional_stream_create(engine(), &test, test.callback());
699 cronet_bidirectional_stream_create(engine(), &test, test.callback());
700 DCHECK(test.stream); 677 DCHECK(test.stream);
701 cronet_bidirectional_stream_delay_request_headers_until_flush(test.stream, 678 bidirectional_stream_delay_request_headers_until_flush(test.stream,
702 GetParam()); 679 GetParam());
703 test.cancel_from_step = TestBidirectionalStreamCallback::ON_FAILED; 680 test.cancel_from_step = TestBidirectionalStreamCallback::ON_FAILED;
704 cronet_bidirectional_stream_start(test.stream, "https://notfound.example.com", 681 bidirectional_stream_start(test.stream, "https://notfound.example.com", 0,
705 0, "GET", &kTestHeadersArray, true); 682 "GET", &kTestHeadersArray, true);
706 test.BlockForDone(); 683 test.BlockForDone();
707 ASSERT_TRUE(test.read_data.empty()); 684 ASSERT_TRUE(test.read_data.empty());
708 ASSERT_EQ(TestBidirectionalStreamCallback::ON_FAILED, test.response_step); 685 ASSERT_EQ(TestBidirectionalStreamCallback::ON_FAILED, test.response_step);
709 ASSERT_EQ(net::ERR_NAME_NOT_RESOLVED, test.net_error); 686 ASSERT_EQ(net::ERR_NAME_NOT_RESOLVED, test.net_error);
710 cronet_bidirectional_stream_destroy(test.stream); 687 bidirectional_stream_destroy(test.stream);
711 } 688 }
712 689
713 INSTANTIATE_TEST_CASE_P(CronetBidirectionalStreamDelayRequestHeadersUntilFlush, 690 INSTANTIATE_TEST_CASE_P(CronetBidirectionalStreamDelayRequestHeadersUntilFlush,
714 CronetBidirectionalStreamTest, 691 CronetBidirectionalStreamTest,
715 ::testing::Values(true, false)); 692 ::testing::Values(true, false));
716 693
717 } // namespace cronet 694 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698