xref: /aosp_15_r20/external/perfetto/src/base/time_unittest.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker  *
4*6dbdd20aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker  *
8*6dbdd20aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker  *
10*6dbdd20aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker  * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker  */
16*6dbdd20aSAndroid Build Coastguard Worker 
17*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/time.h"
18*6dbdd20aSAndroid Build Coastguard Worker 
19*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/utils.h"
20*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
21*6dbdd20aSAndroid Build Coastguard Worker 
22*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
23*6dbdd20aSAndroid Build Coastguard Worker namespace base {
24*6dbdd20aSAndroid Build Coastguard Worker namespace {
25*6dbdd20aSAndroid Build Coastguard Worker 
TEST(TimeTest,Conversions)26*6dbdd20aSAndroid Build Coastguard Worker TEST(TimeTest, Conversions) {
27*6dbdd20aSAndroid Build Coastguard Worker   TimeMillis ms = GetWallTimeMs();
28*6dbdd20aSAndroid Build Coastguard Worker   TimeNanos ns = GetWallTimeNs();
29*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_NEAR(static_cast<double>(ms.count()),
30*6dbdd20aSAndroid Build Coastguard Worker               static_cast<double>(ns.count()) / 1000000, 1000);
31*6dbdd20aSAndroid Build Coastguard Worker 
32*6dbdd20aSAndroid Build Coastguard Worker   {
33*6dbdd20aSAndroid Build Coastguard Worker     struct timespec ts = ToPosixTimespec(TimeMillis(0));
34*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(0, ts.tv_sec);
35*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(0, ts.tv_nsec);
36*6dbdd20aSAndroid Build Coastguard Worker   }
37*6dbdd20aSAndroid Build Coastguard Worker   {
38*6dbdd20aSAndroid Build Coastguard Worker     struct timespec ts = ToPosixTimespec(TimeMillis(1));
39*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(0, ts.tv_sec);
40*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(1000000, ts.tv_nsec);
41*6dbdd20aSAndroid Build Coastguard Worker   }
42*6dbdd20aSAndroid Build Coastguard Worker   {
43*6dbdd20aSAndroid Build Coastguard Worker     struct timespec ts = ToPosixTimespec(TimeMillis(12345));
44*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(12, ts.tv_sec);
45*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(345000000, ts.tv_nsec);
46*6dbdd20aSAndroid Build Coastguard Worker   }
47*6dbdd20aSAndroid Build Coastguard Worker   {
48*6dbdd20aSAndroid Build Coastguard Worker     struct timespec ts = ToPosixTimespec(TimeMillis(1000000000001LL));
49*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(1000000000, ts.tv_sec);
50*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(1000000, ts.tv_nsec);
51*6dbdd20aSAndroid Build Coastguard Worker   }
52*6dbdd20aSAndroid Build Coastguard Worker }
53*6dbdd20aSAndroid Build Coastguard Worker 
TEST(TimeTest,GetTime)54*6dbdd20aSAndroid Build Coastguard Worker TEST(TimeTest, GetTime) {
55*6dbdd20aSAndroid Build Coastguard Worker   const auto start_time = GetWallTimeNs();
56*6dbdd20aSAndroid Build Coastguard Worker   const auto start_cputime = GetThreadCPUTimeNs();
57*6dbdd20aSAndroid Build Coastguard Worker 
58*6dbdd20aSAndroid Build Coastguard Worker   const unsigned ns_in_ms = 1000000;
59*6dbdd20aSAndroid Build Coastguard Worker 
60*6dbdd20aSAndroid Build Coastguard Worker   for (;;) {
61*6dbdd20aSAndroid Build Coastguard Worker     auto cur_time = GetWallTimeNs();
62*6dbdd20aSAndroid Build Coastguard Worker     auto elapsed = cur_time - start_time;
63*6dbdd20aSAndroid Build Coastguard Worker     // Spin for a little while.
64*6dbdd20aSAndroid Build Coastguard Worker     if (elapsed > TimeNanos(20 * ns_in_ms))
65*6dbdd20aSAndroid Build Coastguard Worker       break;
66*6dbdd20aSAndroid Build Coastguard Worker   }
67*6dbdd20aSAndroid Build Coastguard Worker 
68*6dbdd20aSAndroid Build Coastguard Worker   auto end_cputime = GetThreadCPUTimeNs();
69*6dbdd20aSAndroid Build Coastguard Worker   auto elapsed_cputime = end_cputime - start_cputime;
70*6dbdd20aSAndroid Build Coastguard Worker   // Check that we're not burning much more CPU time than the length of time
71*6dbdd20aSAndroid Build Coastguard Worker   // that we spun in the loop. We may burn much less, depending on what else is
72*6dbdd20aSAndroid Build Coastguard Worker   // happening on the test machine.
73*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_LE(elapsed_cputime.count(), 50 * ns_in_ms);
74*6dbdd20aSAndroid Build Coastguard Worker }
75*6dbdd20aSAndroid Build Coastguard Worker 
76*6dbdd20aSAndroid Build Coastguard Worker // This test can work only on Posix platforms which respect the TZ env var.
77*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) ||   \
78*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
79*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE)
TEST(TimeTest,GetTimezoneOffsetMins)80*6dbdd20aSAndroid Build Coastguard Worker TEST(TimeTest, GetTimezoneOffsetMins) {
81*6dbdd20aSAndroid Build Coastguard Worker   const char* tz = getenv("TZ");
82*6dbdd20aSAndroid Build Coastguard Worker   std::string tz_save(tz ? tz : "");
83*6dbdd20aSAndroid Build Coastguard Worker   auto reset_tz_on_exit = OnScopeExit([&] {
84*6dbdd20aSAndroid Build Coastguard Worker     if (!tz_save.empty())
85*6dbdd20aSAndroid Build Coastguard Worker       base::SetEnv("TZ", tz_save.c_str());
86*6dbdd20aSAndroid Build Coastguard Worker   });
87*6dbdd20aSAndroid Build Coastguard Worker 
88*6dbdd20aSAndroid Build Coastguard Worker   // Note: the sign is reversed in the semantic of the TZ env var.
89*6dbdd20aSAndroid Build Coastguard Worker   // UTC+2 means "2 hours to reach UTC", not "2 hours ahead of UTC".
90*6dbdd20aSAndroid Build Coastguard Worker 
91*6dbdd20aSAndroid Build Coastguard Worker   base::SetEnv("TZ", "UTC+2");
92*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(GetTimezoneOffsetMins(), -2 * 60);
93*6dbdd20aSAndroid Build Coastguard Worker 
94*6dbdd20aSAndroid Build Coastguard Worker   base::SetEnv("TZ", "UTC-2");
95*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(GetTimezoneOffsetMins(), 2 * 60);
96*6dbdd20aSAndroid Build Coastguard Worker 
97*6dbdd20aSAndroid Build Coastguard Worker   base::SetEnv("TZ", "UTC-07:45");
98*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(GetTimezoneOffsetMins(), 7 * 60 + 45);
99*6dbdd20aSAndroid Build Coastguard Worker }
100*6dbdd20aSAndroid Build Coastguard Worker #endif
101*6dbdd20aSAndroid Build Coastguard Worker 
102*6dbdd20aSAndroid Build Coastguard Worker }  // namespace
103*6dbdd20aSAndroid Build Coastguard Worker }  // namespace base
104*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
105