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(PROCESS_INFORMATION* process_info) { | 22 void MockCreateProcess(base::win::ScopedProcessInformation* process_info) { |
23 process_info->dwProcessId = kProcessId; | 23 PROCESS_INFORMATION process_information = {}; |
24 process_info->dwThreadId = kThreadId; | 24 process_information.dwProcessId = kProcessId; |
25 process_info->hProcess = kProcessHandle; | 25 process_information.dwThreadId = kThreadId; |
26 process_info->hThread = kThreadHandle; | 26 process_information.hProcess = kProcessHandle; |
| 27 process_information.hThread = kThreadHandle; |
| 28 process_info->Set(process_information); |
27 } | 29 } |
28 | 30 |
29 } // namespace | 31 } // namespace |
30 | 32 |
31 class ScopedProcessInformationTest : public base::MultiProcessTest { | 33 class ScopedProcessInformationTest : public base::MultiProcessTest { |
32 protected: | 34 protected: |
33 void DoCreateProcess(const std::string& main_id, | 35 void DoCreateProcess(const std::string& main_id, |
34 PROCESS_INFORMATION* process_handle); | 36 PROCESS_INFORMATION* process_handle); |
35 }; | 37 }; |
36 | 38 |
(...skipping 18 matching lines...) Expand all Loading... |
55 &startup_info, process_handle)); | 57 &startup_info, process_handle)); |
56 } | 58 } |
57 | 59 |
58 TEST_F(ScopedProcessInformationTest, InitiallyInvalid) { | 60 TEST_F(ScopedProcessInformationTest, InitiallyInvalid) { |
59 base::win::ScopedProcessInformation process_info; | 61 base::win::ScopedProcessInformation process_info; |
60 ASSERT_FALSE(process_info.IsValid()); | 62 ASSERT_FALSE(process_info.IsValid()); |
61 } | 63 } |
62 | 64 |
63 TEST_F(ScopedProcessInformationTest, Receive) { | 65 TEST_F(ScopedProcessInformationTest, Receive) { |
64 base::win::ScopedProcessInformation process_info; | 66 base::win::ScopedProcessInformation process_info; |
65 MockCreateProcess(process_info.Receive()); | 67 MockCreateProcess(&process_info); |
66 | 68 |
67 EXPECT_TRUE(process_info.IsValid()); | 69 EXPECT_TRUE(process_info.IsValid()); |
68 EXPECT_EQ(kProcessId, process_info.process_id()); | 70 EXPECT_EQ(kProcessId, process_info.process_id()); |
69 EXPECT_EQ(kThreadId, process_info.thread_id()); | 71 EXPECT_EQ(kThreadId, process_info.thread_id()); |
70 EXPECT_EQ(kProcessHandle, process_info.process_handle()); | 72 EXPECT_EQ(kProcessHandle, process_info.process_handle()); |
71 EXPECT_EQ(kThreadHandle, process_info.thread_handle()); | 73 EXPECT_EQ(kThreadHandle, process_info.thread_handle()); |
72 PROCESS_INFORMATION to_discard = process_info.Take(); | 74 PROCESS_INFORMATION to_discard = process_info.Take(); |
73 } | 75 } |
74 | 76 |
75 TEST_F(ScopedProcessInformationTest, TakeProcess) { | 77 TEST_F(ScopedProcessInformationTest, TakeProcess) { |
76 base::win::ScopedProcessInformation process_info; | 78 base::win::ScopedProcessInformation process_info; |
77 MockCreateProcess(process_info.Receive()); | 79 MockCreateProcess(&process_info); |
78 | 80 |
79 HANDLE process = process_info.TakeProcessHandle(); | 81 HANDLE process = process_info.TakeProcessHandle(); |
80 EXPECT_EQ(kProcessHandle, process); | 82 EXPECT_EQ(kProcessHandle, process); |
81 EXPECT_EQ(NULL, process_info.process_handle()); | 83 EXPECT_EQ(NULL, process_info.process_handle()); |
82 EXPECT_EQ(0, process_info.process_id()); | 84 EXPECT_EQ(0, process_info.process_id()); |
83 EXPECT_TRUE(process_info.IsValid()); | 85 EXPECT_TRUE(process_info.IsValid()); |
84 PROCESS_INFORMATION to_discard = process_info.Take(); | 86 PROCESS_INFORMATION to_discard = process_info.Take(); |
85 } | 87 } |
86 | 88 |
87 TEST_F(ScopedProcessInformationTest, TakeThread) { | 89 TEST_F(ScopedProcessInformationTest, TakeThread) { |
88 base::win::ScopedProcessInformation process_info; | 90 base::win::ScopedProcessInformation process_info; |
89 MockCreateProcess(process_info.Receive()); | 91 MockCreateProcess(&process_info); |
90 | 92 |
91 HANDLE thread = process_info.TakeThreadHandle(); | 93 HANDLE thread = process_info.TakeThreadHandle(); |
92 EXPECT_EQ(kThreadHandle, thread); | 94 EXPECT_EQ(kThreadHandle, thread); |
93 EXPECT_EQ(NULL, process_info.thread_handle()); | 95 EXPECT_EQ(NULL, process_info.thread_handle()); |
94 EXPECT_EQ(0, process_info.thread_id()); | 96 EXPECT_EQ(0, process_info.thread_id()); |
95 EXPECT_TRUE(process_info.IsValid()); | 97 EXPECT_TRUE(process_info.IsValid()); |
96 PROCESS_INFORMATION to_discard = process_info.Take(); | 98 PROCESS_INFORMATION to_discard = process_info.Take(); |
97 } | 99 } |
98 | 100 |
99 TEST_F(ScopedProcessInformationTest, TakeBoth) { | 101 TEST_F(ScopedProcessInformationTest, TakeBoth) { |
100 base::win::ScopedProcessInformation process_info; | 102 base::win::ScopedProcessInformation process_info; |
101 MockCreateProcess(process_info.Receive()); | 103 MockCreateProcess(&process_info); |
102 | 104 |
103 HANDLE process = process_info.TakeProcessHandle(); | 105 HANDLE process = process_info.TakeProcessHandle(); |
104 HANDLE thread = process_info.TakeThreadHandle(); | 106 HANDLE thread = process_info.TakeThreadHandle(); |
105 EXPECT_FALSE(process_info.IsValid()); | 107 EXPECT_FALSE(process_info.IsValid()); |
106 PROCESS_INFORMATION to_discard = process_info.Take(); | 108 PROCESS_INFORMATION to_discard = process_info.Take(); |
107 } | 109 } |
108 | 110 |
109 TEST_F(ScopedProcessInformationTest, TakeWholeStruct) { | 111 TEST_F(ScopedProcessInformationTest, TakeWholeStruct) { |
110 base::win::ScopedProcessInformation process_info; | 112 base::win::ScopedProcessInformation process_info; |
111 MockCreateProcess(process_info.Receive()); | 113 MockCreateProcess(&process_info); |
112 | 114 |
113 PROCESS_INFORMATION to_discard = process_info.Take(); | 115 PROCESS_INFORMATION to_discard = process_info.Take(); |
114 EXPECT_EQ(kProcessId, to_discard.dwProcessId); | 116 EXPECT_EQ(kProcessId, to_discard.dwProcessId); |
115 EXPECT_EQ(kThreadId, to_discard.dwThreadId); | 117 EXPECT_EQ(kThreadId, to_discard.dwThreadId); |
116 EXPECT_EQ(kProcessHandle, to_discard.hProcess); | 118 EXPECT_EQ(kProcessHandle, to_discard.hProcess); |
117 EXPECT_EQ(kThreadHandle, to_discard.hThread); | 119 EXPECT_EQ(kThreadHandle, to_discard.hThread); |
118 EXPECT_FALSE(process_info.IsValid()); | 120 EXPECT_FALSE(process_info.IsValid()); |
119 } | 121 } |
120 | 122 |
121 TEST_F(ScopedProcessInformationTest, Duplicate) { | 123 TEST_F(ScopedProcessInformationTest, Duplicate) { |
| 124 PROCESS_INFORMATION temp_process_information; |
| 125 DoCreateProcess("ReturnSeven", &temp_process_information); |
122 base::win::ScopedProcessInformation process_info; | 126 base::win::ScopedProcessInformation process_info; |
123 DoCreateProcess("ReturnSeven", process_info.Receive()); | 127 process_info.Set(temp_process_information); |
| 128 |
124 base::win::ScopedProcessInformation duplicate; | 129 base::win::ScopedProcessInformation duplicate; |
125 duplicate.DuplicateFrom(process_info); | 130 duplicate.DuplicateFrom(process_info); |
126 | 131 |
127 ASSERT_TRUE(process_info.IsValid()); | 132 ASSERT_TRUE(process_info.IsValid()); |
128 ASSERT_NE(0u, process_info.process_id()); | 133 ASSERT_NE(0u, process_info.process_id()); |
129 ASSERT_EQ(duplicate.process_id(), process_info.process_id()); | 134 ASSERT_EQ(duplicate.process_id(), process_info.process_id()); |
130 ASSERT_NE(0u, process_info.thread_id()); | 135 ASSERT_NE(0u, process_info.thread_id()); |
131 ASSERT_EQ(duplicate.thread_id(), process_info.thread_id()); | 136 ASSERT_EQ(duplicate.thread_id(), process_info.thread_id()); |
132 | 137 |
133 // Validate that we have separate handles that are good. | 138 // Validate that we have separate handles that are good. |
134 int exit_code = 0; | 139 int exit_code = 0; |
135 ASSERT_TRUE(base::WaitForExitCode(process_info.TakeProcessHandle(), | 140 ASSERT_TRUE(base::WaitForExitCode(process_info.TakeProcessHandle(), |
136 &exit_code)); | 141 &exit_code)); |
137 ASSERT_EQ(7, exit_code); | 142 ASSERT_EQ(7, exit_code); |
138 | 143 |
139 exit_code = 0; | 144 exit_code = 0; |
140 ASSERT_TRUE(base::WaitForExitCode(duplicate.TakeProcessHandle(), | 145 ASSERT_TRUE(base::WaitForExitCode(duplicate.TakeProcessHandle(), |
141 &exit_code)); | 146 &exit_code)); |
142 ASSERT_EQ(7, exit_code); | 147 ASSERT_EQ(7, exit_code); |
143 | 148 |
144 ASSERT_TRUE(::CloseHandle(process_info.TakeThreadHandle())); | 149 ASSERT_TRUE(::CloseHandle(process_info.TakeThreadHandle())); |
145 ASSERT_TRUE(::CloseHandle(duplicate.TakeThreadHandle())); | 150 ASSERT_TRUE(::CloseHandle(duplicate.TakeThreadHandle())); |
146 } | 151 } |
147 | 152 |
148 TEST_F(ScopedProcessInformationTest, Set) { | 153 TEST_F(ScopedProcessInformationTest, Set) { |
149 PROCESS_INFORMATION base_process_info = {}; | 154 base::win::ScopedProcessInformation base_process_info; |
150 MockCreateProcess(&base_process_info); | 155 MockCreateProcess(&base_process_info); |
151 | 156 |
| 157 PROCESS_INFORMATION base_struct = base_process_info.Take(); |
| 158 |
152 base::win::ScopedProcessInformation process_info; | 159 base::win::ScopedProcessInformation process_info; |
153 process_info.Set(base_process_info); | 160 process_info.Set(base_struct); |
154 | 161 |
155 EXPECT_EQ(kProcessId, process_info.process_id()); | 162 EXPECT_EQ(kProcessId, process_info.process_id()); |
156 EXPECT_EQ(kThreadId, process_info.thread_id()); | 163 EXPECT_EQ(kThreadId, process_info.thread_id()); |
157 EXPECT_EQ(kProcessHandle, process_info.process_handle()); | 164 EXPECT_EQ(kProcessHandle, process_info.process_handle()); |
158 EXPECT_EQ(kThreadHandle, process_info.thread_handle()); | 165 EXPECT_EQ(kThreadHandle, process_info.thread_handle()); |
159 base_process_info = process_info.Take(); | 166 base_struct = process_info.Take(); |
160 } | 167 } |
OLD | NEW |