blob: cc8e1eb270dbe8a2d169524eb437c65b6520327b [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.
#ifndef SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_THREAD_CONTROLLER_TEST_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_THREAD_CONTROLLER_TEST_H_
#include <memory>
#include "src/developer/debug/zxdb/client/mock_remote_api.h"
#include "src/developer/debug/zxdb/client/remote_api_test.h"
#include "src/developer/debug/zxdb/symbols/mock_module_symbols.h"
#include "src/developer/debug/zxdb/symbols/system_symbols.h"
namespace zxdb {
class Process;
class Thread;
// This test harness automatically makes a process and a thread
//
// Many tests can be written using this setup entirely. When symbols are needed they can be injected
// into the MockModuleSymbols. If more elaborate symbol mocking is desired, a derived class can
// override MakeModuleSymbols() and provide a custom implementation.
class ThreadControllerTest : public RemoteAPITest {
public:
ThreadControllerTest();
~ThreadControllerTest();
void SetUp() override;
Process* process() { return process_; }
Thread* thread() { return thread_; }
// Load address that a mock module with no symbols is loaded at. If a test needs an address into
// an unsymbolized module, it should be between this value and kSymbolizedModuleAddress.
static constexpr uint64_t kUnsymbolizedModuleAddress = 0x4000000;
// Load address that the mock module with symbols is loaded at. Addresses you want to support
// symbol lookup for need to be larger than this.
static constexpr uint64_t kSymbolizedModuleAddress = 0x5000000;
// The mock module symbols. Addresses above kSymbolizedModuleAddress will be handled by this mock.
// Test code should inject the responses it wants into this mock. Derived classes can provide
// their own implementation by overriding MakeModuleSymbols().
MockModuleSymbols* module_symbols() const { return module_symbols_.get(); }
// The mock module symbols for the unsymbolized module. An unsymbolized module will normally
// still have some ELF/PLT symbols.
MockModuleSymbols* unsymbolized_module_symbols() const {
return unsymbolized_module_symbols_.get();
}
protected:
// Makes the MockModuleSymbols object used for the symbolized module.
//
// Derived classes can also provide a derived MockModuleSymbols implementation to implement
// more complex custom behavior.
virtual fxl::RefPtr<MockModuleSymbols> MakeModuleSymbols();
private:
// Non-owning pointer to the injected fake process/thread.
Process* process_ = nullptr;
Thread* thread_ = nullptr;
fxl::RefPtr<MockModuleSymbols> module_symbols_;
fxl::RefPtr<MockModuleSymbols> unsymbolized_module_symbols_;
};
} // namespace zxdb
#endif // SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_THREAD_CONTROLLER_TEST_H_