root/trunk/whisperlib/common/base/test/strutil_test.cc

Revision 7, 17.0 kB (checked in by whispercastorg, 2 years ago)

version 0.2.0

Line 
1 // Copyright (c) 2009, Whispersoft s.r.l.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 // * Neither the name of Whispersoft s.r.l. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30 // Author: Catalin Popescu
31
32 #include "common/base/log.h"
33 #include "common/base/strutil.h"
34 #include "common/base/system.h"
35
36
37 int main(int argc, char* argv[]) {
38   common::Init(argc, argv);
39   {
40     string s("',P6=-7E|c\\\\\\\\$'+@kz[\\\"\\\"3l]jtDkyt?$!o8>zOax4@U8F`W4^54^H!>5vb\\\"pWArX2,t\\/[Y");
41     CHECK_EQ(strutil::JsonStrEscape(strutil::JsonStrUnescape(s)), s);
42   }
43
44   LOG_INFO << " Testing strutil::StrEql";
45   const char* test = "12345";
46   CHECK(strutil::StrEql(test, test));
47   CHECK(strutil::StrEql("", ""));
48   CHECK(!strutil::StrEql("abcd", "abcde"));
49   CHECK(strutil::StrEql("abcd", "abcd"));
50   CHECK(!strutil::StrEql("fdsakhfsalkjh abcd", "abcde"));
51
52   LOG_INFO << " Testing strutil::StrIEql";
53   CHECK(strutil::StrIEql("", ""));
54   CHECK(strutil::StrIEql(test, test));
55   CHECK(!strutil::StrIEql("abcd", "abcde"));
56   CHECK(strutil::StrIEql("abcd", "aBcD"));
57   CHECK(strutil::StrIEql("Abcd", "aBcD"));
58   CHECK(!strutil::StrIEql("Abcd", "aBcDe"));
59   CHECK(!strutil::StrEql("abcd", "falkjgyabcde"));
60
61   LOG_INFO << " Testing strutil::StrPrefix";
62   CHECK(strutil::StrPrefix(test, test));
63   CHECK(strutil::StrPrefix("abcedf", "abc"));
64   CHECK(strutil::StrPrefix("abcedf", ""));
65   CHECK(strutil::StrPrefix("", ""));
66   CHECK(!strutil::StrPrefix("abc", "abcedf"));
67   CHECK(!strutil::StrPrefix("adfabc", "adfb"));
68
69   LOG_INFO << " Testing strutil::ShiftLeftBuffer";
70   char test_shift[100];
71   strcpy(test_shift, "abcdefghijkl");
72   strutil::ShiftLeftBuffer(test_shift, sizeof(test_shift - 1), 0, 0);
73   CHECK(!strcmp(test_shift, "abcdefghijkl")) << "[" << test_shift << "]";
74   strutil::ShiftLeftBuffer(test_shift, 5, 3, 'x');
75   CHECK(!strcmp(test_shift, "dexxxfghijkl")) << "[" << test_shift << "]";
76   strutil::ShiftLeftBuffer(test_shift, 1, 1, 'y');
77   CHECK(!strcmp(test_shift, "yexxxfghijkl")) << "[" << test_shift << "]";
78   strutil::ShiftLeftBuffer(test_shift, 10, 0, 'y');
79   CHECK(!strcmp(test_shift, "yexxxfghijkl")) << "[" << test_shift << "]";
80   strutil::ShiftLeftBuffer(test_shift, strlen(test_shift),
81                            strlen(test_shift), 'z');
82   CHECK(!strcmp(test_shift, "zzzzzzzzzzzz")) << "[" << test_shift << "]";
83
84   LOG_INFO << " Testing strutil::JoinStrings";
85   const char* test_join[] = {"aaaaa", "bbb", "cccccc", "dd" };
86   CHECK_EQ(strutil::JoinStrings(test_join, NUMBEROF(test_join), " "),
87            string("aaaaa bbb cccccc dd"));
88   vector<string> test_join2;
89   CHECK_EQ(strutil::JoinStrings(test_join2, " "), string(""));
90   test_join2.push_back(string("AAA"));
91   test_join2.push_back(string("BB"));
92   test_join2.push_back(string("CCCC"));
93   test_join2.push_back(string("D"));
94   CHECK_EQ(strutil::JoinStrings(test_join2, "x"), string("AAAxBBxCCCCxD"));
95
96   LOG_INFO << " Testing strutil::Basename";
97   CHECK_STREQ(strutil::Basename("a"), "a");
98   CHECK_STREQ(strutil::Basename("/a"), "a");
99   CHECK_STREQ(strutil::Basename("/a/b"), "b");
100   CHECK_STREQ(strutil::Basename("/a/b/c"), "c");
101   CHECK_STREQ(strutil::Basename("/alda hk/biyf fi/8740%#%/c123456"), "c123456");
102   CHECK_STREQ(strutil::Basename("/a^%#2/tg/ftrdd09[/blksau  834/c123456%^%"),
103               "c123456%^%");
104
105   LOG_INFO << " Testing strutil::Dirname";
106   CHECK_EQ(strutil::Dirname("/a"), string(""));
107   CHECK_EQ(strutil::Dirname("/a/b"), string("/a"));
108   CHECK_EQ(strutil::Dirname("/a/b/c"), string("/a/b"));
109   CHECK_EQ(strutil::Dirname("/alda hk/biyf fi/8740%#%/c123456"),
110            string("/alda hk/biyf fi/8740%#%"));
111
112   LOG_INFO << " Testing strutil::StringPrintf";
113   CHECK_EQ(strutil::StringPrintf("%d", static_cast<int32>(1234)),
114            string("1234"));
115   CHECK_EQ(strutil::StringPrintf("%08d", static_cast<int32>(1234)),
116            string("00001234"));
117   CHECK_EQ(strutil::StringPrintf("%s %d", "abcd", static_cast<int32>(1234)),
118            string("abcd 1234"));
119   CHECK_EQ(strutil::StringPrintf("%s %d %.4f", "abcd",
120                                  static_cast<int32>(1234), 3.456),
121            string("abcd 1234 3.4560"));
122
123   LOG_INFO << " Testing strutil::SplitString";
124   #define TEST_SPLIT(str, sep, nExpectedTokens, strExpectedJoinedTokens) { \
125       vector<string> tokens;                                               \
126     strutil::SplitString(str, sep, &tokens);                               \
127     string strJoinedTokens = strutil::JoinStrings(tokens, ",");            \
128     LOG_INFO << "SplitString(\"" << str << "\", \""                        \
129              << sep << "\") => #" << tokens.size()                         \
130              << " {" << strJoinedTokens << "}";                            \
131     CHECK_EQ(tokens.size(), nExpectedTokens);                              \
132     CHECK_EQ(strJoinedTokens, strExpectedJoinedTokens);                    \
133   }
134   TEST_SPLIT("abcbcd", "b", 3, (string() + "a" + "," + "c" + "," + "cd"));
135   TEST_SPLIT("abc", "abc", 2, (string() + "" + "," + ""));
136   TEST_SPLIT("abc", "a", 2, (string() + "" + "," + "bc"));
137   TEST_SPLIT("abc", "c", 2, (string() + "ab" + "," + ""));
138   TEST_SPLIT("abc", "", 3, (string() + "a" + "," + "b" + "," + "c"));
139   TEST_SPLIT("", "a", 1, (string() + ""));
140   TEST_SPLIT("", "", 0, (string()));
141
142   LOG_INFO << " Testing strutil::StrEscape";
143   CHECK_EQ(strutil::StrEscape("", '#', ","), "");
144   CHECK_EQ(strutil::StrEscape("a", '#', ","), "a");
145   CHECK_EQ(strutil::StrEscape("a,", '#', ","), "a#2c");
146   CHECK_EQ(strutil::StrEscape(".", '#', "."), "#2e");
147   CHECK_EQ(strutil::StrEscape("#", '#', "."), "#23");
148   CHECK_EQ(strutil::StrEscape("##", '#', "."), "#23#23");
149   CHECK_EQ(strutil::StrEscape("#a#", '#', "."), "#23a#23");
150   CHECK_EQ(strutil::StrEscape("a, b, c", '#', ","), "a#2c b#2c c");
151   CHECK_EQ(strutil::StrEscape("a,., b,c", '#', ",."), "a#2c#2e#2c b#2cc");
152   CHECK_EQ(strutil::StrEscape("a,., b,##c", '#', ",."),
153            "a#2c#2e#2c b#2c#23#23c");
154   CHECK_EQ(strutil::StrEscape("a,b\r\na,b\n", '#', ",\r\n"),
155            "a#2cb#0d#0aa#2cb#0a");
156   CHECK_EQ(strutil::StrEscape("#a,b\r\na,b\n#", '#', ",\r\n"),
157            "#23a#2cb#0d#0aa#2cb#0a#23");
158
159   LOG_INFO << " Testing strutil::StrUnescape";
160   CHECK_EQ(strutil::StrUnescape("", '#'), "");
161   CHECK_EQ(strutil::StrUnescape("a", '#'), "a");
162   CHECK_EQ(strutil::StrUnescape("a#2c", '#'), "a,");
163   CHECK_EQ(strutil::StrUnescape("#2e", '#'), ".");
164   CHECK_EQ(strutil::StrUnescape("#23", '#'), "#");
165   CHECK_EQ(strutil::StrUnescape("#23#23", '#'), "##");
166   CHECK_EQ(strutil::StrUnescape("#23a#23", '#'), "#a#");
167   CHECK_EQ(strutil::StrUnescape("a#2c b#2c c", '#'), "a, b, c");
168   CHECK_EQ(strutil::StrUnescape("a#2c#2e#2c b#2cc", '#'), "a,., b,c");
169   CHECK_EQ(strutil::StrUnescape("a#2c#2e#2c b#2c#23#23c", '#'), "a,., b,##c");
170   CHECK_EQ(strutil::StrUnescape("a#2cb#0d#0aa#2cb#0a", '#'), "a,b\r\na,b\n");
171   CHECK_EQ(strutil::StrUnescape("#23a#2cb#0d#0aa#2cb#0a#23", '#'),
172            "#a,b\r\na,b\n#");
173
174   CHECK_STREQ(strutil::NormalizePath("").c_str(), "");
175   CHECK_STREQ(strutil::NormalizePath("/").c_str(), "/");
176   CHECK_STREQ(strutil::NormalizePath("//").c_str(), "//");
177   CHECK_STREQ(strutil::NormalizePath("///").c_str(), "/");
178   CHECK_STREQ(strutil::NormalizePath("f").c_str(), "f");
179   CHECK_STREQ(strutil::NormalizePath("foo").c_str(), "foo");
180   CHECK_STREQ(strutil::NormalizePath("foo/").c_str(), "foo/");
181   CHECK_STREQ(strutil::NormalizePath("f/").c_str(), "f/");
182   CHECK_STREQ(strutil::NormalizePath("/foo").c_str(), "/foo");
183   CHECK_STREQ(strutil::NormalizePath("foo/bar").c_str(), "foo/bar");
184   CHECK_STREQ(strutil::NormalizePath("..").c_str(), "");
185   CHECK_STREQ(strutil::NormalizePath("../..").c_str(), "");
186   CHECK_STREQ(strutil::NormalizePath("/..").c_str(), "/");
187   CHECK_STREQ(strutil::NormalizePath("/../..").c_str(), "/");
188   CHECK_STREQ(strutil::NormalizePath("../foo").c_str(), "");
189   CHECK_STREQ(strutil::NormalizePath("foo/..").c_str(), "");
190   CHECK_STREQ(strutil::NormalizePath("foo/../").c_str(), "");
191   CHECK_STREQ(strutil::NormalizePath("foo/...").c_str(), "foo/...");
192   CHECK_STREQ(strutil::NormalizePath("foo/.../").c_str(), "foo/.../");
193   CHECK_STREQ(strutil::NormalizePath("foo/..bar").c_str(), "foo/..bar");
194   CHECK_STREQ(strutil::NormalizePath("../f").c_str(), "");
195   CHECK_STREQ(strutil::NormalizePath("/../f").c_str(), "/");
196   CHECK_STREQ(strutil::NormalizePath("f/..").c_str(), "");
197   CHECK_STREQ(strutil::NormalizePath("foo/../..").c_str(), "");
198   CHECK_STREQ(strutil::NormalizePath("foo/../../").c_str(), "");
199   CHECK_STREQ(strutil::NormalizePath("foo/../../..").c_str(), "");
200   CHECK_STREQ(strutil::NormalizePath("foo/../../../").c_str(), "");
201   CHECK_STREQ(strutil::NormalizePath("foo/../bar").c_str(), "bar");
202   CHECK_STREQ(strutil::NormalizePath("foo/../bar/").c_str(), "bar/");
203   CHECK_STREQ(strutil::NormalizePath("foo/bar/..").c_str(), "foo");
204   CHECK_STREQ(strutil::NormalizePath("foo/bar/../").c_str(), "foo/");
205   CHECK_STREQ(strutil::NormalizePath("foo/bar/../..").c_str(), "");
206   CHECK_STREQ(strutil::NormalizePath("foo/bar/../../").c_str(), "");
207   CHECK_STREQ(strutil::NormalizePath("foo/bar/../blah").c_str(), "foo/blah");
208   CHECK_STREQ(strutil::NormalizePath("f/../b").c_str(), "b");
209   CHECK_STREQ(strutil::NormalizePath("f/b/..").c_str(), "f");
210   CHECK_STREQ(strutil::NormalizePath("f/b/../").c_str(), "f/");
211   CHECK_STREQ(strutil::NormalizePath("f/b/../a").c_str(), "f/a");
212   CHECK_STREQ(strutil::NormalizePath("foo/bar/blah/../..").c_str(), "foo");
213   CHECK_STREQ(strutil::NormalizePath("foo/bar/blah/../../bletch").c_str(),
214               "foo/bletch");
215   CHECK_STREQ(strutil::NormalizePath("//net").c_str(), "//net");
216   CHECK_STREQ(strutil::NormalizePath("//net/").c_str(), "//net/");
217   CHECK_STREQ(strutil::NormalizePath("//..net").c_str(), "//..net");
218   CHECK_STREQ(strutil::NormalizePath("//net/..").c_str(), "/");
219   CHECK_STREQ(strutil::NormalizePath("//net/foo").c_str(), "//net/foo");
220   CHECK_STREQ(strutil::NormalizePath("//net/foo/").c_str(), "//net/foo/");
221   CHECK_STREQ(strutil::NormalizePath("//net/foo/..").c_str(), "//net");
222   CHECK_STREQ(strutil::NormalizePath("//net/foo/../").c_str(), "//net/");
223
224   CHECK_STREQ(strutil::NormalizePath("/net/foo/bar").c_str(),
225               "/net/foo/bar");
226   CHECK_STREQ(strutil::NormalizePath("/net/foo/bar/").c_str(),
227               "/net/foo/bar/");
228   CHECK_STREQ(strutil::NormalizePath("/net/foo/..").c_str(),
229               "/net");
230   CHECK_STREQ(strutil::NormalizePath("/net/foo/../").c_str(),
231               "/net/");
232
233   CHECK_STREQ(strutil::NormalizePath("//net//foo//bar").c_str(),
234               "//net/foo/bar");
235   CHECK_STREQ(strutil::NormalizePath("//net//foo//bar//").c_str(),
236               "//net/foo/bar/");
237   CHECK_STREQ(strutil::NormalizePath("//net//foo//..").c_str(),
238               "//net");
239   CHECK_STREQ(strutil::NormalizePath("//net//foo//..//").c_str(),
240               "//net/");
241
242   CHECK_STREQ(strutil::NormalizePath("///net///foo///bar").c_str(),
243               "/net/foo/bar");
244   CHECK_STREQ(strutil::NormalizePath("///net///foo///bar///").c_str(),
245               "/net/foo/bar/");
246   CHECK_STREQ(strutil::NormalizePath("///net///foo///..").c_str(),
247               "/net");
248   CHECK_STREQ(strutil::NormalizePath("///net///foo///..///").c_str(),
249               "/net/");
250
251   LOG_INFO << " Testing strutil::StrTrim";
252   CHECK_EQ(strutil::StrTrimChars("", ""), "");
253   CHECK_EQ(strutil::StrTrimChars("", " "), "");
254   CHECK_EQ(strutil::StrTrimChars(" ", " "), "");
255   CHECK_EQ(strutil::StrTrimChars("  ", " "), "");
256   CHECK_EQ(strutil::StrTrimChars("   ", " "), "");
257   CHECK_EQ(strutil::StrTrimChars(" a ", " "), "a");
258   CHECK_EQ(strutil::StrTrimChars("a ", " "), "a");
259   CHECK_EQ(strutil::StrTrimChars(" a", " "), "a");
260   CHECK_EQ(strutil::StrTrimChars(" abcd ", " "), "abcd");
261   CHECK_EQ(strutil::StrTrimChars("abcd ", " "), "abcd");
262   CHECK_EQ(strutil::StrTrimChars(" abcd", " "), "abcd");
263   CHECK_EQ(strutil::StrTrimChars("   a      a ", " "), "a      a");
264   CHECK_EQ(strutil::StrTrimChars("      a  ", " "), "a");
265   CHECK_EQ(strutil::StrTrimChars("a        a", " "), "a        a");
266   CHECK_EQ(strutil::StrTrimChars("   a      a ", " "), "a      a");
267
268   LOG_INFO << " Testing strutil::StrTrimChars";
269   CHECK_EQ(strutil::StrTrimChars("", ""), "");
270   CHECK_EQ(strutil::StrTrimChars("", "/"), "");
271   CHECK_EQ(strutil::StrTrimChars("/", "/"), "");
272   CHECK_EQ(strutil::StrTrimChars("//", "/"), "");
273   CHECK_EQ(strutil::StrTrimChars("///", "/"), "");
274   CHECK_EQ(strutil::StrTrimChars("/a/", "/"), "a");
275   CHECK_EQ(strutil::StrTrimChars("a/", "/"), "a");
276   CHECK_EQ(strutil::StrTrimChars("/a", "/"), "a");
277   CHECK_EQ(strutil::StrTrimChars("/abcd/", "/"), "abcd");
278   CHECK_EQ(strutil::StrTrimChars("abcd/", "/"), "abcd");
279   CHECK_EQ(strutil::StrTrimChars("/abcd", "/"), "abcd");
280   CHECK_EQ(strutil::StrTrimChars("///a//////a/", "/"), "a//////a");
281   CHECK_EQ(strutil::StrTrimChars("//////a//", "/"), "a");
282   CHECK_EQ(strutil::StrTrimChars("a////////a", "/"), "a////////a");
283   CHECK_EQ(strutil::StrTrimChars("///a//////a/", "/"), "a//////a");
284
285   LOG_INFO << " Testing strutil::JoinPaths";
286   CHECK_EQ(strutil::JoinPaths("", ""), "");
287   CHECK_EQ(strutil::JoinPaths("", "b"), "b");
288   CHECK_EQ(strutil::JoinPaths("", "/b"), "/b");
289   CHECK_EQ(strutil::JoinPaths("/", ""), "/");
290   CHECK_EQ(strutil::JoinPaths("/", "b"), "/b");
291   CHECK_EQ(strutil::JoinPaths("/", "/b"), "//b");
292   CHECK_EQ(strutil::JoinPaths("/a", "b"), "/a/b");
293   CHECK_EQ(strutil::JoinPaths("/a", "/b"), "/a/b");
294   CHECK_EQ(strutil::JoinPaths("/a/b", "//c//d//"), "/a/b/c/d/");
295   CHECK_EQ(strutil::JoinPaths("a", "b"), "a/b");
296   CHECK_EQ(strutil::JoinPaths("a", "/b"), "a/b");
297   CHECK_EQ(strutil::JoinPaths("a/", "b/"), "a/b/");
298
299   LOG_INFO << " Testing strutil::StrToUpper";
300   string s;
301   CHECK_STREQ(strutil::StrToUpper(s).c_str(), "");
302   s = "a";
303   CHECK_STREQ(strutil::StrToUpper(s).c_str(), "A");
304   s = "A";
305   CHECK_STREQ(strutil::StrToUpper(s).c_str(), "A");
306   s = "aA 12Xs";
307   CHECK_STREQ(strutil::StrToUpper(s).c_str(), "AA 12XS");
308   s = "Ac (0(12XD";
309   CHECK_STREQ(strutil::StrToUpper(s).c_str(), "AC (0(12XD");
310
311   LOG_INFO << " Testing strutil::StrToLower";
312   s = "";
313   CHECK_STREQ(strutil::StrToLower(s).c_str(), "");
314   s = "a";
315   CHECK_STREQ(strutil::StrToLower(s).c_str(), "a");
316   s = "A";
317   CHECK_STREQ(strutil::StrToLower(s).c_str(), "a");
318   s = "aA 12Xs";
319   CHECK_STREQ(strutil::StrToLower(s).c_str(), "aa 12xs");
320   s = "Ac (0(12XD";
321   CHECK_STREQ(strutil::StrToLower(s).c_str(), "ac (0(12xd");
322
323   LOG_INFO << " Testing strutil::IsValidIdentifier";
324   CHECK(!strutil::IsValidIdentifier(""));
325   CHECK(!strutil::IsValidIdentifier("a@#"));
326   CHECK(!strutil::IsValidIdentifier("_a"));
327   CHECK(!strutil::IsValidIdentifier("!a"));
328   CHECK(strutil::IsValidIdentifier("1a"));
329   CHECK(!strutil::IsValidIdentifier("a_AZ!"));
330
331   CHECK(strutil::IsValidIdentifier("a"));
332   CHECK(strutil::IsValidIdentifier("A"));
333   CHECK(strutil::IsValidIdentifier("a1"));
334   CHECK(strutil::IsValidIdentifier("A1"));
335   CHECK(strutil::IsValidIdentifier("azAZ_09"));
336   CHECK(strutil::IsValidIdentifier("AazZ_09"));
337   CHECK(strutil::IsValidIdentifier("AazZ_09_"));
338
339   LOG_INFO << " Testing  strutil::StrMapFormat";
340   {
341   // string s("We found user ${User} who wants to \${10 access ${Resource}")
342     map<string, string> m;
343     m["User"] = "john";
344     m["Resource"] = "disk";
345     m["Bogus"] = "gugu";
346     m["AHA}"] = "aha";
347     CHECK_STREQ(strutil::StrMapFormat(
348                      "We found user ${User} who wants to \\${10 "
349                      "access ${Resource}.",
350                      m, "${", "}", '\\').c_str(),
351                  "We found user john who wants to ${10 access disk.");
352     CHECK_STREQ(strutil::StrMapFormat(
353                      "${User} \\${10 ${Resource} ${AHA\\}} $Vasile ${lili}.",
354                      m, "${", "}", '\\').c_str(),
355                 "john ${10 disk aha $Vasile .");
356     CHECK_STREQ(strutil::StrMapFormat(
357                      "{{{User}}} \\${10 ${Resource} ${{{AHA\\}}}}",
358                      m, "{{{", "}}}", '\\').c_str(),
359                 "john \\${10 ${Resource} $aha");
360   }
361   LOG_INFO << "PASS";
362   common::Exit(0);
363 }
Note: See TracBrowser for help on using the browser.