// Test that the changes made by the resources decorator hook are correctly // propagated to the resource offer. TEST_F(HookTest, VerifySlaveResourcesAndAttributesDecorator) { Try<PID<Master>> master = StartMaster(CreateMasterFlags()); ASSERT_SOME(master); MockExecutor exec(DEFAULT_EXECUTOR_ID); TestContainerizer containerizer(&exec); // Start a mock slave since we aren't testing the slave hooks yet. Try<PID<Slave>> slave = StartSlave(&containerizer); ASSERT_SOME(slave); MockScheduler sched; MesosSchedulerDriver driver( &sched, DEFAULT_FRAMEWORK_INFO, master.get(), DEFAULT_CREDENTIAL); EXPECT_CALL(sched, registered(&driver, _, _)); Future<vector<Offer>> offers; EXPECT_CALL(sched, resourceOffers(&driver, _)) .WillOnce(FutureArg<1>(&offers)) .WillRepeatedly(Return()); // Ignore subsequent offers. driver.start(); AWAIT_READY(offers); EXPECT_NE(0u, offers.get().size()); Resources resources = offers.get()[0].resources(); // The test hook sets "cpus" to 4. EXPECT_EQ(4, resources.cpus().get()); // The test hook adds a resource named "foo" of type set with values "bar" // and "baz". EXPECT_EQ(Resources::parse("foo:{bar,baz}").get(), resources.get("foo")); // The test hook does not modify "mem", the default value must still be // present. EXPECT_SOME(resources.mem()); // The test hook adds an attribute named "rack" with value "rack1". Attributes attributes = offers.get()[0].attributes(); ASSERT_EQ(attributes.get(0).name(), "rack"); ASSERT_EQ(attributes.get(0).text().value(), "rack1"); driver.stop(); driver.join(); Shutdown(); }
TEST(AttributesTest, invalid_attrib_is_ignored) { string s = "default"; Attributes a; a.addFromGFF("foo"); EXPECT_FALSE(a.get("foo", s)); EXPECT_EQ("default", s); }
TEST(AttributesTest, get_decoded_value) { string s; Attributes a; a.addFromGFF("foo=hello%20world%2Cplanet"); a.get("foo", s); EXPECT_EQ("hello world,planet", s); }
TEST(AttributesTest, get_empty_value) { string s; Attributes a; a.addFromGFF("foo="); a.get("foo", s); EXPECT_EQ("", s); }
TEST(AttributesTest, get_first_of_many) { string s; Attributes a; a.addFromGFF("foo=bar,baz"); a.get("foo", s); EXPECT_EQ("bar", s); }
TEST(AttributesTest, get) { string s; Attributes a; a.addFromGFF("foo=bar"); a.get("foo", s); EXPECT_EQ("bar", s); }
TEST(AttributesTest, Parsing) { Attributes a = Attributes::parse("cpus:45.55;" "ports:[10000-20000, 30000-50000];" "rack:rack1,rack2"); ASSERT_EQ(Value::SCALAR, a.get(0).type()); ASSERT_EQ("cpus", a.get(0).name()); ASSERT_FLOAT_EQ(45.55, a.get(0).scalar().value()); ASSERT_EQ(Value::RANGES, a.get(1).type()); ASSERT_EQ("ports", a.get(1).name()); ASSERT_EQ(2, a.get(1).ranges().range_size()); ASSERT_EQ(10000u, a.get(1).ranges().range(0).begin()); ASSERT_EQ(20000u, a.get(1).ranges().range(0).end()); ASSERT_EQ(30000u, a.get(1).ranges().range(1).begin()); ASSERT_EQ(50000u, a.get(1).ranges().range(1).end()); ASSERT_EQ(Value::TEXT, a.get(2).type()); ASSERT_EQ("rack", a.get(2).name()); ASSERT_EQ("rack1,rack2", a.get(2).text().value()); Attributes b = Attributes::parse("attr1:foo:bar;attr2:baz:qux:"); ASSERT_EQ(Value::TEXT, b.get(0).type()); ASSERT_EQ("attr1", b.get(0).name()); ASSERT_EQ("foo:bar", b.get(0).text().value()); ASSERT_EQ(Value::TEXT, b.get(1).type()); ASSERT_EQ("attr2", b.get(1).name()); ASSERT_EQ("baz:qux:", b.get(1).text().value()); }