OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chrome/browser/local_discovery/privetv3_session.h" | 5 #include "chrome/browser/local_discovery/privetv3_session.h" |
6 | 6 |
7 #include "base/base64.h" | 7 #include "base/base64.h" |
8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
9 #include "chrome/browser/local_discovery/privet_http.h" | 9 #include "chrome/browser/local_discovery/privet_http.h" |
10 #include "content/public/test/test_utils.h" | 10 #include "content/public/test/test_utils.h" |
11 #include "crypto/hmac.h" | 11 #include "crypto/hmac.h" |
12 #include "crypto/p224_spake.h" | 12 #include "crypto/p224_spake.h" |
13 #include "net/url_request/test_url_fetcher_factory.h" | 13 #include "net/url_request/test_url_fetcher_factory.h" |
14 #include "net/url_request/url_request_test_util.h" | 14 #include "net/url_request/url_request_test_util.h" |
15 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
17 | 17 |
18 namespace local_discovery { | 18 namespace local_discovery { |
19 | 19 |
20 namespace { | 20 namespace { |
21 | 21 |
| 22 using testing::InSequence; |
22 using testing::Invoke; | 23 using testing::Invoke; |
23 using testing::SaveArg; | 24 using testing::SaveArg; |
24 using testing::StrictMock; | 25 using testing::StrictMock; |
25 using testing::_; | 26 using testing::_; |
26 | 27 |
27 using PairingType = PrivetV3Session::PairingType; | 28 using PairingType = PrivetV3Session::PairingType; |
28 using Result = PrivetV3Session::Result; | 29 using Result = PrivetV3Session::Result; |
29 | 30 |
30 const char kInfoResponse[] = | 31 const char kInfoResponse[] = |
31 "{\"version\":\"3.0\"," | 32 "{\"version\":\"3.0\"," |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 base::StringPrintf( | 176 base::StringPrintf( |
176 "{\"deviceCommitment\":\"%s\",\"sessionId\":\"testId\"}", | 177 "{\"deviceCommitment\":\"%s\",\"sessionId\":\"testId\"}", |
177 device_commitment.c_str()), | 178 device_commitment.c_str()), |
178 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 179 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
179 })); | 180 })); |
180 session_.StartPairing(PairingType::PAIRING_TYPE_EMBEDDEDCODE, | 181 session_.StartPairing(PairingType::PAIRING_TYPE_EMBEDDEDCODE, |
181 base::Bind(&PrivetV3SessionTest::OnPairingStarted, | 182 base::Bind(&PrivetV3SessionTest::OnPairingStarted, |
182 base::Unretained(this))); | 183 base::Unretained(this))); |
183 base::RunLoop().RunUntilIdle(); | 184 base::RunLoop().RunUntilIdle(); |
184 | 185 |
| 186 EXPECT_TRUE(session_.fingerprint_.empty()); |
| 187 EXPECT_EQ("Privet anonymous", session_.privet_auth_token_); |
| 188 |
185 EXPECT_CALL(*this, OnCodeConfirmed(Result::STATUS_SUCCESS)).Times(1); | 189 EXPECT_CALL(*this, OnCodeConfirmed(Result::STATUS_SUCCESS)).Times(1); |
| 190 InSequence in_sequence; |
186 EXPECT_CALL(*this, OnPostData(_)) | 191 EXPECT_CALL(*this, OnPostData(_)) |
187 .WillOnce( | 192 .WillOnce( |
188 testing::Invoke([this, &spake](const base::DictionaryValue& data) { | 193 testing::Invoke([this, &spake](const base::DictionaryValue& data) { |
189 std::string commitment_base64; | 194 std::string commitment_base64; |
190 EXPECT_TRUE(data.GetString("clientCommitment", &commitment_base64)); | 195 EXPECT_TRUE(data.GetString("clientCommitment", &commitment_base64)); |
191 std::string commitment; | 196 std::string commitment; |
192 EXPECT_TRUE(base::Base64Decode(commitment_base64, &commitment)); | 197 EXPECT_TRUE(base::Base64Decode(commitment_base64, &commitment)); |
193 | 198 |
194 std::string session_id; | 199 std::string session_id; |
195 EXPECT_TRUE(data.GetString("sessionId", &session_id)); | 200 EXPECT_TRUE(data.GetString("sessionId", &session_id)); |
(...skipping 17 matching lines...) Expand all Loading... |
213 std::string signature_base64; | 218 std::string signature_base64; |
214 base::Base64Encode(signature, &signature_base64); | 219 base::Base64Encode(signature, &signature_base64); |
215 | 220 |
216 fetcher_factory_.SetFakeResponse( | 221 fetcher_factory_.SetFakeResponse( |
217 GURL("http://host/privet/v3/pairing/confirm"), | 222 GURL("http://host/privet/v3/pairing/confirm"), |
218 base::StringPrintf( | 223 base::StringPrintf( |
219 "{\"certFingerprint\":\"%s\",\"certSignature\":\"%s\"}", | 224 "{\"certFingerprint\":\"%s\",\"certSignature\":\"%s\"}", |
220 fingerprint_base64.c_str(), signature_base64.c_str()), | 225 fingerprint_base64.c_str(), signature_base64.c_str()), |
221 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 226 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
222 })); | 227 })); |
| 228 EXPECT_CALL(*this, OnPostData(_)) |
| 229 .WillOnce( |
| 230 testing::Invoke([this, &spake](const base::DictionaryValue& data) { |
| 231 std::string access_token_base64; |
| 232 EXPECT_TRUE(data.GetString("authCode", &access_token_base64)); |
| 233 std::string access_token; |
| 234 EXPECT_TRUE(base::Base64Decode(access_token_base64, &access_token)); |
| 235 |
| 236 crypto::HMAC hmac(crypto::HMAC::SHA256); |
| 237 const std::string& key = spake.GetUnverifiedKey(); |
| 238 EXPECT_TRUE(hmac.Init(key)); |
| 239 EXPECT_TRUE(hmac.Verify("testId", access_token)); |
| 240 |
| 241 fetcher_factory_.SetFakeResponse( |
| 242 GURL("http://host/privet/v3/auth"), |
| 243 "{\"accessToken\":\"567\",\"tokenType\":\"testType\"," |
| 244 "\"scope\":\"owner\"}", |
| 245 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
| 246 })); |
223 session_.ConfirmCode("testPin", | 247 session_.ConfirmCode("testPin", |
224 base::Bind(&PrivetV3SessionTest::OnCodeConfirmed, | 248 base::Bind(&PrivetV3SessionTest::OnCodeConfirmed, |
225 base::Unretained(this))); | 249 base::Unretained(this))); |
226 base::RunLoop().RunUntilIdle(); | 250 base::RunLoop().RunUntilIdle(); |
| 251 |
| 252 EXPECT_FALSE(session_.fingerprint_.empty()); |
| 253 EXPECT_EQ("testType 567", session_.privet_auth_token_); |
227 } | 254 } |
228 | 255 |
229 // TODO(vitalybuka): replace PrivetHTTPClient with regular URL fetcher and | 256 // TODO(vitalybuka): replace PrivetHTTPClient with regular URL fetcher and |
230 // implement SendMessage test. | 257 // implement SendMessage test. |
231 | 258 |
232 } // namespace local_discovery | 259 } // namespace local_discovery |
OLD | NEW |