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 <zircon/process.h>
7 #include <zircon/syscalls.h>
8 
9 // Tests in this file rely that the default job is the root job.
10 
make_profile_fails(void)11 static bool make_profile_fails(void) {
12     BEGIN_TEST;
13 
14     zx_handle_t root_job = zx_job_default();
15     if (root_job == ZX_HANDLE_INVALID) {
16         unittest_printf("no root job. skipping test\n");
17     } else {
18         zx_handle_t profile;
19 
20         ASSERT_EQ(zx_profile_create(root_job, NULL, &profile), ZX_ERR_INVALID_ARGS, "");
21         ASSERT_EQ(zx_profile_create(ZX_HANDLE_INVALID, NULL, &profile), ZX_ERR_BAD_HANDLE, "");
22 
23         zx_profile_info_t profile_info = { 0 };
24         ASSERT_EQ(zx_profile_create(root_job, &profile_info, &profile), ZX_ERR_NOT_SUPPORTED, "");
25 
26         profile_info.type = ZX_PROFILE_INFO_SCHEDULER;
27         profile_info.scheduler.priority = ZX_PRIORITY_HIGHEST + 1;
28         ASSERT_EQ(zx_profile_create(root_job, &profile_info, &profile), ZX_ERR_INVALID_ARGS, "");
29 
30         zx_handle_t child_job;
31         ASSERT_EQ(zx_job_create(root_job, 0u, &child_job), ZX_OK, "");
32         profile_info.scheduler.priority = ZX_PRIORITY_HIGH;
33         ASSERT_EQ(zx_profile_create(child_job, &profile_info, &profile), ZX_ERR_ACCESS_DENIED, "");
34         zx_handle_close(child_job);
35     }
36 
37     END_TEST;
38 }
39 
change_priority_via_profile(void)40 static bool change_priority_via_profile(void) {
41     BEGIN_TEST;
42 
43     zx_handle_t root_job = zx_job_default();
44     if (root_job == ZX_HANDLE_INVALID) {
45         unittest_printf("no root job. skipping test\n");
46     } else {
47         zx_profile_info_t profile_info = { 0 };
48         profile_info.type = ZX_PROFILE_INFO_SCHEDULER;
49 
50         zx_handle_t profile1;
51         profile_info.scheduler.priority = ZX_PRIORITY_HIGH;
52         ASSERT_EQ(zx_profile_create(root_job, &profile_info, &profile1), ZX_OK, "");
53 
54         zx_handle_t profile2;
55         profile_info.scheduler.priority = ZX_PRIORITY_DEFAULT;
56         ASSERT_EQ(zx_profile_create(root_job, &profile_info, &profile2), ZX_OK, "");
57 
58         ASSERT_EQ(zx_object_set_profile(zx_thread_self(), profile1, 0), ZX_OK, "");
59         zx_nanosleep(ZX_USEC(100));
60         ASSERT_EQ(zx_object_set_profile(zx_thread_self(), profile2, 0), ZX_OK, "");
61 
62         ASSERT_EQ(zx_handle_close(profile1), ZX_OK, "");
63         ASSERT_EQ(zx_handle_close(profile2), ZX_OK, "");
64     }
65 
66     END_TEST;
67 }
68 
69 BEGIN_TEST_CASE(profile_tests)
70 RUN_TEST(make_profile_fails)
71 RUN_TEST(change_priority_via_profile)
72 END_TEST_CASE(profile_tests)
73