| Index: webrtc/p2p/base/stunport_unittest.cc
 | 
| diff --git a/webrtc/p2p/base/stunport_unittest.cc b/webrtc/p2p/base/stunport_unittest.cc
 | 
| index 522369d487c391245d60c1edad292fe29dcdbdf6..a16887f012f6a2e786f4ff9aef88ce0490da63bb 100644
 | 
| --- a/webrtc/p2p/base/stunport_unittest.cc
 | 
| +++ b/webrtc/p2p/base/stunport_unittest.cc
 | 
| @@ -43,10 +43,9 @@ static const int kHighCostPortKeepaliveLifetimeMs = 2 * 60 * 1000;
 | 
|  // Tests connecting a StunPort to a fake STUN server (cricket::StunServer)
 | 
|  // TODO: Use a VirtualSocketServer here. We have to use a
 | 
|  // PhysicalSocketServer right now since DNS is not part of SocketServer yet.
 | 
| -class StunPortTest : public testing::Test,
 | 
| -                     public sigslot::has_slots<> {
 | 
| +class StunPortTestBase : public testing::Test, public sigslot::has_slots<> {
 | 
|   public:
 | 
| -  StunPortTest()
 | 
| +  StunPortTestBase()
 | 
|        : pss_(new rtc::PhysicalSocketServer),
 | 
|          ss_(new rtc::VirtualSocketServer(pss_.get())),
 | 
|          ss_scope_(ss_.get()),
 | 
| @@ -58,7 +57,7 @@ class StunPortTest : public testing::Test,
 | 
|                                                         kStunAddr2)),
 | 
|          done_(false),
 | 
|          error_(false),
 | 
| -        stun_keepalive_delay_(0),
 | 
| +        stun_keepalive_delay_(1),
 | 
|          stun_keepalive_lifetime_(-1) {}
 | 
|  
 | 
|    cricket::UDPPort* port() const { return stun_port_.get(); }
 | 
| @@ -87,16 +86,15 @@ class StunPortTest : public testing::Test,
 | 
|        stun_port_->set_stun_keepalive_lifetime(stun_keepalive_lifetime_);
 | 
|      }
 | 
|      stun_port_->SignalPortComplete.connect(this,
 | 
| -        &StunPortTest::OnPortComplete);
 | 
| -    stun_port_->SignalPortError.connect(this,
 | 
| -        &StunPortTest::OnPortError);
 | 
| +                                           &StunPortTestBase::OnPortComplete);
 | 
| +    stun_port_->SignalPortError.connect(this, &StunPortTestBase::OnPortError);
 | 
|    }
 | 
|  
 | 
