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

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

Issue 1892423002: [Cronet] Add Hello World response to QuicTestServer and use it in bidirectional stream test. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@cronet7
Patch Set: Remove duplicates, add cronet namespace to test. Created 4 years, 8 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
« no previous file with comments | « no previous file | components/cronet/ios/test/quic_test_server.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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>
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/strings/string_util.h" 13 #include "base/strings/string_util.h"
14 #include "base/strings/sys_string_conversions.h" 14 #include "base/strings/sys_string_conversions.h"
15 #include "base/synchronization/waitable_event.h" 15 #include "base/synchronization/waitable_event.h"
16 #include "components/cronet/ios/cronet_c_for_grpc.h" 16 #include "components/cronet/ios/cronet_c_for_grpc.h"
17 #include "components/cronet/ios/cronet_environment.h" 17 #include "components/cronet/ios/cronet_environment.h"
18 #include "components/cronet/ios/test/quic_test_server.h" 18 #include "components/cronet/ios/test/quic_test_server.h"
19 #include "net/base/mac/url_conversions.h" 19 #include "net/base/mac/url_conversions.h"
20 #include "net/base/net_errors.h" 20 #include "net/base/net_errors.h"
21 #include "net/base/test_data_directory.h" 21 #include "net/base/test_data_directory.h"
22 #include "net/cert/mock_cert_verifier.h" 22 #include "net/cert/mock_cert_verifier.h"
23 #include "testing/gtest/include/gtest/gtest.h" 23 #include "testing/gtest/include/gtest/gtest.h"
24 #include "testing/gtest_mac.h" 24 #include "testing/gtest_mac.h"
25 #include "url/gurl.h" 25 #include "url/gurl.h"
26 26
27 namespace { 27 namespace {
28 const char kTestServerHost[] = "test.example.com";
29 const int kTestServerPort = 6121;
30 const char kTestServerUrl[] = "https://test.example.com:6121";
31 28
32 cronet_bidirectional_stream_header kTestHeaders[] = { 29 cronet_bidirectional_stream_header kTestHeaders[] = {
33 {"header1", "foo"}, 30 {"header1", "foo"},
34 {"header2", "bar"}, 31 {"header2", "bar"},
35 }; 32 };
36 const cronet_bidirectional_stream_header_array kTestHeadersArray = { 33 const cronet_bidirectional_stream_header_array kTestHeadersArray = {
37 2, 2, kTestHeaders}; 34 2, 2, kTestHeaders};
38 } // namespace 35 } // namespace
39 36
37 namespace cronet {
38
40 class CronetBidirectionalStreamTest : public ::testing::Test { 39 class CronetBidirectionalStreamTest : public ::testing::Test {
41 protected: 40 protected:
42 CronetBidirectionalStreamTest() {} 41 CronetBidirectionalStreamTest() {}
43 ~CronetBidirectionalStreamTest() override {} 42 ~CronetBidirectionalStreamTest() override {}
44 43
45 void SetUp() override { 44 void SetUp() override {
46 static bool initialized = false; 45 static bool initialized = false;
47 if (!initialized) { 46 if (!initialized) {
48 initialized = true; 47 initialized = true;
49 // Hack to work around issues with SetUp being called multiple times 48 // Hack to work around issues with SetUp being called multiple times
50 // during the test, and QuicTestServer not shutting down / restarting 49 // during the test, and QuicTestServer not shutting down / restarting
51 // gracefully. 50 // gracefully.
52 cronet::CronetEnvironment::Initialize(); 51 CronetEnvironment::Initialize();
53 cronet::StartQuicTestServer(); 52 StartQuicTestServer();
54 } 53 }
55 54
56 cronet_environment_ = new cronet::CronetEnvironment("CronetTest/1.0.0.0"); 55 cronet_environment_ = new CronetEnvironment("CronetTest/1.0.0.0");
57 cronet_environment_->set_http2_enabled(true); 56 cronet_environment_->set_http2_enabled(true);
58 cronet_environment_->set_quic_enabled(true); 57 cronet_environment_->set_quic_enabled(true);
59 cronet_environment_->set_ssl_key_log_file_name("SSLKEYLOGFILE"); 58 cronet_environment_->set_ssl_key_log_file_name("SSLKEYLOGFILE");
60 59
61 scoped_ptr<net::MockCertVerifier> mock_cert_verifier( 60 scoped_ptr<net::MockCertVerifier> mock_cert_verifier(
62 new net::MockCertVerifier()); 61 new net::MockCertVerifier());
63 mock_cert_verifier->set_default_result(net::OK); 62 mock_cert_verifier->set_default_result(net::OK);
64 63
65 cronet_environment_->set_cert_verifier(std::move(mock_cert_verifier)); 64 cronet_environment_->set_cert_verifier(std::move(mock_cert_verifier));
66 cronet_environment_->set_host_resolver_rules( 65 cronet_environment_->set_host_resolver_rules(
67 "MAP test.example.com 127.0.0.1," 66 "MAP test.example.com 127.0.0.1,"
68 "MAP notfound.example.com ~NOTFOUND"); 67 "MAP notfound.example.com ~NOTFOUND");
69 cronet_environment_->AddQuicHint(kTestServerHost, kTestServerPort, 68 cronet_environment_->AddQuicHint(kTestServerDomain, kTestServerPort,
70 kTestServerPort); 69 kTestServerPort);
71 70
72 cronet_environment_->Start(); 71 cronet_environment_->Start();
73 72
74 cronet_engine_.obj = cronet_environment_; 73 cronet_engine_.obj = cronet_environment_;
75 74
76 cronet_environment_->StartNetLog("cronet_netlog.json", true); 75 cronet_environment_->StartNetLog("cronet_netlog.json", true);
77 } 76 }
78 77
79 void TearDown() override { 78 void TearDown() override {
80 // cronet::ShutdownQuicTestServer(); 79 // ShutdownQuicTestServer();
81 cronet_environment_->StopNetLog(); 80 cronet_environment_->StopNetLog();
82 //[CronetEngine stopNetLog]; 81 //[CronetEngine stopNetLog];
83 //[CronetEngine uninstall]; 82 //[CronetEngine uninstall];
84 } 83 }
85 84
86 cronet_engine* engine() { return &cronet_engine_; } 85 cronet_engine* engine() { return &cronet_engine_; }
87 86
88 private: 87 private:
89 static cronet::CronetEnvironment* cronet_environment_; 88 static CronetEnvironment* cronet_environment_;
90 static cronet_engine cronet_engine_; 89 static cronet_engine cronet_engine_;
91 }; 90 };
92 91
93 cronet::CronetEnvironment* CronetBidirectionalStreamTest::cronet_environment_; 92 CronetEnvironment* CronetBidirectionalStreamTest::cronet_environment_;
94 cronet_engine CronetBidirectionalStreamTest::cronet_engine_; 93 cronet_engine CronetBidirectionalStreamTest::cronet_engine_;
95 94
96 class TestBidirectionalStreamCallback { 95 class TestBidirectionalStreamCallback {
97 public: 96 public:
98 enum ResponseStep { 97 enum ResponseStep {
99 NOTHING, 98 NOTHING,
100 ON_REQUEST_HEADERS_SENT, 99 ON_REQUEST_HEADERS_SENT,
101 ON_RESPONSE_STARTED, 100 ON_RESPONSE_STARTED,
102 ON_READ_COMPLETED, 101 ON_READ_COMPLETED,
103 ON_WRITE_COMPLETED, 102 ON_WRITE_COMPLETED,
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 if (test->MaybeCancel(stream, ON_WRITE_COMPLETED)) 222 if (test->MaybeCancel(stream, ON_WRITE_COMPLETED))
224 return; 223 return;
225 test->write_data.pop_front(); 224 test->write_data.pop_front();
226 test->MaybeWriteNextData(stream); 225 test->MaybeWriteNextData(stream);
227 } 226 }
228 227
229 static void on_response_trailers_received_callback( 228 static void on_response_trailers_received_callback(
230 cronet_bidirectional_stream* stream, 229 cronet_bidirectional_stream* stream,
231 const cronet_bidirectional_stream_header_array* trailers) { 230 const cronet_bidirectional_stream_header_array* trailers) {
232 TestBidirectionalStreamCallback* test = FromStream(stream); 231 TestBidirectionalStreamCallback* test = FromStream(stream);
232 for (size_t i = 0; i < trailers->count; ++i) {
233 test->response_trailers[trailers->headers[i].key] =
kapishnikov 2016/04/26 20:11:50 Is it possible for the response to contain two or
mef 2016/04/26 20:39:21 I just confirmed that I've recalled correctly and
234 trailers->headers[i].value;
235 }
236
233 if (test->MaybeCancel(stream, ON_TRAILERS)) 237 if (test->MaybeCancel(stream, ON_TRAILERS))
234 return; 238 return;
235 } 239 }
236 240
237 static void on_succeded_callback(cronet_bidirectional_stream* stream) { 241 static void on_succeded_callback(cronet_bidirectional_stream* stream) {
238 TestBidirectionalStreamCallback* test = FromStream(stream); 242 TestBidirectionalStreamCallback* test = FromStream(stream);
239 test->MaybeCancel(stream, ON_SUCCEEDED); 243 test->MaybeCancel(stream, ON_SUCCEEDED);
240 test->SignalDone(); 244 test->SignalDone();
241 } 245 }
242 246
(...skipping 29 matching lines...) Expand all
272 TestBidirectionalStreamCallback test; 276 TestBidirectionalStreamCallback test;
273 test.AddWriteData("Hello, "); 277 test.AddWriteData("Hello, ");
274 test.AddWriteData("world!"); 278 test.AddWriteData("world!");
275 test.read_buffer_size = 2; 279 test.read_buffer_size = 2;
276 test.stream = 280 test.stream =
277 cronet_bidirectional_stream_create(engine(), &test, test.callback()); 281 cronet_bidirectional_stream_create(engine(), &test, test.callback());
278 DCHECK(test.stream); 282 DCHECK(test.stream);
279 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST", 283 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST",
280 &kTestHeadersArray, false); 284 &kTestHeadersArray, false);
281 test.BlockForDone(); 285 test.BlockForDone();
282 ASSERT_EQ(std::string("404"), test.response_headers[":status"]); 286 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]);
287 ASSERT_EQ(std::string(kHelloHeaderValue),
288 test.response_headers[kHelloHeaderName]);
283 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step); 289 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step);
284 ASSERT_EQ(std::string("fi"), test.read_data.front()); 290 ASSERT_EQ(std::string(kHelloBodyValue, 2), test.read_data.front());
285 ASSERT_EQ(std::string("file not found"), 291 ASSERT_EQ(std::string(kHelloBodyValue), base::JoinString(test.read_data, ""));
286 base::JoinString(test.read_data, "")); 292 ASSERT_EQ(std::string(kHelloTrailerValue),
293 test.response_trailers[kHelloTrailerName]);
287 cronet_bidirectional_stream_destroy(test.stream); 294 cronet_bidirectional_stream_destroy(test.stream);
288 } 295 }
289 296
290 TEST_F(CronetBidirectionalStreamTest, CancelOnRead) { 297 TEST_F(CronetBidirectionalStreamTest, CancelOnRead) {
291 TestBidirectionalStreamCallback test; 298 TestBidirectionalStreamCallback test;
292 test.stream = 299 test.stream =
293 cronet_bidirectional_stream_create(engine(), &test, test.callback()); 300 cronet_bidirectional_stream_create(engine(), &test, test.callback());
294 DCHECK(test.stream); 301 DCHECK(test.stream);
295 test.cancel_from_step = TestBidirectionalStreamCallback::ON_READ_COMPLETED; 302 test.cancel_from_step = TestBidirectionalStreamCallback::ON_READ_COMPLETED;
296 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST", 303 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST",
297 &kTestHeadersArray, true); 304 &kTestHeadersArray, true);
298 test.BlockForDone(); 305 test.BlockForDone();
299 ASSERT_EQ(std::string("404"), test.response_headers[":status"]); 306 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]);
300 ASSERT_EQ(std::string("file not found"), test.read_data.front()); 307 ASSERT_EQ(std::string(kHelloBodyValue), test.read_data.front());
301 ASSERT_EQ(TestBidirectionalStreamCallback::ON_CANCELED, test.response_step); 308 ASSERT_EQ(TestBidirectionalStreamCallback::ON_CANCELED, test.response_step);
302 cronet_bidirectional_stream_destroy(test.stream); 309 cronet_bidirectional_stream_destroy(test.stream);
303 } 310 }
304 311
305 TEST_F(CronetBidirectionalStreamTest, CancelOnResponse) { 312 TEST_F(CronetBidirectionalStreamTest, CancelOnResponse) {
306 TestBidirectionalStreamCallback test; 313 TestBidirectionalStreamCallback test;
307 test.stream = 314 test.stream =
308 cronet_bidirectional_stream_create(engine(), &test, test.callback()); 315 cronet_bidirectional_stream_create(engine(), &test, test.callback());
309 DCHECK(test.stream); 316 DCHECK(test.stream);
310 test.cancel_from_step = TestBidirectionalStreamCallback::ON_RESPONSE_STARTED; 317 test.cancel_from_step = TestBidirectionalStreamCallback::ON_RESPONSE_STARTED;
311 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST", 318 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST",
312 &kTestHeadersArray, true); 319 &kTestHeadersArray, true);
313 test.BlockForDone(); 320 test.BlockForDone();
314 ASSERT_EQ(std::string("404"), test.response_headers[":status"]); 321 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]);
315 ASSERT_TRUE(test.read_data.empty()); 322 ASSERT_TRUE(test.read_data.empty());
316 ASSERT_EQ(TestBidirectionalStreamCallback::ON_CANCELED, test.response_step); 323 ASSERT_EQ(TestBidirectionalStreamCallback::ON_CANCELED, test.response_step);
317 cronet_bidirectional_stream_destroy(test.stream); 324 cronet_bidirectional_stream_destroy(test.stream);
318 } 325 }
319 326
320 TEST_F(CronetBidirectionalStreamTest, CancelOnSucceeded) { 327 TEST_F(CronetBidirectionalStreamTest, CancelOnSucceeded) {
321 TestBidirectionalStreamCallback test; 328 TestBidirectionalStreamCallback test;
322 test.stream = 329 test.stream =
323 cronet_bidirectional_stream_create(engine(), &test, test.callback()); 330 cronet_bidirectional_stream_create(engine(), &test, test.callback());
324 DCHECK(test.stream); 331 DCHECK(test.stream);
325 test.cancel_from_step = TestBidirectionalStreamCallback::ON_SUCCEEDED; 332 test.cancel_from_step = TestBidirectionalStreamCallback::ON_SUCCEEDED;
326 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST", 333 cronet_bidirectional_stream_start(test.stream, kTestServerUrl, 0, "POST",
327 &kTestHeadersArray, true); 334 &kTestHeadersArray, true);
328 test.BlockForDone(); 335 test.BlockForDone();
329 ASSERT_EQ(std::string("404"), test.response_headers[":status"]); 336 ASSERT_EQ(std::string(kHelloStatus), test.response_headers[kStatusHeader]);
330 ASSERT_EQ(std::string("file not found"), test.read_data.front()); 337 ASSERT_EQ(std::string(kHelloBodyValue), test.read_data.front());
331 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step); 338 ASSERT_EQ(TestBidirectionalStreamCallback::ON_SUCCEEDED, test.response_step);
332 cronet_bidirectional_stream_destroy(test.stream); 339 cronet_bidirectional_stream_destroy(test.stream);
333 } 340 }
334 341
335 TEST_F(CronetBidirectionalStreamTest, ReadFailsBeforeRequestStarted) { 342 TEST_F(CronetBidirectionalStreamTest, ReadFailsBeforeRequestStarted) {
336 TestBidirectionalStreamCallback test; 343 TestBidirectionalStreamCallback test;
337 test.stream = 344 test.stream =
338 cronet_bidirectional_stream_create(engine(), &test, test.callback()); 345 cronet_bidirectional_stream_create(engine(), &test, test.callback());
339 DCHECK(test.stream); 346 DCHECK(test.stream);
340 char read_buffer[1]; 347 char read_buffer[1];
(...skipping 26 matching lines...) Expand all
367 DCHECK(test.stream); 374 DCHECK(test.stream);
368 test.cancel_from_step = TestBidirectionalStreamCallback::ON_FAILED; 375 test.cancel_from_step = TestBidirectionalStreamCallback::ON_FAILED;
369 cronet_bidirectional_stream_start(test.stream, "https://notfound.example.com", 376 cronet_bidirectional_stream_start(test.stream, "https://notfound.example.com",
370 0, "GET", &kTestHeadersArray, true); 377 0, "GET", &kTestHeadersArray, true);
371 test.BlockForDone(); 378 test.BlockForDone();
372 ASSERT_TRUE(test.read_data.empty()); 379 ASSERT_TRUE(test.read_data.empty());
373 ASSERT_EQ(TestBidirectionalStreamCallback::ON_FAILED, test.response_step); 380 ASSERT_EQ(TestBidirectionalStreamCallback::ON_FAILED, test.response_step);
374 ASSERT_EQ(net::ERR_NAME_NOT_RESOLVED, test.net_error); 381 ASSERT_EQ(net::ERR_NAME_NOT_RESOLVED, test.net_error);
375 cronet_bidirectional_stream_destroy(test.stream); 382 cronet_bidirectional_stream_destroy(test.stream);
376 } 383 }
384
385 } // namespace cronet
OLDNEW
« no previous file with comments | « no previous file | components/cronet/ios/test/quic_test_server.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698