Index: handler/win/registration_test_base.h |
diff --git a/handler/win/registration_test_base.h b/handler/win/registration_test_base.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..be96ffcb17e42dcceee918bc3e907b6167485d63 |
--- /dev/null |
+++ b/handler/win/registration_test_base.h |
@@ -0,0 +1,114 @@ |
+// 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 <windows.h> |
+ |
+#include "base/basictypes.h" |
+#include "base/strings/string16.h" |
+#include "client/registration_protocol_win.h" |
+#include "gtest/gtest.h" |
+#include "handler/win/registration_server.h" |
+#include "util/stdlib/pointer_container.h" |
+#include "util/win/address_types.h" |
+#include "util/win/scoped_handle.h" |
+ |
+namespace crashpad { |
+namespace test { |
+ |
+class RegistrationTestBase : public testing::Test { |
+ public: |
+ // Simulates a registrar to collect requests from and feed responses to the |
+ // RegistrationServer. |
+ class MockDelegate : public RegistrationServer::Delegate { |
+ public: |
+ // Records a single simulated client registration. |
+ struct Entry { |
+ Entry(ScopedKernelHANDLE client_process, |
+ WinVMAddress crashpad_info_address, |
+ uint32_t fake_request_dump_event, |
+ uint32_t fake_dump_complete_event); |
+ |
+ ScopedKernelHANDLE client_process; |
+ WinVMAddress crashpad_info_address; |
+ uint32_t fake_request_dump_event; |
+ uint32_t fake_dump_complete_event; |
+ }; |
+ |
+ MockDelegate(); |
+ ~MockDelegate() override; |
+ |
+ // Blocks until RegistrationServer::Delegate::OnStarted is invoked. |
+ void WaitForStart(); |
+ |
+ // RegistrationServer::Delegate: |
+ void OnStarted() override; |
+ |
+ bool RegisterClient(ScopedKernelHANDLE client_process, |
+ WinVMAddress crashpad_info_address, |
+ HANDLE* request_dump_event, |
+ HANDLE* dump_complete_event) override; |
+ |
+ // Provides access to the registered process data. |
+ const std::vector<Entry*> registered_processes() { |
+ return registered_processes_; |
+ } |
+ |
+ // If true, causes RegisterClient to simulate registration failure. |
+ void set_fail_mode(bool fail) { fail_ = fail; } |
+ |
+ private: |
+ ScopedKernelHANDLE started_event_; |
+ PointerVector<Entry> registered_processes_; |
+ uint32_t next_fake_handle_; |
+ bool fail_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MockDelegate); |
+ }; |
+ |
+ RegistrationTestBase(); |
+ ~RegistrationTestBase() override; |
+ |
+ MockDelegate& delegate() { return delegate_; } |
+ base::string16 pipe_name() { return pipe_name_; } |
+ |
+ // Returns a pipe handle connected to the RegistrationServer. |
+ ScopedFileHANDLE Connect(); |
+ |
+ // Sends the provided request and receives a response via the provided pipe. |
+ bool SendRequest(ScopedFileHANDLE pipe, |
+ const void* request_buffer, |
+ size_t request_size, |
+ RegistrationResponse* response); |
+ |
+ bool WriteRequest(HANDLE pipe, |
+ const void* request_buffer, |
+ size_t request_size); |
+ |
+ bool ReadResponse(HANDLE pipe, RegistrationResponse* response); |
+ |
+ // Verifies that the request and response match what was received and sent by |
+ // the MockDelegate. |
+ void VerifyRegistration(const MockDelegate::Entry& registered_process, |
+ const RegistrationRequest& request, |
+ const RegistrationResponse& response); |
+ |
+ private: |
+ base::string16 pipe_name_; |
+ MockDelegate delegate_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(RegistrationTestBase); |
+}; |
+ |
+} // namespace test |
+} // namespace crashpad |