diff options
| author | Greg Hackmann <ghackmann@google.com> | 2016-04-25 15:57:44 -0700 |
|---|---|---|
| committer | Greg Hackmann <ghackmann@google.com> | 2016-05-02 13:59:58 -0700 |
| commit | 340079df2621e27bf8e9f999fbe146fd894fdcfd (patch) | |
| tree | 42507e1f73e2693105c548111616c4e4cf6881df /libutils/tests | |
| parent | 58505e17bb44832ec6d63f62649b666e17bb5ad0 (diff) | |
| download | system_core-340079df2621e27bf8e9f999fbe146fd894fdcfd.tar.gz system_core-340079df2621e27bf8e9f999fbe146fd894fdcfd.tar.bz2 system_core-340079df2621e27bf8e9f999fbe146fd894fdcfd.zip | |
SystemClock: add test
Bug: 28357356
Change-Id: Idf66c048bda09cd8cb08adf89ed0edd3770c4e39
Signed-off-by: Greg Hackmann <ghackmann@google.com>
Diffstat (limited to 'libutils/tests')
| -rw-r--r-- | libutils/tests/Android.mk | 1 | ||||
| -rw-r--r-- | libutils/tests/SystemClock_test.cpp | 74 |
2 files changed, 75 insertions, 0 deletions
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()"; +} |
