| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chromeos/ash/components/file_manager/indexing/token_table.h" |
| |
| #include "base/files/file_path.h" |
| #include "base/files/scoped_temp_dir.h" |
| #include "sql/database.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace ash::file_manager { |
| namespace { |
| |
| const base::FilePath::CharType kDatabaseName[] = |
| FILE_PATH_LITERAL("TokenTableTest.db"); |
| |
| class TokenTableTest : public testing::Test { |
| public: |
| void SetUp() override { |
| ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| db_ = std::make_unique<sql::Database>(sql::DatabaseOptions()); |
| ASSERT_TRUE(InitDb(*db_)); |
| } |
| |
| void TearDown() override { |
| db_->Close(); |
| EXPECT_TRUE(temp_dir_.Delete()); |
| } |
| |
| base::FilePath db_file_path() { |
| return temp_dir_.GetPath().Append(kDatabaseName); |
| } |
| |
| bool InitDb(sql::Database& db) { |
| if (db.is_open()) { |
| return true; |
| } |
| if (!db.Open(db_file_path())) { |
| return false; |
| } |
| return true; |
| } |
| |
| protected: |
| base::ScopedTempDir temp_dir_; |
| std::unique_ptr<sql::Database> db_; |
| }; |
| |
| TEST_F(TokenTableTest, Init) { |
| TokenTable table(db_.get()); |
| EXPECT_TRUE(table.Init()); |
| } |
| |
| TEST_F(TokenTableTest, GetTokenId) { |
| TokenTable table(db_.get()); |
| EXPECT_TRUE(table.Init()); |
| |
| EXPECT_EQ(table.GetTokenId("hello"), -1); |
| EXPECT_EQ(table.GetOrCreateTokenId("hello"), 1); |
| EXPECT_EQ(table.GetTokenId("hello"), 1); |
| EXPECT_EQ(table.GetOrCreateTokenId("there"), 2); |
| EXPECT_EQ(table.GetTokenId("there"), 2); |
| EXPECT_EQ(table.GetTokenId("O'Neill"), -1); |
| EXPECT_EQ(table.GetOrCreateTokenId("O'Neill"), 3); |
| } |
| |
| TEST_F(TokenTableTest, DeleteToken) { |
| TokenTable table(db_.get()); |
| EXPECT_TRUE(table.Init()); |
| |
| EXPECT_EQ(table.DeleteToken("hello"), -1); |
| EXPECT_EQ(table.GetOrCreateTokenId("hello"), 1); |
| EXPECT_EQ(table.DeleteToken("hello"), 1); |
| } |
| |
| TEST_F(TokenTableTest, GetToken) { |
| TokenTable table(db_.get()); |
| EXPECT_TRUE(table.Init()); |
| |
| EXPECT_FALSE(table.GetToken(1).has_value()); |
| EXPECT_EQ(table.GetOrCreateTokenId("hello"), 1); |
| |
| auto token_or = table.GetToken(1); |
| EXPECT_TRUE(token_or.has_value()); |
| EXPECT_EQ(token_or.value(), "hello"); |
| EXPECT_EQ(table.DeleteToken("hello"), 1); |
| EXPECT_FALSE(table.GetToken(1).has_value()); |
| } |
| |
| TEST_F(TokenTableTest, ChangeToken) { |
| TokenTable table(db_.get()); |
| EXPECT_TRUE(table.Init()); |
| |
| // Test 1: Cannot change a non-existing token. |
| std::string token; |
| EXPECT_EQ(table.ChangeToken("foo", "bar"), -1); |
| |
| // Test 2: Change an existing token to a unique token. |
| EXPECT_EQ(table.GetOrCreateTokenId("foo"), 1); |
| EXPECT_EQ(table.ChangeToken("foo", "bar"), 1); |
| |
| // Test 3: Change token to itself |
| EXPECT_EQ(table.ChangeToken("bar", "bar"), 1); |
| |
| // Test 4: It is invalid to change token to be the same as another token |
| EXPECT_EQ(table.GetOrCreateTokenId("baz"), 2); |
| EXPECT_EQ(table.ChangeToken("bar", "baz"), -1); |
| } |
| |
| } // namespace |
| } // namespace ash::file_manager |