|    void CreateSharedUdpPort(const rtc::SocketAddress& server_addr) {
 | 
|      socket_.reset(socket_factory_.CreateUdpSocket(
 | 
|          rtc::SocketAddress(kLocalAddr.ipaddr(), 0), 0, 0));
 | 
|      ASSERT_TRUE(socket_ != NULL);
 | 
| -    socket_->SignalReadPacket.connect(this, &StunPortTest::OnReadPacket);
 | 
| +    socket_->SignalReadPacket.connect(this, &StunPortTestBase::OnReadPacket);
 | 
|      stun_port_.reset(cricket::UDPPort::Create(
 | 
|          rtc::Thread::Current(), &socket_factory_,
 | 
|          &network_, socket_.get(),
 | 
| @@ -107,9 +105,8 @@ class StunPortTest : public testing::Test,
 | 
|      stun_servers.insert(server_addr);
 | 
|      stun_port_->set_server_addresses(stun_servers);
 | 
|      stun_port_->SignalPortComplete.connect(this,
 | 
| -        &StunPortTest::OnPortComplete);
 | 
| -    stun_port_->SignalPortError.connect(this,
 | 
| -        &StunPortTest::OnPortError);
 | 
| +                                           &StunPortTestBase::OnPortComplete);
 | 
| +    stun_port_->SignalPortError.connect(this, &StunPortTestBase::OnPortError);
 | 
|    }
 | 
|  
 | 
|    void PrepareAddress() {
 | 
| @@ -176,6 +173,15 @@ class StunPortTest : public testing::Test,
 | 
|    int stun_keepalive_lifetime_;
 | 
|  };
 | 
|  
 | 
| +class StunPortTestWithRealClock : public StunPortTestBase {};
 | 
| +
 | 
| +class FakeClockBase {
 | 
| + public:
 | 
| +  rtc::ScopedFakeClock fake_clock;
 | 
| +};
 | 
| +
 | 
| +class StunPortTest : public FakeClockBase, public StunPortTestBase {};
 | 
| +
 | 
|  // Test that we can create a STUN port.
 | 
|  TEST_F(StunPortTest, TestCreateStunPort) {
 | 
|    CreateStunPort(kStunAddr1);
 | 
| @@ -194,7 +200,7 @@ TEST_F(StunPortTest, TestCreateUdpPort) {
 | 
|  TEST_F(StunPortTest, TestPrepareAddress) {
 | 
|    CreateStunPort(kStunAddr1);
 | 
|    PrepareAddress();
 | 
| -  EXPECT_TRUE_WAIT(done(), kTimeoutMs);
 | 
| +  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
 | 
|    ASSERT_EQ(1U, port()->Candidates().size());
 | 
|    EXPECT_TRUE(kLocalAddr.EqualIPs(port()->Candidates()[0].address()));
 | 
|  
 | 
| @@ -206,7 +212,7 @@ TEST_F(StunPortTest, TestPrepareAddress) {
 | 
|  TEST_F(StunPortTest, TestPrepareAddressFail) {
 | 
|    CreateStunPort(kBadAddr);
 | 
|    PrepareAddress();
 | 
| -  EXPECT_TRUE_WAIT(done(), kTimeoutMs);
 | 
| +  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
 | 
|    EXPECT_TRUE(error());
 | 
|    EXPECT_EQ(0U, port()->Candidates().size());
 | 
|  }
 | 
| @@ -215,14 +221,14 @@ TEST_F(StunPortTest, TestPrepareAddressFail) {
 | 
|  TEST_F(StunPortTest, TestPrepareAddressHostname) {
 | 
|    CreateStunPort(kStunHostnameAddr);
 | 
|    PrepareAddress();
 | 
| -  EXPECT_TRUE_WAIT(done(), kTimeoutMs);
 | 
| +  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
 | 
|    ASSERT_EQ(1U, port()->Candidates().size());
 | 
|    EXPECT_TRUE(kLocalAddr.EqualIPs(port()->Candidates()[0].address()));
 | 
|    EXPECT_EQ(kStunCandidatePriority, port()->Candidates()[0].priority());
 | 
|  }
 | 
|  
 | 
|  // Test that we handle hostname lookup failures properly.
 | 
| -TEST_F(StunPortTest, TestPrepareAddressHostnameFail) {
 | 
| +TEST_F(StunPortTestWithRealClock, TestPrepareAddressHostnameFail) {
 | 
|    CreateStunPort(kBadHostnameAddr);
 | 
|    PrepareAddress();
 | 
|    EXPECT_TRUE_WAIT(done(), kTimeoutMs);
 | 
| @@ -236,20 +242,18 @@ TEST_F(StunPortTest, TestKeepAliveResponse) {
 | 
|    SetKeepaliveDelay(500);  // 500ms of keepalive delay.
 | 
|    CreateStunPort(kStunHostnameAddr);
 | 
|    PrepareAddress();
 | 
| -  EXPECT_TRUE_WAIT(done(), kTimeoutMs);
 | 
| +  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
 | 
|    ASSERT_EQ(1U, port()->Candidates().size());
 | 
|    EXPECT_TRUE(kLocalAddr.EqualIPs(port()->Candidates()[0].address()));
 | 
| -  // Waiting for 1 seond, which will allow us to process
 | 
| -  // response for keepalive binding request. 500 ms is the keepalive delay.
 | 
| -  rtc::Thread::Current()->ProcessMessages(1000);
 | 
| -  ASSERT_EQ(1U, port()->Candidates().size());
 | 
| +  SIMULATED_WAIT(false, 1000, fake_clock);
 | 
| +  EXPECT_EQ(1U, port()->Candidates().size());
 | 
|  }
 | 
|  
 | 
|  // Test that a local candidate can be generated using a shared socket.
 | 
|  TEST_F(StunPortTest, TestSharedSocketPrepareAddress) {
 | 
|    CreateSharedUdpPort(kStunAddr1);
 | 
|    PrepareAddress();
 | 
| -  EXPECT_TRUE_WAIT(done(), kTimeoutMs);
 | 
| +  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
 | 
|    ASSERT_EQ(1U, port()->Candidates().size());
 | 
|    EXPECT_TRUE(kLocalAddr.EqualIPs(port()->Candidates()[0].address()));
 | 
|  }
 | 
| @@ -257,7 +261,8 @@ TEST_F(StunPortTest, TestSharedSocketPrepareAddress) {
 | 
|  // Test that we still a get a local candidate with invalid stun server hostname.
 | 
|  // Also verifing that UDPPort can receive packets when stun address can't be
 | 
|  // resolved.
 | 
| -TEST_F(StunPortTest, TestSharedSocketPrepareAddressInvalidHostname) {
 | 
| +TEST_F(StunPortTestWithRealClock,
 | 
| +       TestSharedSocketPrepareAddressInvalidHostname) {
 | 
|    CreateSharedUdpPort(kBadHostnameAddr);
 | 
|    PrepareAddress();
 | 
|    EXPECT_TRUE_WAIT(done(), kTimeoutMs);
 | 
| @@ -279,7 +284,7 @@ TEST_F(StunPortTest, TestNoDuplicatedAddressWithTwoStunServers) {
 | 
|    CreateStunPort(stun_servers);
 | 
|    EXPECT_EQ("stun", port()->Type());
 | 
|    PrepareAddress();
 | 
| -  EXPECT_TRUE_WAIT(done(), kTimeoutMs);
 | 
| +  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
 | 
|    EXPECT_EQ(1U, port()->Candidates().size());
 | 
|    EXPECT_EQ(port()->Candidates()[0].relay_protocol(), "");
 | 
|  }
 | 
| @@ -293,7 +298,7 @@ TEST_F(StunPortTest, TestMultipleStunServersWithBadServer) {
 | 
|    CreateStunPort(stun_servers);
 | 
|    EXPECT_EQ("stun", port()->Type());
 | 
|    PrepareAddress();
 | 
| -  EXPECT_TRUE_WAIT(done(), kTimeoutMs);
 | 
| +  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
 | 
|    EXPECT_EQ(1U, port()->Candidates().size());
 | 
|  }
 | 
|  
 | 
| @@ -311,7 +316,7 @@ TEST_F(StunPortTest, TestTwoCandidatesWithTwoStunServersAcrossNat) {
 | 
|    CreateStunPort(stun_servers);
 | 
|    EXPECT_EQ("stun", port()->Type());
 | 
|    PrepareAddress();
 | 
| -  EXPECT_TRUE_WAIT(done(), kTimeoutMs);
 | 
| +  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
 | 
|    EXPECT_EQ(2U, port()->Candidates().size());
 | 
|    EXPECT_EQ(port()->Candidates()[0].relay_protocol(), "");
 | 
|    EXPECT_EQ(port()->Candidates()[1].relay_protocol(), "");
 | 
| @@ -360,9 +365,10 @@ TEST_F(StunPortTest, TestStunBindingRequestShortLifetime) {
 | 
|    SetKeepaliveLifetime(100);
 | 
|    CreateStunPort(kStunAddr1);
 | 
|    PrepareAddress();
 | 
| -  EXPECT_TRUE_WAIT(done(), kTimeoutMs);
 | 
| -  EXPECT_TRUE_WAIT(!port()->HasPendingRequest(cricket::STUN_BINDING_REQUEST),
 | 
| -                   2000);
 | 
| +  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
 | 
| +  EXPECT_TRUE_SIMULATED_WAIT(
 | 
| +      !port()->HasPendingRequest(cricket::STUN_BINDING_REQUEST), 2000,
 | 
| +      fake_clock);
 | 
|  }
 | 
|  
 | 
|  // Test that by default, the STUN binding requests will last for a long time.
 | 
| @@ -370,7 +376,8 @@ TEST_F(StunPortTest, TestStunBindingRequestLongLifetime) {
 | 
|    SetKeepaliveDelay(101);
 | 
|    CreateStunPort(kStunAddr1);
 | 
|    PrepareAddress();
 | 
| -  EXPECT_TRUE_WAIT(done(), kTimeoutMs);
 | 
| -  rtc::Thread::Current()->ProcessMessages(1000);
 | 
| -  EXPECT_TRUE(port()->HasPendingRequest(cricket::STUN_BINDING_REQUEST));
 | 
| +  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
 | 
| +  EXPECT_TRUE_SIMULATED_WAIT(
 | 
| +      port()->HasPendingRequest(cricket::STUN_BINDING_REQUEST), 1000,
 | 
| +      fake_clock);
 | 
|  }
 | 
| 
 |