1340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann/*
2340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann * Copyright (C) 2016 The Android Open Source Project
3340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann *
4340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann * Licensed under the Apache License, Version 2.0 (the "License");
5340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann * you may not use this file except in compliance with the License.
6340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann * You may obtain a copy of the License at
7340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann *
8340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann *      http://www.apache.org/licenses/LICENSE-2.0
9340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann *
10340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann * Unless required by applicable law or agreed to in writing, software
11340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann * distributed under the License is distributed on an "AS IS" BASIS,
12340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann * See the License for the specific language governing permissions and
14340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann * limitations under the License.
15340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann */
16340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann
17340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann#include <unistd.h>
18340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann#include <utils/SystemClock.h>
19340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann
20340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann#include <gtest/gtest.h>
21340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann
22340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmannstatic const auto MS_IN_NS = 1000000;
23340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann
24340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmannstatic const int64_t SLEEP_MS = 500;
25340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmannstatic const int64_t SLEEP_NS = SLEEP_MS * MS_IN_NS;
26340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann// Conservatively assume that we might be descheduled for up to 50 ms
27340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmannstatic const int64_t SLACK_MS = 50;
28340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmannstatic const int64_t SLACK_NS = SLACK_MS * MS_IN_NS;
29340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann
30340079df2621e27bf8e9f999fbe146fd894fdcfdGreg HackmannTEST(SystemClock, SystemClock) {
31340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    auto startUptimeMs = android::uptimeMillis();
32340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    auto startRealtimeMs = android::elapsedRealtime();
33340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    auto startRealtimeNs = android::elapsedRealtimeNano();
34340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann
35340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    ASSERT_GT(startUptimeMs, 0)
36340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann            << "uptimeMillis() reported an impossible uptime";
37340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    ASSERT_GE(startRealtimeMs, startUptimeMs)
38340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann            << "elapsedRealtime() thinks we've suspended for negative time";
39340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    ASSERT_GE(startRealtimeNs, startUptimeMs * MS_IN_NS)
40340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann            << "elapsedRealtimeNano() thinks we've suspended for negative time";
41340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann
42340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    ASSERT_GE(startRealtimeNs, startRealtimeMs * MS_IN_NS)
43340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann            << "elapsedRealtime() and elapsedRealtimeNano() are inconsistent";
44340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    ASSERT_LT(startRealtimeNs, (startRealtimeMs + SLACK_MS) * MS_IN_NS)
45340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann            << "elapsedRealtime() and elapsedRealtimeNano() are inconsistent";
46340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann
47340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    timespec ts;
48340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    ts.tv_sec = 0;
49340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    ts.tv_nsec = SLEEP_MS * MS_IN_NS;
50340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    auto nanosleepErr = TEMP_FAILURE_RETRY(nanosleep(&ts, nullptr));
51340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    ASSERT_EQ(nanosleepErr, 0) << "nanosleep() failed: " << strerror(errno);
52340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann
53340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    auto endUptimeMs = android::uptimeMillis();
54340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    auto endRealtimeMs = android::elapsedRealtime();
55340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    auto endRealtimeNs = android::elapsedRealtimeNano();
56340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann
57340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    EXPECT_GE(endUptimeMs - startUptimeMs, SLEEP_MS)
58340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann            << "uptimeMillis() advanced too little after nanosleep()";
59340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    EXPECT_LT(endUptimeMs - startUptimeMs, SLEEP_MS + SLACK_MS)
60340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann            << "uptimeMillis() advanced too much after nanosleep()";
61340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    EXPECT_GE(endRealtimeMs - startRealtimeMs, SLEEP_MS)
62340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann            << "elapsedRealtime() advanced too little after nanosleep()";
63340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    EXPECT_LT(endRealtimeMs - startRealtimeMs, SLEEP_MS + SLACK_MS)
64340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann            << "elapsedRealtime() advanced too much after nanosleep()";
65340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    EXPECT_GE(endRealtimeNs - startRealtimeNs, SLEEP_NS)
66340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann            << "elapsedRealtimeNano() advanced too little after nanosleep()";
67340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    EXPECT_LT(endRealtimeNs - startRealtimeNs, SLEEP_NS + SLACK_NS)
68340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann            << "elapsedRealtimeNano() advanced too much after nanosleep()";
69340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann
70340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    EXPECT_GE(endRealtimeNs, endRealtimeMs * MS_IN_NS)
71340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann            << "elapsedRealtime() and elapsedRealtimeNano() are inconsistent after nanosleep()";
72340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann    EXPECT_LT(endRealtimeNs, (endRealtimeMs + SLACK_MS) * MS_IN_NS)
73340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann            << "elapsedRealtime() and elapsedRealtimeNano() are inconsistent after nanosleep()";
74340079df2621e27bf8e9f999fbe146fd894fdcfdGreg Hackmann}
75