Home | History | Annotate | Download | only in base
      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