1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
// Copyright (c) 2012 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 "build/build_config.h"
#if defined(OS_WIN)
#include <windows.h>
#elif defined(OS_POSIX)
#include <sys/types.h>
#include <unistd.h>
#endif
#include <stdio.h>
#include <string>
#include <utility>
#include "ipc/ipc_test_base.h"
#include "base/base_switches.h"
#include "base/command_line.h"
#include "base/debug/debug_on_start_win.h"
#include "base/perftimer.h"
#include "base/pickle.h"
#include "base/test/perf_test_suite.h"
#include "base/test/test_suite.h"
#include "base/threading/thread.h"
#include "base/time.h"
#include "ipc/ipc_descriptors.h"
#include "ipc/ipc_channel.h"
#include "ipc/ipc_channel_proxy.h"
#include "ipc/ipc_message_utils.h"
#include "ipc/ipc_multiprocess_test.h"
#include "ipc/ipc_sender.h"
#include "ipc/ipc_switches.h"
#include "testing/multiprocess_func_list.h"
// Define to enable IPC performance testing instead of the regular unit tests
// #define PERFORMANCE_TEST
const char kTestClientChannel[] = "T1";
const char kReflectorChannel[] = "T2";
const char kFuzzerChannel[] = "F3";
const char kSyncSocketChannel[] = "S4";
void IPCTestBase::SetUp() {
MultiProcessTest::SetUp();
// Construct a fresh IO Message loop for the duration of each test.
message_loop_ = new MessageLoopForIO();
}
void IPCTestBase::TearDown() {
delete message_loop_;
message_loop_ = NULL;
MultiProcessTest::TearDown();
}
#if defined(OS_WIN)
base::ProcessHandle IPCTestBase::SpawnChild(IPCTestBase::ChildType child_type,
IPC::Channel *channel) {
// kDebugChildren support.
bool debug_on_start =
CommandLine::ForCurrentProcess()->HasSwitch(switches::kDebugChildren);
switch (child_type) {
case TEST_CLIENT:
return MultiProcessTest::SpawnChild("RunTestClient", debug_on_start);
case TEST_REFLECTOR:
return MultiProcessTest::SpawnChild("RunReflector", debug_on_start);
case FUZZER_SERVER:
return MultiProcessTest::SpawnChild("RunFuzzServer", debug_on_start);
case SYNC_SOCKET_SERVER:
return MultiProcessTest::SpawnChild("RunSyncSocketServer", debug_on_start);
default:
return NULL;
}
}
#elif defined(OS_POSIX)
base::ProcessHandle IPCTestBase::SpawnChild(IPCTestBase::ChildType child_type,
IPC::Channel *channel) {
// kDebugChildren support.
bool debug_on_start =
CommandLine::ForCurrentProcess()->HasSwitch(switches::kDebugChildren);
base::FileHandleMappingVector fds_to_map;
const int ipcfd = channel->GetClientFileDescriptor();
if (ipcfd > -1) {
fds_to_map.push_back(std::pair<int, int>(ipcfd, kPrimaryIPCChannel + 3));
}
base::ProcessHandle ret = base::kNullProcessHandle;
switch (child_type) {
case TEST_CLIENT:
ret = MultiProcessTest::SpawnChild("RunTestClient",
fds_to_map,
debug_on_start);
break;
case TEST_DESCRIPTOR_CLIENT:
ret = MultiProcessTest::SpawnChild("RunTestDescriptorClient",
fds_to_map,
debug_on_start);
break;
case TEST_DESCRIPTOR_CLIENT_SANDBOXED:
ret = MultiProcessTest::SpawnChild("RunTestDescriptorClientSandboxed",
fds_to_map,
debug_on_start);
break;
case TEST_REFLECTOR:
ret = MultiProcessTest::SpawnChild("RunReflector",
fds_to_map,
debug_on_start);
break;
case FUZZER_SERVER:
ret = MultiProcessTest::SpawnChild("RunFuzzServer",
fds_to_map,
debug_on_start);
break;
case SYNC_SOCKET_SERVER:
ret = MultiProcessTest::SpawnChild("RunSyncSocketServer",
fds_to_map,
debug_on_start);
break;
default:
return base::kNullProcessHandle;
break;
}
return ret;
}
#endif // defined(OS_POSIX)
|