Chromium Code Reviews| Index: base/win/scoped_process_information_unittest.cc |
| diff --git a/base/win/scoped_process_information_unittest.cc b/base/win/scoped_process_information_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..16bfe283a23ce526e30759a4a3374803636a77eb |
| --- /dev/null |
| +++ b/base/win/scoped_process_information_unittest.cc |
| @@ -0,0 +1,115 @@ |
| +// 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 <windows.h> |
| + |
| +#include "base/command_line.h" |
| +#include "base/process_util.h" |
| +#include "base/test/multiprocess_test.h" |
| +#include "base/win/scoped_process_information.h" |
| +#include "testing/multiprocess_func_list.h" |
| + |
| +class ScopedProcessInformationTest : public base::MultiProcessTest { |
| + protected: |
| + void DoCreateProcess(const std::string& main_id, |
| + PROCESS_INFORMATION* process_handle); |
| +}; |
| + |
| +MULTIPROCESS_TEST_MAIN(ReturnSeven) { |
| + return 7; |
| +} |
| + |
| +MULTIPROCESS_TEST_MAIN(ReturnNine) { |
| + return 9; |
| +} |
| + |
| +void ScopedProcessInformationTest::DoCreateProcess( |
| + const std::string& main_id, PROCESS_INFORMATION* process_handle) { |
| + std::wstring cmd_line = |
| + this->MakeCmdLine(main_id, false).GetCommandLineString(); |
| + STARTUPINFO startup_info = {}; |
| + startup_info.cb = sizeof(startup_info); |
| + |
| + EXPECT_TRUE(::CreateProcess(NULL, |
| + const_cast<wchar_t*>(cmd_line.c_str()), |
| + NULL, NULL, false, 0, NULL, NULL, |
| + &startup_info, process_handle)); |
| +} |
| + |
| +TEST_F(ScopedProcessInformationTest, TakeProcess) { |
| + base::win::ScopedProcessInformation process_info; |
| + DoCreateProcess("ReturnSeven", process_info.Receive()); |
| + int exit_code = 0; |
| + ASSERT_TRUE(base::WaitForExitCode(process_info.TakeProcessHandle(), |
| + &exit_code)); |
| + ASSERT_EQ(7, exit_code); |
| + ASSERT_TRUE(process_info.IsValid()); |
| + ASSERT_EQ(0u, process_info.process_id()); |
| + ASSERT_TRUE(process_info.process_handle() == NULL); |
| + ASSERT_NE(0u, process_info.thread_id()); |
| + ASSERT_FALSE(process_info.thread_handle() == NULL); |
| +} |
| + |
| +TEST_F(ScopedProcessInformationTest, TakeThread) { |
| + base::win::ScopedProcessInformation process_info; |
| + DoCreateProcess("ReturnSeven", process_info.Receive()); |
| + ASSERT_TRUE(::CloseHandle(process_info.TakeThreadHandle())); |
| + ASSERT_TRUE(process_info.IsValid()); |
| + ASSERT_NE(0u, process_info.process_id()); |
| + ASSERT_FALSE(process_info.process_handle() == NULL); |
| + ASSERT_EQ(0u, process_info.thread_id()); |
| + ASSERT_TRUE(process_info.thread_handle() == NULL); |
| +} |
| + |
| +TEST_F(ScopedProcessInformationTest, TakeBoth) { |
| + base::win::ScopedProcessInformation process_info; |
| + DoCreateProcess("ReturnSeven", process_info.Receive()); |
| + int exit_code = 0; |
| + ASSERT_TRUE(base::WaitForExitCode(process_info.TakeProcessHandle(), |
| + &exit_code)); |
| + ASSERT_EQ(7, exit_code); |
| + ASSERT_TRUE(::CloseHandle(process_info.TakeThreadHandle())); |
| + ASSERT_FALSE(process_info.IsValid()); |
| + ASSERT_EQ(0u, process_info.process_id()); |
| + ASSERT_TRUE(process_info.process_handle() == NULL); |
| + ASSERT_EQ(0u, process_info.thread_id()); |
| + ASSERT_TRUE(process_info.thread_handle() == NULL); |
| +} |
| + |
| +TEST_F(ScopedProcessInformationTest, TakeNothing) { |
| + base::win::ScopedProcessInformation process_info; |
| + DoCreateProcess("ReturnSeven", process_info.Receive()); |
| + ASSERT_TRUE(process_info.IsValid()); |
| + ASSERT_NE(0u, process_info.thread_id()); |
| + ASSERT_FALSE(process_info.thread_handle() == NULL); |
| + ASSERT_NE(0u, process_info.process_id()); |
| + ASSERT_FALSE(process_info.process_handle() == NULL); |
| +} |
| + |
| +TEST_F(ScopedProcessInformationTest, TakeWholeStruct) { |
| + base::win::ScopedProcessInformation process_info; |
| + DoCreateProcess("ReturnSeven", process_info.Receive()); |
| + base::win::ScopedProcessInformation other; |
| + *other.Receive() = process_info.Take(); |
|
alexeypa (please no reviews)
2012/03/29 04:51:35
Swap could be useful here: process_info.Swap(*othe
erikwright (departed)
2012/03/30 17:30:27
Keeping this as an actual test of Take, but there
|
| + |
| + ASSERT_FALSE(process_info.IsValid()); |
| + ASSERT_EQ(0u, process_info.process_id()); |
| + ASSERT_TRUE(process_info.process_handle() == NULL); |
| + ASSERT_EQ(0u, process_info.thread_id()); |
| + ASSERT_TRUE(process_info.thread_handle() == NULL); |
| + |
| + // Validate that what was taken is good. |
| + ASSERT_NE(0u, other.thread_id()); |
| + ASSERT_NE(0u, other.process_id()); |
| + int exit_code = 0; |
| + ASSERT_TRUE(base::WaitForExitCode(other.TakeProcessHandle(), |
| + &exit_code)); |
| + ASSERT_EQ(7, exit_code); |
| + ASSERT_TRUE(::CloseHandle(other.TakeThreadHandle())); |
| +} |
| + |
| +TEST_F(ScopedProcessInformationTest, InitiallyInvalid) { |
| + base::win::ScopedProcessInformation process_info; |
| + ASSERT_FALSE(process_info.IsValid()); |
| +} |