blob: 6343e5e0a3ade80cc9d736102031aa0fe1e326fc [file] [log] [blame]
// Copyright 2020 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/zxdb/console/format_handle.h"
#include <gtest/gtest.h>
#include "src/developer/debug/ipc/records.h"
namespace zxdb {
TEST(FormatHandle, Table) {
std::vector<debug_ipc::InfoHandle> handles;
// Empty case.
OutputBuffer out = FormatHandles(handles, false);
EXPECT_EQ("No handles.", out.AsString());
// Give it several objects.
handles.resize(3);
handles[0].type = 3; // VMO.
handles[0].handle_value = 0; // Non-handle-based VMO.
handles[0].koid = 9999;
handles[1].type = 2; // Thread.
handles[1].handle_value = 1234;
handles[1].koid = 7890;
handles[2].type = 1; // Process.
handles[2].handle_value = 1123;
handles[2].koid = 7891;
out = FormatHandles(handles, false);
EXPECT_EQ(
" Handle Type Koid\n"
" <none> ZX_OBJ_TYPE_VMO 9999\n"
" 1234 ZX_OBJ_TYPE_THREAD 7890\n"
" 1123 ZX_OBJ_TYPE_PROCESS 7891\n",
out.AsString());
// Hex formatting
out = FormatHandles(handles, true);
EXPECT_EQ(
" Handle Type Koid\n"
" <none> ZX_OBJ_TYPE_VMO 0x270f\n"
" 0x4d2 ZX_OBJ_TYPE_THREAD 0x1ed2\n"
" 0x463 ZX_OBJ_TYPE_PROCESS 0x1ed3\n",
out.AsString());
}
TEST(FormatHandle, BasicDetails) {
debug_ipc::InfoHandle handle;
handle.type = 2; // Thread.
handle.handle_value = 1234;
handle.rights = 3;
handle.koid = 7890;
handle.related_koid = 1111;
handle.peer_owner_koid = 2222;
OutputBuffer out = FormatHandle(handle, false);
EXPECT_EQ(
" Handle 1234\n"
" Type ZX_OBJ_TYPE_THREAD\n"
" Koid 7890\n"
" Rights ZX_RIGHT_DUPLICATE\n"
" ZX_RIGHT_TRANSFER\n"
" Related koid 1111\n"
" Peer-owner koid 2222\n",
out.AsString());
// Related and peer owner koid should be omitted when 0 (not all handle types have these and
// it looks confusing). This one also tests hex formatting.
handle.related_koid = 0;
handle.peer_owner_koid = 0;
out = FormatHandle(handle, true);
EXPECT_EQ(
" Handle 0x4d2\n"
" Type ZX_OBJ_TYPE_THREAD\n"
" Koid 0x1ed2\n"
" Rights ZX_RIGHT_DUPLICATE\n"
" ZX_RIGHT_TRANSFER\n",
out.AsString());
}
TEST(FormatHandle, VmoDetails) {
debug_ipc::InfoHandle handle;
handle.type = 3; // VMO.
handle.handle_value = 1234;
handle.rights = 3;
handle.koid = 7890;
handle.related_koid = 0;
handle.peer_owner_koid = 0;
// VMO-specific data.
auto& vmo = handle.ext.vmo;
strcpy(vmo.name, "my name");
vmo.size_bytes = 262144;
vmo.parent_koid = 8888;
vmo.num_children = 0;
vmo.num_mappings = 1;
vmo.share_count = 2;
vmo.flags = 3;
vmo.committed_bytes = 8192;
vmo.cache_policy = 0;
vmo.metadata_bytes = 176;
vmo.committed_change_events = 0;
OutputBuffer out = FormatHandle(handle, false);
EXPECT_EQ(
" Handle 1234\n"
" Type ZX_OBJ_TYPE_VMO\n"
" Koid 7890\n"
" Rights ZX_RIGHT_DUPLICATE\n"
" ZX_RIGHT_TRANSFER\n"
" Name my name\n"
" VMO size in bytes 262144\n"
" Parent koid 8888\n"
" # children 0\n"
" # mappings 1\n"
" Share count 2\n"
" Flags ZX_INFO_VMO_TYPE_PAGED\n"
" ZX_INFO_VMO_RESIZABLE\n"
" Committed bytes 8192\n"
" Cache policy ZX_CACHE_POLICY_CACHED\n"
" Metadata bytes 176\n"
" Committed change events 0\n",
out.AsString());
}
} // namespace zxdb