1 /* 2 * Copyright 2008 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "webrtc/base/fileutils.h" 12 #include "webrtc/base/gunit.h" 13 #include "webrtc/base/optionsfile.h" 14 #include "webrtc/base/pathutils.h" 15 16 namespace rtc { 17 18 static const std::string kTestOptionA = "test-option-a"; 19 static const std::string kTestOptionB = "test-option-b"; 20 static const std::string kTestString1 = "a string"; 21 static const std::string kTestString2 = "different string"; 22 static const std::string kOptionWithEquals = "foo=bar"; 23 static const std::string kOptionWithNewline = "foo\nbar"; 24 static const std::string kValueWithEquals = "baz=quux"; 25 static const std::string kValueWithNewline = "baz\nquux"; 26 static const std::string kEmptyString = ""; 27 static const char kOptionWithUtf8[] = {'O', 'p', 't', '\302', '\256', 'i', 'o', 28 'n', '\342', '\204', '\242', '\0'}; // Opt(R)io(TM). 29 static const char kValueWithUtf8[] = {'V', 'a', 'l', '\302', '\256', 'v', 'e', 30 '\342', '\204', '\242', '\0'}; // Val(R)ue(TM). 31 static int kTestInt1 = 12345; 32 static int kTestInt2 = 67890; 33 static int kNegInt = -634; 34 static int kZero = 0; 35 36 class OptionsFileTest : public testing::Test { 37 public: 38 OptionsFileTest() { 39 Pathname dir; 40 ASSERT(Filesystem::GetTemporaryFolder(dir, true, NULL)); 41 test_file_ = Filesystem::TempFilename(dir, ".testfile"); 42 OpenStore(); 43 } 44 45 protected: 46 void OpenStore() { 47 store_.reset(new OptionsFile(test_file_)); 48 } 49 50 rtc::scoped_ptr<OptionsFile> store_; 51 52 private: 53 std::string test_file_; 54 }; 55 56 TEST_F(OptionsFileTest, GetSetString) { 57 // Clear contents of the file on disk. 58 EXPECT_TRUE(store_->Save()); 59 std::string out1, out2; 60 EXPECT_FALSE(store_->GetStringValue(kTestOptionA, &out1)); 61 EXPECT_FALSE(store_->GetStringValue(kTestOptionB, &out2)); 62 EXPECT_TRUE(store_->SetStringValue(kTestOptionA, kTestString1)); 63 EXPECT_TRUE(store_->Save()); 64 EXPECT_TRUE(store_->Load()); 65 EXPECT_TRUE(store_->SetStringValue(kTestOptionB, kTestString2)); 66 EXPECT_TRUE(store_->Save()); 67 EXPECT_TRUE(store_->Load()); 68 EXPECT_TRUE(store_->GetStringValue(kTestOptionA, &out1)); 69 EXPECT_TRUE(store_->GetStringValue(kTestOptionB, &out2)); 70 EXPECT_EQ(kTestString1, out1); 71 EXPECT_EQ(kTestString2, out2); 72 EXPECT_TRUE(store_->RemoveValue(kTestOptionA)); 73 EXPECT_TRUE(store_->Save()); 74 EXPECT_TRUE(store_->Load()); 75 EXPECT_TRUE(store_->RemoveValue(kTestOptionB)); 76 EXPECT_TRUE(store_->Save()); 77 EXPECT_TRUE(store_->Load()); 78 EXPECT_FALSE(store_->GetStringValue(kTestOptionA, &out1)); 79 EXPECT_FALSE(store_->GetStringValue(kTestOptionB, &out2)); 80 } 81 82 TEST_F(OptionsFileTest, GetSetInt) { 83 // Clear contents of the file on disk. 84 EXPECT_TRUE(store_->Save()); 85 int out1, out2; 86 EXPECT_FALSE(store_->GetIntValue(kTestOptionA, &out1)); 87 EXPECT_FALSE(store_->GetIntValue(kTestOptionB, &out2)); 88 EXPECT_TRUE(store_->SetIntValue(kTestOptionA, kTestInt1)); 89 EXPECT_TRUE(store_->Save()); 90 EXPECT_TRUE(store_->Load()); 91 EXPECT_TRUE(store_->SetIntValue(kTestOptionB, kTestInt2)); 92 EXPECT_TRUE(store_->Save()); 93 EXPECT_TRUE(store_->Load()); 94 EXPECT_TRUE(store_->GetIntValue(kTestOptionA, &out1)); 95 EXPECT_TRUE(store_->GetIntValue(kTestOptionB, &out2)); 96 EXPECT_EQ(kTestInt1, out1); 97 EXPECT_EQ(kTestInt2, out2); 98 EXPECT_TRUE(store_->RemoveValue(kTestOptionA)); 99 EXPECT_TRUE(store_->Save()); 100 EXPECT_TRUE(store_->Load()); 101 EXPECT_TRUE(store_->RemoveValue(kTestOptionB)); 102 EXPECT_TRUE(store_->Save()); 103 EXPECT_TRUE(store_->Load()); 104 EXPECT_FALSE(store_->GetIntValue(kTestOptionA, &out1)); 105 EXPECT_FALSE(store_->GetIntValue(kTestOptionB, &out2)); 106 EXPECT_TRUE(store_->SetIntValue(kTestOptionA, kNegInt)); 107 EXPECT_TRUE(store_->GetIntValue(kTestOptionA, &out1)); 108 EXPECT_EQ(kNegInt, out1); 109 EXPECT_TRUE(store_->SetIntValue(kTestOptionA, kZero)); 110 EXPECT_TRUE(store_->GetIntValue(kTestOptionA, &out1)); 111 EXPECT_EQ(kZero, out1); 112 } 113 114 TEST_F(OptionsFileTest, Persist) { 115 // Clear contents of the file on disk. 116 EXPECT_TRUE(store_->Save()); 117 EXPECT_TRUE(store_->SetStringValue(kTestOptionA, kTestString1)); 118 EXPECT_TRUE(store_->SetIntValue(kTestOptionB, kNegInt)); 119 EXPECT_TRUE(store_->Save()); 120 121 // Load the saved contents from above. 122 OpenStore(); 123 EXPECT_TRUE(store_->Load()); 124 std::string out1; 125 int out2; 126 EXPECT_TRUE(store_->GetStringValue(kTestOptionA, &out1)); 127 EXPECT_TRUE(store_->GetIntValue(kTestOptionB, &out2)); 128 EXPECT_EQ(kTestString1, out1); 129 EXPECT_EQ(kNegInt, out2); 130 } 131 132 TEST_F(OptionsFileTest, SpecialCharacters) { 133 // Clear contents of the file on disk. 134 EXPECT_TRUE(store_->Save()); 135 std::string out; 136 EXPECT_FALSE(store_->SetStringValue(kOptionWithEquals, kTestString1)); 137 EXPECT_FALSE(store_->GetStringValue(kOptionWithEquals, &out)); 138 EXPECT_FALSE(store_->SetStringValue(kOptionWithNewline, kTestString1)); 139 EXPECT_FALSE(store_->GetStringValue(kOptionWithNewline, &out)); 140 EXPECT_TRUE(store_->SetStringValue(kOptionWithUtf8, kValueWithUtf8)); 141 EXPECT_TRUE(store_->SetStringValue(kTestOptionA, kTestString1)); 142 EXPECT_TRUE(store_->Save()); 143 EXPECT_TRUE(store_->Load()); 144 EXPECT_TRUE(store_->GetStringValue(kTestOptionA, &out)); 145 EXPECT_EQ(kTestString1, out); 146 EXPECT_TRUE(store_->GetStringValue(kOptionWithUtf8, &out)); 147 EXPECT_EQ(kValueWithUtf8, out); 148 EXPECT_FALSE(store_->SetStringValue(kTestOptionA, kValueWithNewline)); 149 EXPECT_TRUE(store_->GetStringValue(kTestOptionA, &out)); 150 EXPECT_EQ(kTestString1, out); 151 EXPECT_TRUE(store_->SetStringValue(kTestOptionA, kValueWithEquals)); 152 EXPECT_TRUE(store_->Save()); 153 EXPECT_TRUE(store_->Load()); 154 EXPECT_TRUE(store_->GetStringValue(kTestOptionA, &out)); 155 EXPECT_EQ(kValueWithEquals, out); 156 EXPECT_TRUE(store_->SetStringValue(kEmptyString, kTestString2)); 157 EXPECT_TRUE(store_->Save()); 158 EXPECT_TRUE(store_->Load()); 159 EXPECT_TRUE(store_->GetStringValue(kEmptyString, &out)); 160 EXPECT_EQ(kTestString2, out); 161 EXPECT_TRUE(store_->SetStringValue(kTestOptionB, kEmptyString)); 162 EXPECT_TRUE(store_->Save()); 163 EXPECT_TRUE(store_->Load()); 164 EXPECT_TRUE(store_->GetStringValue(kTestOptionB, &out)); 165 EXPECT_EQ(kEmptyString, out); 166 } 167 168 } // namespace rtc 169