| OLD | NEW |
| 1 /* Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 /* Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 * Use of this source code is governed by a BSD-style license that can be | 2 * Use of this source code is governed by a BSD-style license that can be |
| 3 * found in the LICENSE file. | 3 * found in the LICENSE file. |
| 4 */ | 4 */ |
| 5 | 5 |
| 6 #include <errno.h> | 6 #include <errno.h> |
| 7 #include <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <pthread.h> | 8 #include <pthread.h> |
| 9 #include <stdio.h> | 9 #include <stdio.h> |
| 10 #include <sys/ioctl.h> | 10 #include <sys/ioctl.h> |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 fd_set rd_set; | 266 fd_set rd_set; |
| 267 fd_set wr_set; | 267 fd_set wr_set; |
| 268 fd_set ex_set; | 268 fd_set ex_set; |
| 269 struct pollfd pollfds[MAX_FDS]; | 269 struct pollfd pollfds[MAX_FDS]; |
| 270 }; | 270 }; |
| 271 | 271 |
| 272 TEST_F(SelectPollTest, PollMemPipe) { | 272 TEST_F(SelectPollTest, PollMemPipe) { |
| 273 int fds[2]; | 273 int fds[2]; |
| 274 | 274 |
| 275 // Both FDs for regular files should be read/write but not exception. | 275 // Both FDs for regular files should be read/write but not exception. |
| 276 fds[0] = kp->open("/test.txt", O_CREAT | O_WRONLY); | 276 fds[0] = kp->open("/test.txt", O_CREAT | O_WRONLY, 0777); |
| 277 fds[1] = kp->open("/test.txt", O_RDONLY); | 277 fds[1] = kp->open("/test.txt", O_RDONLY, 0); |
| 278 ASSERT_GT(fds[0], -1); | 278 ASSERT_GT(fds[0], -1); |
| 279 ASSERT_GT(fds[1], -1); | 279 ASSERT_GT(fds[1], -1); |
| 280 | 280 |
| 281 SetFDs(fds, 2); | 281 SetFDs(fds, 2); |
| 282 | 282 |
| 283 ASSERT_EQ(2, kp->poll(pollfds, 2, 0)); | 283 ASSERT_EQ(2, kp->poll(pollfds, 2, 0)); |
| 284 ASSERT_EQ(POLLIN | POLLOUT, pollfds[0].revents); | 284 ASSERT_EQ(POLLIN | POLLOUT, pollfds[0].revents); |
| 285 ASSERT_EQ(POLLIN | POLLOUT, pollfds[1].revents); | 285 ASSERT_EQ(POLLIN | POLLOUT, pollfds[1].revents); |
| 286 CloseFDs(fds, 2); | 286 CloseFDs(fds, 2); |
| 287 | 287 |
| 288 // The write FD should select for write-only, read FD should not select | 288 // The write FD should select for write-only, read FD should not select |
| 289 ASSERT_EQ(0, kp->pipe(fds)); | 289 ASSERT_EQ(0, kp->pipe(fds)); |
| 290 SetFDs(fds, 2); | 290 SetFDs(fds, 2); |
| 291 | 291 |
| 292 ASSERT_EQ(2, kp->poll(pollfds, 2, 0)); | 292 ASSERT_EQ(2, kp->poll(pollfds, 2, 0)); |
| 293 // TODO(noelallen) fix poll based on open mode | 293 // TODO(noelallen) fix poll based on open mode |
| 294 // EXPECT_EQ(0, pollfds[0].revents); | 294 // EXPECT_EQ(0, pollfds[0].revents); |
| 295 // Bug 291018 | 295 // Bug 291018 |
| 296 ASSERT_EQ(POLLOUT, pollfds[1].revents); | 296 ASSERT_EQ(POLLOUT, pollfds[1].revents); |
| 297 | 297 |
| 298 CloseFDs(fds, 2); | 298 CloseFDs(fds, 2); |
| 299 } | 299 } |
| 300 | 300 |
| 301 TEST_F(SelectPollTest, SelectMemPipe) { | 301 TEST_F(SelectPollTest, SelectMemPipe) { |
| 302 int fds[2]; | 302 int fds[2]; |
| 303 | 303 |
| 304 // Both FDs for regular files should be read/write but not exception. | 304 // Both FDs for regular files should be read/write but not exception. |
| 305 fds[0] = kp->open("/test.txt", O_CREAT | O_WRONLY); | 305 fds[0] = kp->open("/test.txt", O_CREAT | O_WRONLY, 0777); |
| 306 fds[1] = kp->open("/test.txt", O_RDONLY); | 306 fds[1] = kp->open("/test.txt", O_RDONLY, 0); |
| 307 ASSERT_GT(fds[0], -1); | 307 ASSERT_GT(fds[0], -1); |
| 308 ASSERT_GT(fds[1], -1); | 308 ASSERT_GT(fds[1], -1); |
| 309 SetFDs(fds, 2); | 309 SetFDs(fds, 2); |
| 310 | 310 |
| 311 ASSERT_EQ(4, kp->select(fds[1] + 1, &rd_set, &wr_set, &ex_set, &tv)); | 311 ASSERT_EQ(4, kp->select(fds[1] + 1, &rd_set, &wr_set, &ex_set, &tv)); |
| 312 EXPECT_NE(0, FD_ISSET(fds[0], &rd_set)); | 312 EXPECT_NE(0, FD_ISSET(fds[0], &rd_set)); |
| 313 EXPECT_NE(0, FD_ISSET(fds[1], &rd_set)); | 313 EXPECT_NE(0, FD_ISSET(fds[1], &rd_set)); |
| 314 EXPECT_NE(0, FD_ISSET(fds[0], &wr_set)); | 314 EXPECT_NE(0, FD_ISSET(fds[0], &wr_set)); |
| 315 EXPECT_NE(0, FD_ISSET(fds[1], &wr_set)); | 315 EXPECT_NE(0, FD_ISSET(fds[1], &wr_set)); |
| 316 EXPECT_EQ(0, FD_ISSET(fds[0], &ex_set)); | 316 EXPECT_EQ(0, FD_ISSET(fds[0], &ex_set)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 337 * Test that calling select() only writes the initial parts of the fd_sets | 337 * Test that calling select() only writes the initial parts of the fd_sets |
| 338 * passed in. | 338 * passed in. |
| 339 * We had an issue when select() was calling FD_ZERO() on the incoming fd_sets | 339 * We had an issue when select() was calling FD_ZERO() on the incoming fd_sets |
| 340 * which was causing corruption in ssh which always allocates the fd_sets to be | 340 * which was causing corruption in ssh which always allocates the fd_sets to be |
| 341 * hold 'nfds' worth of descriptors. | 341 * hold 'nfds' worth of descriptors. |
| 342 */ | 342 */ |
| 343 TEST_F(SelectPollTest, SelectPartialFdset) { | 343 TEST_F(SelectPollTest, SelectPartialFdset) { |
| 344 int fds[2]; | 344 int fds[2]; |
| 345 | 345 |
| 346 // Both FDs for regular files should be read/write but not exception. | 346 // Both FDs for regular files should be read/write but not exception. |
| 347 fds[0] = kp->open("/test.txt", O_CREAT | O_WRONLY); | 347 fds[0] = kp->open("/test.txt", O_CREAT | O_WRONLY, 0777); |
| 348 fds[1] = kp->open("/test.txt", O_RDONLY); | 348 fds[1] = kp->open("/test.txt", O_RDONLY, 0); |
| 349 ASSERT_GT(fds[0], -1); | 349 ASSERT_GT(fds[0], -1); |
| 350 ASSERT_GT(fds[1], -1); | 350 ASSERT_GT(fds[1], -1); |
| 351 ASSERT_LT(fds[1], 8); | 351 ASSERT_LT(fds[1], 8); |
| 352 SetFDs(fds, 2); | 352 SetFDs(fds, 2); |
| 353 | 353 |
| 354 // Fill in all the remaining bytes in the fd_sets a constant value | 354 // Fill in all the remaining bytes in the fd_sets a constant value |
| 355 static const char guard_value = 0xab; | 355 static const char guard_value = 0xab; |
| 356 for (int i = 1; i < sizeof(fd_set); i++) { | 356 for (int i = 1; i < sizeof(fd_set); i++) { |
| 357 ((char*)&rd_set)[i] = guard_value; | 357 ((char*)&rd_set)[i] = guard_value; |
| 358 ((char*)&wr_set)[i] = guard_value; | 358 ((char*)&wr_set)[i] = guard_value; |
| 359 ((char*)&ex_set)[i] = guard_value; | 359 ((char*)&ex_set)[i] = guard_value; |
| 360 } | 360 } |
| 361 | 361 |
| 362 ASSERT_EQ(4, kp->select(fds[1] + 1, &rd_set, &wr_set, &ex_set, &tv)); | 362 ASSERT_EQ(4, kp->select(fds[1] + 1, &rd_set, &wr_set, &ex_set, &tv)); |
| 363 | 363 |
| 364 // Verify guard values were not touched. | 364 // Verify guard values were not touched. |
| 365 for (int i = 1; i < sizeof(fd_set); i++) { | 365 for (int i = 1; i < sizeof(fd_set); i++) { |
| 366 ASSERT_EQ(guard_value, ((char*)&rd_set)[i]); | 366 ASSERT_EQ(guard_value, ((char*)&rd_set)[i]); |
| 367 ASSERT_EQ(guard_value, ((char*)&wr_set)[i]); | 367 ASSERT_EQ(guard_value, ((char*)&wr_set)[i]); |
| 368 ASSERT_EQ(guard_value, ((char*)&ex_set)[i]); | 368 ASSERT_EQ(guard_value, ((char*)&ex_set)[i]); |
| 369 } | 369 } |
| 370 } | 370 } |
| OLD | NEW |