Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(727)

Side by Side Diff: remoting/protocol/authenticator_test_base.cc

Issue 10454066: Move the core state machine of SSLClientSocketNSS into a thread-safe Core (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Actually quit the loop Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #include "remoting/protocol/authenticator_test_base.h" 5 #include "remoting/protocol/authenticator_test_base.h"
6 6
7 #include "base/file_path.h" 7 #include "base/file_path.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/path_service.h" 9 #include "base/path_service.h"
10 #include "base/test/test_timeouts.h"
11 #include "base/timer.h"
10 #include "crypto/rsa_private_key.h" 12 #include "crypto/rsa_private_key.h"
11 #include "net/base/cert_test_util.h" 13 #include "net/base/cert_test_util.h"
12 #include "remoting/protocol/authenticator.h" 14 #include "remoting/protocol/authenticator.h"
13 #include "remoting/protocol/channel_authenticator.h" 15 #include "remoting/protocol/channel_authenticator.h"
14 #include "remoting/protocol/fake_session.h" 16 #include "remoting/protocol/fake_session.h"
15 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
16 #include "third_party/libjingle/source/talk/xmllite/xmlelement.h" 18 #include "third_party/libjingle/source/talk/xmllite/xmlelement.h"
17 19
18 using testing::_; 20 using testing::_;
19 using testing::SaveArg; 21 using testing::SaveArg;
20 22
21 namespace remoting { 23 namespace remoting {
22 namespace protocol { 24 namespace protocol {
23 25
24 AuthenticatorTestBase::MockChannelDoneCallback::MockChannelDoneCallback() { 26 namespace {
25 }
26 AuthenticatorTestBase::MockChannelDoneCallback::~MockChannelDoneCallback() {
27 }
28 27
29 AuthenticatorTestBase::AuthenticatorTestBase() { 28 // Helper to ensure that both the client and host callbacks are invoked
30 } 29 // within a reasonable time or that the message loop is aborted.
31 AuthenticatorTestBase::~AuthenticatorTestBase() { 30 class ChannelDoneHelper {
Sergey Ulanov 2012/06/05 04:29:46 In jingle_session_unittest.cc there is QuitThreadO
32 } 31 public:
32 typedef base::Callback<
33 void(net::Error, scoped_ptr<net::StreamSocket>)> ConnectedCallback;
Sergey Ulanov 2012/06/05 04:29:46 Can we just reuse ChannelAuthenticator::DoneCallba
34
35 ChannelDoneHelper() : expected_calls_(1), actual_calls_(0) {}
Sergey Ulanov 2012/06/05 04:29:46 nit: why initialize expected_calls_ to 1?
36
37 // Starts the shutdown timer, expecting |OnConnected()| to be called at
Sergey Ulanov 2012/06/05 04:29:46 nit: OnConnected(), || are redundant here.
38 // least |expected_calls| times.
39 void Start(int expected_calls) {
40 DCHECK_GT(expected_calls, 0);
41 expected_calls_ = expected_calls_;
42 actual_calls_ = 0;
43 timer_.Start(FROM_HERE, TestTimeouts::action_timeout(), this,
44 &ChannelDoneHelper::OnTimerFired);
45 }
46
47 // Helper function that passes |error| and |socket| to |callback| whenever
48 // it is called, disarming the shutdown timer if called the required number
49 // of times.
50 void OnConnected(const ConnectedCallback& callback,
51 net::Error error,
52 scoped_ptr<net::StreamSocket> socket) {
53 if (++actual_calls_ == expected_calls_) {
54 MessageLoop::current()->Quit();
55 timer_.Stop();
56 }
57 callback.Run(error, socket.Pass());
58 }
59
60 private:
61 void OnTimerFired() {
62 MessageLoop::current()->QuitNow();
63 }
64
65 int expected_calls_;
66 int actual_calls_;
67 base::OneShotTimer<ChannelDoneHelper> timer_;
68 };
69
70 } // namespace
71
72 AuthenticatorTestBase::MockChannelDoneCallback::MockChannelDoneCallback() {}
73
74 AuthenticatorTestBase::MockChannelDoneCallback::~MockChannelDoneCallback() {}
75
76 AuthenticatorTestBase::AuthenticatorTestBase() {}
77
78 AuthenticatorTestBase::~AuthenticatorTestBase() {}
33 79
34 void AuthenticatorTestBase::SetUp() { 80 void AuthenticatorTestBase::SetUp() {
35 FilePath certs_dir(net::GetTestCertsDirectory()); 81 FilePath certs_dir(net::GetTestCertsDirectory());
36 82
37 FilePath cert_path = certs_dir.AppendASCII("unittest.selfsigned.der"); 83 FilePath cert_path = certs_dir.AppendASCII("unittest.selfsigned.der");
38 ASSERT_TRUE(file_util::ReadFileToString(cert_path, &host_cert_)); 84 ASSERT_TRUE(file_util::ReadFileToString(cert_path, &host_cert_));
39 85
40 FilePath key_path = certs_dir.AppendASCII("unittest.key.bin"); 86 FilePath key_path = certs_dir.AppendASCII("unittest.key.bin");
41 std::string key_string; 87 std::string key_string;
42 ASSERT_TRUE(file_util::ReadFileToString(key_path, &key_string)); 88 ASSERT_TRUE(file_util::ReadFileToString(key_path, &key_string));
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 ASSERT_NE(Authenticator::WAITING_MESSAGE, client_->state()); 125 ASSERT_NE(Authenticator::WAITING_MESSAGE, client_->state());
80 } while (client_->state() != Authenticator::ACCEPTED && 126 } while (client_->state() != Authenticator::ACCEPTED &&
81 client_->state() != Authenticator::REJECTED); 127 client_->state() != Authenticator::REJECTED);
82 } 128 }
83 129
84 void AuthenticatorTestBase::RunChannelAuth(bool expected_fail) { 130 void AuthenticatorTestBase::RunChannelAuth(bool expected_fail) {
85 client_fake_socket_.reset(new FakeSocket()); 131 client_fake_socket_.reset(new FakeSocket());
86 host_fake_socket_.reset(new FakeSocket()); 132 host_fake_socket_.reset(new FakeSocket());
87 client_fake_socket_->PairWith(host_fake_socket_.get()); 133 client_fake_socket_->PairWith(host_fake_socket_.get());
88 134
135 ChannelDoneHelper helper;
136
89 client_auth_->SecureAndAuthenticate( 137 client_auth_->SecureAndAuthenticate(
90 client_fake_socket_.PassAs<net::StreamSocket>(), 138 client_fake_socket_.PassAs<net::StreamSocket>(),
91 base::Bind(&AuthenticatorTestBase::OnClientConnected, 139 base::Bind(&ChannelDoneHelper::OnConnected,
92 base::Unretained(this))); 140 base::Unretained(&helper),
141 base::Bind(&AuthenticatorTestBase::OnClientConnected,
142 base::Unretained(this))));
93 143
94 host_auth_->SecureAndAuthenticate( 144 host_auth_->SecureAndAuthenticate(
95 host_fake_socket_.PassAs<net::StreamSocket>(), 145 host_fake_socket_.PassAs<net::StreamSocket>(),
96 base::Bind(&AuthenticatorTestBase::OnHostConnected, 146 base::Bind(&ChannelDoneHelper::OnConnected,
97 base::Unretained(this))); 147 base::Unretained(&helper),
148 base::Bind(&AuthenticatorTestBase::OnHostConnected,
149 base::Unretained(this))));
98 150
99 net::StreamSocket* client_socket = NULL; 151 net::StreamSocket* client_socket = NULL;
100 net::StreamSocket* host_socket = NULL; 152 net::StreamSocket* host_socket = NULL;
101 153
102 EXPECT_CALL(client_callback_, OnDone(net::OK, _)) 154 EXPECT_CALL(client_callback_, OnDone(net::OK, _))
103 .WillOnce(SaveArg<1>(&client_socket)); 155 .WillOnce(SaveArg<1>(&client_socket));
104 if (expected_fail) { 156 if (expected_fail) {
105 EXPECT_CALL(host_callback_, OnDone(net::ERR_FAILED, NULL)); 157 EXPECT_CALL(host_callback_, OnDone(net::ERR_FAILED, NULL));
106 } else { 158 } else {
107 EXPECT_CALL(host_callback_, OnDone(net::OK, _)) 159 EXPECT_CALL(host_callback_, OnDone(net::OK, _))
108 .WillOnce(SaveArg<1>(&host_socket)); 160 .WillOnce(SaveArg<1>(&host_socket));
109 } 161 }
110 162
111 message_loop_.RunAllPending(); 163 // Expect two calls - once for the host, once for the client.
164 helper.Start(2);
165 message_loop_.Run();
112 166
113 testing::Mock::VerifyAndClearExpectations(&client_callback_); 167 testing::Mock::VerifyAndClearExpectations(&client_callback_);
114 testing::Mock::VerifyAndClearExpectations(&host_callback_); 168 testing::Mock::VerifyAndClearExpectations(&host_callback_);
115 169
116 client_socket_.reset(client_socket); 170 client_socket_.reset(client_socket);
117 host_socket_.reset(host_socket); 171 host_socket_.reset(host_socket);
172
173 if (!expected_fail) {
174 ASSERT_TRUE(client_socket_.get() != NULL);
175 ASSERT_TRUE(host_socket_.get() != NULL);
176 }
118 } 177 }
119 178
120 void AuthenticatorTestBase::OnHostConnected( 179 void AuthenticatorTestBase::OnHostConnected(
121 net::Error error, 180 net::Error error,
122 scoped_ptr<net::StreamSocket> socket) { 181 scoped_ptr<net::StreamSocket> socket) {
123 host_callback_.OnDone(error, socket.get()); 182 host_callback_.OnDone(error, socket.get());
124 host_socket_ = socket.Pass(); 183 host_socket_ = socket.Pass();
125 } 184 }
126 185
127 void AuthenticatorTestBase::OnClientConnected( 186 void AuthenticatorTestBase::OnClientConnected(
128 net::Error error, 187 net::Error error,
129 scoped_ptr<net::StreamSocket> socket) { 188 scoped_ptr<net::StreamSocket> socket) {
130 client_callback_.OnDone(error, socket.get()); 189 client_callback_.OnDone(error, socket.get());
131 client_socket_ = socket.Pass(); 190 client_socket_ = socket.Pass();
132 } 191 }
133 192
134 } // namespace protocol 193 } // namespace protocol
135 } // namespace remoting 194 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698