// 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/value_store/value_store_frontend.h" #include #include #include "base/bind.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" #include "base/path_service.h" #include "base/test/task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "components/value_store/test_value_store_factory.h" #include "components/value_store/value_store_task_runner.h" #include "testing/gtest/include/gtest/gtest.h" namespace value_store { class ValueStoreFrontendTest : public testing::Test { public: ValueStoreFrontendTest() {} void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); base::FilePath test_data_dir; ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir)); base::FilePath src_db( test_data_dir.AppendASCII("components/test/data/value_store")); db_path_ = temp_dir_.GetPath().AppendASCII("temp_db"); base::CopyDirectory(src_db, db_path_, true); factory_ = new TestValueStoreFactory(db_path_); ResetStorage(); } void TearDown() override { RunUntilIdle(); storage_.reset(); } // Reset the value store, reloading the DB from disk. void ResetStorage() { storage_ = std::make_unique( factory_, base::FilePath(FILE_PATH_LITERAL("Test dir")), "test_uma_name", base::ThreadTaskRunnerHandle::Get(), value_store::GetValueStoreTaskRunner()); } bool Get(const std::string& key, std::unique_ptr* output) { storage_->Get(key, base::BindOnce(&ValueStoreFrontendTest::GetAndWait, base::Unretained(this), output)); RunUntilIdle(); return !!output->get(); } protected: void RunUntilIdle() { task_environment_.RunUntilIdle(); } void GetAndWait(std::unique_ptr* output, std::unique_ptr result) { *output = std::move(result); } base::test::TaskEnvironment task_environment_; scoped_refptr factory_; std::unique_ptr storage_; base::ScopedTempDir temp_dir_; base::FilePath db_path_; }; TEST_F(ValueStoreFrontendTest, GetExistingData) { std::unique_ptr value; ASSERT_FALSE(Get("key0", &value)); // Test existing keys in the DB. { ASSERT_TRUE(Get("key1", &value)); ASSERT_TRUE(value->is_string()); EXPECT_EQ("value1", value->GetString()); } { ASSERT_TRUE(Get("key2", &value)); ASSERT_TRUE(value->is_int()); EXPECT_EQ(2, value->GetInt()); } } TEST_F(ValueStoreFrontendTest, ChangesPersistAfterReload) { storage_->Set("key0", std::make_unique(0)); storage_->Set("key1", std::make_unique("new1")); storage_->Remove("key2"); // Reload the DB and test our changes. ResetStorage(); std::unique_ptr value; { ASSERT_TRUE(Get("key0", &value)); ASSERT_TRUE(value->is_int()); EXPECT_EQ(0, value->GetInt()); } { ASSERT_TRUE(Get("key1", &value)); ASSERT_TRUE(value->is_string()); EXPECT_EQ("new1", value->GetString()); } ASSERT_FALSE(Get("key2", &value)); } } // namespace value_store