Chromium Code Reviews| Index: handler/win/registration_pipe_state_test.cc |
| diff --git a/handler/win/registration_pipe_state_test.cc b/handler/win/registration_pipe_state_test.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..276b6db80a7e1bbfe50e883b375d4c13f352de3f |
| --- /dev/null |
| +++ b/handler/win/registration_pipe_state_test.cc |
| @@ -0,0 +1,259 @@ |
| +// Copyright 2015 The Crashpad Authors. All rights reserved. |
| +// |
| +// Licensed under the Apache License, Version 2.0 (the "License"); |
| +// you may not use this file except in compliance with the License. |
| +// You may obtain a copy of the License at |
| +// |
| +// http://www.apache.org/licenses/LICENSE-2.0 |
| +// |
| +// Unless required by applicable law or agreed to in writing, software |
| +// distributed under the License is distributed on an "AS IS" BASIS, |
| +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| +// See the License for the specific language governing permissions and |
| +// limitations under the License. |
| + |
| +#include "handler/win/registration_pipe_state.h" |
| + |
| +#include <windows.h> |
| + |
| +#include "base/basictypes.h" |
| +#include "base/logging.h" |
| +#include "base/memory/scoped_ptr.h" |
| +#include "client/crashpad_info.h" |
| +#include "client/registration_protocol_win.h" |
| +#include "gtest/gtest.h" |
| +#include "handler/win/registration_test_base.h" |
| +#include "util/win/scoped_handle.h" |
| + |
| +namespace crashpad { |
| +namespace test { |
| +namespace { |
| + |
| +class RegistrationRegistrationPipeStateTest : public RegistrationTestBase { |
| + public: |
| + RegistrationRegistrationPipeStateTest() : pipe_state_() {} |
| + |
| + void SetUp() override { |
| + ScopedFileHANDLE pipe( |
| + CreateNamedPipe(pipe_name().c_str(), |
| + PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | |
| + FILE_FLAG_FIRST_PIPE_INSTANCE, |
| + PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, |
| + 1, |
| + 512, // nOutBufferSize |
| + 512, // nInBufferSize |
| + 20, // nDefaultTimeOut |
| + nullptr)); // lpSecurityAttributes |
| + ASSERT_TRUE(pipe.is_valid()); |
| + pipe_state_.reset(new RegistrationPipeState(pipe.Pass(), &delegate())); |
| + } |
| + |
| + ~RegistrationRegistrationPipeStateTest() override {} |
| + |
| + RegistrationPipeState& pipe_state() { |
| + DCHECK(pipe_state_.get()); |
| + return *pipe_state_; |
| + } |
| + |
| + private: |
| + scoped_ptr<RegistrationPipeState> pipe_state_; |
| + DISALLOW_COPY_AND_ASSIGN(RegistrationRegistrationPipeStateTest); |
| +}; |
| + |
| +TEST_F(RegistrationRegistrationPipeStateTest, CancelIoWhenConnectIsComplete) { |
| + // -> Connecting |
| + ASSERT_TRUE(pipe_state().Initialize()); |
| + |
| + ScopedFileHANDLE client(Connect()); |
| + |
| + ASSERT_TRUE(client.is_valid()); |
| + |
| + // Connect completion. |
| + ASSERT_EQ(WAIT_OBJECT_0, |
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| + |
| + // Connecting -> Stopping |
| + pipe_state().Stop(); |
| + |
| + // Stop completion. |
| + ASSERT_EQ(WAIT_OBJECT_0, |
|
scottmg
2015/05/25 18:41:54
It seems a bit strange to have all these be ASSERT
erikwright (departed)
2015/05/25 18:54:22
Especially where we are doing blocking operations
|
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| +} |
| + |
| +TEST_F(RegistrationRegistrationPipeStateTest, CancelIoWhenReadIsComplete) { |
| + // -> Connecting |
| + ASSERT_TRUE(pipe_state().Initialize()); |
| + |
| + ScopedFileHANDLE client(Connect()); |
| + |
| + ASSERT_TRUE(client.is_valid()); |
| + |
| + // Connect completion. |
| + ASSERT_EQ(WAIT_OBJECT_0, |
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| + |
| + // Connecting -> Reading |
| + ASSERT_TRUE(pipe_state().OnCompletion()); |
| + |
| + RegistrationRequest request = {0}; |
| + CrashpadInfo crashpad_info; |
| + request.client_process_id = GetCurrentProcessId(); |
| + request.crashpad_info_address = |
| + reinterpret_cast<WinVMAddress>(&crashpad_info); |
| + |
| + ASSERT_TRUE(WriteRequest(client.get(), &request, sizeof(request))); |
| + |
| + // Read completion. |
| + ASSERT_EQ(WAIT_OBJECT_0, |
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| + |
| + // Reading -> Stopping |
| + pipe_state().Stop(); |
| + |
| + // Stop completion. |
| + ASSERT_EQ(WAIT_OBJECT_0, |
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| +} |
| + |
| +TEST_F(RegistrationRegistrationPipeStateTest, CancelIoWhenWriteIsComplete) { |
| + // -> Connecting |
| + ASSERT_TRUE(pipe_state().Initialize()); |
| + |
| + ScopedFileHANDLE client(Connect()); |
| + |
| + ASSERT_TRUE(client.is_valid()); |
| + |
| + // Connect completion. |
| + ASSERT_EQ(WAIT_OBJECT_0, |
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| + |
| + // Connecting -> Reading |
| + ASSERT_TRUE(pipe_state().OnCompletion()); |
| + |
| + RegistrationRequest request = {0}; |
| + CrashpadInfo crashpad_info; |
| + request.client_process_id = GetCurrentProcessId(); |
| + request.crashpad_info_address = |
| + reinterpret_cast<WinVMAddress>(&crashpad_info); |
| + |
| + ASSERT_TRUE(WriteRequest(client.get(), &request, sizeof(request))); |
| + |
| + // Read completion. |
| + ASSERT_EQ(WAIT_OBJECT_0, |
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| + |
| + // Reading -> Writing -> Waiting for Close |
| + ASSERT_TRUE(pipe_state().OnCompletion()); |
| + |
| + RegistrationResponse response = {0}; |
| + ASSERT_TRUE(ReadResponse(client.get(), &response)); |
| + |
| + // Waiting for Close -> Stopping |
| + pipe_state().Stop(); |
| + |
| + // Stop completion. |
| + ASSERT_EQ(WAIT_OBJECT_0, |
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| +} |
| + |
| +TEST_F(RegistrationRegistrationPipeStateTest, CancelIoWhenCloseIsComplete) { |
| + // -> Connecting |
| + ASSERT_TRUE(pipe_state().Initialize()); |
| + |
| + ScopedFileHANDLE client(Connect()); |
| + |
| + ASSERT_TRUE(client.is_valid()); |
| + |
| + // Connect completion. |
| + ASSERT_EQ(WAIT_OBJECT_0, |
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| + |
| + // Connecting -> Reading |
| + ASSERT_TRUE(pipe_state().OnCompletion()); |
| + |
| + RegistrationRequest request = {0}; |
| + CrashpadInfo crashpad_info; |
| + request.client_process_id = GetCurrentProcessId(); |
| + request.crashpad_info_address = |
| + reinterpret_cast<WinVMAddress>(&crashpad_info); |
| + |
| + ASSERT_TRUE(WriteRequest(client.get(), &request, sizeof(request))); |
| + |
| + // Read completion. |
| + ASSERT_EQ(WAIT_OBJECT_0, |
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| + |
| + // Reading -> Writing -> Waiting for Close |
| + ASSERT_TRUE(pipe_state().OnCompletion()); |
| + |
| + RegistrationResponse response = {0}; |
| + ASSERT_TRUE(ReadResponse(client.get(), &response)); |
| + |
| + client.reset(); |
| + |
| + // Wait for close completion. |
| + ASSERT_EQ(WAIT_OBJECT_0, |
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| + |
| + // Waiting for Close -> Stopping |
| + pipe_state().Stop(); |
| + |
| + // Stop completion. |
| + ASSERT_EQ(WAIT_OBJECT_0, |
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| +} |
| + |
| +TEST_F(RegistrationRegistrationPipeStateTest, FullCycle) { |
| + // -> Connecting |
| + ASSERT_TRUE(pipe_state().Initialize()); |
| + |
| + ScopedFileHANDLE client(Connect()); |
| + |
| + ASSERT_TRUE(client.is_valid()); |
| + |
| + // Connect completion. |
| + ASSERT_EQ(WAIT_OBJECT_0, |
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| + |
| + // Connecting -> Reading |
| + ASSERT_TRUE(pipe_state().OnCompletion()); |
| + |
| + RegistrationRequest request = {0}; |
| + CrashpadInfo crashpad_info; |
| + request.client_process_id = GetCurrentProcessId(); |
| + request.crashpad_info_address = |
| + reinterpret_cast<WinVMAddress>(&crashpad_info); |
| + |
| + ASSERT_TRUE(WriteRequest(client.get(), &request, sizeof(request))); |
| + |
| + // Read completion. |
| + ASSERT_EQ(WAIT_OBJECT_0, |
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| + |
| + // Reading -> Writing -> Waiting for Close |
| + ASSERT_TRUE(pipe_state().OnCompletion()); |
| + |
| + RegistrationResponse response = {0}; |
| + ASSERT_TRUE(ReadResponse(client.get(), &response)); |
| + |
| + client.reset(); |
| + |
| + // Wait for close completion. |
| + ASSERT_EQ(WAIT_OBJECT_0, |
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| + |
| + // Waiting for Close -> Reset -> Connecting |
| + ASSERT_TRUE(pipe_state().OnCompletion()); |
| + |
| + client = Connect(); |
| + ASSERT_TRUE(client.is_valid()); |
| + |
| + pipe_state().Stop(); |
| + |
| + ASSERT_EQ(WAIT_OBJECT_0, |
| + WaitForSingleObject(pipe_state().completion_event(), INFINITE)); |
| +} |
| + |
| +} // namespace |
| +} // namespace test |
| +} // namespace crashpad |