url_request_job_unittest.cc revision 010d83a9304c5a91596085d917d248abff47903a
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/url_request/url_request_job.h"
6
7#include "base/run_loop.h"
8#include "net/base/request_priority.h"
9#include "net/http/http_transaction_unittest.h"
10#include "net/url_request/url_request_test_util.h"
11#include "testing/gtest/include/gtest/gtest.h"
12
13namespace net {
14
15namespace {
16
17// This is a header that signals the end of the data.
18const char kGzipData[] = "\x1f\x08b\x08\0\0\0\0\0\0\3\3\0\0\0\0\0\0\0\0";
19const char kGzipDataWithName[] =
20    "\x1f\x08b\x08\x08\0\0\0\0\0\0name\0\3\0\0\0\0\0\0\0\0";
21
22void GZipServer(const HttpRequestInfo* request,
23                std::string* response_status,
24                std::string* response_headers,
25                std::string* response_data) {
26  response_data->assign(kGzipData, sizeof(kGzipData));
27}
28
29void BigGZipServer(const HttpRequestInfo* request,
30                   std::string* response_status,
31                   std::string* response_headers,
32                   std::string* response_data) {
33  response_data->assign(kGzipDataWithName, sizeof(kGzipDataWithName));
34  response_data->insert(10, 64 * 1024, 'a');
35}
36
37const MockTransaction kGZip_Transaction = {
38    "http://www.google.com/gzyp",
39    "GET",
40    base::Time(),
41    "",
42    LOAD_NORMAL,
43    "HTTP/1.1 200 OK",
44    "Cache-Control: max-age=10000\n"
45    "Content-Encoding: gzip\n"
46    "Content-Length: 30\n",  // Intentionally wrong.
47    base::Time(),
48    "",
49    TEST_MODE_NORMAL,
50    &GZipServer,
51    0,
52    OK
53};
54
55const MockTransaction kRedirect_Transaction = {
56    "http://www.google.com/redirect",
57    "GET",
58    base::Time(),
59    "",
60    LOAD_NORMAL,
61    "HTTP/1.1 302 Found",
62    "Cache-Control: max-age=10000\n"
63    "Location: http://www.google.com/destination\n"
64    "Content-Length: 5\n",
65    base::Time(),
66    "hello",
67    TEST_MODE_NORMAL,
68    NULL,
69    0,
70    OK
71};
72
73}  // namespace
74
75TEST(URLRequestJob, TransactionNotifiedWhenDone) {
76  MockNetworkLayer network_layer;
77  TestURLRequestContext context;
78  context.set_http_transaction_factory(&network_layer);
79
80  TestDelegate d;
81  TestURLRequest req(
82      GURL(kGZip_Transaction.url), DEFAULT_PRIORITY, &d, &context);
83  AddMockTransaction(&kGZip_Transaction);
84
85  req.set_method("GET");
86  req.Start();
87
88  base::MessageLoop::current()->Run();
89
90  EXPECT_TRUE(network_layer.done_reading_called());
91
92  RemoveMockTransaction(&kGZip_Transaction);
93}
94
95TEST(URLRequestJob, SyncTransactionNotifiedWhenDone) {
96  MockNetworkLayer network_layer;
97  TestURLRequestContext context;
98  context.set_http_transaction_factory(&network_layer);
99
100  TestDelegate d;
101  TestURLRequest req(
102      GURL(kGZip_Transaction.url), DEFAULT_PRIORITY, &d, &context);
103  MockTransaction transaction(kGZip_Transaction);
104  transaction.test_mode = TEST_MODE_SYNC_ALL;
105  AddMockTransaction(&transaction);
106
107  req.set_method("GET");
108  req.Start();
109
110  base::RunLoop().Run();
111
112  EXPECT_TRUE(network_layer.done_reading_called());
113
114  RemoveMockTransaction(&transaction);
115}
116
117// Tests processing a large gzip header one byte at a time.
118TEST(URLRequestJob, SyncSlowTransaction) {
119  MockNetworkLayer network_layer;
120  TestURLRequestContext context;
121  context.set_http_transaction_factory(&network_layer);
122
123  TestDelegate d;
124  TestURLRequest req(
125      GURL(kGZip_Transaction.url), DEFAULT_PRIORITY, &d, &context);
126  MockTransaction transaction(kGZip_Transaction);
127  transaction.test_mode = TEST_MODE_SYNC_ALL | TEST_MODE_SLOW_READ;
128  transaction.handler = &BigGZipServer;
129  AddMockTransaction(&transaction);
130
131  req.set_method("GET");
132  req.Start();
133
134  base::RunLoop().Run();
135
136  EXPECT_TRUE(network_layer.done_reading_called());
137
138  RemoveMockTransaction(&transaction);
139}
140
141TEST(URLRequestJob, RedirectTransactionNotifiedWhenDone) {
142  MockNetworkLayer network_layer;
143  TestURLRequestContext context;
144  context.set_http_transaction_factory(&network_layer);
145
146  TestDelegate d;
147  TestURLRequest req(
148      GURL(kRedirect_Transaction.url), DEFAULT_PRIORITY, &d, &context);
149  AddMockTransaction(&kRedirect_Transaction);
150
151  req.set_method("GET");
152  req.Start();
153
154  base::RunLoop().Run();
155
156  EXPECT_TRUE(network_layer.done_reading_called());
157
158  RemoveMockTransaction(&kRedirect_Transaction);
159}
160
161TEST(URLRequestJob, TransactionNotCachedWhenNetworkDelegateRedirects) {
162  MockNetworkLayer network_layer;
163  TestNetworkDelegate network_delegate;
164  network_delegate.set_redirect_on_headers_received_url(GURL("http://foo"));
165  TestURLRequestContext context;
166  context.set_http_transaction_factory(&network_layer);
167  context.set_network_delegate(&network_delegate);
168
169  TestDelegate d;
170  TestURLRequest req(GURL(kGZip_Transaction.url), DEFAULT_PRIORITY, &d,
171                     &context);
172  AddMockTransaction(&kGZip_Transaction);
173
174  req.set_method("GET");
175  req.Start();
176
177  base::RunLoop().Run();
178
179  EXPECT_TRUE(network_layer.stop_caching_called());
180
181  RemoveMockTransaction(&kGZip_Transaction);
182}
183
184}  // namespace net
185