Index: blimp/test/fake_engine/fake_engine_app_tests.cc |
diff --git a/blimp/test/fake_engine/fake_engine_app_tests.cc b/blimp/test/fake_engine/fake_engine_app_tests.cc |
deleted file mode 100644 |
index 21beb8738f8882b1fba0eaf9dcf4733907777437..0000000000000000000000000000000000000000 |
--- a/blimp/test/fake_engine/fake_engine_app_tests.cc |
+++ /dev/null |
@@ -1,214 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "blimp/test/fake_engine/fake_engine.h" |
- |
-#include <fcntl.h> |
-#include <sys/socket.h> |
-#include <sys/un.h> |
- |
-#include "base/command_line.h" |
-#include "base/files/file_path.h" |
-#include "base/files/file_util.h" |
-#include "base/synchronization/waitable_event.h" |
-#include "base/test/launcher/unit_test_launcher.h" |
-#include "base/test/test_suite.h" |
-#include "blimp/test/fake_engine/proto/engine.grpc.pb.h" |
-#include "blimp/test/fake_engine/proto/lifetime.grpc.pb.h" |
-#include "blimp/test/fake_engine/proto/logging.grpc.pb.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "third_party/grpc/include/grpc++/create_channel_posix.h" |
-#include "third_party/grpc/include/grpc++/grpc++.h" |
-#include "third_party/grpc/include/grpc++/server_posix.h" |
- |
-using ::testing::_; |
- |
-namespace blimp { |
- |
-namespace { |
- |
-bool SocketPair(int* fd1, int* fd2) { |
- int pipe_fds[2]; |
- if (socketpair(AF_UNIX, SOCK_STREAM, 0, pipe_fds) != 0) { |
- PLOG(ERROR) << "socketpair()"; |
- return false; |
- } |
- |
- // Set both ends to be non-blocking. |
- if (fcntl(pipe_fds[0], F_SETFL, O_NONBLOCK) == -1 || |
- fcntl(pipe_fds[1], F_SETFL, O_NONBLOCK) == -1) { |
- PLOG(ERROR) << "fcntl(O_NONBLOCK)"; |
- if (IGNORE_EINTR(close(pipe_fds[0])) < 0) |
- PLOG(ERROR) << "close"; |
- if (IGNORE_EINTR(close(pipe_fds[1])) < 0) |
- PLOG(ERROR) << "close"; |
- return false; |
- } |
- |
- *fd1 = pipe_fds[0]; |
- *fd2 = pipe_fds[1]; |
- |
- return true; |
-} |
- |
-class MockLifetimeService : public Lifetime::Service { |
- public: |
- MOCK_METHOD3(EngineReady, grpc::Status( |
- grpc::ServerContext*, const EngineReadyRequest*, EngineReadyResponse*)); |
-}; |
- |
-class MockLoggingService : public Logging::Service { |
- public: |
- MOCK_METHOD3(Log, grpc::Status( |
- grpc::ServerContext*, const LogRequest*, LogResponse*)); |
-}; |
- |
-// The FakeEngineAppTest suite sets up a simple interface resembling the |
-// Service, which is required by the Fake Engine. This allows testing whether |
-// the Fake Engine serves its purpose of simulating the real Engine as spawned |
-// by the Service. |
-class FakeEngineAppTest : public testing::Test { |
- public: |
- FakeEngineAppTest() |
- : engine_ready_(base::WaitableEvent::ResetPolicy::MANUAL, |
- base::WaitableEvent::InitialState::NOT_SIGNALED) {} |
- |
- protected: |
- void SetUp() override { |
- CHECK(SocketPair(&rendering_server_connect_fd_, &engine_listen_fd_)); |
- CHECK(SocketPair(&rendering_server_listen_fd_, &engine_connect_fd_)); |
- |
- grpc::ServerBuilder builder; |
- builder.RegisterService(&mock_lifetime_service_); |
- builder.RegisterService(&mock_logging_service_); |
- grpc_server_ = builder.BuildAndStart(); |
- |
- // TODO(xyzzyz): Remove fcntl when https://github.com/grpc/grpc/pull/8051 is |
- // merged and added to Chromium. |
- int flags = fcntl(rendering_server_listen_fd_, F_GETFL, 0); |
- CHECK_EQ(0, fcntl(rendering_server_listen_fd_, F_SETFL, |
- flags | O_NONBLOCK)); |
- |
- grpc::AddInsecureChannelFromFd(grpc_server_.get(), |
- rendering_server_listen_fd_); |
- } |
- |
- // This function spawns a Fake Engine as a child process, and sets up the file |
- // descriptor mappings for it, resembling the mappings in the Service |
- // environment. It also sets up the handler for the EngineReady function that |
- // will be called by the Fake Engine upon startup. |
- base::Process SpawnEngine() { |
- // Find the path of the Engine. |
- base::CommandLine current_cmd = *base::CommandLine::ForCurrentProcess(); |
- base::FilePath current_program_path = base::MakeAbsoluteFilePath( |
- current_cmd.GetProgram()); |
- base::FilePath current_dir = current_program_path.DirName(); |
- base::FilePath fake_engine_path = current_dir.Append("fake_engine_app"); |
- |
- base::CommandLine engine_cmd(fake_engine_path); |
- |
- base::LaunchOptions options; |
- base::FileHandleMappingVector fds_to_remap = { |
- { engine_listen_fd_, kEngineListenFd }, |
- { engine_connect_fd_, kRenderingServerListenFd } |
- }; |
- options.fds_to_remap = &fds_to_remap; |
- |
- ON_CALL(mock_lifetime_service_, EngineReady(_, _, _)) |
- .WillByDefault( |
- testing::Invoke(this, &FakeEngineAppTest::EngineReadyHandler)); |
- return base::LaunchProcess(engine_cmd, options); |
- } |
- |
- grpc::Status EngineReadyHandler( |
- grpc::ServerContext*, const EngineReadyRequest*, EngineReadyResponse*) { |
- engine_ready_.Signal(); |
- return grpc::Status::OK; |
- } |
- |
- bool WaitForEngineReady(base::TimeDelta timeout) { |
- return engine_ready_.TimedWait(timeout); |
- } |
- |
- std::unique_ptr<Engine::Stub> GetEngineStub() { |
- CHECK(!engine_channel_); |
- engine_channel_ = grpc::CreateInsecureChannelFromFd( |
- "fake_engine", rendering_server_connect_fd_); |
- CHECK(engine_channel_); |
- return Engine::NewStub(engine_channel_); |
- } |
- |
- private: |
- int engine_listen_fd_; |
- int rendering_server_connect_fd_; |
- |
- int rendering_server_listen_fd_; |
- int engine_connect_fd_; |
- |
- std::unique_ptr<grpc::Server> grpc_server_; |
- MockLifetimeService mock_lifetime_service_; |
- MockLoggingService mock_logging_service_; |
- |
- std::shared_ptr<grpc::Channel> engine_channel_; |
- base::WaitableEvent engine_ready_; |
- |
- DISALLOW_COPY_AND_ASSIGN(FakeEngineAppTest); |
-}; |
- |
- |
-TEST_F(FakeEngineAppTest, Basic) { |
- base::Process engine_process = SpawnEngine(); |
- EXPECT_TRUE(WaitForEngineReady(base::TimeDelta::FromSeconds(5))); |
- |
- std::unique_ptr<Engine::Stub> engine_stub = GetEngineStub(); |
- { |
- CheckHealthRequest request; |
- CheckHealthResponse response; |
- |
- grpc::ClientContext context; |
- grpc::Status status = engine_stub->CheckHealth( |
- &context, request, &response); |
- EXPECT_TRUE(status.ok()); |
- EXPECT_EQ(response.status(), CheckHealthResponse::OK); |
- } |
- |
- { |
- ShutDownRequest request; |
- ShutDownResponse response; |
- |
- grpc::ClientContext context; |
- grpc::CompletionQueue cq; |
- // We do async call, as the Fake Engine doesn't send any reply to the |
- // ShutDown RPC, so it makes no sense to wait for it. |
- auto rpc = engine_stub->AsyncShutDown(&context, request, &cq); |
- |
- EXPECT_TRUE(engine_process.WaitForExitWithTimeout( |
- base::TimeDelta::FromSeconds(5), nullptr /* exit_code */)); |
- } |
-} |
- |
-class FakeEngineTestSuite : public base::TestSuite { |
- public: |
- FakeEngineTestSuite(int argc, char** argv) : base::TestSuite(argc, argv) {} |
- |
- protected: |
- void Initialize() override { |
- base::TestSuite::Initialize(); |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(FakeEngineTestSuite); |
-}; |
- |
-} // namespace |
- |
-} // namespace blimp |
- |
-int main(int argc, char** argv) { |
- blimp::FakeEngineTestSuite test_suite(argc, argv); |
- return base::LaunchUnitTests( |
- argc, argv, |
- base::Bind(&base::TestSuite::Run, base::Unretained(&test_suite))); |
-} |