1*7eba2f3bSAndroid Build Coastguard Worker /*
2*7eba2f3bSAndroid Build Coastguard Worker * Copyright 2017 The Android Open Source Project
3*7eba2f3bSAndroid Build Coastguard Worker *
4*7eba2f3bSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*7eba2f3bSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*7eba2f3bSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*7eba2f3bSAndroid Build Coastguard Worker *
8*7eba2f3bSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*7eba2f3bSAndroid Build Coastguard Worker *
10*7eba2f3bSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*7eba2f3bSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*7eba2f3bSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*7eba2f3bSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*7eba2f3bSAndroid Build Coastguard Worker * limitations under the License.
15*7eba2f3bSAndroid Build Coastguard Worker */
16*7eba2f3bSAndroid Build Coastguard Worker #include <config.h>
17*7eba2f3bSAndroid Build Coastguard Worker #include <gtest/gtest.h>
18*7eba2f3bSAndroid Build Coastguard Worker
19*7eba2f3bSAndroid Build Coastguard Worker #include <filesystem>
20*7eba2f3bSAndroid Build Coastguard Worker
21*7eba2f3bSAndroid Build Coastguard Worker namespace {
22*7eba2f3bSAndroid Build Coastguard Worker const std::filesystem::path kConfigFile =
23*7eba2f3bSAndroid Build Coastguard Worker std::filesystem::temp_directory_path() / "test_config.conf";
24*7eba2f3bSAndroid Build Coastguard Worker const char* SIMPLE_CONFIG_FILE = kConfigFile.c_str();
25*7eba2f3bSAndroid Build Coastguard Worker const char SIMPLE_CONFIG[] =
26*7eba2f3bSAndroid Build Coastguard Worker "# Simple config file test\n\
27*7eba2f3bSAndroid Build Coastguard Worker STRING_VALUE=\"Hello World!\"\n\
28*7eba2f3bSAndroid Build Coastguard Worker #COMMENTED_OUT_VALUE=1\n\
29*7eba2f3bSAndroid Build Coastguard Worker NUM_VALUE=42\n\
30*7eba2f3bSAndroid Build Coastguard Worker BYTES_VALUE={0A:0b:0C:fF:00}\n";
31*7eba2f3bSAndroid Build Coastguard Worker
32*7eba2f3bSAndroid Build Coastguard Worker const char INVALID_CONFIG1[] =
33*7eba2f3bSAndroid Build Coastguard Worker "# This is an invalid config\n\
34*7eba2f3bSAndroid Build Coastguard Worker # Config values must contain an = sign\n\
35*7eba2f3bSAndroid Build Coastguard Worker TEST:1";
36*7eba2f3bSAndroid Build Coastguard Worker
37*7eba2f3bSAndroid Build Coastguard Worker const char INVALID_CONFIG2[] =
38*7eba2f3bSAndroid Build Coastguard Worker "# This is an invalid config\n\
39*7eba2f3bSAndroid Build Coastguard Worker # Byte arrays must contain at least one value\n\
40*7eba2f3bSAndroid Build Coastguard Worker TEST={}";
41*7eba2f3bSAndroid Build Coastguard Worker
42*7eba2f3bSAndroid Build Coastguard Worker const char INVALID_CONFIG3[] =
43*7eba2f3bSAndroid Build Coastguard Worker "# This is an invalid config\n\
44*7eba2f3bSAndroid Build Coastguard Worker # String values cannot be empty\n\
45*7eba2f3bSAndroid Build Coastguard Worker TEST=\"\"";
46*7eba2f3bSAndroid Build Coastguard Worker
47*7eba2f3bSAndroid Build Coastguard Worker const char INVALID_CONFIG4[] =
48*7eba2f3bSAndroid Build Coastguard Worker "# This is an invalid config\n\
49*7eba2f3bSAndroid Build Coastguard Worker # Multiple config entries with the same key\n\
50*7eba2f3bSAndroid Build Coastguard Worker TEST=1\n\
51*7eba2f3bSAndroid Build Coastguard Worker TEST=2";
52*7eba2f3bSAndroid Build Coastguard Worker
53*7eba2f3bSAndroid Build Coastguard Worker const char INVALID_CONFIG5[] =
54*7eba2f3bSAndroid Build Coastguard Worker "# This is an invalid config\n\
55*7eba2f3bSAndroid Build Coastguard Worker # Byte value width incorrect\n\
56*7eba2f3bSAndroid Build Coastguard Worker BYTES_VALUE={0A:0b:0C:1:00}\n";
57*7eba2f3bSAndroid Build Coastguard Worker } // namespace
58*7eba2f3bSAndroid Build Coastguard Worker
59*7eba2f3bSAndroid Build Coastguard Worker class ConfigTestFromFile : public ::testing::Test {
60*7eba2f3bSAndroid Build Coastguard Worker protected:
SetUp()61*7eba2f3bSAndroid Build Coastguard Worker void SetUp() override {
62*7eba2f3bSAndroid Build Coastguard Worker FILE* fp = fopen(SIMPLE_CONFIG_FILE, "wt");
63*7eba2f3bSAndroid Build Coastguard Worker fwrite(SIMPLE_CONFIG, 1, sizeof(SIMPLE_CONFIG), fp);
64*7eba2f3bSAndroid Build Coastguard Worker fclose(fp);
65*7eba2f3bSAndroid Build Coastguard Worker }
TearDown()66*7eba2f3bSAndroid Build Coastguard Worker void TearDown() override { std::filesystem::remove(kConfigFile); }
67*7eba2f3bSAndroid Build Coastguard Worker };
68*7eba2f3bSAndroid Build Coastguard Worker
TEST(ConfigTestFromString,test_simple_config)69*7eba2f3bSAndroid Build Coastguard Worker TEST(ConfigTestFromString, test_simple_config) {
70*7eba2f3bSAndroid Build Coastguard Worker ConfigFile config;
71*7eba2f3bSAndroid Build Coastguard Worker config.parseFromString(SIMPLE_CONFIG);
72*7eba2f3bSAndroid Build Coastguard Worker EXPECT_FALSE(config.hasKey("UNKNOWN_VALUE"));
73*7eba2f3bSAndroid Build Coastguard Worker EXPECT_FALSE(config.hasKey("COMMENTED_OUT_VALUE"));
74*7eba2f3bSAndroid Build Coastguard Worker EXPECT_TRUE(config.hasKey("NUM_VALUE"));
75*7eba2f3bSAndroid Build Coastguard Worker EXPECT_TRUE(config.hasKey("STRING_VALUE"));
76*7eba2f3bSAndroid Build Coastguard Worker EXPECT_TRUE(config.hasKey("BYTES_VALUE"));
77*7eba2f3bSAndroid Build Coastguard Worker }
78*7eba2f3bSAndroid Build Coastguard Worker
TEST(ConfigTestFromString,test_simple_values)79*7eba2f3bSAndroid Build Coastguard Worker TEST(ConfigTestFromString, test_simple_values) {
80*7eba2f3bSAndroid Build Coastguard Worker ConfigFile config;
81*7eba2f3bSAndroid Build Coastguard Worker config.parseFromString(SIMPLE_CONFIG);
82*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(config.getUnsigned("NUM_VALUE"), 42u);
83*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(config.getString("STRING_VALUE"), "Hello World!");
84*7eba2f3bSAndroid Build Coastguard Worker auto bytes = config.getBytes("BYTES_VALUE");
85*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(bytes.size(), 5u);
86*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(bytes[0], 10);
87*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(bytes[1], 11);
88*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(bytes[2], 12);
89*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(bytes[3], 255);
90*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(bytes[4], 0);
91*7eba2f3bSAndroid Build Coastguard Worker }
92*7eba2f3bSAndroid Build Coastguard Worker
TEST(ConfigTestFromString,test_invalid_configs)93*7eba2f3bSAndroid Build Coastguard Worker TEST(ConfigTestFromString, test_invalid_configs) {
94*7eba2f3bSAndroid Build Coastguard Worker ConfigFile config1;
95*7eba2f3bSAndroid Build Coastguard Worker EXPECT_DEATH(config1.parseFromString(INVALID_CONFIG1), "");
96*7eba2f3bSAndroid Build Coastguard Worker ConfigFile config2;
97*7eba2f3bSAndroid Build Coastguard Worker EXPECT_DEATH(config2.parseFromString(INVALID_CONFIG2), "");
98*7eba2f3bSAndroid Build Coastguard Worker ConfigFile config3;
99*7eba2f3bSAndroid Build Coastguard Worker EXPECT_DEATH(config3.parseFromString(INVALID_CONFIG3), "");
100*7eba2f3bSAndroid Build Coastguard Worker ConfigFile config4;
101*7eba2f3bSAndroid Build Coastguard Worker EXPECT_DEATH(config4.parseFromString(INVALID_CONFIG4), "");
102*7eba2f3bSAndroid Build Coastguard Worker ConfigFile config5;
103*7eba2f3bSAndroid Build Coastguard Worker EXPECT_DEATH(config5.parseFromString(INVALID_CONFIG5), "");
104*7eba2f3bSAndroid Build Coastguard Worker }
105*7eba2f3bSAndroid Build Coastguard Worker
TEST(ConfigTestFromString,test_clear)106*7eba2f3bSAndroid Build Coastguard Worker TEST(ConfigTestFromString, test_clear) {
107*7eba2f3bSAndroid Build Coastguard Worker ConfigFile config;
108*7eba2f3bSAndroid Build Coastguard Worker EXPECT_FALSE(config.hasKey("NUM_VALUE"));
109*7eba2f3bSAndroid Build Coastguard Worker config.parseFromString(SIMPLE_CONFIG);
110*7eba2f3bSAndroid Build Coastguard Worker EXPECT_TRUE(config.hasKey("NUM_VALUE"));
111*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(config.getUnsigned("NUM_VALUE"), 42u);
112*7eba2f3bSAndroid Build Coastguard Worker config.clear();
113*7eba2f3bSAndroid Build Coastguard Worker EXPECT_FALSE(config.hasKey("NUM_VALUE"));
114*7eba2f3bSAndroid Build Coastguard Worker EXPECT_DEATH(config.getUnsigned("NUM_VALUE"), "");
115*7eba2f3bSAndroid Build Coastguard Worker }
116*7eba2f3bSAndroid Build Coastguard Worker
TEST(ConfigTestFromString,test_isEmpty)117*7eba2f3bSAndroid Build Coastguard Worker TEST(ConfigTestFromString, test_isEmpty) {
118*7eba2f3bSAndroid Build Coastguard Worker ConfigFile config;
119*7eba2f3bSAndroid Build Coastguard Worker EXPECT_TRUE(config.isEmpty());
120*7eba2f3bSAndroid Build Coastguard Worker config.parseFromString(SIMPLE_CONFIG);
121*7eba2f3bSAndroid Build Coastguard Worker EXPECT_FALSE(config.isEmpty());
122*7eba2f3bSAndroid Build Coastguard Worker config.clear();
123*7eba2f3bSAndroid Build Coastguard Worker EXPECT_TRUE(config.isEmpty());
124*7eba2f3bSAndroid Build Coastguard Worker }
125*7eba2f3bSAndroid Build Coastguard Worker
TEST_F(ConfigTestFromFile,test_file_based_config)126*7eba2f3bSAndroid Build Coastguard Worker TEST_F(ConfigTestFromFile, test_file_based_config) {
127*7eba2f3bSAndroid Build Coastguard Worker ConfigFile config;
128*7eba2f3bSAndroid Build Coastguard Worker config.parseFromFile(SIMPLE_CONFIG_FILE);
129*7eba2f3bSAndroid Build Coastguard Worker EXPECT_FALSE(config.hasKey("UNKNOWN_VALUE"));
130*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(config.getUnsigned("NUM_VALUE"), 42u);
131*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(config.getString("STRING_VALUE"), "Hello World!");
132*7eba2f3bSAndroid Build Coastguard Worker auto bytes = config.getBytes("BYTES_VALUE");
133*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(bytes.size(), 5u);
134*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(bytes[0], 10);
135*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(bytes[1], 11);
136*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(bytes[2], 12);
137*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(bytes[3], 255);
138*7eba2f3bSAndroid Build Coastguard Worker EXPECT_EQ(bytes[4], 0);
139*7eba2f3bSAndroid Build Coastguard Worker }
140