| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "remoting/signaling/xmpp_login_handler.h" |
| 6 |
| 7 #include "base/base64.h" |
| 8 #include "base/message_loop/message_loop.h" |
| 9 #include "remoting/signaling/xmpp_stream_parser.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 #include "third_party/webrtc/libjingle/xmllite/xmlelement.h" |
| 12 |
| 13 namespace remoting { |
| 14 |
| 15 char kTestUsername[] = "testUsername@gmail.com"; |
| 16 char kTestToken[] = "testToken"; |
| 17 |
| 18 class XmppLoginHandlerTest : public testing::Test, |
| 19 public XmppLoginHandler::Delegate { |
| 20 public: |
| 21 XmppLoginHandlerTest() |
| 22 : start_tls_called_(false), error_(SignalStrategy::OK) {} |
| 23 |
| 24 void SendMessage(const std::string& message) override { |
| 25 sent_data_ += message; |
| 26 } |
| 27 |
| 28 void StartTls() override { |
| 29 start_tls_called_ = true; |
| 30 } |
| 31 |
| 32 void OnHandshakeDone(const std::string& jid, |
| 33 scoped_ptr<XmppStreamParser> parser) override { |
| 34 jid_ = jid; |
| 35 parser_ = parser.Pass(); |
| 36 } |
| 37 |
| 38 void OnLoginHandlerError(SignalStrategy::Error error) override { |
| 39 EXPECT_NE(error, SignalStrategy::OK); |
| 40 error_ = error; |
| 41 } |
| 42 |
| 43 protected: |
| 44 void HandshakeBase(); |
| 45 |
| 46 base::MessageLoop message_loop_; |
| 47 |
| 48 scoped_ptr<XmppLoginHandler> login_handler_; |
| 49 std::string sent_data_; |
| 50 bool start_tls_called_; |
| 51 std::string jid_; |
| 52 scoped_ptr<XmppStreamParser> parser_; |
| 53 SignalStrategy::Error error_; |
| 54 }; |
| 55 |
| 56 void XmppLoginHandlerTest::HandshakeBase() { |
| 57 login_handler_.reset(new remoting::XmppLoginHandler( |
| 58 "google.com", kTestUsername, kTestToken, "oauth2", false, this)); |
| 59 login_handler_->Start(); |
| 60 EXPECT_TRUE(start_tls_called_); |
| 61 |
| 62 login_handler_->OnTlsStarted(); |
| 63 std::string cookie; |
| 64 base::Base64Encode( |
| 65 std::string("\0", 1) + kTestUsername + std::string("\0", 1) + kTestToken, |
| 66 &cookie); |
| 67 EXPECT_EQ( |
| 68 sent_data_, |
| 69 "<stream:stream to=\"google.com\" version=\"1.0\" " |
| 70 "xmlns=\"jabber:client\" " |
| 71 "xmlns:stream=\"http://etherx.jabber.org/streams\">" |
| 72 "<auth xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\" mechanism=\"X-OAUTH2\" " |
| 73 "auth:service=\"oauth2\" auth:allow-generated-jid=\"true\" " |
| 74 "auth:client-uses-full-bind-result=\"true\" " |
| 75 "auth:allow-non-google-login=\"true\" " |
| 76 "xmlns:auth=\"http://www.google.com/talk/protocol/auth\">" + cookie + |
| 77 "</auth>"); |
| 78 sent_data_.clear(); |
| 79 |
| 80 login_handler_->OnDataReceived( |
| 81 "<stream:stream from=\"google.com\" id=\"DCDDE5171CB2154A\" " |
| 82 "version=\"1.0\" " |
| 83 "xmlns:stream=\"http://etherx.jabber.org/streams\" " |
| 84 "xmlns=\"jabber:client\">" |
| 85 "<stream:features>" |
| 86 "<mechanisms xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">" |
| 87 "<mechanism>X-OAUTH2</mechanism>" |
| 88 "<mechanism>X-GOOGLE-TOKEN</mechanism>" |
| 89 "<mechanism>PLAIN</mechanism>" |
| 90 "</mechanisms>" |
| 91 "</stream:features>"); |
| 92 } |
| 93 |
| 94 TEST_F(XmppLoginHandlerTest, SuccessfulAuth) { |
| 95 HandshakeBase(); |
| 96 |
| 97 login_handler_->OnDataReceived( |
| 98 "<success xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\"/>"); |
| 99 EXPECT_EQ( |
| 100 sent_data_, |
| 101 "<stream:stream to=\"google.com\" version=\"1.0\" " |
| 102 "xmlns=\"jabber:client\" " |
| 103 "xmlns:stream=\"http://etherx.jabber.org/streams\">" |
| 104 "<iq type=\"set\" id=\"0\">" |
| 105 "<bind xmlns=\"urn:ietf:params:xml:ns:xmpp-bind\">" |
| 106 "<resource>chromoting</resource>" |
| 107 "</bind>" |
| 108 "</iq>" |
| 109 "<iq type=\"set\" id=\"1\">" |
| 110 "<session xmlns=\"urn:ietf:params:xml:ns:xmpp-session\"/>" |
| 111 "</iq>"); |
| 112 sent_data_.clear(); |
| 113 |
| 114 login_handler_->OnDataReceived( |
| 115 "<stream:stream from=\"google.com\" id=\"104FA10576E2AA80\" " |
| 116 "version=\"1.0\" " |
| 117 "xmlns:stream=\"http://etherx.jabber.org/streams\" " |
| 118 "xmlns=\"jabber:client\">" |
| 119 "<stream:features>" |
| 120 "<bind xmlns=\"urn:ietf:params:xml:ns:xmpp-bind\"/>" |
| 121 "<session xmlns=\"urn:ietf:params:xml:ns:xmpp-session\"/>" |
| 122 "</stream:features>" |
| 123 "<iq id=\"0\" type=\"result\">" |
| 124 "<bind xmlns=\"urn:ietf:params:xml:ns:xmpp-bind\">" |
| 125 "<jid>" + std::string(kTestUsername) + "/chromoting52B4920E</jid>" |
| 126 "</bind>" |
| 127 "</iq>" |
| 128 "<iq type=\"result\" id=\"1\"/>"); |
| 129 |
| 130 EXPECT_EQ(jid_, std::string(kTestUsername) + "/chromoting52B4920E"); |
| 131 EXPECT_TRUE(parser_); |
| 132 } |
| 133 |
| 134 TEST_F(XmppLoginHandlerTest, StartTlsHandshake) { |
| 135 login_handler_.reset(new remoting::XmppLoginHandler( |
| 136 "google.com", kTestUsername, kTestToken, "oauth2", true, this)); |
| 137 login_handler_->Start(); |
| 138 EXPECT_FALSE(start_tls_called_); |
| 139 |
| 140 EXPECT_EQ(sent_data_, |
| 141 "<stream:stream to=\"google.com\" version=\"1.0\" " |
| 142 "xmlns=\"jabber:client\" " |
| 143 "xmlns:stream=\"http://etherx.jabber.org/streams\">" |
| 144 "<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"/>"); |
| 145 sent_data_.clear(); |
| 146 |
| 147 login_handler_->OnDataReceived( |
| 148 "<stream:stream from=\"google.com\" id=\"78A87C70559EF28A\" " |
| 149 "version=\"1.0\" " |
| 150 "xmlns:stream=\"http://etherx.jabber.org/streams\" " |
| 151 "xmlns=\"jabber:client\">" |
| 152 "<stream:features>" |
| 153 "<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\">" |
| 154 "<required/>" |
| 155 "</starttls>" |
| 156 "<mechanisms xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">" |
| 157 "<mechanism>X-OAUTH2</mechanism>" |
| 158 "<mechanism>X-GOOGLE-TOKEN</mechanism>" |
| 159 "</mechanisms>" |
| 160 "</stream:features>"); |
| 161 |
| 162 login_handler_->OnDataReceived( |
| 163 "<proceed xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"/>"); |
| 164 EXPECT_TRUE(start_tls_called_); |
| 165 } |
| 166 |
| 167 TEST_F(XmppLoginHandlerTest, AuthError) { |
| 168 HandshakeBase(); |
| 169 |
| 170 login_handler_->OnDataReceived( |
| 171 "<failure xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">" |
| 172 "<not-authorized/></failure>"); |
| 173 EXPECT_EQ(error_, SignalStrategy::AUTHENTICATION_FAILED); |
| 174 } |
| 175 |
| 176 TEST_F(XmppLoginHandlerTest, StreamParseError) { |
| 177 HandshakeBase(); |
| 178 login_handler_->OnDataReceived("BAD DATA"); |
| 179 EXPECT_EQ(error_, SignalStrategy::PROTOCOL_ERROR); |
| 180 } |
| 181 |
| 182 } // namespace remoting |
| OLD | NEW |