// Tests receive timeout. The timing verification logic must be very coarse to make sure different
// systems running different loads can all pass these tests.
TEST_F(SocketTest, ReceiveTimeout) {
    time_t start_time;

    ASSERT_TRUE(StartServer());

    // Make sure a 20ms timeout completes in 1 second or less.
    start_time = time(nullptr);
    EXPECT_TRUE(ReceiveTimeout(server_.get(), 20));
    EXPECT_LE(difftime(time(nullptr), start_time), 1.0);

    // Make sure a 1250ms timeout takes 1 second or more.
    start_time = time(nullptr);
    EXPECT_TRUE(ReceiveTimeout(server_.get(), 1250));
    EXPECT_LE(1.0, difftime(time(nullptr), start_time));
}
예제 #2
0
void Pololu::Serial::Interface::receive(std::vector<unsigned char>& data) {
  if (handle) {
    size_t i = 0;
    struct timeval time;
    fd_set set;
    int error;

    while (i < data.size()) {
      time.tv_sec = 0;
      time.tv_usec = timeout*1e6;

      FD_ZERO(&set);
      FD_SET(handle, &set);

      error = select(handle+1, &set, NULL, NULL, &time);
      if (error == 0)
        throw ReceiveTimeout(address);
      else if (error < 0)
        throw ReceiveError(address);

      ssize_t result;
      result = ::read(handle, &data[i], data.size()-i);

      if ((result < 0) && (result != EWOULDBLOCK))
        throw ReceiveError(address);
      else if (result > 0)
        i += result;
    }
  }
  else
    throw OperationError();
}
예제 #3
0
TEST(BlockRecv, ReceiveTimeoutDelay)
{
  usrsocktest_daemon_config = usrsocktest_daemon_defconf;
  usrsocktest_daemon_config.delay_all_responses = true;
  ReceiveTimeout(&usrsocktest_daemon_config);
}
예제 #4
0
TEST(BlockRecv, ReceiveTimeout)
{
  usrsocktest_daemon_config = usrsocktest_daemon_defconf;
  ReceiveTimeout(&usrsocktest_daemon_config);
}