| // 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/job.h> |
| #include <lib/zx/process.h> |
| #include <lib/zx/thread.h> |
| #include <zircon/syscalls/exception.h> |
| #include <zircon/syscalls/object.h> |
| |
| #include <zxtest/zxtest.h> |
| |
| #include "helper.h" |
| |
| namespace object_info_test { |
| namespace { |
| |
| constexpr auto job_provider = []() -> const zx::job& { |
| static const zx::unowned_job job = zx::job::default_job(); |
| return *job; |
| }; |
| |
| constexpr auto process_provider = []() -> const zx::process& { |
| static const zx::unowned_process process = zx::process::self(); |
| return *process; |
| }; |
| |
| constexpr auto thread_provider = []() -> const zx::thread& { |
| const static zx::unowned_thread thread = zx::thread::self(); |
| return *thread; |
| }; |
| |
| TEST(ThreadGetInfoTest, InfoHandleBasicOnSelfSuceeds) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckSelfInfoSuceeds<zx_info_handle_basic_t>(ZX_INFO_HANDLE_BASIC, 1, thread_provider()))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleBasicInvalidHandleFails) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckInvalidHandleFails<zx_info_handle_basic_t>(ZX_INFO_HANDLE_BASIC, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleBasicNullAvailSucceeds) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullAvailSuceeds<zx_info_handle_basic_t>(ZX_INFO_HANDLE_BASIC, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleBasicNullActualSucceeds) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_handle_basic_t>(ZX_INFO_HANDLE_BASIC, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleBasicNullActualAndAvailSucceeds) { |
| ASSERT_NO_FATAL_FAILURES((CheckNullActualAndAvailSuceeds<zx_info_handle_basic_t>( |
| ZX_INFO_HANDLE_BASIC, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleBasicInvalidBufferPointerFails) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_handle_basic_t>(ZX_INFO_HANDLE_BASIC, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleBasicBadActualgIsInvalidArg) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_handle_basic_t>(ZX_INFO_HANDLE_BASIC, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleBasicBadAvailIsInvalidArg) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_handle_basic_t>(ZX_INFO_HANDLE_BASIC, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleBasicZeroSizedBufferFails) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckZeroSizeBufferFails<zx_info_handle_basic_t>(ZX_INFO_HANDLE_BASIC, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleCountOnSelfSuceeds) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckSelfInfoSuceeds<zx_info_handle_count_t>(ZX_INFO_HANDLE_COUNT, 1, thread_provider()))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleCountInvalidHandleFails) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckInvalidHandleFails<zx_info_handle_count_t>(ZX_INFO_HANDLE_COUNT, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleCountNullAvailSucceeds) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullAvailSuceeds<zx_info_handle_count_t>(ZX_INFO_HANDLE_COUNT, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleCountNullActualSucceeds) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_handle_count_t>(ZX_INFO_HANDLE_COUNT, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleCountNullActualAndAvailSucceeds) { |
| ASSERT_NO_FATAL_FAILURES((CheckNullActualAndAvailSuceeds<zx_info_handle_count_t>( |
| ZX_INFO_HANDLE_COUNT, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleCountInvalidBufferPointerFails) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_handle_count_t>(ZX_INFO_HANDLE_COUNT, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleCountBadActualgIsInvalidArg) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_handle_count_t>(ZX_INFO_HANDLE_COUNT, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleCountBadAvailIsInvalidArg) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_handle_count_t>(ZX_INFO_HANDLE_COUNT, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoHandleCountZeroSizedBufferFails) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckZeroSizeBufferFails<zx_info_handle_count_t>(ZX_INFO_HANDLE_COUNT, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadOnSelfSuceeds) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckSelfInfoSuceeds<zx_info_thread_t>(ZX_INFO_THREAD, 1, thread_provider()))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadInvalidHandleFails) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckInvalidHandleFails<zx_info_thread_t>(ZX_INFO_THREAD, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadNullAvailSucceeds) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullAvailSuceeds<zx_info_thread_t>(ZX_INFO_THREAD, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadNullActualSucceeds) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_thread_t>(ZX_INFO_THREAD, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadNullActualAndAvailSucceeds) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualAndAvailSuceeds<zx_info_thread_t>(ZX_INFO_THREAD, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadInvalidBufferPointerFails) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_thread_t>(ZX_INFO_THREAD, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadBadActualgIsInvalidArg) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_thread_t>(ZX_INFO_THREAD, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadBadAvailIsInvalidArg) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_thread_t>(ZX_INFO_THREAD, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadZeroSizedBufferFails) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckZeroSizeBufferFails<zx_info_thread_t>(ZX_INFO_THREAD, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadJobHandleIsBadHandle) { |
| ASSERT_NO_FATAL_FAILURES( |
| CheckWrongHandleTypeFails<zx_info_thread_t>(ZX_INFO_THREAD, 32, job_provider)); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadProcessHandleIsBadHandle) { |
| ASSERT_NO_FATAL_FAILURES( |
| CheckWrongHandleTypeFails<zx_info_thread_t>(ZX_INFO_THREAD, 32, process_provider)); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadStatsOnSelfSuceeds) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckSelfInfoSuceeds<zx_info_thread_stats_t>(ZX_INFO_THREAD_STATS, 1, thread_provider()))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadStatsInvalidHandleFails) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckInvalidHandleFails<zx_info_thread_stats_t>(ZX_INFO_THREAD_STATS, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadStatsNullAvailSucceeds) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullAvailSuceeds<zx_info_thread_stats_t>(ZX_INFO_THREAD_STATS, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadStatsNullActualSucceeds) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_thread_stats_t>(ZX_INFO_THREAD_STATS, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadStatsNullActualAndAvailSucceeds) { |
| ASSERT_NO_FATAL_FAILURES((CheckNullActualAndAvailSuceeds<zx_info_thread_stats_t>( |
| ZX_INFO_THREAD_STATS, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadStatsInvalidBufferPointerFails) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_thread_stats_t>(ZX_INFO_THREAD_STATS, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadStatsBadActualgIsInvalidArg) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_thread_stats_t>(ZX_INFO_THREAD_STATS, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadStatsBadAvailIsInvalidArg) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckNullActualSuceeds<zx_info_thread_stats_t>(ZX_INFO_THREAD_STATS, 1, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadStatsZeroSizedBufferFails) { |
| ASSERT_NO_FATAL_FAILURES( |
| (CheckZeroSizeBufferFails<zx_info_thread_stats_t>(ZX_INFO_THREAD_STATS, thread_provider))); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadStatsJobHandleIsBadHandle) { |
| ASSERT_NO_FATAL_FAILURES( |
| CheckWrongHandleTypeFails<zx_info_thread_stats_t>(ZX_INFO_THREAD_STATS, 32, job_provider)); |
| } |
| |
| TEST(ThreadGetInfoTest, InfoThreadStatsProcessHandleIsBadHandle) { |
| ASSERT_NO_FATAL_FAILURES(CheckWrongHandleTypeFails<zx_info_thread_stats_t>(ZX_INFO_THREAD_STATS, |
| 32, process_provider)); |
| } |
| |
| // As reference from previous object-info test. |
| // Skip most tests for ZX_INFO_THREAD_EXCEPTION_REPORT, which is tested |
| // elsewhere and requires the target thread to be in a certain state. |
| TEST(ThreadGetInfoTest, InfoThreadExceptionReportInvalidHandleFails) { |
| ASSERT_NO_FATAL_FAILURES(CheckInvalidHandleFails<zx_exception_report_t>( |
| ZX_INFO_THREAD_EXCEPTION_REPORT, 32, []() { return zx::handle(); })); |
| } |
| |
| } // namespace |
| } // namespace object_info_test |