Index: remoting/protocol/authenticator_test_base.cc |
diff --git a/remoting/protocol/authenticator_test_base.cc b/remoting/protocol/authenticator_test_base.cc |
index edff6d361ad20b9d9cfddb5921a9486d15184ff0..eda9420153914aa4e809246a4ffb8013a2eaabfe 100644 |
--- a/remoting/protocol/authenticator_test_base.cc |
+++ b/remoting/protocol/authenticator_test_base.cc |
@@ -7,6 +7,8 @@ |
#include "base/file_path.h" |
#include "base/file_util.h" |
#include "base/path_service.h" |
+#include "base/test/test_timeouts.h" |
+#include "base/timer.h" |
#include "crypto/rsa_private_key.h" |
#include "net/base/cert_test_util.h" |
#include "remoting/protocol/authenticator.h" |
@@ -21,15 +23,59 @@ using testing::SaveArg; |
namespace remoting { |
namespace protocol { |
-AuthenticatorTestBase::MockChannelDoneCallback::MockChannelDoneCallback() { |
-} |
-AuthenticatorTestBase::MockChannelDoneCallback::~MockChannelDoneCallback() { |
-} |
+namespace { |
+ |
+// Helper to ensure that both the client and host callbacks are invoked |
+// within a reasonable time or that the message loop is aborted. |
+class ChannelDoneHelper { |
Sergey Ulanov
2012/06/05 04:29:46
In jingle_session_unittest.cc there is QuitThreadO
|
+ public: |
+ typedef base::Callback< |
+ void(net::Error, scoped_ptr<net::StreamSocket>)> ConnectedCallback; |
Sergey Ulanov
2012/06/05 04:29:46
Can we just reuse ChannelAuthenticator::DoneCallba
|
+ |
+ ChannelDoneHelper() : expected_calls_(1), actual_calls_(0) {} |
Sergey Ulanov
2012/06/05 04:29:46
nit: why initialize expected_calls_ to 1?
|
+ |
+ // Starts the shutdown timer, expecting |OnConnected()| to be called at |
Sergey Ulanov
2012/06/05 04:29:46
nit: OnConnected(), || are redundant here.
|
+ // least |expected_calls| times. |
+ void Start(int expected_calls) { |
+ DCHECK_GT(expected_calls, 0); |
+ expected_calls_ = expected_calls_; |
+ actual_calls_ = 0; |
+ timer_.Start(FROM_HERE, TestTimeouts::action_timeout(), this, |
+ &ChannelDoneHelper::OnTimerFired); |
+ } |
-AuthenticatorTestBase::AuthenticatorTestBase() { |
-} |
-AuthenticatorTestBase::~AuthenticatorTestBase() { |
-} |
+ // Helper function that passes |error| and |socket| to |callback| whenever |
+ // it is called, disarming the shutdown timer if called the required number |
+ // of times. |
+ void OnConnected(const ConnectedCallback& callback, |
+ net::Error error, |
+ scoped_ptr<net::StreamSocket> socket) { |
+ if (++actual_calls_ == expected_calls_) { |
+ MessageLoop::current()->Quit(); |
+ timer_.Stop(); |
+ } |
+ callback.Run(error, socket.Pass()); |
+ } |
+ |
+ private: |
+ void OnTimerFired() { |
+ MessageLoop::current()->QuitNow(); |
+ } |
+ |
+ int expected_calls_; |
+ int actual_calls_; |
+ base::OneShotTimer<ChannelDoneHelper> timer_; |
+}; |
+ |
+} // namespace |
+ |
+AuthenticatorTestBase::MockChannelDoneCallback::MockChannelDoneCallback() {} |
+ |
+AuthenticatorTestBase::MockChannelDoneCallback::~MockChannelDoneCallback() {} |
+ |
+AuthenticatorTestBase::AuthenticatorTestBase() {} |
+ |
+AuthenticatorTestBase::~AuthenticatorTestBase() {} |
void AuthenticatorTestBase::SetUp() { |
FilePath certs_dir(net::GetTestCertsDirectory()); |
@@ -86,15 +132,21 @@ void AuthenticatorTestBase::RunChannelAuth(bool expected_fail) { |
host_fake_socket_.reset(new FakeSocket()); |
client_fake_socket_->PairWith(host_fake_socket_.get()); |
+ ChannelDoneHelper helper; |
+ |
client_auth_->SecureAndAuthenticate( |
client_fake_socket_.PassAs<net::StreamSocket>(), |
- base::Bind(&AuthenticatorTestBase::OnClientConnected, |
- base::Unretained(this))); |
+ base::Bind(&ChannelDoneHelper::OnConnected, |
+ base::Unretained(&helper), |
+ base::Bind(&AuthenticatorTestBase::OnClientConnected, |
+ base::Unretained(this)))); |
host_auth_->SecureAndAuthenticate( |
host_fake_socket_.PassAs<net::StreamSocket>(), |
- base::Bind(&AuthenticatorTestBase::OnHostConnected, |
- base::Unretained(this))); |
+ base::Bind(&ChannelDoneHelper::OnConnected, |
+ base::Unretained(&helper), |
+ base::Bind(&AuthenticatorTestBase::OnHostConnected, |
+ base::Unretained(this)))); |
net::StreamSocket* client_socket = NULL; |
net::StreamSocket* host_socket = NULL; |
@@ -108,13 +160,20 @@ void AuthenticatorTestBase::RunChannelAuth(bool expected_fail) { |
.WillOnce(SaveArg<1>(&host_socket)); |
} |
- message_loop_.RunAllPending(); |
+ // Expect two calls - once for the host, once for the client. |
+ helper.Start(2); |
+ message_loop_.Run(); |
testing::Mock::VerifyAndClearExpectations(&client_callback_); |
testing::Mock::VerifyAndClearExpectations(&host_callback_); |
client_socket_.reset(client_socket); |
host_socket_.reset(host_socket); |
+ |
+ if (!expected_fail) { |
+ ASSERT_TRUE(client_socket_.get() != NULL); |
+ ASSERT_TRUE(host_socket_.get() != NULL); |
+ } |
} |
void AuthenticatorTestBase::OnHostConnected( |