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