am ab5488f9: Merge "Fix transient failure in select_smoke test."

* commit 'ab5488f97545f5dd1a1cd2ff6a5579b1d2443996':
  Fix transient failure in select_smoke test.
This commit is contained in:
Christopher Ferris 2014-04-01 22:03:17 +00:00 committed by Android Git Automerger
commit e42e5b32eb

View File

@ -43,6 +43,32 @@ TEST(sys_select, fd_set_smoke) {
EXPECT_FALSE(FD_ISSET(1, &fds)); EXPECT_FALSE(FD_ISSET(1, &fds));
} }
#define DELAY_MSG "1234"
static void DelayedWrite(int* pid, int* fd) {
int fds[2];
ASSERT_EQ(0, pipe(fds));
if ((*pid = fork()) == 0) {
close(fds[0]);
usleep(5000);
EXPECT_EQ(5, write(fds[1], DELAY_MSG, sizeof(DELAY_MSG)));
close(fds[1]);
exit(0);
}
ASSERT_LT(0, *pid);
close(fds[1]);
*fd = fds[0];
}
static void DelayedWriteCleanup(int pid, int fd) {
char buf[sizeof(DELAY_MSG)];
ASSERT_EQ(static_cast<ssize_t>(sizeof(DELAY_MSG)), read(fd, buf, sizeof(DELAY_MSG)));
ASSERT_STREQ(DELAY_MSG, buf);
ASSERT_EQ(pid, waitpid(pid, NULL, 0));
}
TEST(sys_select, select_smoke) { TEST(sys_select, select_smoke) {
fd_set r; fd_set r;
FD_ZERO(&r); FD_ZERO(&r);
@ -72,8 +98,17 @@ TEST(sys_select, select_smoke) {
// Valid timeout... // Valid timeout...
tv.tv_sec = 1; tv.tv_sec = 1;
ASSERT_EQ(2, select(max, &r, &w, &e, &tv)); int pid, fd;
ASSERT_NE(0, tv.tv_usec); // ...which got updated. DelayedWrite(&pid, &fd);
FD_ZERO(&r);
FD_SET(fd, &r);
ASSERT_EQ(1, select(fd+1, &r, NULL, NULL, &tv));
// Both tv_sec and tv_nsec should have been updated.
ASSERT_EQ(0, tv.tv_sec);
ASSERT_NE(0, tv.tv_usec);
DelayedWriteCleanup(pid, fd);
} }
TEST(sys_select, pselect_smoke) { TEST(sys_select, pselect_smoke) {
@ -109,6 +144,15 @@ TEST(sys_select, pselect_smoke) {
// Valid timeout... // Valid timeout...
tv.tv_sec = 1; tv.tv_sec = 1;
ASSERT_EQ(2, pselect(max, &r, &w, &e, &tv, &ss)); int pid, fd;
ASSERT_EQ(0, tv.tv_nsec); // ...which did _not_ get updated. DelayedWrite(&pid, &fd);
FD_ZERO(&r);
FD_SET(fd, &r);
ASSERT_EQ(1, pselect(fd+1, &r, NULL, NULL, &tv, NULL));
// Neither tv_sec nor tv_nsec should have been updated.
ASSERT_EQ(1, tv.tv_sec);
ASSERT_EQ(0, tv.tv_nsec);
DelayedWriteCleanup(pid, fd);
} }