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

Side by Side Diff: net/http/infinite_cache_unittest.cc

Issue 10909136: Http Cache: Add code for simulating an infinite HTTP cache. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 3 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 | Annotate | Revision Log
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
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 "base/file_util.h"
6 #include "base/scoped_temp_dir.h"
7 #include "base/threading/platform_thread.h"
8 #include "base/time.h"
9 #include "net/base/net_errors.h"
10 #include "net/base/test_completion_callback.h"
11 #include "net/http/infinite_cache.h"
willchan no longer on Chromium 2012/09/10 20:47:05 Move this to the top
12 #include "net/http/http_transaction_unittest.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 using base::Time;
16 using base::TimeDelta;
17 using net::InfiniteCache;
18 using net::InfiniteCacheTransaction;
19
20 namespace {
21
22 void StartRequest(const MockTransaction& http_transaction,
23 InfiniteCacheTransaction* transaction) {
24 scoped_refptr<net::HttpResponseHeaders> headers(
25 new net::HttpResponseHeaders(http_transaction.response_headers));
26 net::HttpResponseInfo response;
27 response.headers = headers;
28 response.request_time = http_transaction.request_time.is_null() ?
29 Time::Now() : http_transaction.request_time;
30 response.response_time = Time::Now();
31
32 MockHttpRequest request(http_transaction);
33 transaction->OnRequestStart(&request);
34 transaction->OnResponseReceived(&response);
35 }
36
37 void ProcessRequest(const MockTransaction& http_transaction,
38 InfiniteCache* cache) {
39 scoped_ptr<InfiniteCacheTransaction> transaction
40 (cache->CreateInfiniteCacheTransaction());
41
42 StartRequest(http_transaction, transaction.get());
43 transaction->OnDataRead(http_transaction.data, strlen(http_transaction.data));
44 }
45
46 void ProcessRequestWithTime(const MockTransaction& http_transaction,
47 InfiniteCache* cache,
48 Time time) {
49 scoped_ptr<InfiniteCacheTransaction> transaction
50 (cache->CreateInfiniteCacheTransaction());
51
52 MockTransaction timed_transaction = http_transaction;
53 timed_transaction.request_time = time;
54 StartRequest(timed_transaction, transaction.get());
55 transaction->OnDataRead(http_transaction.data, strlen(http_transaction.data));
56 }
57
58 } // namespace
59
60 TEST(InfiniteCache, Basics) {
61 InfiniteCache cache;
62 cache.Init(FilePath());
63
64 scoped_ptr<InfiniteCacheTransaction> transaction
65 (cache.CreateInfiniteCacheTransaction());
66
67 // Don't even Start() this transaction.
68 transaction.reset(cache.CreateInfiniteCacheTransaction());
69
70 net::TestCompletionCallback cb;
71 EXPECT_EQ(0, cb.GetResult(cache.QueryItemsForTest(cb.callback())));
72
73 MockHttpRequest request(kTypicalGET_Transaction);
74 transaction->OnRequestStart(&request);
75
76 // Don't have a response yet.
77 transaction.reset(cache.CreateInfiniteCacheTransaction());
78 EXPECT_EQ(0, cb.GetResult(cache.QueryItemsForTest(cb.callback())));
79
80 net::HttpResponseInfo response;
81 scoped_refptr<net::HttpResponseHeaders> headers(
82 new net::HttpResponseHeaders(kTypicalGET_Transaction.response_headers));
83 response.headers = headers;
84
85 transaction->OnRequestStart(&request);
86 transaction->OnResponseReceived(&response);
87 transaction.reset(cache.CreateInfiniteCacheTransaction());
88 EXPECT_EQ(1, cb.GetResult(cache.QueryItemsForTest(cb.callback())));
89
90 // Hit the same URL again.
91 transaction->OnRequestStart(&request);
92 transaction->OnResponseReceived(&response);
93 transaction.reset(cache.CreateInfiniteCacheTransaction());
94 EXPECT_EQ(1, cb.GetResult(cache.QueryItemsForTest(cb.callback())));
95
96 // Now a different URL.
97 MockHttpRequest request2(kSimpleGET_Transaction);
98 transaction->OnRequestStart(&request2);
99 transaction->OnResponseReceived(&response);
100 transaction.reset();
101 EXPECT_EQ(2, cb.GetResult(cache.QueryItemsForTest(cb.callback())));
102 }
103
104 TEST(InfiniteCache, Save_Restore) {
105 ScopedTempDir dir;
106 ASSERT_TRUE(dir.CreateUniqueTempDir());
107 FilePath path = dir.path().Append(FILE_PATH_LITERAL("infinite"));
108
109 scoped_ptr<InfiniteCache> cache(new InfiniteCache);
110 cache->Init(path);
111 net::TestCompletionCallback cb;
112
113 ProcessRequest(kTypicalGET_Transaction, cache.get());
114 ProcessRequest(kSimpleGET_Transaction, cache.get());
115 ProcessRequest(kETagGET_Transaction, cache.get());
116 ProcessRequest(kSimplePOST_Transaction, cache.get());
117
118 EXPECT_EQ(3, cb.GetResult(cache->QueryItemsForTest(cb.callback())));
119 EXPECT_EQ(net::OK, cb.GetResult(cache->FlushDataForTest(cb.callback())));
120
121 cache.reset(new InfiniteCache);
122 cache->Init(path);
123 EXPECT_EQ(3, cb.GetResult(cache->QueryItemsForTest(cb.callback())));
124
125 ProcessRequest(kTypicalGET_Transaction, cache.get());
126 EXPECT_EQ(3, cb.GetResult(cache->QueryItemsForTest(cb.callback())));
127 EXPECT_EQ(net::OK, cb.GetResult(cache->FlushDataForTest(cb.callback())));
128 }
129
130 TEST(InfiniteCache, DoomMethod) {
131 InfiniteCache cache;
132 cache.Init(FilePath());
133
134 ProcessRequest(kTypicalGET_Transaction, &cache);
135 ProcessRequest(kSimpleGET_Transaction, &cache);
136 ProcessRequest(kETagGET_Transaction, &cache);
137 net::TestCompletionCallback cb;
138 EXPECT_EQ(3, cb.GetResult(cache.QueryItemsForTest(cb.callback())));
139
140 MockTransaction request(kTypicalGET_Transaction);
141 request.method = "PUT";
142 ProcessRequest(request, &cache);
143 EXPECT_EQ(2, cb.GetResult(cache.QueryItemsForTest(cb.callback())));
144
145 request.method = "POST";
146 request.url = kSimpleGET_Transaction.url;
147 ProcessRequest(request, &cache);
148 EXPECT_EQ(1, cb.GetResult(cache.QueryItemsForTest(cb.callback())));
149
150 request.method = "DELETE";
151 request.url = kETagGET_Transaction.url;
152 ProcessRequest(request, &cache);
153 EXPECT_EQ(0, cb.GetResult(cache.QueryItemsForTest(cb.callback())));
154 }
155
156 TEST(InfiniteCache, Delete) {
157 ScopedTempDir dir;
158 ASSERT_TRUE(dir.CreateUniqueTempDir());
159 FilePath path = dir.path().Append(FILE_PATH_LITERAL("infinite"));
160
161 scoped_ptr<InfiniteCache> cache(new InfiniteCache);
162 cache->Init(path);
163 net::TestCompletionCallback cb;
164
165 ProcessRequest(kTypicalGET_Transaction, cache.get());
166 ProcessRequest(kSimpleGET_Transaction, cache.get());
167 EXPECT_EQ(2, cb.GetResult(cache->QueryItemsForTest(cb.callback())));
168 EXPECT_EQ(net::OK, cb.GetResult(cache->FlushDataForTest(cb.callback())));
169 EXPECT_TRUE(file_util::PathExists(path));
170
171 cache.reset(new InfiniteCache);
172 cache->Init(path);
173 EXPECT_EQ(2, cb.GetResult(cache->QueryItemsForTest(cb.callback())));
174 EXPECT_EQ(net::OK, cb.GetResult(cache->DeleteData(cb.callback())));
175 EXPECT_EQ(0, cb.GetResult(cache->QueryItemsForTest(cb.callback())));
176 EXPECT_FALSE(file_util::PathExists(path));
177
178 EXPECT_EQ(net::OK, cb.GetResult(cache->FlushDataForTest(cb.callback())));
179 }
180
181 TEST(InfiniteCache, DeleteBetween) {
182 ScopedTempDir dir;
183 ASSERT_TRUE(dir.CreateUniqueTempDir());
184 FilePath path = dir.path().Append(FILE_PATH_LITERAL("infinite"));
185
186 scoped_ptr<InfiniteCache> cache(new InfiniteCache);
187 cache->Init(path);
188 net::TestCompletionCallback cb;
189
190 Time::Exploded baseline = {};
191 baseline.year = 2012;
192 baseline.month = 1;
193 baseline.day_of_month = 1;
194 Time base_time = Time::FromUTCExploded(baseline);
195
196 ProcessRequestWithTime(kTypicalGET_Transaction, cache.get(), base_time);
197
198 Time start = base_time + TimeDelta::FromSeconds(2);
199 ProcessRequestWithTime(kSimpleGET_Transaction, cache.get(), start);
200 Time end = start + TimeDelta::FromSeconds(2);
201
202 ProcessRequestWithTime(kETagGET_Transaction, cache.get(),
203 end + TimeDelta::FromSeconds(2));
204
205 EXPECT_EQ(3, cb.GetResult(cache->QueryItemsForTest(cb.callback())));
206 EXPECT_EQ(net::OK,
207 cb.GetResult(cache->DeleteDataBetween(start, end,
208 cb.callback())));
209 EXPECT_EQ(2, cb.GetResult(cache->QueryItemsForTest(cb.callback())));
210
211 // Make sure the data is deleted from disk.
212 EXPECT_EQ(net::OK, cb.GetResult(cache->FlushDataForTest(cb.callback())));
213 cache.reset(new InfiniteCache);
214 cache->Init(path);
215
216 EXPECT_EQ(2, cb.GetResult(cache->QueryItemsForTest(cb.callback())));
217 ProcessRequest(kETagGET_Transaction, cache.get());
218 EXPECT_EQ(2, cb.GetResult(cache->QueryItemsForTest(cb.callback())));
219
220 EXPECT_EQ(net::OK,
221 cb.GetResult(cache->DeleteDataBetween(start, Time::Now(),
222 cb.callback())));
223 EXPECT_EQ(1, cb.GetResult(cache->QueryItemsForTest(cb.callback())));
224
225 // Make sure the data is deleted from disk.
226 EXPECT_EQ(net::OK, cb.GetResult(cache->FlushDataForTest(cb.callback())));
227 cache.reset(new InfiniteCache);
228 cache->Init(path);
229
230 EXPECT_EQ(1, cb.GetResult(cache->QueryItemsForTest(cb.callback())));
231 ProcessRequest(kTypicalGET_Transaction, cache.get());
232 EXPECT_EQ(1, cb.GetResult(cache->QueryItemsForTest(cb.callback())));
233 }
OLDNEW
« net/http/infinite_cache.cc ('K') | « net/http/infinite_cache.cc ('k') | net/net.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698