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