1 // Copyright (c) 2006-2008 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/http/http_transaction_unittest.h"
6
7 #include "base/hash_tables.h"
8 #include "base/message_loop.h"
9 #include "base/string_util.h"
10 #include "net/base/net_errors.h"
11 #include "net/base/load_flags.h"
12 #include "net/disk_cache/disk_cache.h"
13 #include "net/http/http_cache.h"
14 #include "net/http/http_request_info.h"
15 #include "net/http/http_response_info.h"
16 #include "net/http/http_transaction.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18
19 //-----------------------------------------------------------------------------
20 // mock transaction data
21
22 const MockTransaction kSimpleGET_Transaction = {
23 "http://www.google.com/",
24 "GET",
25 base::Time(),
26 "",
27 net::LOAD_NORMAL,
28 "HTTP/1.1 200 OK",
29 "Cache-Control: max-age=10000\n",
30 base::Time(),
31 "<html><body>Google Blah Blah</body></html>",
32 TEST_MODE_NORMAL,
33 NULL,
34 0
35 };
36
37 const MockTransaction kSimplePOST_Transaction = {
38 "http://bugdatabase.com/edit",
39 "POST",
40 base::Time(),
41 "",
42 net::LOAD_NORMAL,
43 "HTTP/1.1 200 OK",
44 "",
45 base::Time(),
46 "<html><body>Google Blah Blah</body></html>",
47 TEST_MODE_NORMAL,
48 NULL,
49 0
50 };
51
52 const MockTransaction kTypicalGET_Transaction = {
53 "http://www.example.com/~foo/bar.html",
54 "GET",
55 base::Time(),
56 "",
57 net::LOAD_NORMAL,
58 "HTTP/1.1 200 OK",
59 "Date: Wed, 28 Nov 2007 09:40:09 GMT\n"
60 "Last-Modified: Wed, 28 Nov 2007 00:40:09 GMT\n",
61 base::Time(),
62 "<html><body>Google Blah Blah</body></html>",
63 TEST_MODE_NORMAL,
64 NULL,
65 0
66 };
67
68 const MockTransaction kETagGET_Transaction = {
69 "http://www.google.com/foopy",
70 "GET",
71 base::Time(),
72 "",
73 net::LOAD_NORMAL,
74 "HTTP/1.1 200 OK",
75 "Cache-Control: max-age=10000\n"
76 "Etag: foopy\n",
77 base::Time(),
78 "<html><body>Google Blah Blah</body></html>",
79 TEST_MODE_NORMAL,
80 NULL,
81 0
82 };
83
84 const MockTransaction kRangeGET_Transaction = {
85 "http://www.google.com/",
86 "GET",
87 base::Time(),
88 "Range: 0-100\r\n",
89 net::LOAD_NORMAL,
90 "HTTP/1.1 200 OK",
91 "Cache-Control: max-age=10000\n",
92 base::Time(),
93 "<html><body>Google Blah Blah</body></html>",
94 TEST_MODE_NORMAL,
95 NULL,
96 0
97 };
98
99 static const MockTransaction* const kBuiltinMockTransactions[] = {
100 &kSimpleGET_Transaction,
101 &kSimplePOST_Transaction,
102 &kTypicalGET_Transaction,
103 &kETagGET_Transaction,
104 &kRangeGET_Transaction
105 };
106
107 typedef base::hash_map<std::string, const MockTransaction*>
108 MockTransactionMap;
109 static MockTransactionMap mock_transactions;
110
AddMockTransaction(const MockTransaction * trans)111 void AddMockTransaction(const MockTransaction* trans) {
112 mock_transactions[GURL(trans->url).spec()] = trans;
113 }
114
RemoveMockTransaction(const MockTransaction * trans)115 void RemoveMockTransaction(const MockTransaction* trans) {
116 mock_transactions.erase(GURL(trans->url).spec());
117 }
118
FindMockTransaction(const GURL & url)119 const MockTransaction* FindMockTransaction(const GURL& url) {
120 // look for overrides:
121 MockTransactionMap::const_iterator it = mock_transactions.find(url.spec());
122 if (it != mock_transactions.end())
123 return it->second;
124
125 // look for builtins:
126 for (size_t i = 0; i < arraysize(kBuiltinMockTransactions); ++i) {
127 if (url == GURL(kBuiltinMockTransactions[i]->url))
128 return kBuiltinMockTransactions[i];
129 }
130 return NULL;
131 }
132
133
134 //-----------------------------------------------------------------------------
135
136 // static
137 int TestTransactionConsumer::quit_counter_ = 0;
138
139
140 //-----------------------------------------------------------------------------
141 // helpers
142
ReadTransaction(net::HttpTransaction * trans,std::string * result)143 int ReadTransaction(net::HttpTransaction* trans, std::string* result) {
144 int rv;
145
146 TestCompletionCallback callback;
147
148 std::string content;
149 do {
150 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(256);
151 rv = trans->Read(buf, 256, &callback);
152 if (rv == net::ERR_IO_PENDING)
153 rv = callback.WaitForResult();
154 if (rv > 0) {
155 content.append(buf->data(), rv);
156 } else if (rv < 0) {
157 return rv;
158 }
159 } while (rv > 0);
160
161 result->swap(content);
162 return net::OK;
163 }
164