blob: e07dbcc25552351f64d644130ca09ed9b15a988b [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 <gmock/gmock.h>
#include <map>
#include <string>
#include <stout/duration.hpp>
#include <stout/none.hpp>
#include <stout/option.hpp>
#include "configurator/configuration.hpp"
#include "configurator/configurator.hpp"
#include "flags/flags.hpp"
#include "tests/utils.hpp"
using namespace flags;
class TestFlags : public virtual FlagsBase
{
public:
TestFlags()
{
add(&TestFlags::name1,
"name1",
"Set name1",
"ben folds");
add(&TestFlags::name2,
"name2",
"Set name2",
42);
add(&TestFlags::name3,
"name3",
"Set name3",
false);
add(&TestFlags::name4,
"name4",
"Set name4");
add(&TestFlags::name5,
"name5",
"Set name5");
}
std::string name1;
int name2;
bool name3;
Option<bool> name4;
Option<bool> name5;
};
TEST(FlagsTest, Load)
{
TestFlags flags;
std::map<std::string, Option<std::string> > values;
values["name1"] = Option<std::string>::some("billy joel");
values["name2"] = Option<std::string>::some("43");
values["name3"] = Option<std::string>::some("false");
values["no-name4"] = None();
values["name5"] = None();
flags.load(values);
EXPECT_EQ("billy joel", flags.name1);
EXPECT_EQ(43, flags.name2);
EXPECT_FALSE(flags.name3);
ASSERT_SOME(flags.name4);
EXPECT_FALSE(flags.name4.get());
ASSERT_SOME(flags.name5);
EXPECT_TRUE(flags.name5.get());
}
TEST(FlagsTest, Add)
{
Flags<TestFlags> flags;
Option<std::string> name6;
flags.add(&name6,
"name6",
"Also set name6");
bool name7;
flags.add(&name7,
"name7",
"Also set name7",
true);
Option<std::string> name8;
flags.add(&name8,
"name8",
"Also set name8");
std::map<std::string, Option<std::string> > values;
values["name6"] = Option<std::string>::some("ben folds");
values["no-name7"] = None();
flags.load(values);
ASSERT_SOME(name6);
EXPECT_EQ("ben folds", name6.get());
EXPECT_FALSE(name7);
ASSERT_TRUE(name8.isNone());
}
TEST(FlagsTest, Flags)
{
Flags<TestFlags> flags;
std::map<std::string, Option<std::string> > values;
values["name1"] = Option<std::string>::some("billy joel");
values["name2"] = Option<std::string>::some("43");
values["name3"] = Option<std::string>::some("false");
values["no-name4"] = None();
values["name5"] = None();
flags.load(values);
EXPECT_EQ("billy joel", flags.name1);
EXPECT_EQ(43, flags.name2);
EXPECT_FALSE(flags.name3);
ASSERT_SOME(flags.name4);
EXPECT_FALSE(flags.name4.get());
ASSERT_SOME(flags.name5);
EXPECT_TRUE(flags.name5.get());
}
TEST(FlagsTest, Configurator)
{
Flags<TestFlags> flags;
int argc = 6;
char* argv[argc];
argv[0] = (char*) "/path/to/program";
argv[1] = (char*) "--name1=billy joel";
argv[2] = (char*) "--name2=43";
argv[3] = (char*) "--no-name3";
argv[4] = (char*) "--no-name4";
argv[5] = (char*) "--name5";
mesos::internal::Configurator configurator(flags);
mesos::internal::Configuration configuration;
try {
configuration = configurator.load(argc, argv);
} catch (mesos::internal::ConfigurationException& e) {
FAIL() << "Configuration error: " << e.what();
}
flags.load(configuration.getMap());
EXPECT_EQ("billy joel", flags.name1);
EXPECT_EQ(43, flags.name2);
EXPECT_FALSE(flags.name3);
ASSERT_SOME(flags.name4);
EXPECT_FALSE(flags.name4.get());
ASSERT_SOME(flags.name5);
EXPECT_TRUE(flags.name5.get());
}
TEST(FlagsTest, Duration)
{
Flags<TestFlags> flags;
Duration name6;
flags.add(&name6,
"name6",
"Amount of time",
Milliseconds(100));
Option<Duration> name7;
flags.add(&name7,
"name7",
"Also some amount of time");
std::map<std::string, Option<std::string> > values;
values["name6"] = Option<std::string>::some("2mins");
values["name7"] = Option<std::string>::some("3hrs");
flags.load(values);
EXPECT_EQ(Minutes(2), name6);
ASSERT_SOME(name7);
EXPECT_EQ(Hours(3), name7.get());
}