| Index: experimental/windows_debugger/debugger/core/debuggee_process_test.cc
|
| diff --git a/experimental/windows_debugger/debugger/core/debuggee_process_test.cc b/experimental/windows_debugger/debugger/core/debuggee_process_test.cc
|
| deleted file mode 100644
|
| index 7a34ab281ee489c7c9c4bc9c96673e97e797bf7e..0000000000000000000000000000000000000000
|
| --- a/experimental/windows_debugger/debugger/core/debuggee_process_test.cc
|
| +++ /dev/null
|
| @@ -1,287 +0,0 @@
|
| -// Copyright (c) 2011 The Native Client 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 "debugger/core/debug_api_mock.h"
|
| -#include "debugger/core/debug_breakpoint.h"
|
| -#include "debugger/core/debug_event.h"
|
| -#include "debugger/core/debuggee_process.h"
|
| -
|
| -#include "gtest/gtest.h"
|
| -
|
| -namespace {
|
| -const int kFakeProcessId = 847;
|
| -const int kFakeThreadId = 378421;
|
| -const int kFakeThreadId2 = 308421;
|
| -HANDLE kFakeThreadHandle = reinterpret_cast<void*>(1);
|
| -HANDLE kFakeProcessHandle = reinterpret_cast<void*>(2);
|
| -HANDLE kFakeFileHandle = NULL;
|
| -
|
| -const int kNexeThreadStarted = 1;
|
| -const int kThreadHalted = 2;
|
| -const int kThreadRunning = 3;
|
| -
|
| -const debug::DebuggeeThread* kNullThreadPtr = NULL;
|
| -const debug::Breakpoint* kNullBreakpointPtr = NULL;
|
| -void* kFakeAddr1 = reinterpret_cast<void*>(0x1B0e37C5);
|
| -void* kFakeAddr2 = reinterpret_cast<void*>(0x435F976D);
|
| -
|
| -class TestableDebuggeeProcess : public debug::DebuggeeProcess {
|
| - public:
|
| - TestableDebuggeeProcess(int id,
|
| - HANDLE handle,
|
| - HANDLE file_handle,
|
| - debug::DebugAPI* debug_api)
|
| - : debug::DebuggeeProcess(id,
|
| - handle,
|
| - file_handle,
|
| - debug_api) {
|
| - }
|
| -
|
| - void OnDebugEvent(debug::DebugEvent* debug_event) {
|
| - debug::DebuggeeProcess::OnDebugEvent(debug_event);
|
| - }
|
| -
|
| - void Halt() { state_ = kHalted; }
|
| -};
|
| -
|
| -class DebuggeeProcessTest : public ::testing::Test {
|
| - public:
|
| - DebuggeeProcessTest() {
|
| - proc_ = new TestableDebuggeeProcess(kFakeProcessId,
|
| - kFakeProcessHandle,
|
| - kFakeFileHandle,
|
| - &fake_debug_api_);
|
| - CreateThread(kFakeThreadId2);
|
| - fake_debug_api_.ClearCallSequence();
|
| - }
|
| -
|
| - ~DebuggeeProcessTest() {
|
| - delete proc_;
|
| - }
|
| -
|
| - void CreateThread(int id) {
|
| - DEBUG_EVENT wde;
|
| - memset(&wde, 0, sizeof(wde));
|
| - wde.dwDebugEventCode = CREATE_THREAD_DEBUG_EVENT;
|
| - wde.dwProcessId = proc_->id();
|
| - wde.dwThreadId = id;
|
| -
|
| - debug::DebugEvent de;
|
| - de.set_windows_debug_event(wde);
|
| - proc_->OnDebugEvent(&de);
|
| - proc_->Continue();
|
| - }
|
| -
|
| - debug::DebugEvent CreateBreakpointDebugEvent(int thread_id, void* addr) {
|
| - DEBUG_EVENT wde;
|
| - memset(&wde, 0, sizeof(wde));
|
| - wde.dwDebugEventCode = EXCEPTION_DEBUG_EVENT;
|
| - wde.dwProcessId = proc_->id();
|
| - wde.dwThreadId = thread_id;
|
| - wde.u.Exception.ExceptionRecord.ExceptionCode =
|
| - EXCEPTION_BREAKPOINT;
|
| - wde.u.Exception.ExceptionRecord.ExceptionAddress =
|
| - addr;
|
| -
|
| - debug::DebugEvent de;
|
| - de.set_windows_debug_event(wde);
|
| - return de;
|
| - }
|
| -
|
| - TestableDebuggeeProcess* proc_;
|
| - debug::DebugAPIMock fake_debug_api_;
|
| -};
|
| -
|
| -TEST_F(DebuggeeProcessTest, SimpleAccessors) {
|
| - ASSERT_NE(reinterpret_cast<debug::DebugAPIMock*>(NULL), &proc_->debug_api());
|
| -
|
| - EXPECT_EQ(&proc_->debug_api(), &fake_debug_api_);
|
| - EXPECT_EQ(kFakeProcessId, proc_->id());
|
| - EXPECT_EQ(kFakeProcessHandle, proc_->handle());
|
| - EXPECT_EQ(debug::DebuggeeProcess::kRunning, proc_->state());
|
| -
|
| - debug::DebugAPI deb_api;
|
| - debug::DebuggeeProcess this_proc(::GetCurrentProcessId(),
|
| - ::GetCurrentProcess(),
|
| - kFakeFileHandle,
|
| - &deb_api);
|
| -
|
| - int sz = this_proc.GetWordSizeInBits();
|
| -#ifdef _WIN64
|
| - EXPECT_EQ(64, sz);
|
| - EXPECT_FALSE(this_proc.IsWoW());
|
| -#else
|
| - EXPECT_EQ(32, sz);
|
| -#endif
|
| -}
|
| -
|
| -TEST_F(DebuggeeProcessTest, Threads) {
|
| - std::deque<int> threads;
|
| - threads.push_back(1);
|
| - threads.push_back(2);
|
| - proc_->GetThreadIds(&threads);
|
| - ASSERT_EQ(1, threads.size());
|
| - EXPECT_EQ(kFakeThreadId2, threads[0]);
|
| - EXPECT_EQ(NULL, proc_->GetHaltedThread());
|
| -
|
| - debug::DebuggeeThread* thread = proc_->GetThread(threads[0]);
|
| - ASSERT_NE(kNullThreadPtr, thread);
|
| -}
|
| -
|
| -TEST_F(DebuggeeProcessTest, MemRead) {
|
| - char buff[10];
|
| - ASSERT_TRUE(proc_->ReadMemory(0, sizeof(buff), buff));
|
| - std::deque<debug::DebugAPIMock::FunctionId> call_list;
|
| - call_list.push_back(debug::DebugAPIMock::kReadProcessMemory);
|
| - EXPECT_TRUE(fake_debug_api_.CompareCallSequence(call_list));
|
| -}
|
| -
|
| -TEST_F(DebuggeeProcessTest, MemWrite) {
|
| - proc_->Halt();
|
| - char buff[10];
|
| - ASSERT_TRUE(proc_->WriteMemory(0, sizeof(buff), buff));
|
| - std::deque<debug::DebugAPIMock::FunctionId> call_list;
|
| - call_list.push_back(debug::DebugAPIMock::kWriteProcessMemory);
|
| - call_list.push_back(debug::DebugAPIMock::kFlushInstructionCache);
|
| - EXPECT_TRUE(fake_debug_api_.CompareCallSequence(call_list));
|
| -}
|
| -
|
| -TEST_F(DebuggeeProcessTest, Breakpoints) {
|
| - CreateThread(kFakeThreadId);
|
| - proc_->Halt();
|
| -
|
| - std::deque<debug::Breakpoint*> breakpoints;
|
| - breakpoints.push_back(0);
|
| - // DebuggeeProcess::GetBreakpoints shall clear 'breakpoints', just
|
| - // in case something was there.
|
| - proc_->GetBreakpoints(&breakpoints);
|
| - EXPECT_EQ(0, breakpoints.size());
|
| - EXPECT_EQ(kNullBreakpointPtr, proc_->GetBreakpoint(kFakeAddr1));
|
| - EXPECT_EQ(kNullBreakpointPtr, proc_->GetBreakpoint(kFakeAddr2));
|
| -
|
| - EXPECT_TRUE(proc_->SetBreakpoint(kFakeAddr1));
|
| - EXPECT_TRUE(proc_->SetBreakpoint(kFakeAddr2));
|
| - proc_->GetBreakpoints(&breakpoints);
|
| - ASSERT_EQ(2, breakpoints.size());
|
| -
|
| - debug::Breakpoint* br1 = breakpoints[0];
|
| - EXPECT_EQ(kFakeAddr1, breakpoints[0]->address());
|
| - EXPECT_EQ(kFakeAddr2, breakpoints[1]->address());
|
| -
|
| - ASSERT_NE(kNullBreakpointPtr, proc_->GetBreakpoint(kFakeAddr1));
|
| - ASSERT_NE(kNullBreakpointPtr, proc_->GetBreakpoint(kFakeAddr2));
|
| - EXPECT_EQ(kFakeAddr1, proc_->GetBreakpoint(kFakeAddr1)->address());
|
| - EXPECT_EQ(kFakeAddr2, proc_->GetBreakpoint(kFakeAddr2)->address());
|
| -}
|
| -
|
| -TEST_F(DebuggeeProcessTest, ThreadNewAndDelete) {
|
| - CreateThread(kFakeThreadId + 13);
|
| - std::deque<int> threads;
|
| - proc_->GetThreadIds(&threads);
|
| - ASSERT_EQ(2, threads.size());
|
| - EXPECT_EQ(kFakeThreadId2, threads[0]);
|
| - EXPECT_EQ(kFakeThreadId + 13, threads[1]);
|
| -
|
| - CreateThread(kFakeThreadId + 77);
|
| - proc_->GetThreadIds(&threads);
|
| - ASSERT_EQ(3, threads.size());
|
| - EXPECT_EQ(kFakeThreadId + 77, threads[2]);
|
| -
|
| - DEBUG_EVENT wde;
|
| - memset(&wde, 0, sizeof(wde));
|
| - wde.dwProcessId = proc_->id();
|
| - wde.dwThreadId = kFakeThreadId2;
|
| - wde.dwDebugEventCode = EXIT_THREAD_DEBUG_EVENT;
|
| -
|
| - debug::DebugEvent de;
|
| - de.set_windows_debug_event(wde);
|
| - proc_->OnDebugEvent(&de);
|
| - proc_->GetThreadIds(&threads);
|
| - EXPECT_EQ(3, threads.size());
|
| -
|
| - proc_->Continue();
|
| - proc_->GetThreadIds(&threads);
|
| - EXPECT_EQ(2, threads.size());
|
| - EXPECT_EQ(debug::DebuggeeProcess::kRunning, proc_->state());
|
| -}
|
| -
|
| -TEST_F(DebuggeeProcessTest, ProcessExit) {
|
| - DEBUG_EVENT wde;
|
| - memset(&wde, 0, sizeof(wde));
|
| - wde.dwDebugEventCode = EXIT_PROCESS_DEBUG_EVENT;
|
| - wde.dwThreadId = kFakeThreadId2;
|
| - wde.dwProcessId = proc_->id();
|
| -
|
| - debug::DebugEvent de;
|
| - de.set_windows_debug_event(wde);
|
| -
|
| - proc_->OnDebugEvent(&de);
|
| - EXPECT_EQ(debug::DebuggeeProcess::kHalted, proc_->state());
|
| - EXPECT_EQ(wde.dwDebugEventCode,
|
| - proc_->last_debug_event().windows_debug_event().dwDebugEventCode);
|
| - EXPECT_EQ(wde.dwProcessId,
|
| - proc_->last_debug_event().windows_debug_event().dwProcessId);
|
| - EXPECT_EQ(wde.dwThreadId,
|
| - proc_->last_debug_event().windows_debug_event().dwThreadId);
|
| -
|
| - proc_->Continue();
|
| - EXPECT_EQ(debug::DebuggeeProcess::kDead, proc_->state());
|
| -}
|
| -
|
| -TEST_F(DebuggeeProcessTest, HitOurBreakpoint) {
|
| - CreateThread(kFakeThreadId);
|
| - proc_->Halt();
|
| - EXPECT_TRUE(proc_->SetBreakpoint(kFakeAddr1));
|
| -
|
| - debug::DebugEvent de = CreateBreakpointDebugEvent(kFakeThreadId, kFakeAddr1);
|
| - proc_->OnDebugEvent(&de);
|
| -
|
| - EXPECT_EQ(debug::DebuggeeProcess::kHalted, proc_->state());
|
| - EXPECT_EQ(proc_->GetThread(kFakeThreadId), proc_->GetHaltedThread());
|
| -
|
| - EXPECT_TRUE(proc_->Continue());
|
| - EXPECT_EQ(debug::DebuggeeProcess::kRunning, proc_->state());
|
| -}
|
| -
|
| -TEST_F(DebuggeeProcessTest, HitBreakpointSingleStep) {
|
| - debug::DebugEvent de = CreateBreakpointDebugEvent(kFakeThreadId2, kFakeAddr1);
|
| - proc_->OnDebugEvent(&de);
|
| -
|
| - EXPECT_EQ(debug::DebuggeeProcess::kHalted, proc_->state());
|
| - EXPECT_EQ(proc_->GetThread(kFakeThreadId2), proc_->GetHaltedThread());
|
| -
|
| - EXPECT_TRUE(proc_->SingleStep());
|
| - EXPECT_EQ(debug::DebuggeeProcess::kRunning, proc_->state());
|
| -}
|
| -
|
| -TEST_F(DebuggeeProcessTest, HitUnknownBreakpoint) {
|
| - CreateThread(kFakeThreadId);
|
| - proc_->Halt();
|
| - EXPECT_TRUE(proc_->SetBreakpoint(kFakeAddr1));
|
| -
|
| - debug::DebugEvent de = CreateBreakpointDebugEvent(kFakeThreadId, kFakeAddr2);
|
| - proc_->OnDebugEvent(&de);
|
| -
|
| - EXPECT_EQ(debug::DebuggeeProcess::kHalted, proc_->state());
|
| - EXPECT_EQ(proc_->GetThread(kFakeThreadId), proc_->GetHaltedThread());
|
| -
|
| - EXPECT_TRUE(proc_->ContinueAndPassExceptionToDebuggee());
|
| - EXPECT_EQ(debug::DebuggeeProcess::kRunning, proc_->state());
|
| -}
|
| -
|
| -TEST_F(DebuggeeProcessTest, Break) {
|
| - proc_->Break();
|
| - std::deque<debug::DebugAPIMock::FunctionId> call_list;
|
| - call_list.push_back(debug::DebugAPIMock::kDebugBreakProcess);
|
| - EXPECT_TRUE(fake_debug_api_.CompareCallSequence(call_list));
|
| -}
|
| -
|
| -TEST_F(DebuggeeProcessTest, Detach) {
|
| - proc_->Detach();
|
| - std::deque<debug::DebugAPIMock::FunctionId> call_list;
|
| - call_list.push_back(debug::DebugAPIMock::kDebugActiveProcessStop);
|
| - EXPECT_TRUE(fake_debug_api_.CompareCallSequence(call_list));
|
| - EXPECT_EQ(debug::DebuggeeProcess::kDead, proc_->state());
|
| -}
|
| -} // namespace
|
| -
|
|
|