TEST(ProcessTest, Remote) { ASSERT_TRUE(GTEST_IS_THREADSAFE); RemoteProcess process; spawn(process); Future<Nothing> handler; EXPECT_CALL(process, handler(_, _)) .WillOnce(FutureSatisfy(&handler)); Try<Socket> create = Socket::create(); ASSERT_SOME(create); Socket socket = create.get(); AWAIT_READY(socket.connect(process.self().address)); Message message; message.name = "handler"; message.from = UPID(); message.to = process.self(); const string data = MessageEncoder::encode(&message); AWAIT_READY(socket.send(data)); AWAIT_READY(handler); terminate(process); wait(process); }
TEST(ProcessTest, Event) { Event* event = new TerminateEvent(UPID()); EXPECT_FALSE(event->is<MessageEvent>()); EXPECT_FALSE(event->is<ExitedEvent>()); EXPECT_TRUE(event->is<TerminateEvent>()); delete event; }
v1::scheduler::Event evolve(const StatusUpdateMessage& message) { v1::scheduler::Event event; event.set_type(v1::scheduler::Event::UPDATE); v1::scheduler::Event::Update* update = event.mutable_update(); update->mutable_status()->CopyFrom(evolve(message.update().status())); if (message.update().has_slave_id()) { update->mutable_status()->mutable_agent_id()->CopyFrom( evolve(message.update().slave_id())); } if (message.update().has_executor_id()) { update->mutable_status()->mutable_executor_id()->CopyFrom( evolve(message.update().executor_id())); } update->mutable_status()->set_timestamp(message.update().timestamp()); // If the update does not have a 'uuid', it does not need // acknowledging. However, prior to 0.23.0, the update uuid // was required and always set. In 0.24.0, we can rely on the // update uuid check here, until then we must still check for // this being sent from the driver (from == UPID()) or from // the master (pid == UPID()). // TODO(vinod): Get rid of this logic in 0.25.0 because master // and slave correctly set task status in 0.24.0. if (!message.update().has_uuid() || message.update().uuid() == "") { update->mutable_status()->clear_uuid(); } else if (UPID(message.pid()) == UPID()) { update->mutable_status()->clear_uuid(); } else { update->mutable_status()->set_uuid(message.update().uuid()); } return event; }
// Like the 'remote' test but uses http::connect. TEST(ProcessTest, Http1) { ASSERT_TRUE(GTEST_IS_THREADSAFE); RemoteProcess process; spawn(process); http::URL url = http::URL( "http", process.self().address.ip, process.self().address.port, process.self().id + "/handler"); Future<http::Connection> connect = http::connect(url); AWAIT_READY(connect); http::Connection connection = connect.get(); Future<UPID> pid; Future<string> body; EXPECT_CALL(process, handler(_, _)) .WillOnce(DoAll(FutureArg<0>(&pid), FutureArg<1>(&body))); http::Request request; request.method = "POST"; request.url = url; request.headers["User-Agent"] = "libprocess/"; request.body = "hello world"; // Send the libprocess request. Note that we will not // receive a 202 due to the use of the `User-Agent` // header, therefore we need to explicitly disconnect! Future<http::Response> response = connection.send(request); AWAIT_READY(body); ASSERT_EQ("hello world", body.get()); AWAIT_READY(pid); ASSERT_EQ(UPID(), pid.get()); EXPECT_TRUE(response.isPending()); AWAIT_READY(connection.disconnect()); terminate(process); wait(process); }