OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <windows.h> | 5 #include <windows.h> |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/process/kill.h" | 10 #include "base/process/kill.h" |
11 #include "base/test/multiprocess_test.h" | 11 #include "base/test/multiprocess_test.h" |
12 #include "base/win/scoped_process_information.h" | 12 #include "base/win/scoped_process_information.h" |
13 #include "testing/multiprocess_func_list.h" | 13 #include "testing/multiprocess_func_list.h" |
14 | 14 |
15 namespace { | 15 namespace { |
16 | 16 |
17 const DWORD kProcessId = 4321; | 17 const DWORD kProcessId = 4321; |
18 const DWORD kThreadId = 1234; | 18 const DWORD kThreadId = 1234; |
19 const HANDLE kProcessHandle = reinterpret_cast<HANDLE>(7651); | 19 const HANDLE kProcessHandle = reinterpret_cast<HANDLE>(7651); |
20 const HANDLE kThreadHandle = reinterpret_cast<HANDLE>(1567); | 20 const HANDLE kThreadHandle = reinterpret_cast<HANDLE>(1567); |
21 | 21 |
22 void MockCreateProcess(base::win::ScopedProcessInformation* process_info) { | 22 void MockCreateProcess(PROCESS_INFORMATION* process_info) { |
23 PROCESS_INFORMATION process_information = {}; | 23 process_info->dwProcessId = kProcessId; |
24 process_information.dwProcessId = kProcessId; | 24 process_info->dwThreadId = kThreadId; |
25 process_information.dwThreadId = kThreadId; | 25 process_info->hProcess = kProcessHandle; |
26 process_information.hProcess = kProcessHandle; | 26 process_info->hThread = kThreadHandle; |
27 process_information.hThread = kThreadHandle; | |
28 process_info->Set(process_information); | |
29 } | 27 } |
30 | 28 |
31 } // namespace | 29 } // namespace |
32 | 30 |
33 class ScopedProcessInformationTest : public base::MultiProcessTest { | 31 class ScopedProcessInformationTest : public base::MultiProcessTest { |
34 protected: | 32 protected: |
35 void DoCreateProcess(const std::string& main_id, | 33 void DoCreateProcess(const std::string& main_id, |
36 PROCESS_INFORMATION* process_handle); | 34 PROCESS_INFORMATION* process_handle); |
37 }; | 35 }; |
38 | 36 |
(...skipping 18 matching lines...) Expand all Loading... |
57 &startup_info, process_handle)); | 55 &startup_info, process_handle)); |
58 } | 56 } |
59 | 57 |
60 TEST_F(ScopedProcessInformationTest, InitiallyInvalid) { | 58 TEST_F(ScopedProcessInformationTest, InitiallyInvalid) { |
61 base::win::ScopedProcessInformation process_info; | 59 base::win::ScopedProcessInformation process_info; |
62 ASSERT_FALSE(process_info.IsValid()); | 60 ASSERT_FALSE(process_info.IsValid()); |
63 } | 61 } |
64 | 62 |
65 TEST_F(ScopedProcessInformationTest, Receive) { | 63 TEST_F(ScopedProcessInformationTest, Receive) { |
66 base::win::ScopedProcessInformation process_info; | 64 base::win::ScopedProcessInformation process_info; |
67 MockCreateProcess(&process_info); | 65 MockCreateProcess(process_info.Receive()); |
68 | 66 |
69 EXPECT_TRUE(process_info.IsValid()); | 67 EXPECT_TRUE(process_info.IsValid()); |
70 EXPECT_EQ(kProcessId, process_info.process_id()); | 68 EXPECT_EQ(kProcessId, process_info.process_id()); |
71 EXPECT_EQ(kThreadId, process_info.thread_id()); | 69 EXPECT_EQ(kThreadId, process_info.thread_id()); |
72 EXPECT_EQ(kProcessHandle, process_info.process_handle()); | 70 EXPECT_EQ(kProcessHandle, process_info.process_handle()); |
73 EXPECT_EQ(kThreadHandle, process_info.thread_handle()); | 71 EXPECT_EQ(kThreadHandle, process_info.thread_handle()); |
74 PROCESS_INFORMATION to_discard = process_info.Take(); | 72 PROCESS_INFORMATION to_discard = process_info.Take(); |
75 } | 73 } |
76 | 74 |
77 TEST_F(ScopedProcessInformationTest, TakeProcess) { | 75 TEST_F(ScopedProcessInformationTest, TakeProcess) { |
78 base::win::ScopedProcessInformation process_info; | 76 base::win::ScopedProcessInformation process_info; |
79 MockCreateProcess(&process_info); | 77 MockCreateProcess(process_info.Receive()); |
80 | 78 |
81 HANDLE process = process_info.TakeProcessHandle(); | 79 HANDLE process = process_info.TakeProcessHandle(); |
82 EXPECT_EQ(kProcessHandle, process); | 80 EXPECT_EQ(kProcessHandle, process); |
83 EXPECT_EQ(NULL, process_info.process_handle()); | 81 EXPECT_EQ(NULL, process_info.process_handle()); |
84 EXPECT_EQ(0, process_info.process_id()); | 82 EXPECT_EQ(0, process_info.process_id()); |
85 EXPECT_TRUE(process_info.IsValid()); | 83 EXPECT_TRUE(process_info.IsValid()); |
86 PROCESS_INFORMATION to_discard = process_info.Take(); | 84 PROCESS_INFORMATION to_discard = process_info.Take(); |
87 } | 85 } |
88 | 86 |
89 TEST_F(ScopedProcessInformationTest, TakeThread) { | 87 TEST_F(ScopedProcessInformationTest, TakeThread) { |
90 base::win::ScopedProcessInformation process_info; | 88 base::win::ScopedProcessInformation process_info; |
91 MockCreateProcess(&process_info); | 89 MockCreateProcess(process_info.Receive()); |
92 | 90 |
93 HANDLE thread = process_info.TakeThreadHandle(); | 91 HANDLE thread = process_info.TakeThreadHandle(); |
94 EXPECT_EQ(kThreadHandle, thread); | 92 EXPECT_EQ(kThreadHandle, thread); |
95 EXPECT_EQ(NULL, process_info.thread_handle()); | 93 EXPECT_EQ(NULL, process_info.thread_handle()); |
96 EXPECT_EQ(0, process_info.thread_id()); | 94 EXPECT_EQ(0, process_info.thread_id()); |
97 EXPECT_TRUE(process_info.IsValid()); | 95 EXPECT_TRUE(process_info.IsValid()); |
98 PROCESS_INFORMATION to_discard = process_info.Take(); | 96 PROCESS_INFORMATION to_discard = process_info.Take(); |
99 } | 97 } |
100 | 98 |
101 TEST_F(ScopedProcessInformationTest, TakeBoth) { | 99 TEST_F(ScopedProcessInformationTest, TakeBoth) { |
102 base::win::ScopedProcessInformation process_info; | 100 base::win::ScopedProcessInformation process_info; |
103 MockCreateProcess(&process_info); | 101 MockCreateProcess(process_info.Receive()); |
104 | 102 |
105 HANDLE process = process_info.TakeProcessHandle(); | 103 HANDLE process = process_info.TakeProcessHandle(); |
106 HANDLE thread = process_info.TakeThreadHandle(); | 104 HANDLE thread = process_info.TakeThreadHandle(); |
107 EXPECT_FALSE(process_info.IsValid()); | 105 EXPECT_FALSE(process_info.IsValid()); |
108 PROCESS_INFORMATION to_discard = process_info.Take(); | 106 PROCESS_INFORMATION to_discard = process_info.Take(); |
109 } | 107 } |
110 | 108 |
111 TEST_F(ScopedProcessInformationTest, TakeWholeStruct) { | 109 TEST_F(ScopedProcessInformationTest, TakeWholeStruct) { |
112 base::win::ScopedProcessInformation process_info; | 110 base::win::ScopedProcessInformation process_info; |
113 MockCreateProcess(&process_info); | 111 MockCreateProcess(process_info.Receive()); |
114 | 112 |
115 PROCESS_INFORMATION to_discard = process_info.Take(); | 113 PROCESS_INFORMATION to_discard = process_info.Take(); |
116 EXPECT_EQ(kProcessId, to_discard.dwProcessId); | 114 EXPECT_EQ(kProcessId, to_discard.dwProcessId); |
117 EXPECT_EQ(kThreadId, to_discard.dwThreadId); | 115 EXPECT_EQ(kThreadId, to_discard.dwThreadId); |
118 EXPECT_EQ(kProcessHandle, to_discard.hProcess); | 116 EXPECT_EQ(kProcessHandle, to_discard.hProcess); |
119 EXPECT_EQ(kThreadHandle, to_discard.hThread); | 117 EXPECT_EQ(kThreadHandle, to_discard.hThread); |
120 EXPECT_FALSE(process_info.IsValid()); | 118 EXPECT_FALSE(process_info.IsValid()); |
121 } | 119 } |
122 | 120 |
123 TEST_F(ScopedProcessInformationTest, Duplicate) { | 121 TEST_F(ScopedProcessInformationTest, Duplicate) { |
124 PROCESS_INFORMATION temp_process_information; | |
125 DoCreateProcess("ReturnSeven", &temp_process_information); | |
126 base::win::ScopedProcessInformation process_info; | 122 base::win::ScopedProcessInformation process_info; |
127 process_info.Set(temp_process_information); | 123 DoCreateProcess("ReturnSeven", process_info.Receive()); |
128 | |
129 base::win::ScopedProcessInformation duplicate; | 124 base::win::ScopedProcessInformation duplicate; |
130 duplicate.DuplicateFrom(process_info); | 125 duplicate.DuplicateFrom(process_info); |
131 | 126 |
132 ASSERT_TRUE(process_info.IsValid()); | 127 ASSERT_TRUE(process_info.IsValid()); |
133 ASSERT_NE(0u, process_info.process_id()); | 128 ASSERT_NE(0u, process_info.process_id()); |
134 ASSERT_EQ(duplicate.process_id(), process_info.process_id()); | 129 ASSERT_EQ(duplicate.process_id(), process_info.process_id()); |
135 ASSERT_NE(0u, process_info.thread_id()); | 130 ASSERT_NE(0u, process_info.thread_id()); |
136 ASSERT_EQ(duplicate.thread_id(), process_info.thread_id()); | 131 ASSERT_EQ(duplicate.thread_id(), process_info.thread_id()); |
137 | 132 |
138 // Validate that we have separate handles that are good. | 133 // Validate that we have separate handles that are good. |
139 int exit_code = 0; | 134 int exit_code = 0; |
140 ASSERT_TRUE(base::WaitForExitCode(process_info.TakeProcessHandle(), | 135 ASSERT_TRUE(base::WaitForExitCode(process_info.TakeProcessHandle(), |
141 &exit_code)); | 136 &exit_code)); |
142 ASSERT_EQ(7, exit_code); | 137 ASSERT_EQ(7, exit_code); |
143 | 138 |
144 exit_code = 0; | 139 exit_code = 0; |
145 ASSERT_TRUE(base::WaitForExitCode(duplicate.TakeProcessHandle(), | 140 ASSERT_TRUE(base::WaitForExitCode(duplicate.TakeProcessHandle(), |
146 &exit_code)); | 141 &exit_code)); |
147 ASSERT_EQ(7, exit_code); | 142 ASSERT_EQ(7, exit_code); |
148 | 143 |
149 ASSERT_TRUE(::CloseHandle(process_info.TakeThreadHandle())); | 144 ASSERT_TRUE(::CloseHandle(process_info.TakeThreadHandle())); |
150 ASSERT_TRUE(::CloseHandle(duplicate.TakeThreadHandle())); | 145 ASSERT_TRUE(::CloseHandle(duplicate.TakeThreadHandle())); |
151 } | 146 } |
152 | 147 |
153 TEST_F(ScopedProcessInformationTest, Set) { | 148 TEST_F(ScopedProcessInformationTest, Set) { |
154 base::win::ScopedProcessInformation base_process_info; | 149 PROCESS_INFORMATION base_process_info = {}; |
155 MockCreateProcess(&base_process_info); | 150 MockCreateProcess(&base_process_info); |
156 | 151 |
157 PROCESS_INFORMATION base_struct = base_process_info.Take(); | |
158 | |
159 base::win::ScopedProcessInformation process_info; | 152 base::win::ScopedProcessInformation process_info; |
160 process_info.Set(base_struct); | 153 process_info.Set(base_process_info); |
161 | 154 |
162 EXPECT_EQ(kProcessId, process_info.process_id()); | 155 EXPECT_EQ(kProcessId, process_info.process_id()); |
163 EXPECT_EQ(kThreadId, process_info.thread_id()); | 156 EXPECT_EQ(kThreadId, process_info.thread_id()); |
164 EXPECT_EQ(kProcessHandle, process_info.process_handle()); | 157 EXPECT_EQ(kProcessHandle, process_info.process_handle()); |
165 EXPECT_EQ(kThreadHandle, process_info.thread_handle()); | 158 EXPECT_EQ(kThreadHandle, process_info.thread_handle()); |
166 base_struct = process_info.Take(); | 159 base_process_info = process_info.Take(); |
167 } | 160 } |
OLD | NEW |