1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/cert_verifier.h" 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/mock_host_resolver.h" 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_log.h" 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/ssl_config_service_defaults.h" 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_network_layer.h" 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "net/http/http_network_session.h" 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_transaction_unittest.h" 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/proxy/proxy_service.h" 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/socket/socket_test_util.h" 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "net/spdy/spdy_session_pool.h" 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h" 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/platform_test.h" 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 18731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace net { 19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 20731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace { 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass HttpNetworkLayerTest : public PlatformTest { 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen protected: 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpNetworkLayerTest() 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : proxy_service_(ProxyService::CreateDirect()), 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ssl_config_service_(new SSLConfigServiceDefaults) { 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpNetworkSession::Params session_params; 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen session_params.client_socket_factory = &mock_socket_factory_; 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen session_params.host_resolver = &host_resolver_; 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen session_params.cert_verifier = &cert_verifier_; 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen session_params.proxy_service = proxy_service_; 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen session_params.ssl_config_service = ssl_config_service_; 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen network_session_ = new HttpNetworkSession(session_params); 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen factory_.reset(new HttpNetworkLayer(network_session_)); 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MockClientSocketFactory mock_socket_factory_; 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MockHostResolver host_resolver_; 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CertVerifier cert_verifier_; 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const scoped_refptr<ProxyService> proxy_service_; 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const scoped_refptr<SSLConfigService> ssl_config_service_; 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<HttpNetworkSession> network_session_; 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_ptr<HttpNetworkLayer> factory_; 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(HttpNetworkLayerTest, CreateAndDestroy) { 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_ptr<HttpTransaction> trans; 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int rv = factory_->CreateTransaction(&trans); 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(OK, rv); 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(trans.get() != NULL); 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(HttpNetworkLayerTest, Suspend) { 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_ptr<HttpTransaction> trans; 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int rv = factory_->CreateTransaction(&trans); 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(OK, rv); 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott trans.reset(); 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen factory_->Suspend(true); 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen rv = factory_->CreateTransaction(&trans); 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(ERR_NETWORK_IO_SUSPENDED, rv); 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(trans == NULL); 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen factory_->Suspend(false); 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen rv = factory_->CreateTransaction(&trans); 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(OK, rv); 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(HttpNetworkLayerTest, GET) { 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MockRead data_reads[] = { 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MockRead("HTTP/1.0 200 OK\r\n\r\n"), 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MockRead("hello world"), 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MockRead(false, OK), 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MockWrite data_writes[] = { 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MockWrite("GET / HTTP/1.1\r\n" 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Host: www.google.com\r\n" 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Connection: keep-alive\r\n" 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "User-Agent: Foo/1.0\r\n\r\n"), 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen StaticSocketDataProvider data(data_reads, arraysize(data_reads), 864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch data_writes, arraysize(data_writes)); 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen mock_socket_factory_.AddSocketDataProvider(&data); 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCompletionCallback callback; 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpRequestInfo request_info; 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott request_info.url = GURL("http://www.google.com/"); 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott request_info.method = "GET"; 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen request_info.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Foo/1.0"); 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen request_info.load_flags = LOAD_NORMAL; 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_ptr<HttpTransaction> trans; 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int rv = factory_->CreateTransaction(&trans); 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(OK, rv); 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen rv = trans->Start(&request_info, &callback, BoundNetLog()); 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (rv == ERR_IO_PENDING) 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv = callback.WaitForResult(); 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(OK, rv); 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string contents; 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rv = ReadTransaction(trans.get(), &contents); 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(OK, rv); 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("hello world", contents); 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} // namespace 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} // namespace net 116