From 340079df2621e27bf8e9f999fbe146fd894fdcfd Mon Sep 17 00:00:00 2001 From: Greg Hackmann <ghackmann@google.com> Date: Mon, 25 Apr 2016 15:57:44 -0700 Subject: [PATCH] SystemClock: add test Bug: 28357356 Change-Id: Idf66c048bda09cd8cb08adf89ed0edd3770c4e39 Signed-off-by: Greg Hackmann <ghackmann@google.com> --- libutils/tests/Android.mk | 1 + libutils/tests/SystemClock_test.cpp | 74 +++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 libutils/tests/SystemClock_test.cpp diff --git a/libutils/tests/Android.mk b/libutils/tests/Android.mk index 8f07f1ad1..21fe19c96 100644 --- a/libutils/tests/Android.mk +++ b/libutils/tests/Android.mk @@ -28,6 +28,7 @@ LOCAL_SRC_FILES := \ LruCache_test.cpp \ String8_test.cpp \ StrongPointer_test.cpp \ + SystemClock_test.cpp \ Unicode_test.cpp \ Vector_test.cpp \ diff --git a/libutils/tests/SystemClock_test.cpp b/libutils/tests/SystemClock_test.cpp new file mode 100644 index 000000000..5ad060b04 --- /dev/null +++ b/libutils/tests/SystemClock_test.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <unistd.h> +#include <utils/SystemClock.h> + +#include <gtest/gtest.h> + +static const auto MS_IN_NS = 1000000; + +static const int64_t SLEEP_MS = 500; +static const int64_t SLEEP_NS = SLEEP_MS * MS_IN_NS; +// Conservatively assume that we might be descheduled for up to 50 ms +static const int64_t SLACK_MS = 50; +static const int64_t SLACK_NS = SLACK_MS * MS_IN_NS; + +TEST(SystemClock, SystemClock) { + auto startUptimeMs = android::uptimeMillis(); + auto startRealtimeMs = android::elapsedRealtime(); + auto startRealtimeNs = android::elapsedRealtimeNano(); + + ASSERT_GT(startUptimeMs, 0) + << "uptimeMillis() reported an impossible uptime"; + ASSERT_GE(startRealtimeMs, startUptimeMs) + << "elapsedRealtime() thinks we've suspended for negative time"; + ASSERT_GE(startRealtimeNs, startUptimeMs * MS_IN_NS) + << "elapsedRealtimeNano() thinks we've suspended for negative time"; + + ASSERT_GE(startRealtimeNs, startRealtimeMs * MS_IN_NS) + << "elapsedRealtime() and elapsedRealtimeNano() are inconsistent"; + ASSERT_LT(startRealtimeNs, (startRealtimeMs + SLACK_MS) * MS_IN_NS) + << "elapsedRealtime() and elapsedRealtimeNano() are inconsistent"; + + timespec ts; + ts.tv_sec = 0; + ts.tv_nsec = SLEEP_MS * MS_IN_NS; + auto nanosleepErr = TEMP_FAILURE_RETRY(nanosleep(&ts, nullptr)); + ASSERT_EQ(nanosleepErr, 0) << "nanosleep() failed: " << strerror(errno); + + auto endUptimeMs = android::uptimeMillis(); + auto endRealtimeMs = android::elapsedRealtime(); + auto endRealtimeNs = android::elapsedRealtimeNano(); + + EXPECT_GE(endUptimeMs - startUptimeMs, SLEEP_MS) + << "uptimeMillis() advanced too little after nanosleep()"; + EXPECT_LT(endUptimeMs - startUptimeMs, SLEEP_MS + SLACK_MS) + << "uptimeMillis() advanced too much after nanosleep()"; + EXPECT_GE(endRealtimeMs - startRealtimeMs, SLEEP_MS) + << "elapsedRealtime() advanced too little after nanosleep()"; + EXPECT_LT(endRealtimeMs - startRealtimeMs, SLEEP_MS + SLACK_MS) + << "elapsedRealtime() advanced too much after nanosleep()"; + EXPECT_GE(endRealtimeNs - startRealtimeNs, SLEEP_NS) + << "elapsedRealtimeNano() advanced too little after nanosleep()"; + EXPECT_LT(endRealtimeNs - startRealtimeNs, SLEEP_NS + SLACK_NS) + << "elapsedRealtimeNano() advanced too much after nanosleep()"; + + EXPECT_GE(endRealtimeNs, endRealtimeMs * MS_IN_NS) + << "elapsedRealtime() and elapsedRealtimeNano() are inconsistent after nanosleep()"; + EXPECT_LT(endRealtimeNs, (endRealtimeMs + SLACK_MS) * MS_IN_NS) + << "elapsedRealtime() and elapsedRealtimeNano() are inconsistent after nanosleep()"; +}