blob: 6947055a81261f3396f6821776f6078f03d726fd [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
avid0181f32015-12-10 19:41:475#include <stdint.h>
6
7#include <limits>
[email protected]be052212011-12-14 18:40:408#include <string>
9
10#include "base/bind.h"
[email protected]57999812013-02-24 05:40:5211#include "base/files/file_path.h"
[email protected]be052212011-12-14 18:40:4012#include "base/logging.h"
13#include "base/memory/scoped_ptr.h"
14#include "base/stl_util.h"
[email protected]340f55d7c2013-06-10 20:49:1115#include "base/strings/string16.h"
[email protected]41a17c52013-06-28 00:27:5316#include "base/time/time.h"
[email protected]be052212011-12-14 18:40:4017#include "base/values.h"
[email protected]0a2bafc2012-02-01 22:35:0018#include "chrome/browser/download/download_query.h"
[email protected]b7d000b2012-06-02 22:18:2119#include "content/public/test/mock_download_item.h"
[email protected]be052212011-12-14 18:40:4020#include "testing/gmock/include/gmock/gmock.h"
21#include "testing/gtest/include/gtest/gtest.h"
22
23using ::testing::Return;
24using ::testing::ReturnRef;
25using ::testing::_;
26using base::Time;
27using base::Value;
[email protected]e582fdd2011-12-20 16:48:1728using content::DownloadItem;
[email protected]be052212011-12-14 18:40:4029typedef DownloadQuery::DownloadVector DownloadVector;
30
31namespace {
32
[email protected]c5899b252013-01-13 00:42:1033static const int kSomeKnownTime = 1355864160;
34static const char kSomeKnownTime8601[] = "2012-12-18T20:56:0";
35static const char k8601Suffix[] = ".000Z";
36
avid0181f32015-12-10 19:41:4737bool IdNotEqual(uint32_t not_id, const DownloadItem& item) {
[email protected]be052212011-12-14 18:40:4038 return item.GetId() != not_id;
39}
40
41bool AlwaysReturn(bool result, const DownloadItem& item) {
42 return result;
43}
44
45} // anonymous namespace
46
47class DownloadQueryTest : public testing::Test {
48 public:
49 DownloadQueryTest() {}
50
dchenge1bc7982014-10-30 00:32:4051 ~DownloadQueryTest() override {}
[email protected]be052212011-12-14 18:40:4052
dchenge1bc7982014-10-30 00:32:4053 void TearDown() override { STLDeleteElements(&mocks_); }
[email protected]be052212011-12-14 18:40:4054
55 void CreateMocks(int count) {
56 for (int i = 0; i < count; ++i) {
[email protected]75e51b52012-02-04 16:57:5457 mocks_.push_back(new content::MockDownloadItem());
[email protected]c5899b252013-01-13 00:42:1058 EXPECT_CALL(mock(mocks_.size() - 1), GetId()).WillRepeatedly(Return(
59 mocks_.size() - 1));
[email protected]be052212011-12-14 18:40:4060 }
61 }
62
[email protected]75e51b52012-02-04 16:57:5463 content::MockDownloadItem& mock(int index) { return *mocks_[index]; }
[email protected]be052212011-12-14 18:40:4064
65 DownloadQuery* query() { return &query_; }
66
67 template<typename ValueType> void AddFilter(
68 DownloadQuery::FilterType name, ValueType value);
69
70 void Search() {
71 query_.Search(mocks_.begin(), mocks_.end(), &results_);
72 }
73
74 DownloadVector* results() { return &results_; }
75
[email protected]c5899b252013-01-13 00:42:1076 // Filter tests generally contain 2 items. mock(0) matches the filter, mock(1)
77 // does not.
78 void ExpectStandardFilterResults() {
79 Search();
80 ASSERT_EQ(1U, results()->size());
[email protected]530047e2013-07-12 17:02:2581 ASSERT_EQ(0U, results()->at(0)->GetId());
[email protected]c5899b252013-01-13 00:42:1082 }
83
84 // If no sorters distinguish between two items, then DownloadQuery sorts by ID
85 // ascending. In order to test that a sorter distinguishes between two items,
86 // the sorter must sort them by ID descending.
87 void ExpectSortInverted() {
88 Search();
89 ASSERT_EQ(2U, results()->size());
[email protected]530047e2013-07-12 17:02:2590 ASSERT_EQ(1U, results()->at(0)->GetId());
91 ASSERT_EQ(0U, results()->at(1)->GetId());
[email protected]c5899b252013-01-13 00:42:1092 }
93
[email protected]be052212011-12-14 18:40:4094 private:
[email protected]75e51b52012-02-04 16:57:5495 std::vector<content::MockDownloadItem*> mocks_;
[email protected]be052212011-12-14 18:40:4096 DownloadQuery query_;
97 DownloadVector results_;
98
99 DISALLOW_COPY_AND_ASSIGN(DownloadQueryTest);
100};
101
102template<> void DownloadQueryTest::AddFilter(
103 DownloadQuery::FilterType name, bool cpp_value) {
[email protected]012d1312014-07-17 06:37:40104 scoped_ptr<base::Value> value(new base::FundamentalValue(cpp_value));
[email protected]be052212011-12-14 18:40:40105 CHECK(query_.AddFilter(name, *value.get()));
106}
107
108template<> void DownloadQueryTest::AddFilter(
109 DownloadQuery::FilterType name, int cpp_value) {
[email protected]a7965a42014-07-22 02:35:56110 scoped_ptr<base::Value> value(new base::FundamentalValue(cpp_value));
[email protected]be052212011-12-14 18:40:40111 CHECK(query_.AddFilter(name, *value.get()));
112}
113
114template<> void DownloadQueryTest::AddFilter(
115 DownloadQuery::FilterType name, const char* cpp_value) {
[email protected]df287e12014-03-24 18:33:39116 CHECK(query_.AddFilter(name, base::StringValue(cpp_value)));
[email protected]be052212011-12-14 18:40:40117}
118
119template<> void DownloadQueryTest::AddFilter(
[email protected]d5e60e192013-01-04 00:09:50120 DownloadQuery::FilterType name, std::string cpp_value) {
[email protected]df287e12014-03-24 18:33:39121 CHECK(query_.AddFilter(name, base::StringValue(cpp_value)));
[email protected]d5e60e192013-01-04 00:09:50122}
123
124template<> void DownloadQueryTest::AddFilter(
[email protected]b6775d782013-12-25 20:04:53125 DownloadQuery::FilterType name, const base::char16* cpp_value) {
[email protected]df287e12014-03-24 18:33:39126 CHECK(query_.AddFilter(name, base::StringValue(cpp_value)));
[email protected]be052212011-12-14 18:40:40127}
128
[email protected]f1d784d62013-07-28 18:36:09129template<> void DownloadQueryTest::AddFilter(
[email protected]96920152013-12-04 21:00:16130 DownloadQuery::FilterType name, std::vector<base::string16> cpp_value) {
[email protected]f1d784d62013-07-28 18:36:09131 scoped_ptr<base::ListValue> list(new base::ListValue());
[email protected]96920152013-12-04 21:00:16132 for (std::vector<base::string16>::const_iterator it = cpp_value.begin();
[email protected]f1d784d62013-07-28 18:36:09133 it != cpp_value.end(); ++it) {
[email protected]df287e12014-03-24 18:33:39134 list->Append(new base::StringValue(*it));
[email protected]f1d784d62013-07-28 18:36:09135 }
136 CHECK(query_.AddFilter(name, *list.get()));
137}
138
139template<> void DownloadQueryTest::AddFilter(
140 DownloadQuery::FilterType name, std::vector<std::string> cpp_value) {
141 scoped_ptr<base::ListValue> list(new base::ListValue());
142 for (std::vector<std::string>::const_iterator it = cpp_value.begin();
143 it != cpp_value.end(); ++it) {
[email protected]df287e12014-03-24 18:33:39144 list->Append(new base::StringValue(*it));
[email protected]f1d784d62013-07-28 18:36:09145 }
146 CHECK(query_.AddFilter(name, *list.get()));
147}
148
[email protected]c5899b252013-01-13 00:42:10149#if defined(OS_WIN)
150template<> void DownloadQueryTest::AddFilter(
151 DownloadQuery::FilterType name, std::wstring cpp_value) {
[email protected]df287e12014-03-24 18:33:39152 CHECK(query_.AddFilter(name, base::StringValue(cpp_value)));
[email protected]c5899b252013-01-13 00:42:10153}
154#endif
155
156TEST_F(DownloadQueryTest, DownloadQueryTest_ZeroItems) {
[email protected]be052212011-12-14 18:40:40157 Search();
158 EXPECT_EQ(0U, results()->size());
159}
160
[email protected]c5899b252013-01-13 00:42:10161TEST_F(DownloadQueryTest, DownloadQueryTest_InvalidFilter) {
[email protected]a7965a42014-07-22 02:35:56162 scoped_ptr<base::Value> value(new base::FundamentalValue(0));
avid0181f32015-12-10 19:41:47163 EXPECT_FALSE(query()->AddFilter(static_cast<DownloadQuery::FilterType>(
164 std::numeric_limits<int32_t>::max()),
165 *value.get()));
[email protected]be052212011-12-14 18:40:40166}
167
[email protected]c5899b252013-01-13 00:42:10168TEST_F(DownloadQueryTest, DownloadQueryTest_EmptyQuery) {
169 CreateMocks(2);
170 Search();
171 ASSERT_EQ(2U, results()->size());
[email protected]530047e2013-07-12 17:02:25172 ASSERT_EQ(0U, results()->at(0)->GetId());
173 ASSERT_EQ(1U, results()->at(1)->GetId());
[email protected]c5899b252013-01-13 00:42:10174}
175
176TEST_F(DownloadQueryTest, DownloadQueryTest_Limit) {
[email protected]be052212011-12-14 18:40:40177 CreateMocks(2);
178 query()->Limit(1);
[email protected]c5899b252013-01-13 00:42:10179 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40180}
181
dbeam901ce732015-10-28 03:26:58182TEST_F(DownloadQueryTest, DownloadQueryTest_Skip) {
183 CreateMocks(2);
184 query()->Skip(1);
185 Search();
186 EXPECT_EQ(1U, results()->size());
187}
188
189TEST_F(DownloadQueryTest, DownloadQueryTest_SkipMoreThanExist) {
190 query()->Skip(20);
191 Search();
192 EXPECT_EQ(0U, results()->size());
193}
194
195TEST_F(DownloadQueryTest, DownloadQueryTest_LimitSkipAndSort) {
196 const size_t kNumMocks = 10U;
197 CreateMocks(kNumMocks);
198 for (size_t i = 0; i < kNumMocks; ++i) {
199 EXPECT_CALL(mock(i), GetStartTime()).WillRepeatedly(Return(
200 base::Time::FromTimeT(kSomeKnownTime + 1000 * i)));
201 }
202 query()->AddSorter(DownloadQuery::SORT_START_TIME, DownloadQuery::ASCENDING);
203 query()->Limit(2);
204 query()->Skip(5);
205 Search();
206 EXPECT_EQ(2U, results()->size());
207 EXPECT_EQ(5U, results()->at(0)->GetId());
208 EXPECT_EQ(6U, results()->at(1)->GetId());
209}
210
[email protected]c5899b252013-01-13 00:42:10211TEST_F(DownloadQueryTest, DownloadQueryTest_FilterGenericQueryFilename) {
212 CreateMocks(2);
213 EXPECT_CALL(mock(0), GetBrowserContext()).WillRepeatedly(Return(
214 static_cast<content::BrowserContext*>(NULL)));
215 EXPECT_CALL(mock(1), GetBrowserContext()).WillRepeatedly(Return(
216 static_cast<content::BrowserContext*>(NULL)));
[email protected]650b2d52013-02-10 03:41:45217 base::FilePath match_filename(FILE_PATH_LITERAL("query"));
[email protected]c5899b252013-01-13 00:42:10218 EXPECT_CALL(mock(0), GetTargetFilePath()).WillRepeatedly(ReturnRef(
219 match_filename));
[email protected]650b2d52013-02-10 03:41:45220 base::FilePath fail_filename(FILE_PATH_LITERAL("fail"));
[email protected]c5899b252013-01-13 00:42:10221 EXPECT_CALL(mock(1), GetTargetFilePath()).WillRepeatedly(ReturnRef(
222 fail_filename));
[email protected]9dccd8062012-09-17 17:19:12223 GURL fail_url("http://example.com/fail");
[email protected]c5899b252013-01-13 00:42:10224 EXPECT_CALL(mock(0), GetOriginalUrl()).WillRepeatedly(ReturnRef(fail_url));
225 EXPECT_CALL(mock(1), GetOriginalUrl()).WillRepeatedly(ReturnRef(fail_url));
[email protected]f1d784d62013-07-28 18:36:09226 std::vector<std::string> query_terms;
227 query_terms.push_back("query");
228 AddFilter(DownloadQuery::FILTER_QUERY, query_terms);
[email protected]c5899b252013-01-13 00:42:10229 ExpectStandardFilterResults();
230}
231
232TEST_F(DownloadQueryTest, DownloadQueryTest_FilterGenericQueryUrl) {
233 CreateMocks(2);
234 EXPECT_CALL(mock(0), GetBrowserContext()).WillRepeatedly(Return(
235 static_cast<content::BrowserContext*>(NULL)));
236 EXPECT_CALL(mock(1), GetBrowserContext()).WillRepeatedly(Return(
237 static_cast<content::BrowserContext*>(NULL)));
[email protected]650b2d52013-02-10 03:41:45238 base::FilePath fail_filename(FILE_PATH_LITERAL("fail"));
[email protected]c5899b252013-01-13 00:42:10239 EXPECT_CALL(mock(0), GetTargetFilePath()).WillRepeatedly(ReturnRef(
240 fail_filename));
241 EXPECT_CALL(mock(1), GetTargetFilePath()).WillRepeatedly(ReturnRef(
242 fail_filename));
[email protected]9dccd8062012-09-17 17:19:12243 GURL match_url("http://query.com/query");
[email protected]c5899b252013-01-13 00:42:10244 EXPECT_CALL(mock(0), GetOriginalUrl()).WillRepeatedly(ReturnRef(match_url));
[email protected]be052212011-12-14 18:40:40245 GURL fail_url("http://example.com/fail");
[email protected]c5899b252013-01-13 00:42:10246 EXPECT_CALL(mock(1), GetOriginalUrl()).WillRepeatedly(ReturnRef(fail_url));
[email protected]f1d784d62013-07-28 18:36:09247 std::vector<std::string> query_terms;
248 query_terms.push_back("query");
249 AddFilter(DownloadQuery::FILTER_QUERY, query_terms);
[email protected]c5899b252013-01-13 00:42:10250 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40251}
252
[email protected]c5899b252013-01-13 00:42:10253TEST_F(DownloadQueryTest, DownloadQueryTest_FilterGenericQueryFilenameI18N) {
254 CreateMocks(2);
255 EXPECT_CALL(mock(0), GetBrowserContext()).WillRepeatedly(Return(
256 static_cast<content::BrowserContext*>(NULL)));
257 EXPECT_CALL(mock(1), GetBrowserContext()).WillRepeatedly(Return(
258 static_cast<content::BrowserContext*>(NULL)));
[email protected]650b2d52013-02-10 03:41:45259 const base::FilePath::StringType kTestString(
[email protected]c5899b252013-01-13 00:42:10260#if defined(OS_POSIX)
261 "/\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xbd\xa0\xe5\xa5\xbd"
262#elif defined(OS_WIN)
263 L"/\x4f60\x597d\x4f60\x597d"
264#endif
265 );
[email protected]650b2d52013-02-10 03:41:45266 base::FilePath match_filename(kTestString);
[email protected]c5899b252013-01-13 00:42:10267 EXPECT_CALL(mock(0), GetTargetFilePath()).WillRepeatedly(ReturnRef(
268 match_filename));
[email protected]650b2d52013-02-10 03:41:45269 base::FilePath fail_filename(FILE_PATH_LITERAL("fail"));
[email protected]c5899b252013-01-13 00:42:10270 EXPECT_CALL(mock(1), GetTargetFilePath()).WillRepeatedly(ReturnRef(
271 fail_filename));
272 GURL fail_url("http://example.com/fail");
273 EXPECT_CALL(mock(0), GetOriginalUrl()).WillRepeatedly(ReturnRef(fail_url));
274 EXPECT_CALL(mock(1), GetOriginalUrl()).WillRepeatedly(ReturnRef(fail_url));
[email protected]f1d784d62013-07-28 18:36:09275 std::vector<base::FilePath::StringType> query_terms;
276 query_terms.push_back(kTestString);
277 AddFilter(DownloadQuery::FILTER_QUERY, query_terms);
[email protected]c5899b252013-01-13 00:42:10278 ExpectStandardFilterResults();
279}
280
281TEST_F(DownloadQueryTest, DownloadQueryTest_FilterFilenameRegex) {
282 CreateMocks(2);
[email protected]650b2d52013-02-10 03:41:45283 base::FilePath match_filename(FILE_PATH_LITERAL("query"));
[email protected]c5899b252013-01-13 00:42:10284 EXPECT_CALL(mock(0), GetTargetFilePath()).WillRepeatedly(ReturnRef(
285 match_filename));
[email protected]650b2d52013-02-10 03:41:45286 base::FilePath fail_filename(FILE_PATH_LITERAL("fail"));
[email protected]c5899b252013-01-13 00:42:10287 EXPECT_CALL(mock(1), GetTargetFilePath()).WillRepeatedly(ReturnRef(
288 fail_filename));
289 AddFilter(DownloadQuery::FILTER_FILENAME_REGEX, "y");
290 ExpectStandardFilterResults();
291}
292
293TEST_F(DownloadQueryTest, DownloadQueryTest_SortFilename) {
294 CreateMocks(2);
[email protected]650b2d52013-02-10 03:41:45295 base::FilePath b_filename(FILE_PATH_LITERAL("b"));
[email protected]c5899b252013-01-13 00:42:10296 EXPECT_CALL(mock(0), GetTargetFilePath()).WillRepeatedly(ReturnRef(
297 b_filename));
[email protected]650b2d52013-02-10 03:41:45298 base::FilePath a_filename(FILE_PATH_LITERAL("a"));
[email protected]c5899b252013-01-13 00:42:10299 EXPECT_CALL(mock(1), GetTargetFilePath()).WillRepeatedly(ReturnRef(
300 a_filename));
301 query()->AddSorter(DownloadQuery::SORT_FILENAME, DownloadQuery::ASCENDING);
302 ExpectSortInverted();
303}
304
305TEST_F(DownloadQueryTest, DownloadQueryTest_FilterFilename) {
306 CreateMocks(2);
[email protected]650b2d52013-02-10 03:41:45307 base::FilePath match_filename(FILE_PATH_LITERAL("query"));
[email protected]c5899b252013-01-13 00:42:10308 EXPECT_CALL(mock(0), GetTargetFilePath()).WillRepeatedly(ReturnRef(
309 match_filename));
[email protected]650b2d52013-02-10 03:41:45310 base::FilePath fail_filename(FILE_PATH_LITERAL("fail"));
[email protected]c5899b252013-01-13 00:42:10311 EXPECT_CALL(mock(1), GetTargetFilePath()).WillRepeatedly(ReturnRef(
312 fail_filename));
313 AddFilter(DownloadQuery::FILTER_FILENAME, match_filename.value().c_str());
314 ExpectStandardFilterResults();
315}
316
317TEST_F(DownloadQueryTest, DownloadQueryTest_FilterUrlRegex) {
318 CreateMocks(2);
319 GURL match_url("http://query.com/query");
320 EXPECT_CALL(mock(0), GetOriginalUrl()).WillRepeatedly(ReturnRef(match_url));
321 GURL fail_url("http://example.com/fail");
322 EXPECT_CALL(mock(1), GetOriginalUrl()).WillRepeatedly(ReturnRef(fail_url));
323 AddFilter(DownloadQuery::FILTER_URL_REGEX, "query");
324 ExpectStandardFilterResults();
325}
326
327TEST_F(DownloadQueryTest, DownloadQueryTest_SortUrl) {
328 CreateMocks(2);
329 GURL b_url("http://example.com/b");
330 EXPECT_CALL(mock(0), GetOriginalUrl()).WillRepeatedly(ReturnRef(b_url));
331 GURL a_url("http://example.com/a");
332 EXPECT_CALL(mock(1), GetOriginalUrl()).WillRepeatedly(ReturnRef(a_url));
333 query()->AddSorter(DownloadQuery::SORT_URL, DownloadQuery::ASCENDING);
334 ExpectSortInverted();
335}
336
337TEST_F(DownloadQueryTest, DownloadQueryTest_FilterUrl) {
338 CreateMocks(2);
339 GURL match_url("http://query.com/query");
340 EXPECT_CALL(mock(0), GetOriginalUrl()).WillRepeatedly(ReturnRef(match_url));
341 GURL fail_url("http://example.com/fail");
342 EXPECT_CALL(mock(1), GetOriginalUrl()).WillRepeatedly(ReturnRef(fail_url));
343 AddFilter(DownloadQuery::FILTER_URL, match_url.spec().c_str());
344 ExpectStandardFilterResults();
345}
346
347TEST_F(DownloadQueryTest, DownloadQueryTest_FilterCallback) {
348 CreateMocks(2);
349 CHECK(query()->AddFilter(base::Bind(&IdNotEqual, 1)));
350 ExpectStandardFilterResults();
351}
352
353TEST_F(DownloadQueryTest, DownloadQueryTest_FilterBytesReceived) {
[email protected]be052212011-12-14 18:40:40354 CreateMocks(2);
355 EXPECT_CALL(mock(0), GetReceivedBytes()).WillRepeatedly(Return(0));
356 EXPECT_CALL(mock(1), GetReceivedBytes()).WillRepeatedly(Return(1));
[email protected]c5899b252013-01-13 00:42:10357 AddFilter(DownloadQuery::FILTER_BYTES_RECEIVED, 0);
358 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40359}
360
[email protected]c5899b252013-01-13 00:42:10361TEST_F(DownloadQueryTest, DownloadQueryTest_SortBytesReceived) {
[email protected]be052212011-12-14 18:40:40362 CreateMocks(2);
[email protected]c5899b252013-01-13 00:42:10363 EXPECT_CALL(mock(0), GetReceivedBytes()).WillRepeatedly(Return(0));
364 EXPECT_CALL(mock(1), GetReceivedBytes()).WillRepeatedly(Return(1));
365 query()->AddSorter(DownloadQuery::SORT_BYTES_RECEIVED,
366 DownloadQuery::DESCENDING);
367 ExpectSortInverted();
[email protected]be052212011-12-14 18:40:40368}
369
[email protected]c5899b252013-01-13 00:42:10370TEST_F(DownloadQueryTest, DownloadQueryTest_FilterDangerAccepted) {
[email protected]be052212011-12-14 18:40:40371 CreateMocks(2);
[email protected]cda79062013-01-17 01:50:52372 EXPECT_CALL(mock(0), GetDangerType()).WillRepeatedly(Return(
373 content::DOWNLOAD_DANGER_TYPE_USER_VALIDATED));
374 EXPECT_CALL(mock(1), GetDangerType()).WillRepeatedly(Return(
375 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE));
[email protected]c5899b252013-01-13 00:42:10376 AddFilter(DownloadQuery::FILTER_DANGER_ACCEPTED, true);
377 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40378}
379
[email protected]c5899b252013-01-13 00:42:10380TEST_F(DownloadQueryTest, DownloadQueryTest_SortDangerAccepted) {
[email protected]be052212011-12-14 18:40:40381 CreateMocks(2);
[email protected]cda79062013-01-17 01:50:52382 EXPECT_CALL(mock(0), GetDangerType()).WillRepeatedly(Return(
383 content::DOWNLOAD_DANGER_TYPE_USER_VALIDATED));
384 EXPECT_CALL(mock(1), GetDangerType()).WillRepeatedly(Return(
385 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE));
[email protected]c5899b252013-01-13 00:42:10386 query()->AddSorter(DownloadQuery::SORT_DANGER_ACCEPTED,
387 DownloadQuery::ASCENDING);
388 ExpectSortInverted();
[email protected]be052212011-12-14 18:40:40389}
390
[email protected]3291a4982013-01-14 00:58:52391TEST_F(DownloadQueryTest, DownloadQueryTest_FilterExists) {
392 CreateMocks(2);
393 EXPECT_CALL(mock(0), GetFileExternallyRemoved()).WillRepeatedly(Return(
394 false));
395 EXPECT_CALL(mock(1), GetFileExternallyRemoved()).WillRepeatedly(Return(
396 true));
397 AddFilter(DownloadQuery::FILTER_EXISTS, true);
398 ExpectStandardFilterResults();
399}
400
401TEST_F(DownloadQueryTest, DownloadQueryTest_SortExists) {
402 CreateMocks(2);
403 EXPECT_CALL(mock(0), GetFileExternallyRemoved()).WillRepeatedly(Return(
404 false));
405 EXPECT_CALL(mock(1), GetFileExternallyRemoved()).WillRepeatedly(Return(
406 true));
407 query()->AddSorter(DownloadQuery::SORT_EXISTS,
408 DownloadQuery::ASCENDING);
409 ExpectSortInverted();
410}
411
[email protected]c5899b252013-01-13 00:42:10412TEST_F(DownloadQueryTest, DownloadQueryTest_FilterMime) {
[email protected]be052212011-12-14 18:40:40413 CreateMocks(2);
[email protected]c5899b252013-01-13 00:42:10414 EXPECT_CALL(mock(0), GetMimeType()).WillRepeatedly(Return("text"));
415 EXPECT_CALL(mock(1), GetMimeType()).WillRepeatedly(Return("image"));
416 AddFilter(DownloadQuery::FILTER_MIME, "text");
417 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40418}
419
[email protected]c5899b252013-01-13 00:42:10420TEST_F(DownloadQueryTest, DownloadQueryTest_SortMime) {
421 CreateMocks(2);
422 EXPECT_CALL(mock(0), GetMimeType()).WillRepeatedly(Return("b"));
423 EXPECT_CALL(mock(1), GetMimeType()).WillRepeatedly(Return("a"));
424 query()->AddSorter(DownloadQuery::SORT_MIME, DownloadQuery::ASCENDING);
425 ExpectSortInverted();
426}
427
428TEST_F(DownloadQueryTest, DownloadQueryTest_FilterPaused) {
[email protected]be052212011-12-14 18:40:40429 CreateMocks(2);
430 EXPECT_CALL(mock(0), IsPaused()).WillRepeatedly(Return(true));
431 EXPECT_CALL(mock(1), IsPaused()).WillRepeatedly(Return(false));
[email protected]c5899b252013-01-13 00:42:10432 AddFilter(DownloadQuery::FILTER_PAUSED, true);
433 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40434}
435
[email protected]c5899b252013-01-13 00:42:10436TEST_F(DownloadQueryTest, DownloadQueryTest_SortPaused) {
[email protected]d5e60e192013-01-04 00:09:50437 CreateMocks(2);
[email protected]c5899b252013-01-13 00:42:10438 EXPECT_CALL(mock(0), IsPaused()).WillRepeatedly(Return(true));
439 EXPECT_CALL(mock(1), IsPaused()).WillRepeatedly(Return(false));
440 query()->AddSorter(DownloadQuery::SORT_PAUSED, DownloadQuery::ASCENDING);
441 ExpectSortInverted();
[email protected]d5e60e192013-01-04 00:09:50442}
443
[email protected]c5899b252013-01-13 00:42:10444TEST_F(DownloadQueryTest, DownloadQueryTest_FilterStartedAfter) {
[email protected]be052212011-12-14 18:40:40445 CreateMocks(2);
446 EXPECT_CALL(mock(0), GetStartTime()).WillRepeatedly(Return(
[email protected]c5899b252013-01-13 00:42:10447 base::Time::FromTimeT(kSomeKnownTime + 2)));
[email protected]be052212011-12-14 18:40:40448 EXPECT_CALL(mock(1), GetStartTime()).WillRepeatedly(Return(
[email protected]c5899b252013-01-13 00:42:10449 base::Time::FromTimeT(kSomeKnownTime + 1)));
450 AddFilter(DownloadQuery::FILTER_STARTED_AFTER,
451 std::string(kSomeKnownTime8601) + "1" + std::string(k8601Suffix));
452 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40453}
454
[email protected]c5899b252013-01-13 00:42:10455TEST_F(DownloadQueryTest, DownloadQueryTest_FilterStartedBefore) {
456 CreateMocks(2);
457 EXPECT_CALL(mock(0), GetStartTime()).WillRepeatedly(Return(
458 base::Time::FromTimeT(kSomeKnownTime + 2)));
459 EXPECT_CALL(mock(1), GetStartTime()).WillRepeatedly(Return(
460 base::Time::FromTimeT(kSomeKnownTime + 4)));
461 AddFilter(DownloadQuery::FILTER_STARTED_BEFORE,
462 std::string(kSomeKnownTime8601) + "4" + std::string(k8601Suffix));
463 ExpectStandardFilterResults();
464}
465
466TEST_F(DownloadQueryTest, DownloadQueryTest_FilterStartTime) {
467 CreateMocks(2);
468 EXPECT_CALL(mock(0), GetStartTime()).WillRepeatedly(Return(
469 base::Time::FromTimeT(kSomeKnownTime + 2)));
470 EXPECT_CALL(mock(1), GetStartTime()).WillRepeatedly(Return(
471 base::Time::FromTimeT(kSomeKnownTime + 4)));
472 AddFilter(DownloadQuery::FILTER_START_TIME,
473 std::string(kSomeKnownTime8601) + "2" + std::string(k8601Suffix));
474 ExpectStandardFilterResults();
475}
476
477TEST_F(DownloadQueryTest, DownloadQueryTest_SortStartTime) {
478 CreateMocks(2);
479 EXPECT_CALL(mock(0), GetStartTime()).WillRepeatedly(Return(
480 base::Time::FromTimeT(kSomeKnownTime + 2)));
481 EXPECT_CALL(mock(1), GetStartTime()).WillRepeatedly(Return(
482 base::Time::FromTimeT(kSomeKnownTime + 4)));
483 query()->AddSorter(DownloadQuery::SORT_START_TIME, DownloadQuery::DESCENDING);
484 ExpectSortInverted();
485}
486
487TEST_F(DownloadQueryTest, DownloadQueryTest_FilterEndedAfter) {
488 CreateMocks(2);
489 EXPECT_CALL(mock(0), GetEndTime()).WillRepeatedly(Return(
490 base::Time::FromTimeT(kSomeKnownTime + 2)));
491 EXPECT_CALL(mock(1), GetEndTime()).WillRepeatedly(Return(
492 base::Time::FromTimeT(kSomeKnownTime + 1)));
493 AddFilter(DownloadQuery::FILTER_ENDED_AFTER,
494 std::string(kSomeKnownTime8601) + "1" + std::string(k8601Suffix));
495 ExpectStandardFilterResults();
496}
497
498TEST_F(DownloadQueryTest, DownloadQueryTest_FilterEndedBefore) {
499 CreateMocks(2);
500 EXPECT_CALL(mock(0), GetEndTime()).WillRepeatedly(Return(
501 base::Time::FromTimeT(kSomeKnownTime + 2)));
502 EXPECT_CALL(mock(1), GetEndTime()).WillRepeatedly(Return(
503 base::Time::FromTimeT(kSomeKnownTime + 4)));
504 AddFilter(DownloadQuery::FILTER_ENDED_BEFORE,
505 std::string(kSomeKnownTime8601) + "4" + std::string(k8601Suffix));
506 ExpectStandardFilterResults();
507}
508
509TEST_F(DownloadQueryTest, DownloadQueryTest_FilterEndTime) {
510 CreateMocks(2);
511 EXPECT_CALL(mock(0), GetEndTime()).WillRepeatedly(Return(
512 base::Time::FromTimeT(kSomeKnownTime + 2)));
513 EXPECT_CALL(mock(1), GetEndTime()).WillRepeatedly(Return(
514 base::Time::FromTimeT(kSomeKnownTime + 4)));
515 AddFilter(DownloadQuery::FILTER_END_TIME,
516 std::string(kSomeKnownTime8601) + "2" + std::string(k8601Suffix));
517 ExpectStandardFilterResults();
518}
519
520TEST_F(DownloadQueryTest, DownloadQueryTest_SortEndTime) {
521 CreateMocks(2);
522 EXPECT_CALL(mock(0), GetEndTime()).WillRepeatedly(Return(
523 base::Time::FromTimeT(kSomeKnownTime + 2)));
524 EXPECT_CALL(mock(1), GetEndTime()).WillRepeatedly(Return(
525 base::Time::FromTimeT(kSomeKnownTime + 4)));
526 query()->AddSorter(DownloadQuery::SORT_END_TIME, DownloadQuery::DESCENDING);
527 ExpectSortInverted();
528}
529
530TEST_F(DownloadQueryTest, DownloadQueryTest_FilterTotalBytesGreater) {
531 CreateMocks(2);
532 EXPECT_CALL(mock(0), GetTotalBytes()).WillRepeatedly(Return(2));
533 EXPECT_CALL(mock(1), GetTotalBytes()).WillRepeatedly(Return(1));
534 AddFilter(DownloadQuery::FILTER_TOTAL_BYTES_GREATER, 1);
535 ExpectStandardFilterResults();
536}
537
538TEST_F(DownloadQueryTest, DownloadQueryTest_FilterTotalBytesLess) {
539 CreateMocks(2);
540 EXPECT_CALL(mock(0), GetTotalBytes()).WillRepeatedly(Return(2));
541 EXPECT_CALL(mock(1), GetTotalBytes()).WillRepeatedly(Return(4));
542 AddFilter(DownloadQuery::FILTER_TOTAL_BYTES_LESS, 4);
543 ExpectStandardFilterResults();
544}
545
546TEST_F(DownloadQueryTest, DownloadQueryTest_FilterTotalBytes) {
547 CreateMocks(2);
548 EXPECT_CALL(mock(0), GetTotalBytes()).WillRepeatedly(Return(2));
549 EXPECT_CALL(mock(1), GetTotalBytes()).WillRepeatedly(Return(4));
550 AddFilter(DownloadQuery::FILTER_TOTAL_BYTES, 2);
551 ExpectStandardFilterResults();
552}
553
554TEST_F(DownloadQueryTest, DownloadQueryTest_SortTotalBytes) {
555 CreateMocks(2);
556 EXPECT_CALL(mock(0), GetTotalBytes()).WillRepeatedly(Return(2));
557 EXPECT_CALL(mock(1), GetTotalBytes()).WillRepeatedly(Return(4));
558 query()->AddSorter(DownloadQuery::SORT_TOTAL_BYTES,
559 DownloadQuery::DESCENDING);
560 ExpectSortInverted();
561}
562
563TEST_F(DownloadQueryTest, DownloadQueryTest_FilterState) {
[email protected]be052212011-12-14 18:40:40564 CreateMocks(2);
565 EXPECT_CALL(mock(0), GetState()).WillRepeatedly(Return(
[email protected]c5899b252013-01-13 00:42:10566 DownloadItem::IN_PROGRESS));
[email protected]be052212011-12-14 18:40:40567 EXPECT_CALL(mock(1), GetState()).WillRepeatedly(Return(
[email protected]c5899b252013-01-13 00:42:10568 DownloadItem::CANCELLED));
569 query()->AddFilter(DownloadItem::IN_PROGRESS);
570 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40571}
572
[email protected]c5899b252013-01-13 00:42:10573TEST_F(DownloadQueryTest, DownloadQueryTest_SortState) {
[email protected]be052212011-12-14 18:40:40574 CreateMocks(2);
[email protected]c5899b252013-01-13 00:42:10575 EXPECT_CALL(mock(0), GetState()).WillRepeatedly(Return(
576 DownloadItem::IN_PROGRESS));
577 EXPECT_CALL(mock(1), GetState()).WillRepeatedly(Return(
578 DownloadItem::CANCELLED));
579 query()->AddSorter(DownloadQuery::SORT_STATE, DownloadQuery::DESCENDING);
580 ExpectSortInverted();
[email protected]be052212011-12-14 18:40:40581}
582
[email protected]c5899b252013-01-13 00:42:10583TEST_F(DownloadQueryTest, DownloadQueryTest_FilterDanger) {
[email protected]be052212011-12-14 18:40:40584 CreateMocks(2);
[email protected]c5899b252013-01-13 00:42:10585 EXPECT_CALL(mock(0), GetDangerType()).WillRepeatedly(Return(
586 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS));
587 EXPECT_CALL(mock(1), GetDangerType()).WillRepeatedly(Return(
588 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE));
589 query()->AddFilter(content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS);
590 ExpectStandardFilterResults();
[email protected]be052212011-12-14 18:40:40591}
592
[email protected]c5899b252013-01-13 00:42:10593TEST_F(DownloadQueryTest, DownloadQueryTest_SortDanger) {
594 CreateMocks(2);
595 EXPECT_CALL(mock(0), GetDangerType()).WillRepeatedly(Return(
596 content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS));
597 EXPECT_CALL(mock(1), GetDangerType()).WillRepeatedly(Return(
598 content::DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE));
599 query()->AddSorter(DownloadQuery::SORT_DANGER, DownloadQuery::DESCENDING);
600 ExpectSortInverted();
601}
602
603TEST_F(DownloadQueryTest, DownloadQueryTest_DefaultSortById1) {
[email protected]be052212011-12-14 18:40:40604 CreateMocks(2);
605 EXPECT_CALL(mock(0), GetReceivedBytes()).WillRepeatedly(Return(0));
606 EXPECT_CALL(mock(1), GetReceivedBytes()).WillRepeatedly(Return(0));
[email protected]c5899b252013-01-13 00:42:10607 query()->AddSorter(DownloadQuery::SORT_BYTES_RECEIVED,
608 DownloadQuery::ASCENDING);
[email protected]be052212011-12-14 18:40:40609 Search();
[email protected]c5899b252013-01-13 00:42:10610 ASSERT_EQ(2U, results()->size());
[email protected]530047e2013-07-12 17:02:25611 EXPECT_EQ(0U, results()->at(0)->GetId());
612 EXPECT_EQ(1U, results()->at(1)->GetId());
[email protected]c5899b252013-01-13 00:42:10613}
614
615TEST_F(DownloadQueryTest, DownloadQueryTest_DefaultSortById2) {
616 CreateMocks(2);
617 EXPECT_CALL(mock(0), GetReceivedBytes()).WillRepeatedly(Return(0));
618 EXPECT_CALL(mock(1), GetReceivedBytes()).WillRepeatedly(Return(0));
619 query()->AddSorter(DownloadQuery::SORT_BYTES_RECEIVED,
620 DownloadQuery::DESCENDING);
621 Search();
622 ASSERT_EQ(2U, results()->size());
[email protected]530047e2013-07-12 17:02:25623 EXPECT_EQ(0U, results()->at(0)->GetId());
624 EXPECT_EQ(1U, results()->at(1)->GetId());
[email protected]be052212011-12-14 18:40:40625}
626
627TEST_F(DownloadQueryTest, DownloadQueryFilterPerformance) {
[email protected]c5899b252013-01-13 00:42:10628 static const int kNumItems = 100;
629 static const int kNumFilters = 100;
[email protected]be052212011-12-14 18:40:40630 CreateMocks(kNumItems);
631 for (size_t i = 0; i < (kNumFilters - 1); ++i) {
632 query()->AddFilter(base::Bind(&AlwaysReturn, true));
633 }
634 query()->AddFilter(base::Bind(&AlwaysReturn, false));
635 base::Time start = base::Time::Now();
636 Search();
637 base::Time end = base::Time::Now();
638 double nanos = (end - start).InMillisecondsF() * 1000.0 * 1000.0;
639 double nanos_per_item = nanos / static_cast<double>(kNumItems);
640 double nanos_per_item_per_filter = nanos_per_item
641 / static_cast<double>(kNumFilters);
642 std::cout << "Search took " << nanos_per_item_per_filter
643 << " nanoseconds per item per filter.\n";
644}