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