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