普通文本  |  136行  |  4.03 KB

/*
 * 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 <gtest/gtest.h>

#include <config.h>

namespace {
const char SIMPLE_CONFIG_FILE[] = "/data/local/tmp/test_config.conf";
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);
  }
};

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);
}