| Index: experimental/windows_debugger/debugger/core/debuggee_thread_test.cc
|
| diff --git a/experimental/windows_debugger/debugger/core/debuggee_thread_test.cc b/experimental/windows_debugger/debugger/core/debuggee_thread_test.cc
|
| deleted file mode 100644
|
| index 3ae4743556104ed6f8b1ce0ecf0f17885a3bf240..0000000000000000000000000000000000000000
|
| --- a/experimental/windows_debugger/debugger/core/debuggee_thread_test.cc
|
| +++ /dev/null
|
| @@ -1,377 +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_event.h"
|
| -#include "debugger/core/debuggee_iprocess.h"
|
| -#include "debugger/core/debuggee_process_mock.h"
|
| -#include "debugger/core/debuggee_thread.h"
|
| -#include "gtest/gtest.h"
|
| -
|
| -namespace {
|
| -const int kFakeProcessId = 847;
|
| -const int kFakeThreadId = 378421;
|
| -const int kFakeThreadId2 = 308421;
|
| -HANDLE kFakeThreadHandle = 0;
|
| -HANDLE kFakeProcessHandle = 0;
|
| -HANDLE kFakeFileHandle = 0;
|
| -
|
| -const int kNexeThreadStarted = 1;
|
| -const int kThreadHalted = 2;
|
| -const int kThreadRunning = 3;
|
| -
|
| -const char* kNexeUuid =
|
| - "{7AA7C9CF-89EC-4ed3-8DAD-6DC84302AB11} -v 1"
|
| - " -event NaClThreadStart -mb c0000000 -ep 20080";
|
| -const void* kNexeMemBaseAddr = reinterpret_cast<void*>(0xc0000000);
|
| -const void* kNexeEntryPoint = reinterpret_cast<void*>(0x20080);
|
| -const debug::DebuggeeThread* kNullThread =
|
| - reinterpret_cast<debug::DebuggeeThread*>(0);
|
| -const char* kNullCharPtr = reinterpret_cast<char*>(0);
|
| -
|
| -class TestableDebuggeeThread : public debug::DebuggeeThread {
|
| - public:
|
| - TestableDebuggeeThread(int id,
|
| - HANDLE handle,
|
| - debug::IDebuggeeProcess* parent_process)
|
| - : debug::DebuggeeThread(id, handle, parent_process) {}
|
| -
|
| - void Kill() { debug::DebuggeeThread::Kill(); }
|
| - void OnDebugEvent(debug::DebugEvent* debug_event) {
|
| - debug::DebuggeeThread::OnDebugEvent(debug_event);
|
| - }
|
| - bool Continue(debug::DebuggeeThread::ContinueOption option) {
|
| - return debug::DebuggeeThread::Continue(option);
|
| - }
|
| - debug::IDebuggeeProcess& parent_process() {
|
| - return debug::DebuggeeThread::parent_process();
|
| - }
|
| - debug::DebugAPI& debug_api() { return debug::DebuggeeThread::debug_api(); }
|
| -
|
| - void SimulateBreakpointHit() {
|
| - DEBUG_EVENT wde;
|
| - memset(&wde, 0, sizeof(wde));
|
| - wde.dwDebugEventCode = EXCEPTION_DEBUG_EVENT;
|
| - wde.u.Exception.ExceptionRecord.ExceptionCode = EXCEPTION_BREAKPOINT;
|
| - wde.dwThreadId = id();
|
| -
|
| - debug::DebugEvent de;
|
| - de.set_windows_debug_event(wde);
|
| - OnDebugEvent(&de);
|
| - }
|
| -};
|
| -
|
| -// DebuggeeThread test fixture.
|
| -class DebuggeeThreadTest : public ::testing::Test {
|
| - public:
|
| - DebuggeeThreadTest() {
|
| - fake_proc_ = new debug::DebuggeeProcessMock(&fake_debug_api_);
|
| - fake_proc_->AddThread(kFakeThreadId2, kFakeThreadHandle);
|
| -
|
| - no_thread_ = new TestableDebuggeeThread(kFakeThreadId,
|
| - kFakeThreadHandle,
|
| - fake_proc_);
|
| -
|
| - this_thread_ = new TestableDebuggeeThread(GetCurrentThreadId(),
|
| - GetCurrentThread(),
|
| - fake_proc_);
|
| -
|
| - fake_thread_ = new TestableDebuggeeThread(kFakeThreadId,
|
| - kFakeThreadHandle,
|
| - fake_proc_);
|
| - DEBUG_EVENT wde;
|
| - memset(&wde, 0, sizeof(wde));
|
| - wde.dwDebugEventCode = CREATE_THREAD_DEBUG_EVENT;
|
| - wde.dwProcessId = fake_proc_->id();
|
| - wde.dwThreadId = kFakeThreadId;
|
| -
|
| - debug::DebugEvent de;
|
| - de.set_windows_debug_event(wde);
|
| - fake_proc_->OnDebugEvent(&de);
|
| - }
|
| -
|
| - ~DebuggeeThreadTest() {
|
| - delete fake_proc_;
|
| - delete fake_thread_;
|
| - delete no_thread_;
|
| - delete this_thread_;
|
| - }
|
| -
|
| - void InitDebugEventWithString(const char* str,
|
| - int addr,
|
| - debug::DebugEvent* de) {
|
| - DEBUG_EVENT wde;
|
| - memset(&wde, 0, sizeof(wde));
|
| - wde.dwDebugEventCode = OUTPUT_DEBUG_STRING_EVENT;
|
| - wde.u.DebugString.lpDebugStringData = reinterpret_cast<char*>(addr);
|
| - wde.u.DebugString.nDebugStringLength = static_cast<WORD>(strlen(str));
|
| - fake_proc_->WriteMemory(
|
| - wde.u.DebugString.lpDebugStringData,
|
| - strlen(str),
|
| - str);
|
| - de->set_windows_debug_event(wde);
|
| - }
|
| -
|
| - TestableDebuggeeThread* no_thread_;
|
| - TestableDebuggeeThread* this_thread_;
|
| - debug::DebuggeeProcessMock* fake_proc_;
|
| - TestableDebuggeeThread* fake_thread_;
|
| - debug::DebugAPIMock fake_debug_api_;
|
| -};
|
| -
|
| -TEST_F(DebuggeeThreadTest, SimpleAccessors) {
|
| - EXPECT_EQ(fake_proc_, &no_thread_->parent_process());
|
| - EXPECT_EQ(kFakeThreadId, no_thread_->id());
|
| - EXPECT_EQ(&fake_proc_->debug_api(), &no_thread_->debug_api());
|
| - EXPECT_EQ(debug::DebuggeeThread::kHalted, no_thread_->state());
|
| - EXPECT_STREQ("kHalted",
|
| - debug::DebuggeeThread::GetStateName(no_thread_->state()));
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, Nothread) {
|
| - EXPECT_FALSE(no_thread_->IsNaClAppThread());
|
| - EXPECT_TRUE(no_thread_->IsHalted());
|
| - CONTEXT context;
|
| - EXPECT_TRUE(no_thread_->GetContext(&context));
|
| - EXPECT_TRUE(no_thread_->SetContext(context));
|
| -
|
| - WOW64_CONTEXT wow;
|
| - EXPECT_TRUE(no_thread_->GetWowContext(&wow));
|
| - EXPECT_TRUE(no_thread_->SetWowContext(wow));
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, NothreadShallNotCrash) {
|
| - no_thread_->Kill();
|
| - no_thread_->Continue(debug::DebuggeeThread::kContinue);
|
| - no_thread_->Continue(debug::DebuggeeThread::kContinueAndPassException);
|
| - no_thread_->Continue(debug::DebuggeeThread::kSingleStep);
|
| - no_thread_->SetIP(NULL);
|
| -
|
| - debug::DebugEvent de;
|
| - no_thread_->OnDebugEvent(&de);
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, SimpleAccessorsForThisThread) {
|
| - EXPECT_EQ(GetCurrentThreadId(), this_thread_->id());
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, ReadRegsForThisThread) {
|
| - CONTEXT zeroed_context;
|
| - memset(&zeroed_context, 0, sizeof(zeroed_context));
|
| - CONTEXT context;
|
| - EXPECT_TRUE(this_thread_->GetContext(&context));
|
| - EXPECT_NE(0, memcmp(&context, &zeroed_context, sizeof(context)));
|
| - const void* zero_ip = 0;
|
| - EXPECT_NE(zero_ip, this_thread_->GetIP());
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, RecvDebugUnicodeStringAndHalt) {
|
| - DEBUG_EVENT wde;
|
| - memset(&wde, 0, sizeof(wde));
|
| - wde.dwDebugEventCode = OUTPUT_DEBUG_STRING_EVENT;
|
| - wde.u.DebugString.fUnicode = 1;
|
| -
|
| - debug::DebugEvent de;
|
| - de.set_windows_debug_event(wde);
|
| - no_thread_->OnDebugEvent(&de);
|
| - EXPECT_TRUE(no_thread_->IsHalted());
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, RecvDebugStringB) {
|
| - debug::DebugEvent de;
|
| - InitDebugEventWithString("abc", 1, &de);
|
| -
|
| - fake_thread_->OnDebugEvent(&de);
|
| - EXPECT_TRUE(fake_thread_->IsHalted());
|
| - EXPECT_EQ(debug::DebugEvent::kNotNaClDebugEvent, de.nacl_debug_event_code());
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, RecvNexeDebugString) {
|
| - debug::DebugEvent de;
|
| - InitDebugEventWithString(kNexeUuid, 2, &de);
|
| -
|
| - fake_thread_->OnDebugEvent(&de);
|
| - EXPECT_TRUE(fake_thread_->IsHalted());
|
| - EXPECT_EQ(debug::DebugEvent::kThreadIsAboutToStart,
|
| - de.nacl_debug_event_code());
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, RecvNexeDebugStringValidateParams) {
|
| - debug::DebugEvent de;
|
| - InitDebugEventWithString(kNexeUuid, 2, &de);
|
| - fake_thread_->OnDebugEvent(&de);
|
| -
|
| - EXPECT_TRUE(fake_thread_->IsNaClAppThread());
|
| - EXPECT_EQ(kNexeMemBaseAddr, fake_proc_->nexe_mem_base());
|
| - EXPECT_EQ(kNexeEntryPoint, fake_proc_->nexe_entry_point());
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, RecvNexeDebugStringAndContinue) {
|
| - debug::DebugEvent de;
|
| - InitDebugEventWithString(kNexeUuid, 2, &de);
|
| -
|
| - fake_thread_->OnDebugEvent(&de);
|
| -
|
| - EXPECT_TRUE(fake_thread_->IsHalted());
|
| - EXPECT_EQ(debug::DebuggeeThread::kHalted, fake_thread_->state());
|
| -
|
| - fake_thread_->Continue(debug::DebuggeeThread::kContinue);
|
| - EXPECT_FALSE(fake_thread_->IsHalted());
|
| - EXPECT_EQ(debug::DebuggeeThread::kRunning, fake_thread_->state());
|
| - EXPECT_FALSE(fake_debug_api_.single_step_enabled_);
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, RecvNexeDebugStringAndContinueB) {
|
| - debug::DebugEvent de;
|
| - InitDebugEventWithString(kNexeUuid, 2, &de);
|
| - fake_thread_->OnDebugEvent(&de);
|
| -
|
| - fake_thread_->Continue(debug::DebuggeeThread::kContinueAndPassException);
|
| - EXPECT_FALSE(fake_thread_->IsHalted());
|
| - EXPECT_EQ(debug::DebuggeeThread::kRunning, fake_thread_->state());
|
| - EXPECT_FALSE(fake_debug_api_.single_step_enabled_);
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, RecvNexeDebugStringAndContinueVerifyCallList) {
|
| - debug::DebugEvent de;
|
| - InitDebugEventWithString(kNexeUuid, 2, &de);
|
| - fake_thread_->OnDebugEvent(&de);
|
| -
|
| - fake_debug_api_.ClearCallSequence();
|
| - fake_thread_->Continue(debug::DebuggeeThread::kContinue);
|
| -
|
| - std::deque<debug::DebugAPIMock::FunctionId> call_list;
|
| - call_list.push_back(debug::DebugAPIMock::kContinueDebugEvent);
|
| - EXPECT_TRUE(fake_debug_api_.CompareCallSequence(call_list));
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, RecvNexeDebugStringAndContinueVerifyCallListB) {
|
| - debug::DebugEvent de;
|
| - InitDebugEventWithString(kNexeUuid, 2, &de);
|
| - fake_thread_->OnDebugEvent(&de);
|
| -
|
| - fake_debug_api_.ClearCallSequence();
|
| - fake_thread_->Continue(debug::DebuggeeThread::kContinueAndPassException);
|
| -
|
| - std::deque<debug::DebugAPIMock::FunctionId> call_list;
|
| - call_list.push_back(debug::DebugAPIMock::kContinueDebugEvent);
|
| - EXPECT_TRUE(fake_debug_api_.CompareCallSequence(call_list));
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, RecvNexeDebugStringAndSingleStep) {
|
| - debug::DebugEvent de;
|
| - InitDebugEventWithString(kNexeUuid, 2, &de);
|
| -
|
| - fake_thread_->OnDebugEvent(&de);
|
| - EXPECT_TRUE(fake_thread_->IsHalted());
|
| -
|
| - fake_thread_->Continue(debug::DebuggeeThread::kSingleStep);
|
| - EXPECT_FALSE(fake_thread_->IsHalted());
|
| - EXPECT_TRUE(fake_debug_api_.single_step_enabled_);
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, RecvNexeDebugStringAndSingleStepVerifyCallList) {
|
| - fake_debug_api_.ClearCallSequence();
|
| -
|
| - debug::DebugEvent de;
|
| - InitDebugEventWithString(kNexeUuid, 2, &de);
|
| - fake_thread_->OnDebugEvent(&de);
|
| - fake_thread_->Continue(debug::DebuggeeThread::kSingleStep);
|
| -
|
| - std::deque<debug::DebugAPIMock::FunctionId> call_list;
|
| - call_list.push_back(debug::DebugAPIMock::kGetThreadContext);
|
| - call_list.push_back(debug::DebugAPIMock::kSetThreadContext);
|
| - call_list.push_back(debug::DebugAPIMock::kGetThreadContext);
|
| - call_list.push_back(debug::DebugAPIMock::kSetThreadContext);
|
| - call_list.push_back(debug::DebugAPIMock::kContinueDebugEvent);
|
| -
|
| - EXPECT_TRUE(fake_debug_api_.CompareCallSequence(call_list));
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, Kill) {
|
| - TestableDebuggeeThread thread(1, reinterpret_cast<HANDLE>(1), fake_proc_);
|
| - fake_debug_api_.ClearCallSequence();
|
| - thread.Kill();
|
| -
|
| - std::deque<debug::DebugAPIMock::FunctionId> call_list;
|
| - call_list.push_back(debug::DebugAPIMock::kTerminateThread);
|
| - EXPECT_TRUE(fake_debug_api_.CompareCallSequence(call_list));
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, SetContextVerifyCallList) {
|
| - fake_debug_api_.ClearCallSequence();
|
| - debug::DebuggeeThread thread(1, reinterpret_cast<HANDLE>(1), fake_proc_);
|
| -
|
| - CONTEXT ct;
|
| - thread.GetContext(&ct);
|
| - thread.SetContext(ct);
|
| -
|
| - std::deque<debug::DebugAPIMock::FunctionId> call_list;
|
| - call_list.push_back(debug::DebugAPIMock::kGetThreadContext);
|
| - call_list.push_back(debug::DebugAPIMock::kSetThreadContext);
|
| - EXPECT_TRUE(fake_debug_api_.CompareCallSequence(call_list));
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, RecvAlienBreakpoint) {
|
| - fake_thread_->SimulateBreakpointHit();
|
| - EXPECT_TRUE(fake_thread_->IsHalted());
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, FailContinue) {
|
| - fake_thread_->SimulateBreakpointHit();
|
| - EXPECT_TRUE(fake_thread_->IsHalted());
|
| - EXPECT_TRUE(fake_thread_->Continue(debug::DebuggeeThread::kContinue));
|
| - EXPECT_FALSE(fake_thread_->IsHalted());
|
| - EXPECT_FALSE(fake_thread_->Continue(debug::DebuggeeThread::kContinue));
|
| - EXPECT_FALSE(fake_thread_->IsHalted());
|
| -
|
| - fake_thread_->SimulateBreakpointHit();
|
| - EXPECT_TRUE(fake_thread_->IsHalted());
|
| - EXPECT_TRUE(fake_thread_->Continue(debug::DebuggeeThread::kSingleStep));
|
| - EXPECT_FALSE(fake_thread_->IsHalted());
|
| - EXPECT_FALSE(fake_thread_->Continue(debug::DebuggeeThread::kSingleStep));
|
| - EXPECT_FALSE(fake_thread_->IsHalted());
|
| -
|
| - fake_thread_->SimulateBreakpointHit();
|
| - EXPECT_TRUE(fake_thread_->IsHalted());
|
| - EXPECT_TRUE(fake_thread_->Continue(
|
| - debug::DebuggeeThread::kContinueAndPassException));
|
| - EXPECT_FALSE(fake_thread_->IsHalted());
|
| - EXPECT_FALSE(fake_thread_->Continue(
|
| - debug::DebuggeeThread::kContinueAndPassException));
|
| - EXPECT_FALSE(fake_thread_->IsHalted());
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, FailIfNotHalted) {
|
| - fake_thread_->SimulateBreakpointHit();
|
| - EXPECT_TRUE(fake_thread_->IsHalted());
|
| - EXPECT_TRUE(fake_thread_->Continue(debug::DebuggeeThread::kContinue));
|
| -
|
| - EXPECT_FALSE(fake_thread_->IsHalted());
|
| - CONTEXT context;
|
| - EXPECT_FALSE(fake_thread_->GetContext(&context));
|
| - EXPECT_FALSE(fake_thread_->SetContext(context));
|
| -
|
| - WOW64_CONTEXT wow_ctx;
|
| - EXPECT_FALSE(fake_thread_->GetWowContext(&wow_ctx));
|
| - EXPECT_FALSE(fake_thread_->SetWowContext(wow_ctx));
|
| -
|
| - EXPECT_EQ(NULL, fake_thread_->GetIP());
|
| - EXPECT_FALSE(fake_thread_->SetIP(NULL));
|
| -}
|
| -
|
| -TEST_F(DebuggeeThreadTest, NotFailIfHalted) {
|
| - EXPECT_TRUE(fake_thread_->IsHalted());
|
| - CONTEXT context;
|
| - EXPECT_TRUE(fake_thread_->GetContext(&context));
|
| - EXPECT_TRUE(fake_thread_->SetContext(context));
|
| -
|
| - WOW64_CONTEXT wow_ctx;
|
| - EXPECT_TRUE(fake_thread_->GetWowContext(&wow_ctx));
|
| - EXPECT_TRUE(fake_thread_->SetWowContext(wow_ctx));
|
| -
|
| - EXPECT_TRUE(fake_thread_->SetIP(NULL));
|
| -}
|
| -
|
| -} // namespace
|
| -
|
|
|