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
9extern zx_handle_t get_root_resource(void);
10
11
12static bool make_profile_fails(void) {
13    BEGIN_TEST;
14
15    zx_handle_t rrh = get_root_resource();
16    if (rrh == ZX_HANDLE_INVALID) {
17        unittest_printf("no root resource. skipping test\n");
18    } else {
19        zx_handle_t profile;
20
21        ASSERT_EQ(zx_profile_create(rrh, NULL, &profile), ZX_ERR_INVALID_ARGS, "");
22        ASSERT_EQ(zx_profile_create(ZX_HANDLE_INVALID, NULL, &profile), ZX_ERR_BAD_HANDLE, "");
23
24        zx_profile_info_t profile_info = { 0 };
25        ASSERT_EQ(zx_profile_create(rrh, &profile_info, &profile), ZX_ERR_NOT_SUPPORTED, "");
26
27        profile_info.type = ZX_PROFILE_INFO_SCHEDULER;
28        profile_info.scheduler.priority = ZX_PRIORITY_HIGHEST + 1;
29        ASSERT_EQ(zx_profile_create(rrh, &profile_info, &profile), ZX_ERR_INVALID_ARGS, "");
30    }
31
32    END_TEST;
33}
34
35static bool change_priority_via_profile(void) {
36    BEGIN_TEST;
37
38    zx_handle_t rrh = get_root_resource();
39    if (rrh == ZX_HANDLE_INVALID) {
40        unittest_printf("no root resource. skipping test\n");
41    } else {
42        zx_profile_info_t profile_info = { 0 };
43        profile_info.type = ZX_PROFILE_INFO_SCHEDULER;
44
45        zx_handle_t profile1;
46        profile_info.scheduler.priority = ZX_PRIORITY_HIGH;
47        ASSERT_EQ(zx_profile_create(rrh, &profile_info, &profile1), ZX_OK, "");
48
49        zx_handle_t profile2;
50        profile_info.scheduler.priority = ZX_PRIORITY_DEFAULT;
51        ASSERT_EQ(zx_profile_create(rrh, &profile_info, &profile2), ZX_OK, "");
52
53        ASSERT_EQ(zx_object_set_profile(zx_thread_self(), profile1, 0), ZX_OK, "");
54        zx_nanosleep(ZX_USEC(100));
55        ASSERT_EQ(zx_object_set_profile(zx_thread_self(), profile2, 0), ZX_OK, "");
56
57        ASSERT_EQ(zx_handle_close(profile1), ZX_OK, "");
58        ASSERT_EQ(zx_handle_close(profile2), ZX_OK, "");
59    }
60
61    END_TEST;
62}
63
64BEGIN_TEST_CASE(profile_tests)
65RUN_TEST(make_profile_fails)
66RUN_TEST(change_priority_via_profile)
67END_TEST_CASE(profile_tests)
68