Index: components/password_manager/core/browser/android_affiliation/affiliation_database_unittest.cc |
diff --git a/components/password_manager/core/browser/android_affiliation/affiliation_database_unittest.cc b/components/password_manager/core/browser/android_affiliation/affiliation_database_unittest.cc |
deleted file mode 100644 |
index 127ca55d00ae68203c2b895ca249b8724f7cb40c..0000000000000000000000000000000000000000 |
--- a/components/password_manager/core/browser/android_affiliation/affiliation_database_unittest.cc |
+++ /dev/null |
@@ -1,309 +0,0 @@ |
-// Copyright 2014 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 "components/password_manager/core/browser/android_affiliation/affiliation_database.h" |
- |
-#include <stdint.h> |
- |
-#include "base/files/file_util.h" |
-#include "base/files/scoped_temp_dir.h" |
-#include "base/macros.h" |
-#include "sql/test/scoped_error_expecter.h" |
-#include "sql/test/test_helpers.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "third_party/sqlite/sqlite3.h" |
- |
-namespace password_manager { |
- |
-namespace { |
- |
-const char kTestFacetURI1[] = "https://alpha.example.com"; |
-const char kTestFacetURI2[] = "https://beta.example.com"; |
-const char kTestFacetURI3[] = "https://gamma.example.com"; |
-const char kTestFacetURI4[] = "https://delta.example.com"; |
-const char kTestFacetURI5[] = "https://epsilon.example.com"; |
-const char kTestFacetURI6[] = "https://zeta.example.com"; |
- |
-const char kTestAndroidFacetURI[] = "android://hash@com.example.android"; |
- |
-const int64_t kTestTimeUs1 = 1000000; |
-const int64_t kTestTimeUs2 = 2000000; |
-const int64_t kTestTimeUs3 = 3000000; |
- |
-void ExpectEquivalenceClassesAreEqual( |
- const AffiliatedFacetsWithUpdateTime& expectation, |
- const AffiliatedFacetsWithUpdateTime& reality) { |
- EXPECT_EQ(expectation.last_update_time, reality.last_update_time); |
- EXPECT_THAT(reality.facets, |
- testing::UnorderedElementsAreArray(reality.facets)); |
-} |
- |
-AffiliatedFacetsWithUpdateTime TestEquivalenceClass1() { |
- AffiliatedFacetsWithUpdateTime affiliation; |
- affiliation.last_update_time = base::Time::FromInternalValue(kTestTimeUs1); |
- affiliation.facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURI1)); |
- affiliation.facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURI2)); |
- affiliation.facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURI3)); |
- return affiliation; |
-} |
- |
-AffiliatedFacetsWithUpdateTime TestEquivalenceClass2() { |
- AffiliatedFacetsWithUpdateTime affiliation; |
- affiliation.last_update_time = base::Time::FromInternalValue(kTestTimeUs2); |
- affiliation.facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURI4)); |
- affiliation.facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURI5)); |
- return affiliation; |
-} |
- |
-AffiliatedFacetsWithUpdateTime TestEquivalenceClass3() { |
- AffiliatedFacetsWithUpdateTime affiliation; |
- affiliation.last_update_time = base::Time::FromInternalValue(kTestTimeUs3); |
- affiliation.facets.push_back( |
- FacetURI::FromCanonicalSpec(kTestAndroidFacetURI)); |
- return affiliation; |
-} |
- |
-} // namespace |
- |
-class AffiliationDatabaseTest : public testing::Test { |
- public: |
- AffiliationDatabaseTest() {} |
- ~AffiliationDatabaseTest() override {} |
- |
- void SetUp() override { |
- ASSERT_TRUE(temp_directory_.CreateUniqueTempDir()); |
- OpenDatabase(); |
- } |
- |
- void OpenDatabase() { |
- db_.reset(new AffiliationDatabase); |
- ASSERT_TRUE(db_->Init(db_path())); |
- } |
- |
- void CloseDatabase() { db_.reset(); } |
- |
- void StoreInitialTestData() { |
- ASSERT_TRUE(db_->Store(TestEquivalenceClass1())); |
- ASSERT_TRUE(db_->Store(TestEquivalenceClass2())); |
- ASSERT_TRUE(db_->Store(TestEquivalenceClass3())); |
- } |
- |
- AffiliationDatabase& db() { return *db_; } |
- |
- base::FilePath db_path() { |
- return temp_directory_.GetPath().Append( |
- FILE_PATH_LITERAL("Test Affiliation Database")); |
- } |
- |
- private: |
- base::ScopedTempDir temp_directory_; |
- std::unique_ptr<AffiliationDatabase> db_; |
- |
- DISALLOW_COPY_AND_ASSIGN(AffiliationDatabaseTest); |
-}; |
- |
-TEST_F(AffiliationDatabaseTest, Store) { |
- LOG(ERROR) << "During this test, SQL errors (number 19) will be logged to " |
- "the console. This is expected."; |
- |
- ASSERT_NO_FATAL_FAILURE(StoreInitialTestData()); |
- |
- // Verify that duplicate equivalence classes are not allowed to be stored. |
- { |
- sql::test::ScopedErrorExpecter expecter; |
- expecter.ExpectError(SQLITE_CONSTRAINT); |
- AffiliatedFacetsWithUpdateTime duplicate = TestEquivalenceClass1(); |
- EXPECT_FALSE(db().Store(duplicate)); |
- EXPECT_TRUE(expecter.SawExpectedErrors()); |
- } |
- |
- // Verify that intersecting equivalence classes are not allowed to be stored. |
- { |
- sql::test::ScopedErrorExpecter expecter; |
- expecter.ExpectError(SQLITE_CONSTRAINT); |
- AffiliatedFacetsWithUpdateTime intersecting; |
- intersecting.facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURI3)); |
- intersecting.facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURI4)); |
- EXPECT_FALSE(db().Store(intersecting)); |
- EXPECT_TRUE(expecter.SawExpectedErrors()); |
- } |
-} |
- |
-TEST_F(AffiliationDatabaseTest, GetAllAffiliations) { |
- std::vector<AffiliatedFacetsWithUpdateTime> affiliations; |
- |
- // Empty database should not return any equivalence classes. |
- db().GetAllAffiliations(&affiliations); |
- EXPECT_EQ(0u, affiliations.size()); |
- |
- ASSERT_NO_FATAL_FAILURE(StoreInitialTestData()); |
- |
- // The test data should be returned in order. |
- db().GetAllAffiliations(&affiliations); |
- ASSERT_EQ(3u, affiliations.size()); |
- ExpectEquivalenceClassesAreEqual(TestEquivalenceClass1(), affiliations[0]); |
- ExpectEquivalenceClassesAreEqual(TestEquivalenceClass2(), affiliations[1]); |
- ExpectEquivalenceClassesAreEqual(TestEquivalenceClass3(), affiliations[2]); |
-} |
- |
-TEST_F(AffiliationDatabaseTest, GetAffiliationForFacet) { |
- ASSERT_NO_FATAL_FAILURE(StoreInitialTestData()); |
- |
- // Verify that querying any element in the first equivalence class yields that |
- // class. |
- for (const auto& facet_uri : TestEquivalenceClass1().facets) { |
- AffiliatedFacetsWithUpdateTime affiliation; |
- EXPECT_TRUE(db().GetAffiliationsForFacet(facet_uri, &affiliation)); |
- ExpectEquivalenceClassesAreEqual(TestEquivalenceClass1(), affiliation); |
- } |
- |
- // Verify that querying the sole element in the third equivalence class yields |
- // that class. |
- { |
- AffiliatedFacetsWithUpdateTime affiliation; |
- EXPECT_TRUE(db().GetAffiliationsForFacet( |
- FacetURI::FromCanonicalSpec(kTestAndroidFacetURI), &affiliation)); |
- ExpectEquivalenceClassesAreEqual(TestEquivalenceClass3(), affiliation); |
- } |
- |
- // Verify that querying a facet not in the database yields no result. |
- { |
- AffiliatedFacetsWithUpdateTime affiliation; |
- EXPECT_FALSE(db().GetAffiliationsForFacet( |
- FacetURI::FromCanonicalSpec(kTestFacetURI6), &affiliation)); |
- ExpectEquivalenceClassesAreEqual(AffiliatedFacetsWithUpdateTime(), |
- affiliation); |
- } |
-} |
- |
-TEST_F(AffiliationDatabaseTest, StoreAndRemoveConflicting) { |
- ASSERT_NO_FATAL_FAILURE(StoreInitialTestData()); |
- |
- AffiliatedFacetsWithUpdateTime updated = TestEquivalenceClass1(); |
- updated.last_update_time = base::Time::FromInternalValue(4000000); |
- |
- // Verify that duplicate equivalence classes are now allowed to be stored, and |
- // the last update timestamp is updated. |
- { |
- std::vector<AffiliatedFacetsWithUpdateTime> removed; |
- db().StoreAndRemoveConflicting(updated, &removed); |
- EXPECT_EQ(0u, removed.size()); |
- |
- AffiliatedFacetsWithUpdateTime affiliation; |
- EXPECT_TRUE(db().GetAffiliationsForFacet( |
- FacetURI::FromCanonicalSpec(kTestFacetURI1), &affiliation)); |
- ExpectEquivalenceClassesAreEqual(updated, affiliation); |
- } |
- |
- // Verify that intersecting equivalence classes are now allowed to be stored, |
- // the conflicting classes are removed, but unaffected classes are retained. |
- { |
- AffiliatedFacetsWithUpdateTime intersecting; |
- std::vector<AffiliatedFacetsWithUpdateTime> removed; |
- intersecting.last_update_time = base::Time::FromInternalValue(5000000); |
- intersecting.facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURI3)); |
- intersecting.facets.push_back(FacetURI::FromCanonicalSpec(kTestFacetURI4)); |
- db().StoreAndRemoveConflicting(intersecting, &removed); |
- |
- ASSERT_EQ(2u, removed.size()); |
- ExpectEquivalenceClassesAreEqual(updated, removed[0]); |
- ExpectEquivalenceClassesAreEqual(TestEquivalenceClass2(), removed[1]); |
- |
- std::vector<AffiliatedFacetsWithUpdateTime> affiliations; |
- db().GetAllAffiliations(&affiliations); |
- ASSERT_EQ(2u, affiliations.size()); |
- ExpectEquivalenceClassesAreEqual(TestEquivalenceClass3(), affiliations[0]); |
- ExpectEquivalenceClassesAreEqual(intersecting, affiliations[1]); |
- } |
-} |
- |
-TEST_F(AffiliationDatabaseTest, DeleteAllAffiliations) { |
- db().DeleteAllAffiliations(); |
- |
- ASSERT_NO_FATAL_FAILURE(StoreInitialTestData()); |
- |
- db().DeleteAllAffiliations(); |
- |
- std::vector<AffiliatedFacetsWithUpdateTime> affiliations; |
- db().GetAllAffiliations(&affiliations); |
- ASSERT_EQ(0u, affiliations.size()); |
-} |
- |
-TEST_F(AffiliationDatabaseTest, DeleteAffiliationsOlderThan) { |
- db().DeleteAffiliationsOlderThan(base::Time::FromInternalValue(0)); |
- |
- ASSERT_NO_FATAL_FAILURE(StoreInitialTestData()); |
- |
- db().DeleteAffiliationsOlderThan(base::Time::FromInternalValue(kTestTimeUs2)); |
- |
- std::vector<AffiliatedFacetsWithUpdateTime> affiliations; |
- db().GetAllAffiliations(&affiliations); |
- ASSERT_EQ(2u, affiliations.size()); |
- ExpectEquivalenceClassesAreEqual(TestEquivalenceClass2(), affiliations[0]); |
- ExpectEquivalenceClassesAreEqual(TestEquivalenceClass3(), affiliations[1]); |
- |
- db().DeleteAffiliationsOlderThan(base::Time::Max()); |
- |
- db().GetAllAffiliations(&affiliations); |
- ASSERT_EQ(0u, affiliations.size()); |
-} |
- |
-// Verify that an existing DB can be reopened, and data is retained. |
-TEST_F(AffiliationDatabaseTest, DBRetainsDataAfterReopening) { |
- ASSERT_NO_FATAL_FAILURE(StoreInitialTestData()); |
- |
- CloseDatabase(); |
- OpenDatabase(); |
- |
- // The test data should be returned in order. |
- std::vector<AffiliatedFacetsWithUpdateTime> affiliations; |
- db().GetAllAffiliations(&affiliations); |
- ASSERT_EQ(3u, affiliations.size()); |
- ExpectEquivalenceClassesAreEqual(TestEquivalenceClass1(), affiliations[0]); |
- ExpectEquivalenceClassesAreEqual(TestEquivalenceClass2(), affiliations[1]); |
- ExpectEquivalenceClassesAreEqual(TestEquivalenceClass3(), affiliations[2]); |
-} |
- |
-// Verify that when it is discovered during opening that a DB is corrupt, it |
-// gets razed, and then an empty (but again usable) DB is produced. |
-TEST_F(AffiliationDatabaseTest, CorruptDBIsRazedThenOpened) { |
- ASSERT_NO_FATAL_FAILURE(StoreInitialTestData()); |
- |
- CloseDatabase(); |
- ASSERT_TRUE(sql::test::CorruptSizeInHeader(db_path())); |
- ASSERT_NO_FATAL_FAILURE(OpenDatabase()); |
- |
- std::vector<AffiliatedFacetsWithUpdateTime> affiliations; |
- db().GetAllAffiliations(&affiliations); |
- EXPECT_EQ(0u, affiliations.size()); |
- |
- ASSERT_NO_FATAL_FAILURE(StoreInitialTestData()); |
- db().GetAllAffiliations(&affiliations); |
- EXPECT_EQ(3u, affiliations.size()); |
-} |
- |
-// Verify that when the DB becomes corrupt after it has been opened, it gets |
-// poisoned so that operations fail silently without side effects. |
-TEST_F(AffiliationDatabaseTest, CorruptDBGetsPoisoned) { |
- ASSERT_TRUE(db().Store(TestEquivalenceClass1())); |
- |
- ASSERT_TRUE(sql::test::CorruptSizeInHeader(db_path())); |
- |
- EXPECT_FALSE(db().Store(TestEquivalenceClass2())); |
- std::vector<AffiliatedFacetsWithUpdateTime> affiliations; |
- db().GetAllAffiliations(&affiliations); |
- EXPECT_EQ(0u, affiliations.size()); |
-} |
- |
-// Verify that all files get deleted. |
-TEST_F(AffiliationDatabaseTest, Delete) { |
- ASSERT_NO_FATAL_FAILURE(StoreInitialTestData()); |
- CloseDatabase(); |
- |
- AffiliationDatabase::Delete(db_path()); |
- EXPECT_TRUE(base::IsDirectoryEmpty(db_path().DirName())); |
-} |
- |
-} // namespace password_manager |