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