diff options
author | Mark Salyzyn <salyzyn@google.com> | 2016-01-26 11:18:48 -0800 |
---|---|---|
committer | Mark Salyzyn <salyzyn@google.com> | 2016-01-26 11:22:06 -0800 |
commit | de9b37d793554343026636455e60b63400ca339e (patch) | |
tree | 7670b37734f124895ea7cf8ae2e687249d69ea30 /tests | |
parent | 9427861d2746735378aa3dc628c917fac2acec83 (diff) | |
download | extras-de9b37d793554343026636455e60b63400ca339e.tar.gz |
rtc_test: EACCES acceptable for write
If we can not write to /dev/rtc0, then accept result
Requires /dev/rtc0 to be something like mode 440.
Bug: 26792522
Change-Id: Ief2ac5cd1bac4b0272ef9d9bf096ed4000163244
Diffstat (limited to 'tests')
-rw-r--r-- | tests/timetest/rtc_test.cpp | 51 |
1 files changed, 42 insertions, 9 deletions
diff --git a/tests/timetest/rtc_test.cpp b/tests/timetest/rtc_test.cpp index 9dd6fd89..d1c9eafc 100644 --- a/tests/timetest/rtc_test.cpp +++ b/tests/timetest/rtc_test.cpp @@ -18,15 +18,38 @@ #include <fcntl.h> #include <linux/rtc.h> #include <sys/ioctl.h> +#include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <gtest/gtest.h> static int hwtime(int flag, int request, struct rtc_time *tm) { - int ret; + static const char rtc[] = "/dev/rtc0"; + + int ret = TEMP_FAILURE_RETRY(access(rtc, flag & O_WRONLY) ? W_OK : R_OK); + if (ret < 0) { + ret = -errno; + } + if (ret == -EACCES) { + return ret; + } + + if (flag & O_WRONLY) { + struct stat st; + ret = TEMP_FAILURE_RETRY(stat(rtc, &st)); + if (ret < 0) { + ret = -errno; + } else if (!(st.st_mode & (S_IWUSR|S_IWGRP|S_IWOTH))) { + ret = -EACCES; + } + } + if (ret == -EACCES) { + return ret; + } + do { - ret = TEMP_FAILURE_RETRY(open("/dev/rtc0", flag)); + ret = TEMP_FAILURE_RETRY(open(rtc, flag)); if (ret < 0) { ret = -errno; } @@ -94,9 +117,15 @@ TEST(time, rtc_rollover) { roll.tm_yday = 0; roll.tm_isdst = 0; + bool eacces = true; for (roll.tm_year = 70; roll.tm_year < 137; ++roll.tm_year) { struct rtc_time tm = roll; int __set_hwtime = set_hwtime(&tm); + // Allowed to be 100% denied for writing + if ((__set_hwtime == -EACCES) && (eacces == true)) { + continue; + } + eacces = false; // below 2015, permitted to error out. if ((__set_hwtime == -EINVAL) && (roll.tm_year < 115)) { continue; @@ -137,13 +166,17 @@ TEST(time, rtc_rollover) { } } - ASSERT_LE(0, set_hwtime(&save)); + if (!eacces) { + ASSERT_LE(0, set_hwtime(&save)); + } ASSERT_LE(0, rd_hwtime(&roll)); - ASSERT_EQ(save.tm_sec, roll.tm_sec); - ASSERT_EQ(save.tm_min, roll.tm_min); - ASSERT_EQ(save.tm_hour, roll.tm_hour); - ASSERT_EQ(save.tm_mday, roll.tm_mday); - ASSERT_EQ(save.tm_mon, roll.tm_mon); - ASSERT_EQ(save.tm_year, roll.tm_year); + if (!eacces) { + ASSERT_EQ(save.tm_sec, roll.tm_sec); + ASSERT_EQ(save.tm_min, roll.tm_min); + ASSERT_EQ(save.tm_hour, roll.tm_hour); + ASSERT_EQ(save.tm_mday, roll.tm_mday); + ASSERT_EQ(save.tm_mon, roll.tm_mon); + ASSERT_EQ(save.tm_year, roll.tm_year); + } } |