1 // Copyright (C) 2019 The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "utils/config_file.h"
16 
17 #include <sstream>
18 
19 #include <gtest/gtest.h>
20 
21 
22 namespace header_checker {
23 namespace utils {
24 
25 
TEST(ConfigParserTest,Parse)26 TEST(ConfigParserTest, Parse) {
27   std::stringstream stream(R"(
28 # Comment line starts with hash symbol
29 ; Comment line starts with semicolon
30 
31 [section1]
32 key1 = value1
33 key2 = value2
34 
35 [section2]
36 key1 = true
37 key2 = false
38 )");
39 
40   auto &&cfg = ConfigParser::ParseFile(stream);
41   EXPECT_TRUE(cfg.HasSection("section1"));
42   EXPECT_TRUE(cfg.HasSection("section2"));
43   EXPECT_FALSE(cfg.HasSection("section3"));
44 
45   auto &&section1 = cfg.GetSection("section1");
46   EXPECT_TRUE(section1.HasProperty("key1"));
47   EXPECT_EQ("value1", section1.GetProperty("key1"));
48   EXPECT_TRUE(section1.HasProperty("key2"));
49   EXPECT_EQ("value2", section1.GetProperty("key2"));
50 
51   EXPECT_FALSE(section1.HasProperty("key3"));
52   EXPECT_EQ("", section1.GetProperty("key3"));
53 
54   auto &&section2 = cfg.GetSection("section2");
55   EXPECT_TRUE(section2.HasProperty("key1"));
56   EXPECT_EQ("true", section2.GetProperty("key1"));
57   EXPECT_TRUE(section2.HasProperty("key2"));
58   EXPECT_EQ("false", section2.GetProperty("key2"));
59 
60   EXPECT_EQ("value1", cfg.GetProperty("section1", "key1"));
61   EXPECT_EQ("value2", cfg.GetProperty("section1", "key2"));
62 
63   EXPECT_EQ("value1", cfg["section1"]["key1"]);
64   EXPECT_EQ("value2", cfg["section1"]["key2"]);
65 }
66 
67 
TEST(ConfigParserTest,BadSectionNameLine)68 TEST(ConfigParserTest, BadSectionNameLine) {
69   std::stringstream stream(R"(
70 [section1
71 key1 = value1
72 )");
73 
74   size_t num_errors = 0;
75 
76   ConfigParser parser(stream);
77   parser.SetErrorListener(
78       [&num_errors](size_t line_no, const char *cause) {
79         ++num_errors;
80         EXPECT_EQ(2, line_no);
81         EXPECT_STREQ("bad section name line", cause);
82       });
83   parser.ParseFile();
84 
85   EXPECT_EQ(1, num_errors);
86 }
87 
88 
TEST(ConfigParserTest,BadKeyValueLine)89 TEST(ConfigParserTest, BadKeyValueLine) {
90   std::stringstream stream(R"(
91 [section1]
92 key1
93 )");
94 
95   size_t num_errors = 0;
96 
97   ConfigParser parser(stream);
98   parser.SetErrorListener(
99       [&num_errors](size_t line_no, const char *cause) {
100         ++num_errors;
101         EXPECT_EQ(3, line_no);
102         EXPECT_STREQ("bad key-value line", cause);
103       });
104   parser.ParseFile();
105 
106   EXPECT_EQ(1, num_errors);
107 }
108 
109 
110 }  // namespace utils
111 }  // namespace header_checker
112