diff options
Diffstat (limited to 'tools/testing/selftests/rtc/rtctest.c')
| -rw-r--r-- | tools/testing/selftests/rtc/rtctest.c | 109 |
1 files changed, 104 insertions, 5 deletions
diff --git a/tools/testing/selftests/rtc/rtctest.c b/tools/testing/selftests/rtc/rtctest.c index e20b017e7073..b2065536d407 100644 --- a/tools/testing/selftests/rtc/rtctest.c +++ b/tools/testing/selftests/rtc/rtctest.c | |||
| @@ -145,15 +145,12 @@ TEST_F(rtc, alarm_alm_set) { | |||
| 145 | 145 | ||
| 146 | rc = select(self->fd + 1, &readfds, NULL, NULL, &tv); | 146 | rc = select(self->fd + 1, &readfds, NULL, NULL, &tv); |
| 147 | ASSERT_NE(-1, rc); | 147 | ASSERT_NE(-1, rc); |
| 148 | EXPECT_NE(0, rc); | 148 | ASSERT_NE(0, rc); |
| 149 | 149 | ||
| 150 | /* Disable alarm interrupts */ | 150 | /* Disable alarm interrupts */ |
| 151 | rc = ioctl(self->fd, RTC_AIE_OFF, 0); | 151 | rc = ioctl(self->fd, RTC_AIE_OFF, 0); |
| 152 | ASSERT_NE(-1, rc); | 152 | ASSERT_NE(-1, rc); |
| 153 | 153 | ||
| 154 | if (rc == 0) | ||
| 155 | return; | ||
| 156 | |||
| 157 | rc = read(self->fd, &data, sizeof(unsigned long)); | 154 | rc = read(self->fd, &data, sizeof(unsigned long)); |
| 158 | ASSERT_NE(-1, rc); | 155 | ASSERT_NE(-1, rc); |
| 159 | TH_LOG("data: %lx", data); | 156 | TH_LOG("data: %lx", data); |
| @@ -202,7 +199,109 @@ TEST_F(rtc, alarm_wkalm_set) { | |||
| 202 | 199 | ||
| 203 | rc = select(self->fd + 1, &readfds, NULL, NULL, &tv); | 200 | rc = select(self->fd + 1, &readfds, NULL, NULL, &tv); |
| 204 | ASSERT_NE(-1, rc); | 201 | ASSERT_NE(-1, rc); |
| 205 | EXPECT_NE(0, rc); | 202 | ASSERT_NE(0, rc); |
| 203 | |||
| 204 | rc = read(self->fd, &data, sizeof(unsigned long)); | ||
| 205 | ASSERT_NE(-1, rc); | ||
| 206 | |||
| 207 | rc = ioctl(self->fd, RTC_RD_TIME, &tm); | ||
| 208 | ASSERT_NE(-1, rc); | ||
| 209 | |||
| 210 | new = timegm((struct tm *)&tm); | ||
| 211 | ASSERT_EQ(new, secs); | ||
| 212 | } | ||
| 213 | |||
| 214 | TEST_F(rtc, alarm_alm_set_minute) { | ||
| 215 | struct timeval tv = { .tv_sec = 62 }; | ||
| 216 | unsigned long data; | ||
| 217 | struct rtc_time tm; | ||
| 218 | fd_set readfds; | ||
| 219 | time_t secs, new; | ||
| 220 | int rc; | ||
| 221 | |||
| 222 | rc = ioctl(self->fd, RTC_RD_TIME, &tm); | ||
| 223 | ASSERT_NE(-1, rc); | ||
| 224 | |||
| 225 | secs = timegm((struct tm *)&tm) + 60 - tm.tm_sec; | ||
| 226 | gmtime_r(&secs, (struct tm *)&tm); | ||
| 227 | |||
| 228 | rc = ioctl(self->fd, RTC_ALM_SET, &tm); | ||
| 229 | if (rc == -1) { | ||
| 230 | ASSERT_EQ(EINVAL, errno); | ||
| 231 | TH_LOG("skip alarms are not supported."); | ||
| 232 | return; | ||
| 233 | } | ||
| 234 | |||
| 235 | rc = ioctl(self->fd, RTC_ALM_READ, &tm); | ||
| 236 | ASSERT_NE(-1, rc); | ||
| 237 | |||
| 238 | TH_LOG("Alarm time now set to %02d:%02d:%02d.", | ||
| 239 | tm.tm_hour, tm.tm_min, tm.tm_sec); | ||
| 240 | |||
| 241 | /* Enable alarm interrupts */ | ||
| 242 | rc = ioctl(self->fd, RTC_AIE_ON, 0); | ||
| 243 | ASSERT_NE(-1, rc); | ||
| 244 | |||
| 245 | FD_ZERO(&readfds); | ||
| 246 | FD_SET(self->fd, &readfds); | ||
| 247 | |||
| 248 | rc = select(self->fd + 1, &readfds, NULL, NULL, &tv); | ||
| 249 | ASSERT_NE(-1, rc); | ||
| 250 | ASSERT_NE(0, rc); | ||
| 251 | |||
| 252 | /* Disable alarm interrupts */ | ||
| 253 | rc = ioctl(self->fd, RTC_AIE_OFF, 0); | ||
| 254 | ASSERT_NE(-1, rc); | ||
| 255 | |||
| 256 | rc = read(self->fd, &data, sizeof(unsigned long)); | ||
| 257 | ASSERT_NE(-1, rc); | ||
| 258 | TH_LOG("data: %lx", data); | ||
| 259 | |||
| 260 | rc = ioctl(self->fd, RTC_RD_TIME, &tm); | ||
| 261 | ASSERT_NE(-1, rc); | ||
| 262 | |||
| 263 | new = timegm((struct tm *)&tm); | ||
| 264 | ASSERT_EQ(new, secs); | ||
| 265 | } | ||
| 266 | |||
| 267 | TEST_F(rtc, alarm_wkalm_set_minute) { | ||
| 268 | struct timeval tv = { .tv_sec = 62 }; | ||
| 269 | struct rtc_wkalrm alarm = { 0 }; | ||
| 270 | struct rtc_time tm; | ||
| 271 | unsigned long data; | ||
| 272 | fd_set readfds; | ||
| 273 | time_t secs, new; | ||
| 274 | int rc; | ||
| 275 | |||
| 276 | rc = ioctl(self->fd, RTC_RD_TIME, &alarm.time); | ||
| 277 | ASSERT_NE(-1, rc); | ||
| 278 | |||
| 279 | secs = timegm((struct tm *)&alarm.time) + 60 - alarm.time.tm_sec; | ||
| 280 | gmtime_r(&secs, (struct tm *)&alarm.time); | ||
| 281 | |||
| 282 | alarm.enabled = 1; | ||
| 283 | |||
| 284 | rc = ioctl(self->fd, RTC_WKALM_SET, &alarm); | ||
| 285 | if (rc == -1) { | ||
| 286 | ASSERT_EQ(EINVAL, errno); | ||
| 287 | TH_LOG("skip alarms are not supported."); | ||
| 288 | return; | ||
| 289 | } | ||
| 290 | |||
| 291 | rc = ioctl(self->fd, RTC_WKALM_RD, &alarm); | ||
| 292 | ASSERT_NE(-1, rc); | ||
| 293 | |||
| 294 | TH_LOG("Alarm time now set to %02d/%02d/%02d %02d:%02d:%02d.", | ||
| 295 | alarm.time.tm_mday, alarm.time.tm_mon + 1, | ||
| 296 | alarm.time.tm_year + 1900, alarm.time.tm_hour, | ||
| 297 | alarm.time.tm_min, alarm.time.tm_sec); | ||
| 298 | |||
| 299 | FD_ZERO(&readfds); | ||
| 300 | FD_SET(self->fd, &readfds); | ||
| 301 | |||
| 302 | rc = select(self->fd + 1, &readfds, NULL, NULL, &tv); | ||
| 303 | ASSERT_NE(-1, rc); | ||
| 304 | ASSERT_NE(0, rc); | ||
| 206 | 305 | ||
| 207 | rc = read(self->fd, &data, sizeof(unsigned long)); | 306 | rc = read(self->fd, &data, sizeof(unsigned long)); |
| 208 | ASSERT_NE(-1, rc); | 307 | ASSERT_NE(-1, rc); |
