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

Unified Diff: remoting/protocol/jingle_session_unittest.cc

Issue 2453933008: Bugfixes in JingleSession (Closed)
Patch Set: Created 4 years, 2 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 side-by-side diff with in-line comments
Download patch
« remoting/protocol/jingle_session.cc ('K') | « remoting/protocol/jingle_session.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/protocol/jingle_session_unittest.cc
diff --git a/remoting/protocol/jingle_session_unittest.cc b/remoting/protocol/jingle_session_unittest.cc
index e47413fb612966ea09e3cdb85edf91d8bc784075..add05adf74c4613d585825e178d271f883c744ad 100644
--- a/remoting/protocol/jingle_session_unittest.cc
+++ b/remoting/protocol/jingle_session_unittest.cc
@@ -68,6 +68,19 @@ class MockSessionEventHandler : public Session::EventHandler {
class FakeTransport : public Transport {
public:
+ SendTransportInfoCallback send_transport_info_callback() {
+ return send_transport_info_callback_;
+ }
+
+ const std::vector<std::unique_ptr<buzz::XmlElement>>& received_messages() {
+ return received_messages_;
+ }
+
+ void set_on_message_callback(const base::Closure& on_message_callback) {
+ on_message_callback_ = on_message_callback;
+ }
+
+ // Transport interface.
void Start(Authenticator* authenticator,
SendTransportInfoCallback send_transport_info_callback) override {
send_transport_info_callback_ = send_transport_info_callback;
@@ -76,20 +89,15 @@ class FakeTransport : public Transport {
bool ProcessTransportInfo(buzz::XmlElement* transport_info) override {
received_messages_.push_back(
base::MakeUnique<buzz::XmlElement>(*transport_info));
+ if (!on_message_callback_.is_null())
+ on_message_callback_.Run();
return true;
}
- SendTransportInfoCallback send_transport_info_callback() {
- return send_transport_info_callback_;
- }
-
- const std::vector<std::unique_ptr<buzz::XmlElement>>& received_messages() {
- return received_messages_;
- }
-
private:
SendTransportInfoCallback send_transport_info_callback_;
std::vector<std::unique_ptr<buzz::XmlElement>> received_messages_;
+ base::Closure on_message_callback_;
};
std::unique_ptr<buzz::XmlElement> CreateTransportInfo(const std::string& id) {
@@ -117,9 +125,9 @@ class JingleSessionTest : public testing::Test {
host_session_->SetTransport(&host_transport_);
}
- void DeleteSession() {
- host_session_.reset();
- }
+ void DeleteHostSession() { host_session_.reset(); }
+
+ void DeleteClientSession() { client_session_.reset(); }
protected:
void TearDown() override {
@@ -166,13 +174,11 @@ class JingleSessionTest : public testing::Test {
client_signal_strategy_.reset();
}
- void InitiateConnection(int auth_round_trips,
- FakeAuthenticator::Action auth_action,
- bool expect_fail) {
+ void SetHostExpectation(bool expect_fail) {
EXPECT_CALL(host_server_listener_, OnIncomingSession(_, _))
- .WillOnce(DoAll(
- WithArg<0>(Invoke(this, &JingleSessionTest::SetHostSession)),
- SetArgumentPointee<1>(protocol::SessionManager::ACCEPT)));
+ .WillOnce(
+ DoAll(WithArg<0>(Invoke(this, &JingleSessionTest::SetHostSession)),
+ SetArgumentPointee<1>(protocol::SessionManager::ACCEPT)));
{
InSequence dummy;
@@ -197,42 +203,49 @@ class JingleSessionTest : public testing::Test {
.Times(AtMost(1));
}
}
+ }
- {
- InSequence dummy;
+ void SetClientExpectation(bool expect_fail) {
+ InSequence dummy;
+ EXPECT_CALL(client_session_event_handler_,
+ OnSessionStateChange(Session::ACCEPTED))
+ .Times(AtMost(1));
+ EXPECT_CALL(client_session_event_handler_,
+ OnSessionStateChange(Session::AUTHENTICATING))
+ .Times(AtMost(1));
+ if (expect_fail) {
EXPECT_CALL(client_session_event_handler_,
- OnSessionStateChange(Session::ACCEPTED))
- .Times(AtMost(1));
+ OnSessionStateChange(Session::FAILED))
+ .Times(1);
+ } else {
EXPECT_CALL(client_session_event_handler_,
- OnSessionStateChange(Session::AUTHENTICATING))
+ OnSessionStateChange(Session::AUTHENTICATED))
+ .Times(1);
+ // Expect that the connection will be closed eventually.
+ EXPECT_CALL(client_session_event_handler_,
+ OnSessionStateChange(Session::CLOSED))
.Times(AtMost(1));
- if (expect_fail) {
- EXPECT_CALL(client_session_event_handler_,
- OnSessionStateChange(Session::FAILED))
- .Times(1);
- } else {
- EXPECT_CALL(client_session_event_handler_,
- OnSessionStateChange(Session::AUTHENTICATED))
- .Times(1);
- // Expect that the connection will be closed eventually.
- EXPECT_CALL(client_session_event_handler_,
- OnSessionStateChange(Session::CLOSED))
- .Times(AtMost(1));
- }
}
+ }
- std::unique_ptr<Authenticator> authenticator(new FakeAuthenticator(
- FakeAuthenticator::CLIENT, auth_round_trips, auth_action, true));
-
+ void ConnectClient(std::unique_ptr<Authenticator> authenticator) {
client_session_ =
client_server_->Connect(kHostJid, std::move(authenticator));
client_session_->SetEventHandler(&client_session_event_handler_);
client_session_->SetTransport(&client_transport_);
-
base::RunLoop().RunUntilIdle();
}
+ void InitiateConnection(int auth_round_trips,
+ FakeAuthenticator::Action auth_action,
+ bool expect_fail) {
+ SetHostExpectation(expect_fail);
+ SetClientExpectation(expect_fail);
+ ConnectClient(base::MakeUnique<FakeAuthenticator>(
+ FakeAuthenticator::CLIENT, auth_round_trips, auth_action, true));
+ }
+
void ExpectRouteChange(const std::string& channel_name) {
EXPECT_CALL(host_session_event_handler_,
OnSessionRouteChange(channel_name, _))
@@ -314,16 +327,40 @@ TEST_F(JingleSessionTest, ConnectWithMultistep) {
InitiateConnection(3, FakeAuthenticator::ACCEPT, false);
}
-TEST_F(JingleSessionTest, ConnectWithOutofOrderIqs) {
+TEST_F(JingleSessionTest, ConnectWithOutOfOrderIqs) {
CreateSessionManagers(1, FakeAuthenticator::ACCEPT);
InitiateConnection(1, FakeAuthenticator::ACCEPT, false);
client_signal_strategy_->SimulatePackgeReordering();
+
// Verify that out of order transport messages are received correctly.
host_transport_.send_transport_info_callback().Run(CreateTransportInfo("1"));
host_transport_.send_transport_info_callback().Run(CreateTransportInfo("2"));
base::RunLoop().RunUntilIdle();
- EXPECT_EQ(client_transport_.received_messages()[0]->Attr(buzz::QN_ID), "1");
- EXPECT_EQ(client_transport_.received_messages()[1]->Attr(buzz::QN_ID), "2");
+
+ ASSERT_EQ(client_transport_.received_messages().size(), 2U);
+ EXPECT_EQ("1", client_transport_.received_messages()[0]->Attr(buzz::QN_ID));
+ EXPECT_EQ("2", client_transport_.received_messages()[1]->Attr(buzz::QN_ID));
+}
+
+// Verify that out-of-order messages are handled correctly when the session is
+// torn down after the first message.
+TEST_F(JingleSessionTest, ConnectWithOutOfOrderIqsDestroyOnFirstMessage) {
+ CreateSessionManagers(1, FakeAuthenticator::ACCEPT);
+ InitiateConnection(1, FakeAuthenticator::ACCEPT, false);
+ client_signal_strategy_->SimulatePackgeReordering();
+
+ // Verify that out of order transport messages are received correctly.
+ host_transport_.send_transport_info_callback().Run(CreateTransportInfo("1"));
+ host_transport_.send_transport_info_callback().Run(CreateTransportInfo("2"));
+
+ // Destroy the session as soon as the first message is received.
+ client_transport_.set_on_message_callback(base::Bind(
+ &JingleSessionTest::DeleteClientSession, base::Unretained(this)));
+
+ base::RunLoop().RunUntilIdle();
+
+ ASSERT_EQ(client_transport_.received_messages().size(), 1U);
+ EXPECT_EQ("1", client_transport_.received_messages()[0]->Attr(buzz::QN_ID));
}
// Verify that connection is terminated when single-step auth fails.
@@ -404,8 +441,8 @@ TEST_F(JingleSessionTest, DeleteSessionOnIncomingConnection) {
.Times(AtMost(1));
EXPECT_CALL(host_session_event_handler_,
- OnSessionStateChange(Session::AUTHENTICATING))
- .WillOnce(InvokeWithoutArgs(this, &JingleSessionTest::DeleteSession));
+ OnSessionStateChange(Session::AUTHENTICATING))
+ .WillOnce(InvokeWithoutArgs(this, &JingleSessionTest::DeleteHostSession));
std::unique_ptr<Authenticator> authenticator(new FakeAuthenticator(
FakeAuthenticator::CLIENT, 3, FakeAuthenticator::ACCEPT, true));
@@ -422,17 +459,17 @@ TEST_F(JingleSessionTest, DeleteSessionOnAuth) {
CreateSessionManagers(3, 2, FakeAuthenticator::ACCEPT);
EXPECT_CALL(host_server_listener_, OnIncomingSession(_, _))
- .WillOnce(DoAll(
- WithArg<0>(Invoke(this, &JingleSessionTest::SetHostSession)),
- SetArgumentPointee<1>(protocol::SessionManager::ACCEPT)));
+ .WillOnce(
+ DoAll(WithArg<0>(Invoke(this, &JingleSessionTest::SetHostSession)),
+ SetArgumentPointee<1>(protocol::SessionManager::ACCEPT)));
EXPECT_CALL(host_session_event_handler_,
OnSessionStateChange(Session::ACCEPTED))
.Times(AtMost(1));
EXPECT_CALL(host_session_event_handler_,
- OnSessionStateChange(Session::AUTHENTICATING))
- .WillOnce(InvokeWithoutArgs(this, &JingleSessionTest::DeleteSession));
+ OnSessionStateChange(Session::AUTHENTICATING))
+ .WillOnce(InvokeWithoutArgs(this, &JingleSessionTest::DeleteHostSession));
std::unique_ptr<Authenticator> authenticator(new FakeAuthenticator(
FakeAuthenticator::CLIENT, 3, FakeAuthenticator::ACCEPT, true));
@@ -448,5 +485,52 @@ TEST_F(JingleSessionTest, TestMultistepAuth) {
InitiateConnection(3, FakeAuthenticator::ACCEPT, false));
}
+// Verify that incoming transport-info messages are handled correctly while in
+// AUTHENTICATING state.
+TEST_F(JingleSessionTest, TransportInfoDuringAuthentication) {
+ CreateSessionManagers(2, FakeAuthenticator::ACCEPT);
+
+ SetHostExpectation(false);
+ {
+ InSequence dummy;
+
+ EXPECT_CALL(client_session_event_handler_,
+ OnSessionStateChange(Session::ACCEPTED))
+ .Times(AtMost(1));
+ EXPECT_CALL(client_session_event_handler_,
+ OnSessionStateChange(Session::AUTHENTICATING))
+ .Times(AtMost(1));
+ }
+
+ // Create connection and pause it before authentication is finished.
+ FakeAuthenticator* authenticator = new FakeAuthenticator(
+ FakeAuthenticator::CLIENT, 2, FakeAuthenticator::ACCEPT, true);
+ authenticator->set_pause_message_index(4);
+ ConnectClient(base::WrapUnique(authenticator));
+
+ // Send 2 transport messages.
+ host_transport_.send_transport_info_callback().Run(CreateTransportInfo("1"));
+ host_transport_.send_transport_info_callback().Run(CreateTransportInfo("2"));
+
+ base::RunLoop().RunUntilIdle();
+
+ // The transport-info messages should not be received here because
+ // authentication hasn't finished.
+ EXPECT_TRUE(client_transport_.received_messages().empty());
+
+ // Destroy the session as soon as the first message is received.
+ client_transport_.set_on_message_callback(base::Bind(
+ &JingleSessionTest::DeleteClientSession, base::Unretained(this)));
+
+ // Resume authentication.
+ authenticator->Resume();
+ base::RunLoop().RunUntilIdle();
+
+ // Verify that transport-info that the first transport-info message was
+ // received.
+ ASSERT_EQ(client_transport_.received_messages().size(), 1U);
+ EXPECT_EQ("1", client_transport_.received_messages()[0]->Attr(buzz::QN_ID));
+}
+
} // namespace protocol
} // namespace remoting
« remoting/protocol/jingle_session.cc ('K') | « remoting/protocol/jingle_session.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698