| /* |
| * Copyright 2017 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| #include <config.h> |
| #include <gtest/gtest.h> |
| |
| #include <filesystem> |
| |
| namespace { |
| const std::filesystem::path kConfigFile = |
| std::filesystem::temp_directory_path() / "test_config.conf"; |
| const char* SIMPLE_CONFIG_FILE = kConfigFile.c_str(); |
| const char SIMPLE_CONFIG[] = |
| "# Simple config file test\n\ |
| STRING_VALUE=\"Hello World!\"\n\ |
| #COMMENTED_OUT_VALUE=1\n\ |
| NUM_VALUE=42\n\ |
| BYTES_VALUE={0A:0b:0C:fF:00}\n"; |
| |
| const char INVALID_CONFIG1[] = |
| "# This is an invalid config\n\ |
| # Config values must contain an = sign\n\ |
| TEST:1"; |
| |
| const char INVALID_CONFIG2[] = |
| "# This is an invalid config\n\ |
| # Byte arrays must contain at least one value\n\ |
| TEST={}"; |
| |
| const char INVALID_CONFIG3[] = |
| "# This is an invalid config\n\ |
| # String values cannot be empty\n\ |
| TEST=\"\""; |
| |
| const char INVALID_CONFIG4[] = |
| "# This is an invalid config\n\ |
| # Multiple config entries with the same key\n\ |
| TEST=1\n\ |
| TEST=2"; |
| |
| const char INVALID_CONFIG5[] = |
| "# This is an invalid config\n\ |
| # Byte value width incorrect\n\ |
| BYTES_VALUE={0A:0b:0C:1:00}\n"; |
| } // namespace |
| |
| class ConfigTestFromFile : public ::testing::Test { |
| protected: |
| void SetUp() override { |
| FILE* fp = fopen(SIMPLE_CONFIG_FILE, "wt"); |
| fwrite(SIMPLE_CONFIG, 1, sizeof(SIMPLE_CONFIG), fp); |
| fclose(fp); |
| } |
| void TearDown() override { std::filesystem::remove(kConfigFile); } |
| }; |
| |
| TEST(ConfigTestFromString, test_simple_config) { |
| ConfigFile config; |
| config.parseFromString(SIMPLE_CONFIG); |
| EXPECT_FALSE(config.hasKey("UNKNOWN_VALUE")); |
| EXPECT_FALSE(config.hasKey("COMMENTED_OUT_VALUE")); |
| EXPECT_TRUE(config.hasKey("NUM_VALUE")); |
| EXPECT_TRUE(config.hasKey("STRING_VALUE")); |
| EXPECT_TRUE(config.hasKey("BYTES_VALUE")); |
| } |
| |
| TEST(ConfigTestFromString, test_simple_values) { |
| ConfigFile config; |
| config.parseFromString(SIMPLE_CONFIG); |
| EXPECT_EQ(config.getUnsigned("NUM_VALUE"), 42u); |
| EXPECT_EQ(config.getString("STRING_VALUE"), "Hello World!"); |
| auto bytes = config.getBytes("BYTES_VALUE"); |
| EXPECT_EQ(bytes.size(), 5u); |
| EXPECT_EQ(bytes[0], 10); |
| EXPECT_EQ(bytes[1], 11); |
| EXPECT_EQ(bytes[2], 12); |
| EXPECT_EQ(bytes[3], 255); |
| EXPECT_EQ(bytes[4], 0); |
| } |
| |
| TEST(ConfigTestFromString, test_invalid_configs) { |
| ConfigFile config1; |
| EXPECT_DEATH(config1.parseFromString(INVALID_CONFIG1), ""); |
| ConfigFile config2; |
| EXPECT_DEATH(config2.parseFromString(INVALID_CONFIG2), ""); |
| ConfigFile config3; |
| EXPECT_DEATH(config3.parseFromString(INVALID_CONFIG3), ""); |
| ConfigFile config4; |
| EXPECT_DEATH(config4.parseFromString(INVALID_CONFIG4), ""); |
| ConfigFile config5; |
| EXPECT_DEATH(config5.parseFromString(INVALID_CONFIG5), ""); |
| } |
| |
| TEST(ConfigTestFromString, test_clear) { |
| ConfigFile config; |
| EXPECT_FALSE(config.hasKey("NUM_VALUE")); |
| config.parseFromString(SIMPLE_CONFIG); |
| EXPECT_TRUE(config.hasKey("NUM_VALUE")); |
| EXPECT_EQ(config.getUnsigned("NUM_VALUE"), 42u); |
| config.clear(); |
| EXPECT_FALSE(config.hasKey("NUM_VALUE")); |
| EXPECT_DEATH(config.getUnsigned("NUM_VALUE"), ""); |
| } |
| |
| TEST(ConfigTestFromString, test_isEmpty) { |
| ConfigFile config; |
| EXPECT_TRUE(config.isEmpty()); |
| config.parseFromString(SIMPLE_CONFIG); |
| EXPECT_FALSE(config.isEmpty()); |
| config.clear(); |
| EXPECT_TRUE(config.isEmpty()); |
| } |
| |
| TEST_F(ConfigTestFromFile, test_file_based_config) { |
| ConfigFile config; |
| config.parseFromFile(SIMPLE_CONFIG_FILE); |
| EXPECT_FALSE(config.hasKey("UNKNOWN_VALUE")); |
| EXPECT_EQ(config.getUnsigned("NUM_VALUE"), 42u); |
| EXPECT_EQ(config.getString("STRING_VALUE"), "Hello World!"); |
| auto bytes = config.getBytes("BYTES_VALUE"); |
| EXPECT_EQ(bytes.size(), 5u); |
| EXPECT_EQ(bytes[0], 10); |
| EXPECT_EQ(bytes[1], 11); |
| EXPECT_EQ(bytes[2], 12); |
| EXPECT_EQ(bytes[3], 255); |
| EXPECT_EQ(bytes[4], 0); |
| } |