| 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 |