| // 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 <lib/zx/process.h> |
| |
| #include "garnet/bin/debug_agent/object_util.h" |
| #include "garnet/bin/debug_agent/system_info.h" |
| #include "gtest/gtest.h" |
| |
| namespace debug_agent { |
| |
| namespace { |
| |
| // Recursively walks the process tree and returns true if there is a process |
| // with the given name and koid. |
| bool FindProcess(const debug_ipc::ProcessTreeRecord& record, |
| const std::string& name_to_find, zx_koid_t koid_to_find) { |
| if (record.name == name_to_find && record.koid == koid_to_find) |
| return true; |
| for (const auto& child : record.children) { |
| if (FindProcess(child, name_to_find, koid_to_find)) |
| return true; |
| } |
| return false; |
| } |
| |
| } // namespace |
| |
| TEST(SystemInfo, GetProcessTree) { |
| debug_ipc::ProcessTreeRecord root; |
| zx_status_t status = GetProcessTree(&root); |
| ASSERT_EQ(ZX_OK, status); |
| |
| // The root node should be a job with some children. |
| EXPECT_EQ(debug_ipc::ProcessTreeRecord::Type::kJob, root.type); |
| EXPECT_FALSE(root.children.empty()); |
| |
| // Compute our own process name and koid. |
| zx_handle_t self = zx_process_self(); |
| std::string self_name = NameForObject(self); |
| EXPECT_FALSE(self_name.empty()); |
| zx_koid_t self_koid = KoidForObject(self); |
| ASSERT_NE(0u, self_koid); |
| |
| // Our name and koid should be somewhere in the tree. |
| EXPECT_TRUE(FindProcess(root, self_name, self_koid)); |
| } |
| |
| } // namespace debug_agent |