1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <unittest/unittest.h>
6 #include <lib/zx/profile.h>
7 #include <lib/zx/thread.h>
8 #include <lib/zx/job.h>
9
10 // Tests in this file rely that the default job is the root job.
11
profile_failures_test()12 static bool profile_failures_test() {
13 BEGIN_TEST;
14
15 zx::unowned_job root_job(zx_job_default());
16 if (!root_job->is_valid()) {
17 unittest_printf("no root job. skipping test\n");
18 } else {
19 zx::profile profile;
20
21 ASSERT_EQ(zx::profile::create(*root_job, nullptr, &profile), ZX_ERR_INVALID_ARGS, "");
22 ASSERT_EQ(zx::profile::create(zx::job(), nullptr, &profile), ZX_ERR_BAD_HANDLE, "");
23
24 zx_profile_info_t profile_info = {};
25 ASSERT_EQ(zx::profile::create(
26 *root_job, &profile_info, &profile), ZX_ERR_NOT_SUPPORTED, "");
27
28 profile_info.type = ZX_PROFILE_INFO_SCHEDULER;
29 profile_info.scheduler.priority = ZX_PRIORITY_HIGHEST + 1;
30 ASSERT_EQ(zx::profile::create(
31 *root_job, &profile_info, &profile), ZX_ERR_INVALID_ARGS, "");
32
33 zx::job child_job;
34 ASSERT_EQ(zx::job::create(*root_job, 0u, &child_job), ZX_OK, "");
35 profile_info.scheduler.priority = ZX_PRIORITY_HIGH;
36 ASSERT_EQ(zx::profile::create(
37 child_job, &profile_info, &profile), ZX_ERR_ACCESS_DENIED, "");
38 }
39
40 END_TEST;
41 }
42
profile_priority_test(void)43 static bool profile_priority_test(void) {
44 BEGIN_TEST;
45
46 zx::unowned_job root_job(zx_job_default());
47 if (!root_job->is_valid()) {
48 unittest_printf("no root job. skipping test\n");
49 } else {
50 zx_profile_info_t profile_info = {};
51 profile_info.type = ZX_PROFILE_INFO_SCHEDULER;
52
53 zx::profile profile1;
54 profile_info.scheduler.priority = ZX_PRIORITY_HIGH;
55 ASSERT_EQ(zx::profile::create(*root_job, &profile_info, &profile1), ZX_OK, "");
56
57 zx::profile profile2;
58 profile_info.scheduler.priority = ZX_PRIORITY_DEFAULT;
59 ASSERT_EQ(zx::profile::create(*root_job, &profile_info, &profile2), ZX_OK, "");
60
61 ASSERT_EQ(zx::thread::self()->set_profile(profile1, 0), ZX_OK, "");
62 zx_nanosleep(ZX_USEC(100));
63 ASSERT_EQ(zx::thread::self()->set_profile(profile2, 0), ZX_OK, "");
64 }
65
66 END_TEST;
67 }
68
69 BEGIN_TEST_CASE(profile_cpp_tests)
70 RUN_TEST(profile_failures_test)
71 RUN_TEST(profile_priority_test)
72 END_TEST_CASE(profile_cpp_tests)
73