1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <benchmark/benchmark.h>
17 #include "datetime_ex.h"
18 #include <unistd.h>
19 #include <iostream>
20 #include "benchmark_log.h"
21 #include "benchmark_assert.h"
22 using namespace std;
23 
24 namespace OHOS {
25 namespace {
26 
27 class BenchmarkDateTimeTest : public benchmark::Fixture {
28 public:
SetUp(const::benchmark::State & state)29     void SetUp(const ::benchmark::State& state) override
30     {
31     }
32 
TearDown(const::benchmark::State & state)33     void TearDown(const ::benchmark::State& state) override
34     {
35     }
36 
BenchmarkDateTimeTest()37     BenchmarkDateTimeTest()
38     {
39         Iterations(iterations);
40         Repetitions(repetitions);
41         ReportAggregatesOnly();
42     }
43 
44     ~BenchmarkDateTimeTest() override = default;
45 
46 protected:
47     const int32_t repetitions = 3;
48     const int32_t iterations = 1000;
49 };
50 
51 const int64_t SLEEP_DURATION_MICROSECONDS = 100;
52 
53 /*
54  * @tc.name: testTimecover001
55  * @tc.desc: convert all letters of str to uppercase
56  */
BENCHMARK_F(BenchmarkDateTimeTest,testTimecover001)57 BENCHMARK_F(BenchmarkDateTimeTest, testTimecover001)(benchmark::State& state)
58 {
59     BENCHMARK_LOGD("DateTimeTest testTimecover001 start.");
60     while (state.KeepRunning()) {
61         const int64_t second = 20;
62         const int64_t nanosecondsInASecond = 20000000000;
63         AssertEqual(SecToNanosec(second), nanosecondsInASecond,
64             "SecToNanosec(second) did not equal nanosecondsInASecond as expected.", state);
65         const int64_t millsec = 10;
66         const int64_t nanosecondsInAMillisecond = 10000000;
67         AssertEqual(MillisecToNanosec(millsec), nanosecondsInAMillisecond,
68             "MillisecToNanosec(millsec) did not equal nanosecondsInAMillisecond as expected.", state);
69         const int64_t microsec = 5;
70         const int64_t nanosecondsInAMicrosecond = 5000;
71         AssertEqual(MicrosecToNanosec(microsec), nanosecondsInAMicrosecond,
72             "MicrosecToNanosec(microsec) did not equal nanosecondsInAMicrosecond as expected.", state);
73 
74         const int64_t nanoces = 1000000000;
75         const int64_t secondsInANanosecond = 1;
76         const int64_t millisecondsInANanosecond = 1000;
77         const int64_t microsecondsInANanosecond = 1000000;
78         AssertEqual(NanosecToSec(nanoces), secondsInANanosecond,
79             "NanosecToSec(nanoces) did not equal secondsInANanosecond as expected.", state);
80         AssertEqual(NanosecToMillisec(nanoces), millisecondsInANanosecond,
81             "NanosecToMillisec(nanoces) did not equal millisecondsInANanosecond as expected.", state);
82         AssertEqual(NanosecToMicrosec(nanoces), microsecondsInANanosecond,
83             "NanosecToMicrosec(nanoces) did not equal microsecondsInANanosecond as expected.", state);
84     }
85     BENCHMARK_LOGD("DateTimeTest testTimecover001 end.");
86 }
87 
88 /*
89  * @tc.name: testTime001
90  * @tc.desc: datetime unit
91  */
BENCHMARK_F(BenchmarkDateTimeTest,testTime001)92 BENCHMARK_F(BenchmarkDateTimeTest, testTime001)(benchmark::State& state)
93 {
94     BENCHMARK_LOGD("DateTimeTest testTime001 start.");
95     while (state.KeepRunning()) {
96         int64_t second = GetSecondsSince1970ToNow();
97 
98         struct tm curTime = {0};
99         bool ret = GetSystemCurrentTime(&curTime);
100         AssertEqual(ret, true, "ret did not equal true as expected.", state);
101         ret = GetSystemCurrentTime(nullptr);
102         AssertEqual(ret, false, "ret did not equal false as expected.", state);
103 
104         int64_t second2 = GetSecondsSince1970ToPointTime(curTime);
105         AssertEqual(second, second2, "second did not equal second2 as expected.", state);
106         struct tm info;
107         info.tm_year = INT32_MIN;
108         info.tm_mon = 0;
109         info.tm_mday = 0;
110         info.tm_hour = 0;
111         info.tm_min = 0;
112         info.tm_sec = 0;
113         info.tm_isdst = 0;
114         const int64_t invalidReturnValue = -1;
115         second2 = GetSecondsSince1970ToPointTime(info);
116         AssertEqual(invalidReturnValue, second2, "invalidReturnValue did not equal second2 as expected.", state);
117         int64_t ret2 = GetSecondsBetween(curTime, info);
118         AssertTrue((ret2 = invalidReturnValue), "ret2 = invalidReturnValue did not equal true as expected.", state);
119     }
120     BENCHMARK_LOGD("DateTimeTest testTime001 end.");
121 }
122 
123 /*
124  * @tc.name: testTime002
125  * @tc.desc: datetime unit
126  */
BENCHMARK_F(BenchmarkDateTimeTest,testTime002)127 BENCHMARK_F(BenchmarkDateTimeTest, testTime002)(benchmark::State& state)
128 {
129     BENCHMARK_LOGD("DateTimeTest testTime002 start.");
130     while (state.KeepRunning()) {
131         int64_t days = GetDaysSince1970ToNow();
132         int64_t seconds = GetSecondsSince1970ToNow();
133         const int64_t secondsInAnHour = 3600;
134         const int64_t hoursInADay = 24;
135         int64_t resultdays = seconds / (secondsInAnHour * hoursInADay);
136         AssertEqual(days, resultdays, "days did not equal resultdays as expected.", state);
137     }
138     BENCHMARK_LOGD("DateTimeTest testTime002 end.");
139 }
140 
141 /*
142  * @tc.name: testTime003
143  * @tc.desc: datetime unit
144  */
BENCHMARK_F(BenchmarkDateTimeTest,testTime003)145 BENCHMARK_F(BenchmarkDateTimeTest, testTime003)(benchmark::State& state)
146 {
147     BENCHMARK_LOGD("DateTimeTest testTime003 start.");
148     while (state.KeepRunning()) {
149         struct tm curTime = { 0 };
150         bool ret = GetSystemCurrentTime(&curTime);
151         AssertEqual(ret, true, "ret did not equal true as expected.", state);
152 
153         struct tm curTime2 = { 0 };
154         ret = GetSystemCurrentTime(&curTime2);
155         AssertEqual(ret, true, "ret did not equal true as expected.", state);
156         int64_t betweensec = GetSecondsBetween(curTime, curTime2);
157         AssertGreaterThanOrEqual(betweensec, 0, "betweensec >= 0 did not equal true as expected.", state);
158     }
159     BENCHMARK_LOGD("DateTimeTest testTime003 end.");
160 }
161 
162 /*
163  * @tc.name: testTime004
164  * @tc.desc: datetime unit
165  */
BENCHMARK_F(BenchmarkDateTimeTest,testTime004)166 BENCHMARK_F(BenchmarkDateTimeTest, testTime004)(benchmark::State& state)
167 {
168     BENCHMARK_LOGD("DateTimeTest testTime004 start.");
169     while (state.KeepRunning()) {
170         int timezone = 0;
171         bool ret = GetLocalTimeZone(timezone);
172         AssertEqual(ret, true, "ret did not equal true as expected.", state);
173     }
174     BENCHMARK_LOGD("DateTimeTest testTime004 end.");
175 }
176 
177 /*
178  * @tc.name: testGetTickCount001
179  * @tc.desc: datetime unit
180  */
BENCHMARK_F(BenchmarkDateTimeTest,testGetTickCount001)181 BENCHMARK_F(BenchmarkDateTimeTest, testGetTickCount001)(benchmark::State& state)
182 {
183     BENCHMARK_LOGD("DateTimeTest testGetTickCount001 start.");
184     while (state.KeepRunning()) {
185         int64_t begin = GetTickCount();
186         usleep(SLEEP_DURATION_MICROSECONDS);
187         int64_t end = GetTickCount();
188 
189         AssertGreaterThanOrEqual(end - begin, 0, "end - begin >= 0 did not equal true as expected.", state);
190     }
191     BENCHMARK_LOGD("DateTimeTest testGetTickCount001 end.");
192 }
193 
194 /*
195  * @tc.name: testGetMicroTickCount001
196  * @tc.desc: datetime unit
197  */
BENCHMARK_F(BenchmarkDateTimeTest,testGetMicroTickCount001)198 BENCHMARK_F(BenchmarkDateTimeTest, testGetMicroTickCount001)(benchmark::State& state)
199 {
200     BENCHMARK_LOGD("DateTimeTest testGetMicroTickCount001 start.");
201     while (state.KeepRunning()) {
202         int64_t begin = GetMicroTickCount();
203         usleep(SLEEP_DURATION_MICROSECONDS);
204         int64_t end = GetMicroTickCount();
205 
206         AssertGreaterThanOrEqual(end - begin, 0, "end - begin >= 0 did not equal true as expected.", state);
207     }
208     BENCHMARK_LOGD("DateTimeTest testGetMicroTickCount001 end.");
209 }
210 }  // namespace
211 }  // namespace OHOS
212 // Run the benchmark
213 BENCHMARK_MAIN();