blob: 7bfd77c397f0b9783037a5383a18772325624458 [file] [log] [blame]
morrita54f6f80c2014-09-23 21:16:001// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
amistryd4aa70d2016-06-23 07:52:375#include "ipc/ipc_mojo_bootstrap.h"
morrita54f6f80c2014-09-23 21:16:006
avi246998d82015-12-22 02:39:047#include <stdint.h>
danakj03de39b22016-04-23 04:21:098#include <memory>
avi246998d82015-12-22 02:39:049
morrita54f6f80c2014-09-23 21:16:0010#include "base/base_paths.h"
11#include "base/files/file.h"
12#include "base/message_loop/message_loop.h"
rockotcf1d7d02016-11-22 05:27:2713#include "base/run_loop.h"
gabf08ccc02016-05-11 18:51:1114#include "base/threading/thread_task_runner_handle.h"
avi246998d82015-12-22 02:39:0415#include "build/build_config.h"
amistryd4aa70d2016-06-23 07:52:3716#include "ipc/ipc.mojom.h"
morrita54f6f80c2014-09-23 21:16:0017#include "ipc/ipc_test_base.h"
sammce4d0abd2016-03-07 22:38:0418#include "mojo/edk/embedder/embedder.h"
19#include "mojo/edk/test/mojo_test_base.h"
20#include "mojo/edk/test/multiprocess_test_helper.h"
rockota628d0b2017-02-09 08:40:1521#include "mojo/public/cpp/bindings/associated_binding.h"
morrita54f6f80c2014-09-23 21:16:0022
23#if defined(OS_POSIX)
24#include "base/file_descriptor_posix.h"
25#endif
26
27namespace {
28
rockota628d0b2017-02-09 08:40:1529constexpr int32_t kTestServerPid = 42;
30constexpr int32_t kTestClientPid = 4242;
31
32class PeerPidReceiver : public IPC::mojom::Channel {
33 public:
34 PeerPidReceiver(IPC::mojom::ChannelAssociatedRequest request,
35 const base::Closure& on_peer_pid_set)
36 : binding_(this, std::move(request)), on_peer_pid_set_(on_peer_pid_set) {}
Chris Watkins2d879af2017-11-30 02:11:5937 ~PeerPidReceiver() override = default;
rockota628d0b2017-02-09 08:40:1538
39 // mojom::Channel:
40 void SetPeerPid(int32_t pid) override {
41 peer_pid_ = pid;
42 on_peer_pid_set_.Run();
43 }
44
Yuzhu Shena0a2b362017-08-25 22:31:3945 void Receive(base::span<const uint8_t> data,
Ken Rockotfd907632017-09-14 04:23:4146 base::Optional<std::vector<mojo::native::SerializedHandlePtr>>
rockota628d0b2017-02-09 08:40:1547 handles) override {}
48
49 void GetAssociatedInterface(
50 const std::string& name,
51 IPC::mojom::GenericInterfaceAssociatedRequest request) override {}
52
53 int32_t peer_pid() const { return peer_pid_; }
54
55 private:
56 mojo::AssociatedBinding<IPC::mojom::Channel> binding_;
57 const base::Closure on_peer_pid_set_;
58 int32_t peer_pid_ = -1;
59
60 DISALLOW_COPY_AND_ASSIGN(PeerPidReceiver);
61};
62
sammc57ed9f982016-03-10 06:28:3563class IPCMojoBootstrapTest : public testing::Test {
morrita54f6f80c2014-09-23 21:16:0064 protected:
sammc57ed9f982016-03-10 06:28:3565 mojo::edk::test::MultiprocessTestHelper helper_;
morrita54f6f80c2014-09-23 21:16:0066};
67
amistry6de2ee4f2016-05-05 05:12:0968TEST_F(IPCMojoBootstrapTest, Connect) {
sammce4d0abd2016-03-07 22:38:0469 base::MessageLoop message_loop;
danakj03de39b22016-04-23 04:21:0970 std::unique_ptr<IPC::MojoBootstrap> bootstrap = IPC::MojoBootstrap::Create(
sammc57ed9f982016-03-10 06:28:3571 helper_.StartChild("IPCMojoBootstrapTestClient"),
Hajime Hoshia98f1102017-11-20 06:34:3572 IPC::Channel::MODE_SERVER, base::ThreadTaskRunnerHandle::Get(),
73 base::ThreadTaskRunnerHandle::Get());
morrita54f6f80c2014-09-23 21:16:0074
rockota628d0b2017-02-09 08:40:1575 IPC::mojom::ChannelAssociatedPtr sender;
76 IPC::mojom::ChannelAssociatedRequest receiver;
77 bootstrap->Connect(&sender, &receiver);
78 sender->SetPeerPid(kTestServerPid);
79
80 base::RunLoop run_loop;
81 PeerPidReceiver impl(std::move(receiver), run_loop.QuitClosure());
sammce4d0abd2016-03-07 22:38:0482 run_loop.Run();
morrita54f6f80c2014-09-23 21:16:0083
rockota628d0b2017-02-09 08:40:1584 EXPECT_EQ(kTestClientPid, impl.peer_pid());
85
sammc57ed9f982016-03-10 06:28:3586 EXPECT_TRUE(helper_.WaitForChildTestShutdown());
morrita54f6f80c2014-09-23 21:16:0087}
88
sammce4d0abd2016-03-07 22:38:0489// A long running process that connects to us.
sammc57ed9f982016-03-10 06:28:3590MULTIPROCESS_TEST_MAIN_WITH_SETUP(
91 IPCMojoBootstrapTestClientTestChildMain,
92 ::mojo::edk::test::MultiprocessTestHelper::ChildSetup) {
sammce4d0abd2016-03-07 22:38:0493 base::MessageLoop message_loop;
danakj03de39b22016-04-23 04:21:0994 std::unique_ptr<IPC::MojoBootstrap> bootstrap = IPC::MojoBootstrap::Create(
sammcb0a39f82016-08-10 06:29:5495 std::move(mojo::edk::test::MultiprocessTestHelper::primordial_pipe),
Hajime Hoshia98f1102017-11-20 06:34:3596 IPC::Channel::MODE_CLIENT, base::ThreadTaskRunnerHandle::Get(),
97 base::ThreadTaskRunnerHandle::Get());
morrita54f6f80c2014-09-23 21:16:0098
rockota628d0b2017-02-09 08:40:1599 IPC::mojom::ChannelAssociatedPtr sender;
100 IPC::mojom::ChannelAssociatedRequest receiver;
101 bootstrap->Connect(&sender, &receiver);
102 sender->SetPeerPid(kTestClientPid);
morrita54f6f80c2014-09-23 21:16:00103
rockota628d0b2017-02-09 08:40:15104 base::RunLoop run_loop;
105 PeerPidReceiver impl(std::move(receiver), run_loop.QuitClosure());
sammce4d0abd2016-03-07 22:38:04106 run_loop.Run();
morrita54f6f80c2014-09-23 21:16:00107
rockota628d0b2017-02-09 08:40:15108 EXPECT_EQ(kTestServerPid, impl.peer_pid());
109
110 return 0;
morrita54f6f80c2014-09-23 21:16:00111}
112
113} // namespace