Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |