Index: components/offline_pages/offline_page_model_query_unittest.cc |
diff --git a/components/offline_pages/offline_page_model_query_unittest.cc b/components/offline_pages/offline_page_model_query_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f8e300646fd8211891e177dbd2630d7fdf285856 |
--- /dev/null |
+++ b/components/offline_pages/offline_page_model_query_unittest.cc |
@@ -0,0 +1,421 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/time/time.h" |
+#include "components/offline_pages/client_namespace_constants.h" |
+#include "components/offline_pages/client_policy_controller.h" |
+#include "components/offline_pages/offline_page_client_policy.h" |
+#include "components/offline_pages/offline_page_item.h" |
+#include "components/offline_pages/offline_page_model_query.h" |
+ |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace offline_pages { |
+ |
+using Requirement = OfflinePageModelQueryBuilder::Requirement; |
+ |
+namespace { |
+ |
+const ClientId kClientId1 = {kDefaultNamespace, "id1"}; |
+const GURL kUrl1 = GURL("https://ktestitem1.com"); |
+const OfflinePageItem kTestItem1(kUrl1, 1, kClientId1, base::FilePath(), 1); |
+ |
+const ClientId kClientId2 = {kDefaultNamespace, "id2"}; |
+const GURL kUrl2 = GURL("https://ktestitem2.com"); |
+const OfflinePageItem kTestItem2(kUrl2, 2, kClientId2, base::FilePath(), 2); |
+ |
+const char kTestNamespace[] = "test_namespace"; |
+} // namespace |
+ |
+class OfflinePageModelQueryTest : public testing::Test { |
+ public: |
+ OfflinePageModelQueryTest(); |
+ ~OfflinePageModelQueryTest() override; |
+ |
+ protected: |
+ ClientPolicyController policy_; |
+ OfflinePageModelQueryBuilder builder_; |
+ |
+ const OfflinePageItem expired_page() { |
+ OfflinePageItem expiredTestItem(GURL("https://ktestitem1.com"), 3, |
+ kClientId1, base::FilePath(), 3); |
+ expiredTestItem.expiration_time = base::Time::Now(); |
+ |
+ return expiredTestItem; |
+ } |
+ |
+ const OfflinePageItem download_page() { |
+ return OfflinePageItem(GURL("https://download.com"), 4, |
+ {kDownloadNamespace, "id1"}, base::FilePath(), 4); |
+ } |
+ |
+ const OfflinePageItem original_tab_page() { |
+ return OfflinePageItem(GURL("https://download.com"), 5, |
+ {kLastNNamespace, "id1"}, base::FilePath(), 5); |
+ } |
+ |
+ const OfflinePageItem test_namespace_page() { |
+ return OfflinePageItem(GURL("https://download.com"), 6, |
+ {kTestNamespace, "id1"}, base::FilePath(), 6); |
+ } |
+ |
+ const OfflinePageItem recent_page() { |
+ return OfflinePageItem(GURL("https://download.com"), 7, |
+ {kLastNNamespace, "id1"}, base::FilePath(), 7); |
+ } |
+}; |
+ |
+OfflinePageModelQueryTest::OfflinePageModelQueryTest() { |
+ policy_.AddPolicyForTest( |
+ kTestNamespace, |
+ OfflinePageClientPolicyBuilder(kTestNamespace, |
+ LifetimePolicy::LifetimeType::TEMPORARY, |
+ kUnlimitedPages, kUnlimitedPages) |
+ .SetIsOnlyShownInOriginalTab(true)); |
+} |
+ |
+OfflinePageModelQueryTest::~OfflinePageModelQueryTest() {} |
+ |
+TEST_F(OfflinePageModelQueryTest, DefaultValues) { |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ |
+ EXPECT_NE(nullptr, query.get()); |
+ EXPECT_FALSE(query->GetAllowExpired()); |
+ EXPECT_EQ(Requirement::UNSET, query->GetRestrictedToOfflineIds().first); |
+ EXPECT_FALSE(query->GetRestrictedToNamespaces().first); |
+ |
+ EXPECT_TRUE(query->Matches(kTestItem1)); |
+ EXPECT_TRUE(query->Matches(kTestItem2)); |
+ EXPECT_FALSE(query->Matches(expired_page())); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, OfflinePageIdsSet_Exclude) { |
+ std::vector<int64_t> ids = {1, 4, 9, 16}; |
+ builder_.SetOfflinePageIds(Requirement::EXCLUDE_MATCHING, ids); |
+ |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ std::pair<Requirement, std::set<int64_t>> offline_id_restriction = |
+ query->GetRestrictedToOfflineIds(); |
+ EXPECT_EQ(Requirement::EXCLUDE_MATCHING, offline_id_restriction.first); |
+ |
+ ASSERT_EQ(ids.size(), offline_id_restriction.second.size()); |
+ for (auto id : ids) { |
+ EXPECT_EQ(1U, offline_id_restriction.second.count(id)) |
+ << "Did not find " << id << "in query restrictions."; |
+ } |
+ |
+ EXPECT_FALSE(query->Matches(kTestItem1)); |
+ EXPECT_TRUE(query->Matches(kTestItem2)); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, OfflinePageIdsSet) { |
+ std::vector<int64_t> ids = {1, 4, 9, 16}; |
+ builder_.SetOfflinePageIds(Requirement::INCLUDE_MATCHING, ids); |
+ |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ std::pair<Requirement, std::set<int64_t>> offline_id_restriction = |
+ query->GetRestrictedToOfflineIds(); |
+ EXPECT_EQ(Requirement::INCLUDE_MATCHING, offline_id_restriction.first); |
+ |
+ ASSERT_EQ(ids.size(), offline_id_restriction.second.size()); |
+ for (auto id : ids) { |
+ EXPECT_EQ(1U, offline_id_restriction.second.count(id)) |
+ << "Did not find " << id << "in query restrictions."; |
+ } |
+ |
+ EXPECT_TRUE(query->Matches(kTestItem1)); |
+ EXPECT_FALSE(query->Matches(kTestItem2)); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, OfflinePageIdsReplace) { |
+ std::vector<int64_t> ids = {1, 4, 9, 16}; |
+ std::vector<int64_t> ids2 = {1, 2, 3, 4}; |
+ |
+ builder_.SetOfflinePageIds(Requirement::INCLUDE_MATCHING, ids); |
+ builder_.SetOfflinePageIds(Requirement::INCLUDE_MATCHING, ids2); |
+ |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ std::pair<Requirement, std::set<int64_t>> offline_id_restriction = |
+ query->GetRestrictedToOfflineIds(); |
+ EXPECT_EQ(Requirement::INCLUDE_MATCHING, offline_id_restriction.first); |
+ |
+ ASSERT_EQ(ids2.size(), offline_id_restriction.second.size()); |
+ for (auto id : ids2) { |
+ EXPECT_EQ(1U, offline_id_restriction.second.count(id)) |
+ << "Did not find " << id << "in query restrictions."; |
+ } |
+ |
+ EXPECT_TRUE(query->Matches(kTestItem1)); |
+ EXPECT_TRUE(query->Matches(kTestItem2)); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, ClientIdsSet) { |
+ std::vector<ClientId> ids = {kClientId2, {"invalid", "client id"}}; |
+ builder_.SetClientIds(Requirement::INCLUDE_MATCHING, ids); |
+ |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ |
+ auto restriction = query->GetRestrictedToClientIds(); |
+ const Requirement& requirement = restriction.first; |
+ const std::set<ClientId>& ids_out = restriction.second; |
+ |
+ EXPECT_EQ(Requirement::INCLUDE_MATCHING, requirement); |
+ |
+ ASSERT_EQ(ids.size(), ids_out.size()); |
+ for (auto id : ids) { |
+ EXPECT_EQ(1U, ids_out.count(id)) << "Did not find " << id.name_space << "." |
+ << id.id << "in query restrictions."; |
+ } |
+ |
+ EXPECT_TRUE(query->Matches(kTestItem2)); |
+ EXPECT_FALSE(query->Matches(kTestItem1)); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, ClientIdsSet_Exclude) { |
+ std::vector<ClientId> ids = {kClientId2, {"invalid", "client id"}}; |
+ builder_.SetClientIds(Requirement::EXCLUDE_MATCHING, ids); |
+ |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ |
+ auto restriction = query->GetRestrictedToClientIds(); |
+ const Requirement& requirement = restriction.first; |
+ const std::set<ClientId>& ids_out = restriction.second; |
+ |
+ EXPECT_EQ(Requirement::EXCLUDE_MATCHING, requirement); |
+ |
+ ASSERT_EQ(ids.size(), ids_out.size()); |
+ for (auto id : ids) { |
+ EXPECT_EQ(1U, ids_out.count(id)) << "Did not find " << id.name_space << "." |
+ << id.id << "in query restrictions."; |
+ } |
+ |
+ EXPECT_TRUE(query->Matches(kTestItem1)); |
+ EXPECT_FALSE(query->Matches(kTestItem2)); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, ClientIdsReplace) { |
+ std::vector<ClientId> ids = {kClientId2, {"invalid", "client id"}}; |
+ std::vector<ClientId> ids2 = {kClientId1, {"invalid", "client id"}}; |
+ |
+ builder_.SetClientIds(Requirement::INCLUDE_MATCHING, ids); |
+ builder_.SetClientIds(Requirement::INCLUDE_MATCHING, ids2); |
+ |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ |
+ auto restriction = query->GetRestrictedToClientIds(); |
+ const Requirement& requirement = restriction.first; |
+ const std::set<ClientId>& ids_out = restriction.second; |
+ |
+ EXPECT_EQ(Requirement::INCLUDE_MATCHING, requirement); |
+ |
+ ASSERT_EQ(ids2.size(), ids_out.size()); |
+ for (auto id : ids2) { |
+ EXPECT_EQ(1U, ids_out.count(id)) << "Did not find " << id.name_space << "." |
+ << id.id << "in query restrictions."; |
+ } |
+ |
+ EXPECT_TRUE(query->Matches(kTestItem1)); |
+ EXPECT_FALSE(query->Matches(kTestItem2)); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, UrlsSet) { |
+ std::vector<GURL> urls = {kUrl1, GURL("https://abc.def")}; |
+ builder_.SetUrls(Requirement::INCLUDE_MATCHING, urls); |
+ |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ |
+ auto restriction = query->GetRestrictedToUrls(); |
+ const Requirement& requirement = restriction.first; |
+ const std::set<GURL>& urls_out = restriction.second; |
+ |
+ EXPECT_EQ(Requirement::INCLUDE_MATCHING, requirement); |
+ |
+ ASSERT_EQ(urls.size(), urls_out.size()); |
+ for (auto url : urls) { |
+ EXPECT_EQ(1U, urls_out.count(url)) << "Did not find " << url |
+ << "in query restrictions."; |
+ } |
+ |
+ EXPECT_TRUE(query->Matches(kTestItem1)); |
+ EXPECT_FALSE(query->Matches(kTestItem2)); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, UrlsSet_Exclude) { |
+ std::vector<GURL> urls = {kUrl1, GURL("https://abc.def")}; |
+ builder_.SetUrls(Requirement::EXCLUDE_MATCHING, urls); |
+ |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ |
+ auto restriction = query->GetRestrictedToUrls(); |
+ const Requirement& requirement = restriction.first; |
+ const std::set<GURL>& urls_out = restriction.second; |
+ |
+ EXPECT_EQ(Requirement::EXCLUDE_MATCHING, requirement); |
+ |
+ ASSERT_EQ(urls.size(), urls_out.size()); |
+ for (auto url : urls) { |
+ EXPECT_EQ(1U, urls_out.count(url)) << "Did not find " << url |
+ << "in query restrictions."; |
+ } |
+ |
+ EXPECT_FALSE(query->Matches(kTestItem1)); |
+ EXPECT_TRUE(query->Matches(kTestItem2)); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, UrlsReplace) { |
+ std::vector<GURL> urls = {kUrl1, GURL("https://abc.def")}; |
+ std::vector<GURL> urls2 = {kUrl2, GURL("https://abc.def")}; |
+ |
+ builder_.SetUrls(Requirement::INCLUDE_MATCHING, urls); |
+ builder_.SetUrls(Requirement::INCLUDE_MATCHING, urls2); |
+ |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ |
+ auto restriction = query->GetRestrictedToUrls(); |
+ const Requirement& requirement = restriction.first; |
+ const std::set<GURL>& urls_out = restriction.second; |
+ |
+ EXPECT_EQ(Requirement::INCLUDE_MATCHING, requirement); |
+ |
+ ASSERT_EQ(urls2.size(), urls_out.size()); |
+ for (auto url : urls2) { |
+ EXPECT_EQ(1U, urls_out.count(url)) << "Did not find " << url |
+ << "in query restrictions."; |
+ } |
+ |
+ EXPECT_FALSE(query->Matches(kTestItem1)); |
+ EXPECT_TRUE(query->Matches(kTestItem2)); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, AllowExpired) { |
+ std::unique_ptr<OfflinePageModelQuery> query = |
+ builder_.AllowExpiredPages(true).Build(&policy_); |
+ |
+ EXPECT_NE(nullptr, query.get()); |
+ EXPECT_TRUE(query->GetAllowExpired()); |
+ |
+ EXPECT_TRUE(query->Matches(kTestItem1)); |
+ EXPECT_TRUE(query->Matches(kTestItem2)); |
+ EXPECT_TRUE(query->Matches(expired_page())); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, RequireSupportedByDownload_Only) { |
+ builder_.RequireSupportedByDownload(Requirement::INCLUDE_MATCHING); |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ |
+ auto restriction = query->GetRestrictedToNamespaces(); |
+ std::set<std::string> namespaces_allowed = restriction.second; |
+ bool restricted_to_namespaces = restriction.first; |
+ EXPECT_TRUE(restricted_to_namespaces); |
+ |
+ for (const std::string& name_space : namespaces_allowed) { |
+ EXPECT_TRUE(policy_.IsSupportedByDownload(name_space)) << "Namespace: " |
+ << name_space; |
+ } |
+ EXPECT_FALSE(query->Matches(kTestItem1)); |
+ EXPECT_TRUE(query->Matches(download_page())); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, RequireSupportedByDownload_Except) { |
+ builder_.RequireSupportedByDownload(Requirement::EXCLUDE_MATCHING); |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ |
+ auto restriction = query->GetRestrictedToNamespaces(); |
+ std::set<std::string> namespaces_allowed = restriction.second; |
+ bool restricted_to_namespaces = restriction.first; |
+ EXPECT_TRUE(restricted_to_namespaces); |
+ |
+ for (const std::string& name_space : namespaces_allowed) { |
+ EXPECT_FALSE(policy_.IsSupportedByDownload(name_space)) << "Namespace: " |
+ << name_space; |
+ } |
+ |
+ EXPECT_TRUE(query->Matches(kTestItem1)); |
+ EXPECT_FALSE(query->Matches(download_page())); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, RequireShownAsRecentlyVisitedSite_Only) { |
+ builder_.RequireShownAsRecentlyVisitedSite(Requirement::INCLUDE_MATCHING); |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ |
+ auto restriction = query->GetRestrictedToNamespaces(); |
+ std::set<std::string> namespaces_allowed = restriction.second; |
+ bool restricted_to_namespaces = restriction.first; |
+ EXPECT_TRUE(restricted_to_namespaces); |
+ |
+ for (const std::string& name_space : namespaces_allowed) { |
+ EXPECT_TRUE(policy_.IsShownAsRecentlyVisitedSite(name_space)) |
+ << "Namespace: " << name_space; |
+ } |
+ EXPECT_FALSE(query->Matches(kTestItem1)); |
+ EXPECT_TRUE(query->Matches(recent_page())); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, RequireShownAsRecentlyVisitedSite_Except) { |
+ builder_.RequireShownAsRecentlyVisitedSite(Requirement::EXCLUDE_MATCHING); |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ |
+ auto restriction = query->GetRestrictedToNamespaces(); |
+ std::set<std::string> namespaces_allowed = restriction.second; |
+ bool restricted_to_namespaces = restriction.first; |
+ EXPECT_TRUE(restricted_to_namespaces); |
+ |
+ for (const std::string& name_space : namespaces_allowed) { |
+ EXPECT_FALSE(policy_.IsShownAsRecentlyVisitedSite(name_space)) |
+ << "Namespace: " << name_space; |
+ } |
+ EXPECT_TRUE(query->Matches(kTestItem1)); |
+ EXPECT_FALSE(query->Matches(recent_page())); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, RequireRestrictedToOriginalTab_Only) { |
+ builder_.RequireRestrictedToOriginalTab(Requirement::INCLUDE_MATCHING); |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ |
+ auto restriction = query->GetRestrictedToNamespaces(); |
+ std::set<std::string> namespaces_allowed = restriction.second; |
+ bool restricted_to_namespaces = restriction.first; |
+ EXPECT_TRUE(restricted_to_namespaces); |
+ |
+ for (const std::string& name_space : namespaces_allowed) { |
+ EXPECT_TRUE(policy_.IsRestrictedToOriginalTab(name_space)) << "Namespace: " |
+ << name_space; |
+ } |
+ EXPECT_FALSE(query->Matches(kTestItem1)); |
+ EXPECT_TRUE(query->Matches(original_tab_page())); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, RequireRestrictedToOriginalTab_Except) { |
+ builder_.RequireRestrictedToOriginalTab(Requirement::EXCLUDE_MATCHING); |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ |
+ auto restriction = query->GetRestrictedToNamespaces(); |
+ std::set<std::string> namespaces_allowed = restriction.second; |
+ bool restricted_to_namespaces = restriction.first; |
+ EXPECT_TRUE(restricted_to_namespaces); |
+ |
+ for (const std::string& name_space : namespaces_allowed) { |
+ EXPECT_FALSE(policy_.IsRestrictedToOriginalTab(name_space)) << "Namespace: " |
+ << name_space; |
+ } |
+ EXPECT_TRUE(query->Matches(kTestItem1)); |
+ EXPECT_FALSE(query->Matches(original_tab_page())); |
+} |
+ |
+TEST_F(OfflinePageModelQueryTest, IntersectNamespaces) { |
+ // This should exclude last N, but include |kTestNamespace|. |
+ builder_.RequireRestrictedToOriginalTab(Requirement::INCLUDE_MATCHING) |
+ .RequireShownAsRecentlyVisitedSite(Requirement::EXCLUDE_MATCHING); |
+ std::unique_ptr<OfflinePageModelQuery> query = builder_.Build(&policy_); |
+ |
+ auto restriction = query->GetRestrictedToNamespaces(); |
+ std::set<std::string> namespaces_allowed = restriction.second; |
+ bool restricted_to_namespaces = restriction.first; |
+ EXPECT_TRUE(restricted_to_namespaces); |
+ |
+ EXPECT_TRUE(namespaces_allowed.count(kTestNamespace) == 1); |
+ EXPECT_FALSE(query->Matches(recent_page())); |
+} |
+ |
+} // namespace offline_pages |