1570af302Sopenharmony_ci/*
2570af302Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3570af302Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4570af302Sopenharmony_ci * you may not use this file except in compliance with the License.
5570af302Sopenharmony_ci * You may obtain a copy of the License at
6570af302Sopenharmony_ci *
7570af302Sopenharmony_ci *   http://www.apache.org/licenses/LICENSE-2.0
8570af302Sopenharmony_ci *
9570af302Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10570af302Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11570af302Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12570af302Sopenharmony_ci * See the License for the specific language governing permissions and
13570af302Sopenharmony_ci * limitations under the License.
14570af302Sopenharmony_ci */
15570af302Sopenharmony_ci
16570af302Sopenharmony_ci#include <errno.h>
17570af302Sopenharmony_ci#include <signal.h>
18570af302Sopenharmony_ci#include <stdlib.h>
19570af302Sopenharmony_ci#include <sys/timex.h>
20570af302Sopenharmony_ci#include <time.h>
21570af302Sopenharmony_ci#include "functionalext.h"
22570af302Sopenharmony_ci
23570af302Sopenharmony_civoid exception_handler(int sig)
24570af302Sopenharmony_ci{
25570af302Sopenharmony_ci    exit(t_status);
26570af302Sopenharmony_ci}
27570af302Sopenharmony_ci
28570af302Sopenharmony_ciextern int __clock_adjtime64(clockid_t, struct timex *);
29570af302Sopenharmony_ci
30570af302Sopenharmony_ci/**
31570af302Sopenharmony_ci * @tc.name      : clock_adjtime_0100
32570af302Sopenharmony_ci * @tc.desc      : Verify that the kernel time can be adjusted (all parameters are valid, clock_id is CLOCK_REALTIME)
33570af302Sopenharmony_ci * @tc.level     : Level 0
34570af302Sopenharmony_ci */
35570af302Sopenharmony_civoid clock_adjtime_0100(void)
36570af302Sopenharmony_ci{
37570af302Sopenharmony_ci    struct timex tx;
38570af302Sopenharmony_ci    memset(&tx, 0, sizeof(tx));
39570af302Sopenharmony_ci
40570af302Sopenharmony_ci    int result = clock_adjtime(CLOCK_REALTIME, &tx);
41570af302Sopenharmony_ci    EXPECT_NE("clock_adjtime_0100", result, -1);
42570af302Sopenharmony_ci}
43570af302Sopenharmony_ci
44570af302Sopenharmony_ci/**
45570af302Sopenharmony_ci * @tc.name      : clock_adjtime_0200
46570af302Sopenharmony_ci * @tc.desc      : Verify that the kernel time can not be adjusted (each parameter is valid, clock_id is
47570af302Sopenharmony_ci *                 CLOCK_MONOTONIC)
48570af302Sopenharmony_ci * @tc.level     : Level 2
49570af302Sopenharmony_ci */
50570af302Sopenharmony_civoid clock_adjtime_0200(void)
51570af302Sopenharmony_ci{
52570af302Sopenharmony_ci    struct timex tx = {ADJ_OFFSET_SS_READ};
53570af302Sopenharmony_ci
54570af302Sopenharmony_ci    int result = clock_adjtime(CLOCK_MONOTONIC, &tx);
55570af302Sopenharmony_ci    EXPECT_EQ("clock_adjtime_0200", result, -1);
56570af302Sopenharmony_ci}
57570af302Sopenharmony_ci
58570af302Sopenharmony_ci/**
59570af302Sopenharmony_ci * @tc.name      : clock_adjtime_0300
60570af302Sopenharmony_ci * @tc.desc      : Verify that the kernel time can not be adjusted (all parameters are valid, clock_id is
61570af302Sopenharmony_ci *                 CLOCK_PROCESS_CPUTIME_ID)
62570af302Sopenharmony_ci * @tc.level     : Level 2
63570af302Sopenharmony_ci */
64570af302Sopenharmony_civoid clock_adjtime_0300(void)
65570af302Sopenharmony_ci{
66570af302Sopenharmony_ci    struct timex tx;
67570af302Sopenharmony_ci    memset(&tx, 0, sizeof(tx));
68570af302Sopenharmony_ci
69570af302Sopenharmony_ci    int result = clock_adjtime(CLOCK_PROCESS_CPUTIME_ID, &tx);
70570af302Sopenharmony_ci    EXPECT_EQ("clock_adjtime_0300", result, -1);
71570af302Sopenharmony_ci}
72570af302Sopenharmony_ci
73570af302Sopenharmony_ci/**
74570af302Sopenharmony_ci * @tc.name      : clock_adjtime_0400
75570af302Sopenharmony_ci * @tc.desc      : Verify that the kernel time can not be adjusted (all parameters are valid, clock_id is
76570af302Sopenharmony_ci *                 CLOCK_THREAD_CPUTIME_ID)
77570af302Sopenharmony_ci * @tc.level     : Level 2
78570af302Sopenharmony_ci */
79570af302Sopenharmony_civoid clock_adjtime_0400(void)
80570af302Sopenharmony_ci{
81570af302Sopenharmony_ci    struct timex tx = {0};
82570af302Sopenharmony_ci    memset(&tx, 0, sizeof(tx));
83570af302Sopenharmony_ci
84570af302Sopenharmony_ci    int result = clock_adjtime(CLOCK_THREAD_CPUTIME_ID, &tx);
85570af302Sopenharmony_ci    EXPECT_EQ("clock_adjtime_0400", result, -1);
86570af302Sopenharmony_ci}
87570af302Sopenharmony_ci
88570af302Sopenharmony_ci/**
89570af302Sopenharmony_ci * @tc.name      : clock_adjtime_0500
90570af302Sopenharmony_ci * @tc.desc      : Verify that kernel time cannot be adjusted (tx parameter invalid)
91570af302Sopenharmony_ci * @tc.level     : Level 2
92570af302Sopenharmony_ci */
93570af302Sopenharmony_civoid clock_adjtime_0500(void)
94570af302Sopenharmony_ci{
95570af302Sopenharmony_ci    signal(SIGSEGV, exception_handler);
96570af302Sopenharmony_ci
97570af302Sopenharmony_ci    errno = 0;
98570af302Sopenharmony_ci    int result = clock_adjtime(CLOCK_REALTIME, NULL);
99570af302Sopenharmony_ci    EXPECT_EQ("clock_adjtime_0500", result, -1);
100570af302Sopenharmony_ci    EXPECT_EQ("clock_adjtime_0500", errno, EFAULT);
101570af302Sopenharmony_ci}
102570af302Sopenharmony_ci
103570af302Sopenharmony_ci/**
104570af302Sopenharmony_ci * @tc.name      : clock_adjtime64_0100
105570af302Sopenharmony_ci * @tc.desc      : Verify that the kernel time can be adjusted (all parameters are valid, clock_id is CLOCK_REALTIME)
106570af302Sopenharmony_ci * @tc.level     : Level 0
107570af302Sopenharmony_ci */
108570af302Sopenharmony_civoid clock_adjtime64_0100(void)
109570af302Sopenharmony_ci{
110570af302Sopenharmony_ci    struct timex tx;
111570af302Sopenharmony_ci    memset(&tx, 0, sizeof(tx));
112570af302Sopenharmony_ci
113570af302Sopenharmony_ci    int result = __clock_adjtime64(CLOCK_REALTIME, &tx);
114570af302Sopenharmony_ci    EXPECT_NE("clock_adjtime64_0100", result, -1);
115570af302Sopenharmony_ci}
116570af302Sopenharmony_ci
117570af302Sopenharmony_ciint main(int argc, char *argv[])
118570af302Sopenharmony_ci{
119570af302Sopenharmony_ci    clock_adjtime_0100();
120570af302Sopenharmony_ci    clock_adjtime_0200();
121570af302Sopenharmony_ci    clock_adjtime_0300();
122570af302Sopenharmony_ci    clock_adjtime_0400();
123570af302Sopenharmony_ci    clock_adjtime_0500();
124570af302Sopenharmony_ci    clock_adjtime64_0100();
125570af302Sopenharmony_ci    return t_status;
126570af302Sopenharmony_ci}