blob: a45083f857bfa1a5d5d64044f46da856ae077a55 [file] [log] [blame]
// Copyright 2021 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 "src/developer/debug/debug_agent/mock_component_manager.h"
#include "src/developer/debug/debug_agent/component_manager.h"
#include "src/developer/debug/debug_agent/mock_system_interface.h"
namespace debug_agent {
std::vector<debug_ipc::ComponentInfo> MockComponentManager::FindComponentInfo(
zx_koid_t job_koid) const {
auto [start, end] = component_info_.equal_range(job_koid);
if (start == component_info_.end()) {
// Not found.
return {};
}
std::vector<debug_ipc::ComponentInfo> components;
components.reserve(std::distance(start, end));
for (auto& i = start; i != end; ++i) {
components.push_back(i->second);
}
return components;
}
void MockComponentManager::AddComponentInfo(zx_koid_t job_koid, debug_ipc::ComponentInfo info) {
component_info_.emplace(job_koid, info);
moniker_to_job_.emplace(info.moniker, job_koid);
}
// Simulates the given event type coming from ComponentManager in a real system. |koid| is only
// used if the type is |kDebugStarted|, in which case it will be used to populate the known
// component information.
void MockComponentManager::InjectComponentEvent(FakeEventType type, const std::string& moniker,
const std::string& url, zx_koid_t koid) {
switch (type) {
case FakeEventType::kDebugStarted: {
zx_koid_t job_koid = koid;
if (auto found = moniker_to_job_.find(moniker); found != moniker_to_job_.end()) {
job_koid = found->second;
} else if (job_koid != ZX_KOID_INVALID) {
AddComponentInfo(job_koid, {.moniker = moniker, .url = url});
mock_system_interface_->AddJob(job_koid, {{.moniker = moniker, .url = url}});
}
debug_agent_->OnComponentStarted(moniker, url, job_koid);
break;
}
case FakeEventType::kStopped: {
debug_agent_->OnComponentExited(moniker, url);
break;
}
default: {
FX_NOTREACHED();
break;
}
}
}
} // namespace debug_agent