1 /*
2 * libjingle
3 * Copyright 2008, Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28 #include "talk/base/gunit.h"
29 #include "talk/base/optionsfile.h"
30
31 namespace talk_base {
32
33 #ifdef ANDROID
34 static const char *kTestFile = "/sdcard/.testfile";
35 #elif CHROMEOS
36 static const char *kTestFile = "/tmp/.testfile";
37 #else
38 static const char *kTestFile = ".testfile";
39 #endif
40
41 static const std::string kTestOptionA = "test-option-a";
42 static const std::string kTestOptionB = "test-option-b";
43 static const std::string kTestString1 = "a string";
44 static const std::string kTestString2 = "different string";
45 static const std::string kOptionWithEquals = "foo=bar";
46 static const std::string kOptionWithNewline = "foo\nbar";
47 static const std::string kValueWithEquals = "baz=quux";
48 static const std::string kValueWithNewline = "baz\nquux";
49 static const std::string kEmptyString = "";
50 static const char kOptionWithUtf8[] = {'O', 'p', 't', '\302', '\256', 'i', 'o',
51 'n', '\342', '\204', '\242', '\0'}; // Opt(R)io(TM).
52 static const char kValueWithUtf8[] = {'V', 'a', 'l', '\302', '\256', 'v', 'e',
53 '\342', '\204', '\242', '\0'}; // Val(R)ue(TM).
54 static int kTestInt1 = 12345;
55 static int kTestInt2 = 67890;
56 static int kNegInt = -634;
57 static int kZero = 0;
58
TEST(OptionsFile,GetSetString)59 TEST(OptionsFile, GetSetString) {
60 OptionsFile store(kTestFile);
61 // Clear contents of the file on disk.
62 EXPECT_TRUE(store.Save());
63 std::string out1, out2;
64 EXPECT_FALSE(store.GetStringValue(kTestOptionA, &out1));
65 EXPECT_FALSE(store.GetStringValue(kTestOptionB, &out2));
66 EXPECT_TRUE(store.SetStringValue(kTestOptionA, kTestString1));
67 EXPECT_TRUE(store.Save());
68 EXPECT_TRUE(store.Load());
69 EXPECT_TRUE(store.SetStringValue(kTestOptionB, kTestString2));
70 EXPECT_TRUE(store.Save());
71 EXPECT_TRUE(store.Load());
72 EXPECT_TRUE(store.GetStringValue(kTestOptionA, &out1));
73 EXPECT_TRUE(store.GetStringValue(kTestOptionB, &out2));
74 EXPECT_EQ(kTestString1, out1);
75 EXPECT_EQ(kTestString2, out2);
76 EXPECT_TRUE(store.RemoveValue(kTestOptionA));
77 EXPECT_TRUE(store.Save());
78 EXPECT_TRUE(store.Load());
79 EXPECT_TRUE(store.RemoveValue(kTestOptionB));
80 EXPECT_TRUE(store.Save());
81 EXPECT_TRUE(store.Load());
82 EXPECT_FALSE(store.GetStringValue(kTestOptionA, &out1));
83 EXPECT_FALSE(store.GetStringValue(kTestOptionB, &out2));
84 }
85
TEST(OptionsFile,GetSetInt)86 TEST(OptionsFile, GetSetInt) {
87 OptionsFile store(kTestFile);
88 // Clear contents of the file on disk.
89 EXPECT_TRUE(store.Save());
90 int out1, out2;
91 EXPECT_FALSE(store.GetIntValue(kTestOptionA, &out1));
92 EXPECT_FALSE(store.GetIntValue(kTestOptionB, &out2));
93 EXPECT_TRUE(store.SetIntValue(kTestOptionA, kTestInt1));
94 EXPECT_TRUE(store.Save());
95 EXPECT_TRUE(store.Load());
96 EXPECT_TRUE(store.SetIntValue(kTestOptionB, kTestInt2));
97 EXPECT_TRUE(store.Save());
98 EXPECT_TRUE(store.Load());
99 EXPECT_TRUE(store.GetIntValue(kTestOptionA, &out1));
100 EXPECT_TRUE(store.GetIntValue(kTestOptionB, &out2));
101 EXPECT_EQ(kTestInt1, out1);
102 EXPECT_EQ(kTestInt2, out2);
103 EXPECT_TRUE(store.RemoveValue(kTestOptionA));
104 EXPECT_TRUE(store.Save());
105 EXPECT_TRUE(store.Load());
106 EXPECT_TRUE(store.RemoveValue(kTestOptionB));
107 EXPECT_TRUE(store.Save());
108 EXPECT_TRUE(store.Load());
109 EXPECT_FALSE(store.GetIntValue(kTestOptionA, &out1));
110 EXPECT_FALSE(store.GetIntValue(kTestOptionB, &out2));
111 EXPECT_TRUE(store.SetIntValue(kTestOptionA, kNegInt));
112 EXPECT_TRUE(store.GetIntValue(kTestOptionA, &out1));
113 EXPECT_EQ(kNegInt, out1);
114 EXPECT_TRUE(store.SetIntValue(kTestOptionA, kZero));
115 EXPECT_TRUE(store.GetIntValue(kTestOptionA, &out1));
116 EXPECT_EQ(kZero, out1);
117 }
118
TEST(OptionsFile,Persist)119 TEST(OptionsFile, Persist) {
120 {
121 OptionsFile store(kTestFile);
122 // Clear contents of the file on disk.
123 EXPECT_TRUE(store.Save());
124 EXPECT_TRUE(store.SetStringValue(kTestOptionA, kTestString1));
125 EXPECT_TRUE(store.SetIntValue(kTestOptionB, kNegInt));
126 EXPECT_TRUE(store.Save());
127 }
128 {
129 OptionsFile store(kTestFile);
130 // Load the saved contents from above.
131 EXPECT_TRUE(store.Load());
132 std::string out1;
133 int out2;
134 EXPECT_TRUE(store.GetStringValue(kTestOptionA, &out1));
135 EXPECT_TRUE(store.GetIntValue(kTestOptionB, &out2));
136 EXPECT_EQ(kTestString1, out1);
137 EXPECT_EQ(kNegInt, out2);
138 }
139 }
140
TEST(OptionsFile,SpecialCharacters)141 TEST(OptionsFile, SpecialCharacters) {
142 OptionsFile store(kTestFile);
143 // Clear contents of the file on disk.
144 EXPECT_TRUE(store.Save());
145 std::string out;
146 EXPECT_FALSE(store.SetStringValue(kOptionWithEquals, kTestString1));
147 EXPECT_FALSE(store.GetStringValue(kOptionWithEquals, &out));
148 EXPECT_FALSE(store.SetStringValue(kOptionWithNewline, kTestString1));
149 EXPECT_FALSE(store.GetStringValue(kOptionWithNewline, &out));
150 EXPECT_TRUE(store.SetStringValue(kOptionWithUtf8, kValueWithUtf8));
151 EXPECT_TRUE(store.SetStringValue(kTestOptionA, kTestString1));
152 EXPECT_TRUE(store.Save());
153 EXPECT_TRUE(store.Load());
154 EXPECT_TRUE(store.GetStringValue(kTestOptionA, &out));
155 EXPECT_EQ(kTestString1, out);
156 EXPECT_TRUE(store.GetStringValue(kOptionWithUtf8, &out));
157 EXPECT_EQ(kValueWithUtf8, out);
158 EXPECT_FALSE(store.SetStringValue(kTestOptionA, kValueWithNewline));
159 EXPECT_TRUE(store.GetStringValue(kTestOptionA, &out));
160 EXPECT_EQ(kTestString1, out);
161 EXPECT_TRUE(store.SetStringValue(kTestOptionA, kValueWithEquals));
162 EXPECT_TRUE(store.Save());
163 EXPECT_TRUE(store.Load());
164 EXPECT_TRUE(store.GetStringValue(kTestOptionA, &out));
165 EXPECT_EQ(kValueWithEquals, out);
166 EXPECT_TRUE(store.SetStringValue(kEmptyString, kTestString2));
167 EXPECT_TRUE(store.Save());
168 EXPECT_TRUE(store.Load());
169 EXPECT_TRUE(store.GetStringValue(kEmptyString, &out));
170 EXPECT_EQ(kTestString2, out);
171 EXPECT_TRUE(store.SetStringValue(kTestOptionB, kEmptyString));
172 EXPECT_TRUE(store.Save());
173 EXPECT_TRUE(store.Load());
174 EXPECT_TRUE(store.GetStringValue(kTestOptionB, &out));
175 EXPECT_EQ(kEmptyString, out);
176 }
177
178 } // namespace talk_base
179