Added unit test for master /tasks endpoint. Review: https://reviews.apache.org/r/48450/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/ec41d1aa Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/ec41d1aa Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/ec41d1aa Branch: refs/heads/master Commit: ec41d1aa8321d98000aed95eb7d26a131c41ea95 Parents: 7f340fb Author: Jay Guo <guojian...@cn.ibm.com> Authored: Fri Jun 17 19:51:13 2016 -0700 Committer: Vinod Kone <vinodk...@gmail.com> Committed: Fri Jun 17 19:51:13 2016 -0700 ---------------------------------------------------------------------- src/tests/master_tests.cpp | 89 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/ec41d1aa/src/tests/master_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/master_tests.cpp b/src/tests/master_tests.cpp index ad05437..a62d0ab 100644 --- a/src/tests/master_tests.cpp +++ b/src/tests/master_tests.cpp @@ -2462,6 +2462,95 @@ TEST_F(MasterTest, OrphanTasks) } +// This tests /tasks endpoint to return correct task information. +TEST_F(MasterTest, TasksEndpoint) +{ + Try<Owned<cluster::Master>> master = StartMaster(); + ASSERT_SOME(master); + + MockExecutor exec(DEFAULT_EXECUTOR_ID); + TestContainerizer containerizer(&exec); + + Owned<MasterDetector> detector = master.get()->createDetector(); + Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), &containerizer); + ASSERT_SOME(slave); + + MockScheduler sched; + MesosSchedulerDriver driver( + &sched, DEFAULT_FRAMEWORK_INFO, master.get()->pid, DEFAULT_CREDENTIAL); + + EXPECT_CALL(sched, registered(&driver, _, _)) + .Times(1); + + 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()); + + TaskInfo task; + task.set_name("test"); + task.mutable_task_id()->set_value("1"); + task.mutable_slave_id()->MergeFrom(offers.get()[0].slave_id()); + task.mutable_resources()->MergeFrom(offers.get()[0].resources()); + task.mutable_executor()->MergeFrom(DEFAULT_EXECUTOR_INFO); + + EXPECT_CALL(exec, registered(_, _, _, _)) + .Times(1); + + EXPECT_CALL(exec, launchTask(_, _)) + .WillOnce(SendStatusUpdateFromTask(TASK_RUNNING)); + + Future<TaskStatus> status; + EXPECT_CALL(sched, statusUpdate(&driver, _)) + .WillOnce(FutureArg<1>(&status)); + + driver.launchTasks(offers.get()[0].id(), {task}); + + AWAIT_READY(status); + EXPECT_EQ(TASK_RUNNING, status.get().state()); + EXPECT_TRUE(status.get().has_executor_id()); + EXPECT_EQ(exec.id, status.get().executor_id()); + + Future<Response> response = process::http::get( + master.get()->pid, + "tasks", + None(), + createBasicAuthHeaders(DEFAULT_CREDENTIAL)); + + AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response); + AWAIT_EXPECT_RESPONSE_HEADER_EQ(APPLICATION_JSON, "Content-Type", response); + + Try<JSON::Value> value = JSON::parse<JSON::Value>(response.get().body); + ASSERT_SOME(value); + + Try<JSON::Value> expected = JSON::parse( + "{" + "\"tasks\":" + "[{" + "\"executor_id\":\"default\"," + "\"id\":\"1\"," + "\"name\":\"test\"," + "\"state\":\"TASK_RUNNING\"" + "}]" + "}"); + + ASSERT_SOME(expected); + + EXPECT_TRUE(value.get().contains(expected.get())); + + EXPECT_CALL(exec, shutdown(_)) + .Times(AtMost(1)); + + driver.stop(); + driver.join(); +} + + // This test verifies that the master will strip ephemeral ports // resource from offers so that frameworks cannot see it. TEST_F(MasterTest, IgnoreEphemeralPortsResource)