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