blob: f04847b132823a5bc5f8f7e48cc0b32b2f848e01 [file] [log] [blame]
[email protected]33d22102012-01-25 17:46:531// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]be052212011-12-14 18:40:402// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <string>
6
7#include "base/bind.h"
8#include "base/file_path.h"
9#include "base/logging.h"
10#include "base/memory/scoped_ptr.h"
11#include "base/stl_util.h"
12#include "base/string16.h"
13#include "base/time.h"
14#include "base/values.h"
[email protected]0a2bafc2012-02-01 22:35:0015#include "chrome/browser/download/download_query.h"
[email protected]b7d000b2012-06-02 22:18:2116#include "content/public/test/mock_download_item.h"
[email protected]be052212011-12-14 18:40:4017#include "testing/gmock/include/gmock/gmock.h"
18#include "testing/gtest/include/gtest/gtest.h"
19
20using ::testing::Return;
21using ::testing::ReturnRef;
22using ::testing::_;
23using base::Time;
24using base::Value;
[email protected]e582fdd2011-12-20 16:48:1725using content::DownloadItem;
[email protected]be052212011-12-14 18:40:4026typedef DownloadQuery::DownloadVector DownloadVector;
27
28namespace {
29
[email protected]c5899b252013-01-13 00:42:1030static const int kSomeKnownTime = 1355864160;
31static const char kSomeKnownTime8601[] = "2012-12-18T20:56:0";
32static const char k8601Suffix[] = ".000Z";
33
[email protected]be052212011-12-14 18:40:4034bool IdNotEqual(int not_id, const DownloadItem& item) {
35 return item.GetId() != not_id;
36}
37
38bool AlwaysReturn(bool result, const DownloadItem& item) {
39 return result;
40}
41
42} // anonymous namespace
43
44class DownloadQueryTest : public testing::Test {
45 public:
46 DownloadQueryTest() {}
47
48 virtual ~DownloadQueryTest() {}
49
50 virtual void TearDown() {
51 STLDeleteElements(&mocks_);
52 }
53
54 void CreateMocks(int count) {
55 for (int i = 0; i < count; ++i) {
[email protected]75e51b52012-02-04 16:57:5456 mocks_.push_back(new content::MockDownloadItem());
[email protected]c5899b252013-01-13 00:42:1057 EXPECT_CALL(mock(mocks_.size() - 1), GetId()).WillRepeatedly(Return(
58 mocks_.size() - 1));
[email protected]be052212011-12-14 18:40:4059 }
60 }
61
[email protected]75e51b52012-02-04 16:57:5462 content::MockDownloadItem& mock(int index) { return *mocks_[index]; }
[email protected]be052212011-12-14 18:40:4063
64 DownloadQuery* query() { return &query_; }
65
66 template<typename ValueType> void AddFilter(
67 DownloadQuery::FilterType name, ValueType value);
68
69 void Search() {
70 query_.Search(mocks_.begin(), mocks_.end(), &results_);
71 }
72
73 DownloadVector* results() { return &results_; }
74
[email protected]c5899b252013-01-13 00:42:1075 // Filter tests generally contain 2 items. mock(0) matches the filter, mock(1)
76 // does not.
77 void ExpectStandardFilterResults() {
78 Search();
79 ASSERT_EQ(1U, results()->size());
80 ASSERT_EQ(0, results()->at(0)->GetId());
81 }
82
83 // If no sorters distinguish between two items, then DownloadQuery sorts by ID
84 // ascending. In order to test that a sorter distinguishes between two items,
85 // the sorter must sort them by ID descending.
86 void ExpectSortInverted() {
87 Search();
88 ASSERT_EQ(2U, results()->size());
89 ASSERT_EQ(1, results()->at(0)->GetId());
90 ASSERT_EQ(0, results()->at(1)->GetId());
91 }
92
[email protected]be052212011-12-14 18:40:4093 private:
[email protected]75e51b52012-02-04 16:57:5494 std::vector<content::MockDownloadItem*> mocks_;
[email protected]be052212011-12-14 18:40:4095 DownloadQuery query_;
96 DownloadVector results_;
97
98 DISALLOW_COPY_AND_ASSIGN(DownloadQueryTest);
99};
100
101template<> void DownloadQueryTest::AddFilter(
102 DownloadQuery::FilterType name, bool cpp_value) {
103 scoped_ptr<base::Value> value(Value::CreateBooleanValue(cpp_value));
104 CHECK(query_.AddFilter(name, *value.get()));
105}
106
107template<> void DownloadQueryTest::AddFilter(
108 DownloadQuery::FilterType name, int cpp_value) {
109 scoped_ptr<base::Value> value(Value::CreateIntegerValue(cpp_value));
110 CHECK(query_.AddFilter(name, *value.get()));
111}
112
113template<> void DownloadQueryTest::AddFilter(
114 DownloadQuery::FilterType name, const char* cpp_value) {
115 scoped_ptr<base::Value> value(Value::CreateStringValue(cpp_value));
116 CHECK(query_.AddFilter(name, *value.get()));
117}
118
119template<> void DownloadQueryTest::AddFilter(
[email protected]d5e60e192013-01-04 00:09:50120 DownloadQuery::FilterType name, std::string cpp_value) {
121 scoped_ptr<base::Value> value(Value::CreateStringValue(cpp_value));
122 CHECK(query_.AddFilter(name, *value.get()));
123}
124
125template<> void DownloadQueryTest::AddFilter(
[email protected]be052212011-12-14 18:40:40126 DownloadQuery::FilterType name, const char16* cpp_value) {
127 scoped_ptr<base::Value> value(Value::CreateStringValue(string16(cpp_value)));
128 CHECK(query_.AddFilter(name, *value.get()));
129}
130
[email protected]c5899b252013-01-13 00:42:10131#if defined(OS_WIN)
132template<> void DownloadQueryTest::AddFilter(
133 DownloadQuery::FilterType name, std::wstring cpp_value) {
134 scoped_ptr<base::Value> value(Value::CreateStringValue(cpp_value));
135 CHECK(query_.AddFilter(name, *value.get()));
136}
137#endif
138
139TEST_F(DownloadQueryTest, DownloadQueryTest_ZeroItems) {
[email protected]be052212011-12-14 18:40:40140 Search();
141 EXPECT_EQ(0U, results()->size());
142}
143
[email protected]c5899b252013-01-13 00:42:10144TEST_F(DownloadQueryTest, DownloadQueryTest_InvalidFilter) {
[email protected]be052212011-12-14 18:40:40145 scoped_ptr<base::Value> value(Value::CreateIntegerValue(0));
146 EXPECT_FALSE(query()->AddFilter(
147 static_cast<DownloadQuery::FilterType>(kint32max),
148 *value.get()));
149}
150
[email protected]c5899b252013-01-13 00:42:10151TEST_F(DownloadQueryTest, DownloadQueryTest_EmptyQuery) {
152 CreateMocks(2);
153 Search();
154 ASSERT_EQ(2U, results()->size());
155 ASSERT_EQ(0, results()->at(0)->GetId());
156 ASSERT_EQ(1, results()->at(1)->GetId());
157}
158
159TEST_F(DownloadQueryTest, DownloadQueryTest_Limit) {
[email protected]be052212011-12-14 18:40:40160 CreateMocks(2);
161 query()->Limit(1);
[email protected]c5899b252013-01-13 00:42:10162 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40163}
164
[email protected]c5899b252013-01-13 00:42:10165TEST_F(DownloadQueryTest, DownloadQueryTest_FilterGenericQueryFilename) {
166 CreateMocks(2);
167 EXPECT_CALL(mock(0), GetBrowserContext()).WillRepeatedly(Return(
168 static_cast<content::BrowserContext*>(NULL)));
169 EXPECT_CALL(mock(1), GetBrowserContext()).WillRepeatedly(Return(
170 static_cast<content::BrowserContext*>(NULL)));
[email protected]9dccd8062012-09-17 17:19:12171 FilePath match_filename(FILE_PATH_LITERAL("query"));
[email protected]c5899b252013-01-13 00:42:10172 EXPECT_CALL(mock(0), GetTargetFilePath()).WillRepeatedly(ReturnRef(
173 match_filename));
[email protected]9dccd8062012-09-17 17:19:12174 FilePath fail_filename(FILE_PATH_LITERAL("fail"));
[email protected]c5899b252013-01-13 00:42:10175 EXPECT_CALL(mock(1), GetTargetFilePath()).WillRepeatedly(ReturnRef(
176 fail_filename));
[email protected]9dccd8062012-09-17 17:19:12177 GURL fail_url("http://example.com/fail");
[email protected]c5899b252013-01-13 00:42:10178 EXPECT_CALL(mock(0), GetOriginalUrl()).WillRepeatedly(ReturnRef(fail_url));
179 EXPECT_CALL(mock(1), GetOriginalUrl()).WillRepeatedly(ReturnRef(fail_url));
180 AddFilter(DownloadQuery::FILTER_QUERY, "query");
181 ExpectStandardFilterResults();
182}
183
184TEST_F(DownloadQueryTest, DownloadQueryTest_FilterGenericQueryUrl) {
185 CreateMocks(2);
186 EXPECT_CALL(mock(0), GetBrowserContext()).WillRepeatedly(Return(
187 static_cast<content::BrowserContext*>(NULL)));
188 EXPECT_CALL(mock(1), GetBrowserContext()).WillRepeatedly(Return(
189 static_cast<content::BrowserContext*>(NULL)));
190 FilePath fail_filename(FILE_PATH_LITERAL("fail"));
191 EXPECT_CALL(mock(0), GetTargetFilePath()).WillRepeatedly(ReturnRef(
192 fail_filename));
193 EXPECT_CALL(mock(1), GetTargetFilePath()).WillRepeatedly(ReturnRef(
194 fail_filename));
[email protected]9dccd8062012-09-17 17:19:12195 GURL match_url("http://query.com/query");
[email protected]c5899b252013-01-13 00:42:10196 EXPECT_CALL(mock(0), GetOriginalUrl()).WillRepeatedly(ReturnRef(match_url));
[email protected]be052212011-12-14 18:40:40197 GURL fail_url("http://example.com/fail");
[email protected]c5899b252013-01-13 00:42:10198 EXPECT_CALL(mock(1), GetOriginalUrl()).WillRepeatedly(ReturnRef(fail_url));
199 AddFilter(DownloadQuery::FILTER_QUERY, "query");
200 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40201}
202
[email protected]c5899b252013-01-13 00:42:10203TEST_F(DownloadQueryTest, DownloadQueryTest_FilterGenericQueryFilenameI18N) {
204 CreateMocks(2);
205 EXPECT_CALL(mock(0), GetBrowserContext()).WillRepeatedly(Return(
206 static_cast<content::BrowserContext*>(NULL)));
207 EXPECT_CALL(mock(1), GetBrowserContext()).WillRepeatedly(Return(
208 static_cast<content::BrowserContext*>(NULL)));
209 const FilePath::StringType kTestString(
210#if defined(OS_POSIX)
211 "/\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xbd\xa0\xe5\xa5\xbd"
212#elif defined(OS_WIN)
213 L"/\x4f60\x597d\x4f60\x597d"
214#endif
215 );
216 FilePath match_filename(kTestString);
217 EXPECT_CALL(mock(0), GetTargetFilePath()).WillRepeatedly(ReturnRef(
218 match_filename));
219 FilePath fail_filename(FILE_PATH_LITERAL("fail"));
220 EXPECT_CALL(mock(1), GetTargetFilePath()).WillRepeatedly(ReturnRef(
221 fail_filename));
222 GURL fail_url("http://example.com/fail");
223 EXPECT_CALL(mock(0), GetOriginalUrl()).WillRepeatedly(ReturnRef(fail_url));
224 EXPECT_CALL(mock(1), GetOriginalUrl()).WillRepeatedly(ReturnRef(fail_url));
225 AddFilter(DownloadQuery::FILTER_QUERY, kTestString);
226 ExpectStandardFilterResults();
227}
228
229TEST_F(DownloadQueryTest, DownloadQueryTest_FilterFilenameRegex) {
230 CreateMocks(2);
231 FilePath match_filename(FILE_PATH_LITERAL("query"));
232 EXPECT_CALL(mock(0), GetTargetFilePath()).WillRepeatedly(ReturnRef(
233 match_filename));
234 FilePath fail_filename(FILE_PATH_LITERAL("fail"));
235 EXPECT_CALL(mock(1), GetTargetFilePath()).WillRepeatedly(ReturnRef(
236 fail_filename));
237 AddFilter(DownloadQuery::FILTER_FILENAME_REGEX, "y");
238 ExpectStandardFilterResults();
239}
240
241TEST_F(DownloadQueryTest, DownloadQueryTest_SortFilename) {
242 CreateMocks(2);
243 FilePath b_filename(FILE_PATH_LITERAL("b"));
244 EXPECT_CALL(mock(0), GetTargetFilePath()).WillRepeatedly(ReturnRef(
245 b_filename));
246 FilePath a_filename(FILE_PATH_LITERAL("a"));
247 EXPECT_CALL(mock(1), GetTargetFilePath()).WillRepeatedly(ReturnRef(
248 a_filename));
249 query()->AddSorter(DownloadQuery::SORT_FILENAME, DownloadQuery::ASCENDING);
250 ExpectSortInverted();
251}
252
253TEST_F(DownloadQueryTest, DownloadQueryTest_FilterFilename) {
254 CreateMocks(2);
255 FilePath match_filename(FILE_PATH_LITERAL("query"));
256 EXPECT_CALL(mock(0), GetTargetFilePath()).WillRepeatedly(ReturnRef(
257 match_filename));
258 FilePath fail_filename(FILE_PATH_LITERAL("fail"));
259 EXPECT_CALL(mock(1), GetTargetFilePath()).WillRepeatedly(ReturnRef(
260 fail_filename));
261 AddFilter(DownloadQuery::FILTER_FILENAME, match_filename.value().c_str());
262 ExpectStandardFilterResults();
263}
264
265TEST_F(DownloadQueryTest, DownloadQueryTest_FilterUrlRegex) {
266 CreateMocks(2);
267 GURL match_url("http://query.com/query");
268 EXPECT_CALL(mock(0), GetOriginalUrl()).WillRepeatedly(ReturnRef(match_url));
269 GURL fail_url("http://example.com/fail");
270 EXPECT_CALL(mock(1), GetOriginalUrl()).WillRepeatedly(ReturnRef(fail_url));
271 AddFilter(DownloadQuery::FILTER_URL_REGEX, "query");
272 ExpectStandardFilterResults();
273}
274
275TEST_F(DownloadQueryTest, DownloadQueryTest_SortUrl) {
276 CreateMocks(2);
277 GURL b_url("http://example.com/b");
278 EXPECT_CALL(mock(0), GetOriginalUrl()).WillRepeatedly(ReturnRef(b_url));
279 GURL a_url("http://example.com/a");
280 EXPECT_CALL(mock(1), GetOriginalUrl()).WillRepeatedly(ReturnRef(a_url));
281 query()->AddSorter(DownloadQuery::SORT_URL, DownloadQuery::ASCENDING);
282 ExpectSortInverted();
283}
284
285TEST_F(DownloadQueryTest, DownloadQueryTest_FilterUrl) {
286 CreateMocks(2);
287 GURL match_url("http://query.com/query");
288 EXPECT_CALL(mock(0), GetOriginalUrl()).WillRepeatedly(ReturnRef(match_url));
289 GURL fail_url("http://example.com/fail");
290 EXPECT_CALL(mock(1), GetOriginalUrl()).WillRepeatedly(ReturnRef(fail_url));
291 AddFilter(DownloadQuery::FILTER_URL, match_url.spec().c_str());
292 ExpectStandardFilterResults();
293}
294
295TEST_F(DownloadQueryTest, DownloadQueryTest_FilterCallback) {
296 CreateMocks(2);
297 CHECK(query()->AddFilter(base::Bind(&IdNotEqual, 1)));
298 ExpectStandardFilterResults();
299}
300
301TEST_F(DownloadQueryTest, DownloadQueryTest_FilterBytesReceived) {
[email protected]be052212011-12-14 18:40:40302 CreateMocks(2);
303 EXPECT_CALL(mock(0), GetReceivedBytes()).WillRepeatedly(Return(0));
304 EXPECT_CALL(mock(1), GetReceivedBytes()).WillRepeatedly(Return(1));
[email protected]c5899b252013-01-13 00:42:10305 AddFilter(DownloadQuery::FILTER_BYTES_RECEIVED, 0);
306 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40307}
308
[email protected]c5899b252013-01-13 00:42:10309TEST_F(DownloadQueryTest, DownloadQueryTest_SortBytesReceived) {
[email protected]be052212011-12-14 18:40:40310 CreateMocks(2);
[email protected]c5899b252013-01-13 00:42:10311 EXPECT_CALL(mock(0), GetReceivedBytes()).WillRepeatedly(Return(0));
312 EXPECT_CALL(mock(1), GetReceivedBytes()).WillRepeatedly(Return(1));
313 query()->AddSorter(DownloadQuery::SORT_BYTES_RECEIVED,
314 DownloadQuery::DESCENDING);
315 ExpectSortInverted();
[email protected]be052212011-12-14 18:40:40316}
317
[email protected]c5899b252013-01-13 00:42:10318TEST_F(DownloadQueryTest, DownloadQueryTest_FilterDangerAccepted) {
[email protected]be052212011-12-14 18:40:40319 CreateMocks(2);
320 EXPECT_CALL(mock(0), GetSafetyState()).WillRepeatedly(Return(
[email protected]c5899b252013-01-13 00:42:10321 DownloadItem::DANGEROUS_BUT_VALIDATED));
[email protected]be052212011-12-14 18:40:40322 EXPECT_CALL(mock(1), GetSafetyState()).WillRepeatedly(Return(
[email protected]c5899b252013-01-13 00:42:10323 DownloadItem::DANGEROUS));
324 AddFilter(DownloadQuery::FILTER_DANGER_ACCEPTED, true);
325 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40326}
327
[email protected]c5899b252013-01-13 00:42:10328TEST_F(DownloadQueryTest, DownloadQueryTest_SortDangerAccepted) {
[email protected]be052212011-12-14 18:40:40329 CreateMocks(2);
[email protected]c5899b252013-01-13 00:42:10330 EXPECT_CALL(mock(0), GetSafetyState()).WillRepeatedly(Return(
331 DownloadItem::DANGEROUS_BUT_VALIDATED));
332 EXPECT_CALL(mock(1), GetSafetyState()).WillRepeatedly(Return(
333 DownloadItem::DANGEROUS));
334 query()->AddSorter(DownloadQuery::SORT_DANGER_ACCEPTED,
335 DownloadQuery::ASCENDING);
336 ExpectSortInverted();
[email protected]be052212011-12-14 18:40:40337}
338
[email protected]3291a4982013-01-14 00:58:52339TEST_F(DownloadQueryTest, DownloadQueryTest_FilterExists) {
340 CreateMocks(2);
341 EXPECT_CALL(mock(0), GetFileExternallyRemoved()).WillRepeatedly(Return(
342 false));
343 EXPECT_CALL(mock(1), GetFileExternallyRemoved()).WillRepeatedly(Return(
344 true));
345 AddFilter(DownloadQuery::FILTER_EXISTS, true);
346 ExpectStandardFilterResults();
347}
348
349TEST_F(DownloadQueryTest, DownloadQueryTest_SortExists) {
350 CreateMocks(2);
351 EXPECT_CALL(mock(0), GetFileExternallyRemoved()).WillRepeatedly(Return(
352 false));
353 EXPECT_CALL(mock(1), GetFileExternallyRemoved()).WillRepeatedly(Return(
354 true));
355 query()->AddSorter(DownloadQuery::SORT_EXISTS,
356 DownloadQuery::ASCENDING);
357 ExpectSortInverted();
358}
359
[email protected]c5899b252013-01-13 00:42:10360TEST_F(DownloadQueryTest, DownloadQueryTest_FilterMime) {
[email protected]be052212011-12-14 18:40:40361 CreateMocks(2);
[email protected]c5899b252013-01-13 00:42:10362 EXPECT_CALL(mock(0), GetMimeType()).WillRepeatedly(Return("text"));
363 EXPECT_CALL(mock(1), GetMimeType()).WillRepeatedly(Return("image"));
364 AddFilter(DownloadQuery::FILTER_MIME, "text");
365 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40366}
367
[email protected]c5899b252013-01-13 00:42:10368TEST_F(DownloadQueryTest, DownloadQueryTest_SortMime) {
369 CreateMocks(2);
370 EXPECT_CALL(mock(0), GetMimeType()).WillRepeatedly(Return("b"));
371 EXPECT_CALL(mock(1), GetMimeType()).WillRepeatedly(Return("a"));
372 query()->AddSorter(DownloadQuery::SORT_MIME, DownloadQuery::ASCENDING);
373 ExpectSortInverted();
374}
375
376TEST_F(DownloadQueryTest, DownloadQueryTest_FilterPaused) {
[email protected]be052212011-12-14 18:40:40377 CreateMocks(2);
378 EXPECT_CALL(mock(0), IsPaused()).WillRepeatedly(Return(true));
379 EXPECT_CALL(mock(1), IsPaused()).WillRepeatedly(Return(false));
[email protected]c5899b252013-01-13 00:42:10380 AddFilter(DownloadQuery::FILTER_PAUSED, true);
381 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40382}
383
[email protected]c5899b252013-01-13 00:42:10384TEST_F(DownloadQueryTest, DownloadQueryTest_SortPaused) {
[email protected]d5e60e192013-01-04 00:09:50385 CreateMocks(2);
[email protected]c5899b252013-01-13 00:42:10386 EXPECT_CALL(mock(0), IsPaused()).WillRepeatedly(Return(true));
387 EXPECT_CALL(mock(1), IsPaused()).WillRepeatedly(Return(false));
388 query()->AddSorter(DownloadQuery::SORT_PAUSED, DownloadQuery::ASCENDING);
389 ExpectSortInverted();
[email protected]d5e60e192013-01-04 00:09:50390}
391
[email protected]c5899b252013-01-13 00:42:10392TEST_F(DownloadQueryTest, DownloadQueryTest_FilterStartedAfter) {
[email protected]be052212011-12-14 18:40:40393 CreateMocks(2);
394 EXPECT_CALL(mock(0), GetStartTime()).WillRepeatedly(Return(
[email protected]c5899b252013-01-13 00:42:10395 base::Time::FromTimeT(kSomeKnownTime + 2)));
[email protected]be052212011-12-14 18:40:40396 EXPECT_CALL(mock(1), GetStartTime()).WillRepeatedly(Return(
[email protected]c5899b252013-01-13 00:42:10397 base::Time::FromTimeT(kSomeKnownTime + 1)));
398 AddFilter(DownloadQuery::FILTER_STARTED_AFTER,
399 std::string(kSomeKnownTime8601) + "1" + std::string(k8601Suffix));
400 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40401}
402
[email protected]c5899b252013-01-13 00:42:10403TEST_F(DownloadQueryTest, DownloadQueryTest_FilterStartedBefore) {
404 CreateMocks(2);
405 EXPECT_CALL(mock(0), GetStartTime()).WillRepeatedly(Return(
406 base::Time::FromTimeT(kSomeKnownTime + 2)));
407 EXPECT_CALL(mock(1), GetStartTime()).WillRepeatedly(Return(
408 base::Time::FromTimeT(kSomeKnownTime + 4)));
409 AddFilter(DownloadQuery::FILTER_STARTED_BEFORE,
410 std::string(kSomeKnownTime8601) + "4" + std::string(k8601Suffix));
411 ExpectStandardFilterResults();
412}
413
414TEST_F(DownloadQueryTest, DownloadQueryTest_FilterStartTime) {
415 CreateMocks(2);
416 EXPECT_CALL(mock(0), GetStartTime()).WillRepeatedly(Return(
417 base::Time::FromTimeT(kSomeKnownTime + 2)));
418 EXPECT_CALL(mock(1), GetStartTime()).WillRepeatedly(Return(
419 base::Time::FromTimeT(kSomeKnownTime + 4)));
420 AddFilter(DownloadQuery::FILTER_START_TIME,
421 std::string(kSomeKnownTime8601) + "2" + std::string(k8601Suffix));
422 ExpectStandardFilterResults();
423}
424
425TEST_F(DownloadQueryTest, DownloadQueryTest_SortStartTime) {
426 CreateMocks(2);
427 EXPECT_CALL(mock(0), GetStartTime()).WillRepeatedly(Return(
428 base::Time::FromTimeT(kSomeKnownTime + 2)));
429 EXPECT_CALL(mock(1), GetStartTime()).WillRepeatedly(Return(
430 base::Time::FromTimeT(kSomeKnownTime + 4)));
431 query()->AddSorter(DownloadQuery::SORT_START_TIME, DownloadQuery::DESCENDING);
432 ExpectSortInverted();
433}
434
435TEST_F(DownloadQueryTest, DownloadQueryTest_FilterEndedAfter) {
436 CreateMocks(2);
437 EXPECT_CALL(mock(0), GetEndTime()).WillRepeatedly(Return(
438 base::Time::FromTimeT(kSomeKnownTime + 2)));
439 EXPECT_CALL(mock(1), GetEndTime()).WillRepeatedly(Return(
440 base::Time::FromTimeT(kSomeKnownTime + 1)));
441 AddFilter(DownloadQuery::FILTER_ENDED_AFTER,
442 std::string(kSomeKnownTime8601) + "1" + std::string(k8601Suffix));
443 ExpectStandardFilterResults();
444}
445
446TEST_F(DownloadQueryTest, DownloadQueryTest_FilterEndedBefore) {
447 CreateMocks(2);
448 EXPECT_CALL(mock(0), GetEndTime()).WillRepeatedly(Return(
449 base::Time::FromTimeT(kSomeKnownTime + 2)));
450 EXPECT_CALL(mock(1), GetEndTime()).WillRepeatedly(Return(
451 base::Time::FromTimeT(kSomeKnownTime + 4)));
452 AddFilter(DownloadQuery::FILTER_ENDED_BEFORE,
453 std::string(kSomeKnownTime8601) + "4" + std::string(k8601Suffix));
454 ExpectStandardFilterResults();
455}
456
457TEST_F(DownloadQueryTest, DownloadQueryTest_FilterEndTime) {
458 CreateMocks(2);
459 EXPECT_CALL(mock(0), GetEndTime()).WillRepeatedly(Return(
460 base::Time::FromTimeT(kSomeKnownTime + 2)));
461 EXPECT_CALL(mock(1), GetEndTime()).WillRepeatedly(Return(
462 base::Time::FromTimeT(kSomeKnownTime + 4)));
463 AddFilter(DownloadQuery::FILTER_END_TIME,
464 std::string(kSomeKnownTime8601) + "2" + std::string(k8601Suffix));
465 ExpectStandardFilterResults();
466}
467
468TEST_F(DownloadQueryTest, DownloadQueryTest_SortEndTime) {
469 CreateMocks(2);
470 EXPECT_CALL(mock(0), GetEndTime()).WillRepeatedly(Return(
471 base::Time::FromTimeT(kSomeKnownTime + 2)));
472 EXPECT_CALL(mock(1), GetEndTime()).WillRepeatedly(Return(
473 base::Time::FromTimeT(kSomeKnownTime + 4)));
474 query()->AddSorter(DownloadQuery::SORT_END_TIME, DownloadQuery::DESCENDING);
475 ExpectSortInverted();
476}
477
478TEST_F(DownloadQueryTest, DownloadQueryTest_FilterTotalBytesGreater) {
479 CreateMocks(2);
480 EXPECT_CALL(mock(0), GetTotalBytes()).WillRepeatedly(Return(2));
481 EXPECT_CALL(mock(1), GetTotalBytes()).WillRepeatedly(Return(1));
482 AddFilter(DownloadQuery::FILTER_TOTAL_BYTES_GREATER, 1);
483 ExpectStandardFilterResults();
484}
485
486TEST_F(DownloadQueryTest, DownloadQueryTest_FilterTotalBytesLess) {
487 CreateMocks(2);
488 EXPECT_CALL(mock(0), GetTotalBytes()).WillRepeatedly(Return(2));
489 EXPECT_CALL(mock(1), GetTotalBytes()).WillRepeatedly(Return(4));
490 AddFilter(DownloadQuery::FILTER_TOTAL_BYTES_LESS, 4);
491 ExpectStandardFilterResults();
492}
493
494TEST_F(DownloadQueryTest, DownloadQueryTest_FilterTotalBytes) {
495 CreateMocks(2);
496 EXPECT_CALL(mock(0), GetTotalBytes()).WillRepeatedly(Return(2));
497 EXPECT_CALL(mock(1), GetTotalBytes()).WillRepeatedly(Return(4));
498 AddFilter(DownloadQuery::FILTER_TOTAL_BYTES, 2);
499 ExpectStandardFilterResults();
500}
501
502TEST_F(DownloadQueryTest, DownloadQueryTest_SortTotalBytes) {
503 CreateMocks(2);
504 EXPECT_CALL(mock(0), GetTotalBytes()).WillRepeatedly(Return(2));
505 EXPECT_CALL(mock(1), GetTotalBytes()).WillRepeatedly(Return(4));
506 query()->AddSorter(DownloadQuery::SORT_TOTAL_BYTES,
507 DownloadQuery::DESCENDING);
508 ExpectSortInverted();
509}
510
511TEST_F(DownloadQueryTest, DownloadQueryTest_FilterState) {
[email protected]be052212011-12-14 18:40:40512 CreateMocks(2);
513 EXPECT_CALL(mock(0), GetState()).WillRepeatedly(Return(
[email protected]c5899b252013-01-13 00:42:10514 DownloadItem::IN_PROGRESS));
[email protected]be052212011-12-14 18:40:40515 EXPECT_CALL(mock(1), GetState()).WillRepeatedly(Return(
[email protected]c5899b252013-01-13 00:42:10516 DownloadItem::CANCELLED));
517 query()->AddFilter(DownloadItem::IN_PROGRESS);
518 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40519}
520
[email protected]c5899b252013-01-13 00:42:10521TEST_F(DownloadQueryTest, DownloadQueryTest_SortState) {
[email protected]be052212011-12-14 18:40:40522 CreateMocks(2);
[email protected]c5899b252013-01-13 00:42:10523 EXPECT_CALL(mock(0), GetState()).WillRepeatedly(Return(
524 DownloadItem::IN_PROGRESS));
525 EXPECT_CALL(mock(1), GetState()).WillRepeatedly(Return(
526 DownloadItem::CANCELLED));
527 query()->AddSorter(DownloadQuery::SORT_STATE, DownloadQuery::DESCENDING);
528 ExpectSortInverted();
[email protected]be052212011-12-14 18:40:40529}
530
[email protected]c5899b252013-01-13 00:42:10531TEST_F(DownloadQueryTest, DownloadQueryTest_FilterDanger) {
[email protected]be052212011-12-14 18:40:40532 CreateMocks(2);
[email protected]c5899b252013-01-13 00:42:10533 EXPECT_CALL(mock(0), GetDangerType()).WillRepeatedly(Return(
534 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS));
535 EXPECT_CALL(mock(1), GetDangerType()).WillRepeatedly(Return(
536 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE));
537 query()->AddFilter(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
538 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40539}
540
[email protected]c5899b252013-01-13 00:42:10541TEST_F(DownloadQueryTest, DownloadQueryTest_SortDanger) {
542 CreateMocks(2);
543 EXPECT_CALL(mock(0), GetDangerType()).WillRepeatedly(Return(
544 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS));
545 EXPECT_CALL(mock(1), GetDangerType()).WillRepeatedly(Return(
546 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE));
547 query()->AddSorter(DownloadQuery::SORT_DANGER, DownloadQuery::DESCENDING);
548 ExpectSortInverted();
549}
550
551TEST_F(DownloadQueryTest, DownloadQueryTest_DefaultSortById1) {
[email protected]be052212011-12-14 18:40:40552 CreateMocks(2);
553 EXPECT_CALL(mock(0), GetReceivedBytes()).WillRepeatedly(Return(0));
554 EXPECT_CALL(mock(1), GetReceivedBytes()).WillRepeatedly(Return(0));
[email protected]c5899b252013-01-13 00:42:10555 query()->AddSorter(DownloadQuery::SORT_BYTES_RECEIVED,
556 DownloadQuery::ASCENDING);
[email protected]be052212011-12-14 18:40:40557 Search();
[email protected]c5899b252013-01-13 00:42:10558 ASSERT_EQ(2U, results()->size());
559 EXPECT_EQ(0, results()->at(0)->GetId());
560 EXPECT_EQ(1, results()->at(1)->GetId());
561}
562
563TEST_F(DownloadQueryTest, DownloadQueryTest_DefaultSortById2) {
564 CreateMocks(2);
565 EXPECT_CALL(mock(0), GetReceivedBytes()).WillRepeatedly(Return(0));
566 EXPECT_CALL(mock(1), GetReceivedBytes()).WillRepeatedly(Return(0));
567 query()->AddSorter(DownloadQuery::SORT_BYTES_RECEIVED,
568 DownloadQuery::DESCENDING);
569 Search();
570 ASSERT_EQ(2U, results()->size());
[email protected]be052212011-12-14 18:40:40571 EXPECT_EQ(0, results()->at(0)->GetId());
572 EXPECT_EQ(1, results()->at(1)->GetId());
573}
574
575TEST_F(DownloadQueryTest, DownloadQueryFilterPerformance) {
[email protected]c5899b252013-01-13 00:42:10576 static const int kNumItems = 100;
577 static const int kNumFilters = 100;
[email protected]be052212011-12-14 18:40:40578 CreateMocks(kNumItems);
579 for (size_t i = 0; i < (kNumFilters - 1); ++i) {
580 query()->AddFilter(base::Bind(&AlwaysReturn, true));
581 }
582 query()->AddFilter(base::Bind(&AlwaysReturn, false));
583 base::Time start = base::Time::Now();
584 Search();
585 base::Time end = base::Time::Now();
586 double nanos = (end - start).InMillisecondsF() * 1000.0 * 1000.0;
587 double nanos_per_item = nanos / static_cast<double>(kNumItems);
588 double nanos_per_item_per_filter = nanos_per_item
589 / static_cast<double>(kNumFilters);
590 std::cout << "Search took " << nanos_per_item_per_filter
591 << " nanoseconds per item per filter.\n";
592}