blob: 1a45d8988f1973f012a08d45c92cc62176c1d974 [file] [log] [blame]
// Copyright 2019 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/event.h>
#include <lib/zx/job.h>
#include <lib/zx/process.h>
#include <lib/zx/thread.h>
#include <lib/zx/vmar.h>
#include <lib/zx/vmo.h>
#include <zircon/syscalls/object.h>
#include <zxtest/zxtest.h>
#include "helper.h"
namespace object_info_test {
namespace {
TEST(TaskGetInfoTest, InfoStatsUnstartedSuceeds) {
static constexpr char kProcessName[] = "object-info-unstarted";
zx::vmar vmar;
zx::process process;
ASSERT_OK(zx::process::create(*zx::job::default_job(), kProcessName, sizeof(kProcessName), 0u,
&process, &vmar));
zx_info_task_stats_t info;
ASSERT_OK(process.get_info(ZX_INFO_TASK_STATS, &info, sizeof(info), nullptr, nullptr));
}
TEST(TaskGetInfoTest, InfoStatsSmokeTest) {
zx_info_task_stats_t info;
ASSERT_OK(
zx::process::self()->get_info(ZX_INFO_TASK_STATS, &info, sizeof(info), nullptr, nullptr));
EXPECT_GT(info.mem_private_bytes, 0u);
EXPECT_GE(info.mem_shared_bytes, 0u);
EXPECT_GE(info.mem_mapped_bytes, info.mem_private_bytes + info.mem_shared_bytes);
EXPECT_GE(info.mem_scaled_shared_bytes, 0u);
EXPECT_GE(info.mem_shared_bytes, info.mem_scaled_shared_bytes);
}
constexpr auto handle_provider = []() -> const zx::process& {
const static zx::unowned_process process = zx::process::self();
return *process;
};
TEST(TaskGetInfoTest, InfoTaskStatsInvalidHandleFails) {
ASSERT_NO_FATAL_FAILURE(
(CheckInvalidHandleFails<zx_info_task_stats_t>(ZX_INFO_TASK_STATS, 1, handle_provider)));
}
TEST(TaskGetInfoTest, InfoTaskStatsNullAvailSucceeds) {
ASSERT_TRUE(handle_provider().is_valid());
ASSERT_NO_FATAL_FAILURE(
(CheckNullAvailSuceeds<zx_info_task_stats_t>(ZX_INFO_TASK_STATS, 1, handle_provider)));
}
TEST(TaskGetInfoTest, InfoTaskStatsNullActualSucceeds) {
ASSERT_NO_FATAL_FAILURE(
(CheckNullActualSuceeds<zx_info_task_stats_t>(ZX_INFO_TASK_STATS, 1, handle_provider)));
}
TEST(TaskGetInfoTest, InfoTaskStatsNullActualAndAvailSucceeds) {
ASSERT_NO_FATAL_FAILURE((CheckNullActualAndAvailSuceeds<zx_info_task_stats_t>(
ZX_INFO_TASK_STATS, 1, handle_provider)));
}
TEST(TaskGetInfoTest, InfoTaskStatsInvalidBufferPointerFails) {
ASSERT_NO_FATAL_FAILURE(
(CheckNullActualSuceeds<zx_info_task_stats_t>(ZX_INFO_TASK_STATS, 1, handle_provider)));
}
TEST(TaskGetInfoTest, InfoTaskStatsBadActualgIsInvalidArg) {
ASSERT_NO_FATAL_FAILURE(
(CheckNullActualSuceeds<zx_info_task_stats_t>(ZX_INFO_TASK_STATS, 1, handle_provider)));
}
TEST(TaskGetInfoTest, InfoTaskStatsBadAvailIsInvalidArg) {
ASSERT_NO_FATAL_FAILURE(
(CheckNullActualSuceeds<zx_info_task_stats_t>(ZX_INFO_TASK_STATS, 1, handle_provider)));
}
TEST(TaskGetInfoTest, InfoTaskStatsZeroSizedBufferIsTooSmall) {
ASSERT_NO_FATAL_FAILURE(
(CheckZeroSizeBufferFails<zx_info_task_stats_t>(ZX_INFO_TASK_STATS, handle_provider)));
}
constexpr auto job_provider = []() -> const zx::job& {
const static zx::unowned_job job = zx::job::default_job();
return *job;
};
TEST(TaskGetInfoTest, InfoTaskStatsJobHandleIsBadHandle) {
ASSERT_NO_FATAL_FAILURE(
CheckWrongHandleTypeFails<zx_info_task_stats_t>(ZX_INFO_TASK_STATS, 1, job_provider));
}
constexpr auto thread_provider = []() -> const zx::thread& {
const static zx::unowned_thread thread = zx::thread::self();
return *thread;
};
TEST(TaskGetInfoTest, InfoTaskStatsThreadHandleIsBadHandle) {
ASSERT_NO_FATAL_FAILURE(
CheckWrongHandleTypeFails<zx_info_task_stats_t>(ZX_INFO_TASK_STATS, 1, thread_provider));
}
TEST(TaskGetInfoTest, InfoTaskRuntimeWrongType) {
zx::event event;
zx::event::create(0, &event);
auto event_provider = [&]() -> const zx::event& { return event; };
ASSERT_NO_FATAL_FAILURE(
CheckWrongHandleTypeFails<zx_info_task_runtime_t>(ZX_INFO_TASK_RUNTIME, 1, event_provider));
}
TEST(TaskGetInfoTest, InfoTaskRuntimeInvalidHandle) {
ASSERT_NO_FATAL_FAILURE(
CheckInvalidHandleFails<zx_info_task_runtime_t>(ZX_INFO_TASK_RUNTIME, 1, thread_provider));
}
} // namespace
} // namespace object_info_test