blob: 94be9e39b4e78e5ce9666671cec73af754956066 [file] [log] [blame]
// Copyright 2018 The Fuchsia 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 "garnet/bin/zxdb/client/thread_controller_test.h"
#include "garnet/bin/zxdb/client/process_impl.h"
#include "garnet/bin/zxdb/client/process_observer.h"
#include "garnet/bin/zxdb/client/session.h"
#include "garnet/bin/zxdb/client/system.h"
#include "garnet/bin/zxdb/client/target_impl.h"
#include "garnet/bin/zxdb/client/thread.h"
#include "garnet/bin/zxdb/symbols/mock_module_symbols.h"
namespace zxdb {
class StopOnLoadModuleObserver : public ProcessObserver {
void DidLoadModuleSymbols(Process* process, LoadedModuleSymbols* module) {
debug_ipc::MessageLoop::Current()->QuitNow();
}
};
// static
const uint64_t ThreadControllerTest::kUnsymbolizedModuleAddress = 0x4000000;
// static
const uint64_t ThreadControllerTest::kSymbolizedModuleAddress = 0x5000000;
ThreadControllerTest::ThreadControllerTest() = default;
ThreadControllerTest::~ThreadControllerTest() = default;
void ThreadControllerTest::SetUp() {
RemoteAPITest::SetUp();
process_ = InjectProcess(0x1234);
thread_ = InjectThread(process_->GetKoid(), 0x7890);
// Inject a mock module symbols.
std::string build_id("abcd"); // Identifies the module below.
auto module_symbols = std::make_unique<MockModuleSymbols>("file.so");
module_symbols_ = module_symbols.get(); // Save pointer for tests.
symbol_module_ref_ = session().system().GetSymbols()->InjectModuleForTesting(
build_id, std::move(module_symbols));
// Make the process load the mocked module symbols and the other one with no
// symbols.
std::vector<debug_ipc::Module> modules;
debug_ipc::Module unsym_load;
unsym_load.name = "nosym";
unsym_load.base = kUnsymbolizedModuleAddress;
unsym_load.build_id = "zzyzx";
modules.push_back(unsym_load);
debug_ipc::Module sym_load;
sym_load.name = "sym";
sym_load.base = kSymbolizedModuleAddress;
sym_load.build_id = build_id;
modules.push_back(sym_load);
TargetImpl* target = session().system_impl().GetTargetImpls()[0];
target->process()->OnModules(modules, std::vector<uint64_t>());
StopOnLoadModuleObserver observer;
target->process()->AddObserver(&observer);
debug_ipc::MessageLoop::Current()->Run();
target->process()->RemoveObserver(&observer);
}
std::unique_ptr<RemoteAPI> ThreadControllerTest::GetRemoteAPIImpl() {
auto remote_api = std::make_unique<MockRemoteAPI>();
mock_remote_api_ = remote_api.get();
return remote_api;
}
} // namespace zxdb