summaryrefslogtreecommitdiff
path: root/common/prefs_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'common/prefs_unittest.cc')
-rw-r--r--common/prefs_unittest.cc260
1 files changed, 257 insertions, 3 deletions
diff --git a/common/prefs_unittest.cc b/common/prefs_unittest.cc
index cb6fc709..a5f46e53 100644
--- a/common/prefs_unittest.cc
+++ b/common/prefs_unittest.cc
@@ -20,6 +20,7 @@
#include <limits>
#include <string>
+#include <vector>
#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
@@ -30,8 +31,11 @@
#include <gtest/gtest.h>
using std::string;
+using std::vector;
using testing::_;
+using testing::ElementsAre;
using testing::Eq;
+using testing::UnorderedElementsAre;
namespace {
// Test key used along the tests.
@@ -40,12 +44,109 @@ const char kKey[] = "test-key";
namespace chromeos_update_engine {
-class PrefsTest : public ::testing::Test {
+class BasePrefsTest : public ::testing::Test {
+ protected:
+ void MultiNamespaceKeyTest() {
+ ASSERT_TRUE(common_prefs_);
+ auto key0 = common_prefs_->CreateSubKey({"ns1", "key"});
+ // Corner case for "ns1".
+ auto key0corner = common_prefs_->CreateSubKey({"ns11", "key"});
+ auto key1A = common_prefs_->CreateSubKey({"ns1", "nsA", "keyA"});
+ auto key1B = common_prefs_->CreateSubKey({"ns1", "nsA", "keyB"});
+ auto key2 = common_prefs_->CreateSubKey({"ns1", "nsB", "key"});
+ // Corner case for "ns1/nsB".
+ auto key2corner = common_prefs_->CreateSubKey({"ns1", "nsB1", "key"});
+ EXPECT_FALSE(common_prefs_->Exists(key0));
+ EXPECT_FALSE(common_prefs_->Exists(key1A));
+ EXPECT_FALSE(common_prefs_->Exists(key1B));
+ EXPECT_FALSE(common_prefs_->Exists(key2));
+
+ EXPECT_TRUE(common_prefs_->SetString(key0, ""));
+ EXPECT_TRUE(common_prefs_->SetString(key0corner, ""));
+ EXPECT_TRUE(common_prefs_->SetString(key1A, ""));
+ EXPECT_TRUE(common_prefs_->SetString(key1B, ""));
+ EXPECT_TRUE(common_prefs_->SetString(key2, ""));
+ EXPECT_TRUE(common_prefs_->SetString(key2corner, ""));
+
+ EXPECT_TRUE(common_prefs_->Exists(key0));
+ EXPECT_TRUE(common_prefs_->Exists(key0corner));
+ EXPECT_TRUE(common_prefs_->Exists(key1A));
+ EXPECT_TRUE(common_prefs_->Exists(key1B));
+ EXPECT_TRUE(common_prefs_->Exists(key2));
+ EXPECT_TRUE(common_prefs_->Exists(key2corner));
+
+ vector<string> keys2;
+ EXPECT_TRUE(common_prefs_->GetSubKeys("ns1/nsB/", &keys2));
+ EXPECT_THAT(keys2, ElementsAre(key2));
+ for (const auto& key : keys2)
+ EXPECT_TRUE(common_prefs_->Delete(key));
+ EXPECT_TRUE(common_prefs_->Exists(key0));
+ EXPECT_TRUE(common_prefs_->Exists(key0corner));
+ EXPECT_TRUE(common_prefs_->Exists(key1A));
+ EXPECT_TRUE(common_prefs_->Exists(key1B));
+ EXPECT_FALSE(common_prefs_->Exists(key2));
+ EXPECT_TRUE(common_prefs_->Exists(key2corner));
+
+ vector<string> keys2corner;
+ EXPECT_TRUE(common_prefs_->GetSubKeys("ns1/nsB", &keys2corner));
+ EXPECT_THAT(keys2corner, ElementsAre(key2corner));
+ for (const auto& key : keys2corner)
+ EXPECT_TRUE(common_prefs_->Delete(key));
+ EXPECT_FALSE(common_prefs_->Exists(key2corner));
+
+ vector<string> keys1;
+ EXPECT_TRUE(common_prefs_->GetSubKeys("ns1/nsA/", &keys1));
+ EXPECT_THAT(keys1, UnorderedElementsAre(key1A, key1B));
+ for (const auto& key : keys1)
+ EXPECT_TRUE(common_prefs_->Delete(key));
+ EXPECT_TRUE(common_prefs_->Exists(key0));
+ EXPECT_TRUE(common_prefs_->Exists(key0corner));
+ EXPECT_FALSE(common_prefs_->Exists(key1A));
+ EXPECT_FALSE(common_prefs_->Exists(key1B));
+
+ vector<string> keys0;
+ EXPECT_TRUE(common_prefs_->GetSubKeys("ns1/", &keys0));
+ EXPECT_THAT(keys0, ElementsAre(key0));
+ for (const auto& key : keys0)
+ EXPECT_TRUE(common_prefs_->Delete(key));
+ EXPECT_FALSE(common_prefs_->Exists(key0));
+ EXPECT_TRUE(common_prefs_->Exists(key0corner));
+
+ vector<string> keys0corner;
+ EXPECT_TRUE(common_prefs_->GetSubKeys("ns1", &keys0corner));
+ EXPECT_THAT(keys0corner, ElementsAre(key0corner));
+ for (const auto& key : keys0corner)
+ EXPECT_TRUE(common_prefs_->Delete(key));
+ EXPECT_FALSE(common_prefs_->Exists(key0corner));
+
+ // Test sub directory namespace.
+ const string kDlcPrefsSubDir = "foo-dir";
+ key1A = common_prefs_->CreateSubKey({kDlcPrefsSubDir, "dlc1", "keyA"});
+ EXPECT_TRUE(common_prefs_->SetString(key1A, "fp_1A"));
+ key1B = common_prefs_->CreateSubKey({kDlcPrefsSubDir, "dlc1", "keyB"});
+ EXPECT_TRUE(common_prefs_->SetString(key1B, "fp_1B"));
+ auto key2A = common_prefs_->CreateSubKey({kDlcPrefsSubDir, "dlc2", "keyA"});
+ EXPECT_TRUE(common_prefs_->SetString(key2A, "fp_A2"));
+
+ vector<string> fpKeys;
+ EXPECT_TRUE(common_prefs_->GetSubKeys(kDlcPrefsSubDir, &fpKeys));
+ EXPECT_EQ(fpKeys.size(), 3UL);
+ EXPECT_TRUE(common_prefs_->Delete(fpKeys[0]));
+ EXPECT_TRUE(common_prefs_->Delete(fpKeys[1]));
+ EXPECT_TRUE(common_prefs_->Delete(fpKeys[2]));
+ EXPECT_FALSE(common_prefs_->Exists(key1A));
+ }
+
+ PrefsInterface* common_prefs_;
+};
+
+class PrefsTest : public BasePrefsTest {
protected:
void SetUp() override {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
prefs_dir_ = temp_dir_.GetPath();
ASSERT_TRUE(prefs_.Init(prefs_dir_));
+ common_prefs_ = &prefs_;
}
bool SetValue(const string& key, const string& value) {
@@ -59,6 +160,31 @@ class PrefsTest : public ::testing::Test {
Prefs prefs_;
};
+TEST(Prefs, Init) {
+ Prefs prefs;
+ const string ns1 = "ns1";
+ const string ns2A = "ns2A";
+ const string ns2B = "ns2B";
+ const string sub_pref = "sp";
+
+ base::ScopedTempDir temp_dir;
+ ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+ auto ns1_path = temp_dir.GetPath().Append(ns1);
+ auto ns2A_path = ns1_path.Append(ns2A);
+ auto ns2B_path = ns1_path.Append(ns2B);
+ auto sub_pref_path = ns2A_path.Append(sub_pref);
+
+ EXPECT_TRUE(base::CreateDirectory(ns2B_path));
+ EXPECT_TRUE(base::PathExists(ns2B_path));
+
+ EXPECT_TRUE(base::CreateDirectory(sub_pref_path));
+ EXPECT_TRUE(base::PathExists(sub_pref_path));
+
+ EXPECT_TRUE(base::PathExists(ns1_path));
+ ASSERT_TRUE(prefs.Init(temp_dir.GetPath()));
+ EXPECT_FALSE(base::PathExists(ns1_path));
+}
+
TEST_F(PrefsTest, GetFileNameForKey) {
const char kAllvalidCharsKey[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-";
@@ -77,6 +203,18 @@ TEST_F(PrefsTest, GetFileNameForKeyEmpty) {
EXPECT_FALSE(prefs_.file_storage_.GetFileNameForKey("", &path));
}
+TEST_F(PrefsTest, CreateSubKey) {
+ const string name_space = "ns";
+ const string sub_pref1 = "sp1";
+ const string sub_pref2 = "sp2";
+ const string sub_key = "sk";
+
+ EXPECT_EQ(PrefsInterface::CreateSubKey({name_space, sub_pref1, sub_key}),
+ "ns/sp1/sk");
+ EXPECT_EQ(PrefsInterface::CreateSubKey({name_space, sub_pref2, sub_key}),
+ "ns/sp2/sk");
+}
+
TEST_F(PrefsTest, GetString) {
const string test_data = "test data";
ASSERT_TRUE(SetValue(kKey, test_data));
@@ -279,6 +417,94 @@ TEST_F(PrefsTest, DeleteWorks) {
EXPECT_FALSE(prefs_.Exists(kKey));
}
+TEST_F(PrefsTest, SetDeleteSubKey) {
+ const string name_space = "ns";
+ const string sub_pref = "sp";
+ const string sub_key1 = "sk1";
+ const string sub_key2 = "sk2";
+ auto key1 = prefs_.CreateSubKey({name_space, sub_pref, sub_key1});
+ auto key2 = prefs_.CreateSubKey({name_space, sub_pref, sub_key2});
+ base::FilePath sub_pref_path = prefs_dir_.Append(name_space).Append(sub_pref);
+
+ ASSERT_TRUE(prefs_.SetInt64(key1, 0));
+ ASSERT_TRUE(prefs_.SetInt64(key2, 0));
+ EXPECT_TRUE(base::PathExists(sub_pref_path.Append(sub_key1)));
+ EXPECT_TRUE(base::PathExists(sub_pref_path.Append(sub_key2)));
+
+ ASSERT_TRUE(prefs_.Delete(key1));
+ EXPECT_FALSE(base::PathExists(sub_pref_path.Append(sub_key1)));
+ EXPECT_TRUE(base::PathExists(sub_pref_path.Append(sub_key2)));
+ ASSERT_TRUE(prefs_.Delete(key2));
+ EXPECT_FALSE(base::PathExists(sub_pref_path.Append(sub_key2)));
+ prefs_.Init(prefs_dir_);
+ EXPECT_FALSE(base::PathExists(prefs_dir_.Append(name_space)));
+}
+
+TEST_F(PrefsTest, DeletePrefs) {
+ const string kPrefsSubDir = "foo-dir";
+ const string kFpKey = "kPrefFp";
+ const string kNotFpKey = "NotkPrefFp";
+ const string kOtherKey = "kPrefNotFp";
+
+ EXPECT_TRUE(prefs_.SetString(kFpKey, "3.000"));
+ EXPECT_TRUE(prefs_.SetString(kOtherKey, "not_fp_val"));
+
+ auto key1_fp = prefs_.CreateSubKey({kPrefsSubDir, "id-1", kFpKey});
+ EXPECT_TRUE(prefs_.SetString(key1_fp, "3.7"));
+ auto key_not_fp = prefs_.CreateSubKey({kPrefsSubDir, "id-1", kOtherKey});
+ EXPECT_TRUE(prefs_.SetString(key_not_fp, "not_fp_val"));
+ auto key2_fp = prefs_.CreateSubKey({kPrefsSubDir, "id-2", kFpKey});
+ EXPECT_TRUE(prefs_.SetString(key2_fp, "3.9"));
+ auto key3_fp = prefs_.CreateSubKey({kPrefsSubDir, "id-3", kFpKey});
+ EXPECT_TRUE(prefs_.SetString(key3_fp, "3.45"));
+
+ // Pref key does not match full subkey at end, should not delete.
+ auto key_middle_fp = prefs_.CreateSubKey({kPrefsSubDir, kFpKey, kOtherKey});
+ EXPECT_TRUE(prefs_.SetString(key_middle_fp, "not_fp_val"));
+ auto key_end_not_fp = prefs_.CreateSubKey({kPrefsSubDir, "id-1", kNotFpKey});
+ EXPECT_TRUE(prefs_.SetString(key_end_not_fp, "not_fp_val"));
+
+ // Delete key in platform and one namespace.
+ prefs_.Delete(kFpKey, {kPrefsSubDir});
+
+ EXPECT_FALSE(prefs_.Exists(kFpKey));
+ EXPECT_FALSE(prefs_.Exists(key1_fp));
+ EXPECT_FALSE(prefs_.Exists(key2_fp));
+ EXPECT_FALSE(prefs_.Exists(key3_fp));
+
+ // Check other keys are not deleted.
+ EXPECT_TRUE(prefs_.Exists(kOtherKey));
+ EXPECT_TRUE(prefs_.Exists(key_not_fp));
+ EXPECT_TRUE(prefs_.Exists(key_middle_fp));
+ EXPECT_TRUE(prefs_.Exists(key_end_not_fp));
+}
+
+TEST_F(PrefsTest, DeleteMultipleNamespaces) {
+ const string kFirstSubDir = "foo-dir";
+ const string kSecondarySubDir = "bar-dir";
+ const string kTertiarySubDir = "ter-dir";
+ const string kFpKey = "kPrefFp";
+
+ EXPECT_TRUE(prefs_.SetString(kFpKey, "3.000"));
+ // Set pref key in different namespaces.
+ auto key1_fp = prefs_.CreateSubKey({kFirstSubDir, "id-1", kFpKey});
+ EXPECT_TRUE(prefs_.SetString(key1_fp, "3.7"));
+ auto key2_fp = prefs_.CreateSubKey({kSecondarySubDir, "id-3", kFpKey});
+ EXPECT_TRUE(prefs_.SetString(key2_fp, "7.45"));
+ auto key3_fp = prefs_.CreateSubKey({kTertiarySubDir, "id-3", kFpKey});
+ EXPECT_TRUE(prefs_.SetString(key3_fp, "7.45"));
+
+ // Delete key in platform and given namespaces.
+ prefs_.Delete(kFpKey, {kFirstSubDir, kSecondarySubDir});
+
+ EXPECT_FALSE(prefs_.Exists(kFpKey));
+ EXPECT_FALSE(prefs_.Exists(key1_fp));
+ EXPECT_FALSE(prefs_.Exists(key2_fp));
+
+ // Tertiary namespace not given to delete. Key should still exist.
+ EXPECT_TRUE(prefs_.Exists(key3_fp));
+}
+
class MockPrefsObserver : public PrefsInterface::ObserverInterface {
public:
MOCK_METHOD1(OnPrefSet, void(const string&));
@@ -299,6 +525,19 @@ TEST_F(PrefsTest, ObserversCalled) {
prefs_.Delete(kKey);
testing::Mock::VerifyAndClearExpectations(&mock_obserser);
+ auto key1 = prefs_.CreateSubKey({"ns", "sp1", "key1"});
+ prefs_.AddObserver(key1, &mock_obserser);
+
+ EXPECT_CALL(mock_obserser, OnPrefSet(key1));
+ EXPECT_CALL(mock_obserser, OnPrefDeleted(_)).Times(0);
+ prefs_.SetString(key1, "value");
+ testing::Mock::VerifyAndClearExpectations(&mock_obserser);
+
+ EXPECT_CALL(mock_obserser, OnPrefSet(_)).Times(0);
+ EXPECT_CALL(mock_obserser, OnPrefDeleted(Eq(key1)));
+ prefs_.Delete(key1);
+ testing::Mock::VerifyAndClearExpectations(&mock_obserser);
+
prefs_.RemoveObserver(kKey, &mock_obserser);
}
@@ -341,8 +580,14 @@ TEST_F(PrefsTest, UnsuccessfulCallsNotObserved) {
prefs_.RemoveObserver(kInvalidKey, &mock_obserser);
}
-class MemoryPrefsTest : public ::testing::Test {
+TEST_F(PrefsTest, MultiNamespaceKeyTest) {
+ MultiNamespaceKeyTest();
+}
+
+class MemoryPrefsTest : public BasePrefsTest {
protected:
+ void SetUp() override { common_prefs_ = &prefs_; }
+
MemoryPrefs prefs_;
};
@@ -358,7 +603,16 @@ TEST_F(MemoryPrefsTest, BasicTest) {
EXPECT_TRUE(prefs_.Delete(kKey));
EXPECT_FALSE(prefs_.Exists(kKey));
- EXPECT_FALSE(prefs_.Delete(kKey));
+ EXPECT_TRUE(prefs_.Delete(kKey));
+
+ auto key = prefs_.CreateSubKey({"ns", "sp", "sk"});
+ ASSERT_TRUE(prefs_.SetInt64(key, 0));
+ EXPECT_TRUE(prefs_.Exists(key));
+ EXPECT_TRUE(prefs_.Delete(kKey));
+}
+
+TEST_F(MemoryPrefsTest, MultiNamespaceKeyTest) {
+ MultiNamespaceKeyTest();
}
} // namespace chromeos_update_engine