diff --git a/src/configuration.cc b/src/configuration.cc index 2d41cdd1..daab70ce 100644 --- a/src/configuration.cc +++ b/src/configuration.cc @@ -136,9 +136,10 @@ int Configuration::ParseArguments(int ac, char** av) { "Enable verbose logging") ("option,o", boost::program_options::value>() - ->multitoken()->zero_tokens()->composing(), + ->composing(), "Explicit configuration option, e.g. " - "-o CredentialsFile=/tmp/token.json") + "-o CredentialsFile=/tmp/token.json " + "(can be specified multiple times)") ; boost::program_options::options_description hidden_desc; hidden_desc.add_options() @@ -174,7 +175,7 @@ int Configuration::ParseArguments(int ac, char** av) { std::stringstream option_stream; const std::vector options = flags["option"].as>(); - for (const std::string& option: options) { + for (const std::string& option : options) { std::size_t separator_pos = option.find("="); if (separator_pos == std::string::npos) { std::cerr << "Invalid option " << option; @@ -278,10 +279,10 @@ void Configuration::ParseConfiguration(std::istream& input) { config["KubernetesUseWatch"].as(kubernetes_use_watch_); kubernetes_cluster_level_metadata_ = config["KubernetesClusterLevelMetadata"].as( - kKubernetesDefaultClusterLevelMetadata); + kubernetes_cluster_level_metadata_); kubernetes_service_metadata_ = config["KubernetesServiceMetadata"].as( - kKubernetesDefaultServiceMetadata); + kubernetes_service_metadata_); instance_id_ = config["InstanceId"].as(instance_id_); instance_zone_ = diff --git a/src/configuration.h b/src/configuration.h index b8b97087..2f90a3b6 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -164,6 +164,7 @@ class Configuration { } private: + friend class ConfigurationArgumentParserTest; friend int ::main(int, char**); // Calls ParseArguments. void ParseConfigFile(const std::string& filename); diff --git a/test/configuration_unittest.cc b/test/configuration_unittest.cc index f2730964..e755cb36 100644 --- a/test/configuration_unittest.cc +++ b/test/configuration_unittest.cc @@ -87,4 +87,35 @@ TEST(ConfigurationTest, BlankLine) { EXPECT_EQ(true, config.MetadataReporterPurgeDeleted()); } +class ConfigurationArgumentParserTest : public ::testing::Test { + protected: + static int ParseArguments(Configuration* config, int ac, char** av) { + return config->ParseArguments(ac, av); + } +}; + +TEST_F(ConfigurationArgumentParserTest, CommandLineOverride) { + Configuration config(std::istringstream( + "ProjectId: TestProjectId\n" + "MetadataApiNumThreads: 13\n" + )); + // First, a sanity check. + EXPECT_EQ("TestProjectId", config.ProjectId()); + EXPECT_EQ(13, config.MetadataApiNumThreads()); + EXPECT_EQ(false, config.MetadataReporterPurgeDeleted()); + + char* arguments[] = { + "/path/to/metadatad", + "-o", + "ProjectId=NewProjectId", + "-o", + "MetadataReporterPurgeDeleted=true", + }; + ParseArguments(&config, sizeof(arguments) / sizeof(char*), arguments); + + EXPECT_EQ("NewProjectId", config.ProjectId()); + EXPECT_EQ(13, config.MetadataApiNumThreads()); + EXPECT_EQ(true, config.MetadataReporterPurgeDeleted()); +} + } // namespace google