// 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.

#pragma once

#include <memory>

#include "garnet/bin/zxdb/client/mock_remote_api.h"
#include "garnet/bin/zxdb/client/remote_api_test.h"
#include "garnet/bin/zxdb/symbols/system_symbols.h"

namespace zxdb {

class MockModuleSymbols;
class Process;
class Thread;

// This test harness automatically makes a process and a thread
//
// In the future we will probably want to add support got setting up a mock
// symbol system (this is more involved).
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 const uint64_t kUnsymbolizedModuleAddress;

  // 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 const uint64_t kSymbolizedModuleAddress;

  // The mock module symbols. Addresses above kModuleAddress will be handled
  // by this mock. Test code should inject the responses it wants into this
  // mock.
  MockModuleSymbols* module_symbols() const { return module_symbols_; }

  MockRemoteAPI* mock_remote_api() const { return mock_remote_api_; }

 private:
  // RemoteAPITest implementation:
  std::unique_ptr<RemoteAPI> GetRemoteAPIImpl() override;

  // Non-owning pointer to the injected fake process/thread.
  Process* process_ = nullptr;
  Thread* thread_ = nullptr;

  MockRemoteAPI* mock_remote_api_;  // Owned by the session.

  // Non-owning (the pointer is owned by the SystemSymbols and held alive
  // because of our ModuleRef below).
  MockModuleSymbols* module_symbols_ = nullptr;

  // This reference ensures the module_symbols_ pointer above is kept alive
  // for the duration of the test.
  fxl::RefPtr<SystemSymbols::ModuleRef> symbol_module_ref_;
};

}  // namespace zxdb
