Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "components/signin/core/browser/signin_header_helper.h" | 5 #include "components/signin/core/browser/signin_header_helper.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 11 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
| 12 #include "base/strings/stringprintf.h" | |
| 12 #include "build/build_config.h" | 13 #include "build/build_config.h" |
| 13 #include "components/content_settings/core/browser/cookie_settings.h" | 14 #include "components/content_settings/core/browser/cookie_settings.h" |
| 14 #include "components/signin/core/browser/chrome_connected_header_helper.h" | 15 #include "components/signin/core/browser/chrome_connected_header_helper.h" |
| 15 #include "components/signin/core/common/profile_management_switches.h" | 16 #include "components/signin/core/common/profile_management_switches.h" |
| 16 #include "components/sync_preferences/testing_pref_service_syncable.h" | 17 #include "components/sync_preferences/testing_pref_service_syncable.h" |
| 17 #include "google_apis/gaia/gaia_urls.h" | 18 #include "google_apis/gaia/gaia_urls.h" |
| 18 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" | 19 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" |
| 19 #include "net/url_request/url_request_test_util.h" | 20 #include "net/url_request/url_request_test_util.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 21 #include "url/gurl.h" | 22 #include "url/gurl.h" |
| 22 | 23 |
| 23 #if !defined(OS_IOS) && !defined(OS_ANDROID) | 24 #if !defined(OS_IOS) && !defined(OS_ANDROID) |
| 24 #include "components/signin/core/browser/dice_header_helper.h" | 25 #include "components/signin/core/browser/dice_header_helper.h" |
| 25 #endif | 26 #endif |
| 26 | 27 |
| 28 namespace signin { | |
|
msarda
2017/06/12 11:52:21
I think that tests can be in an anonymous namespac
droger
2017/06/12 12:39:16
Yes, this is for convenience (removing the signin:
msarda
2017/06/12 14:03:42
Acknowledged.
| |
| 29 | |
| 27 class SigninHeaderHelperTest : public testing::Test { | 30 class SigninHeaderHelperTest : public testing::Test { |
| 28 protected: | 31 protected: |
| 29 void SetUp() override { | 32 void SetUp() override { |
| 30 content_settings::CookieSettings::RegisterProfilePrefs(prefs_.registry()); | 33 content_settings::CookieSettings::RegisterProfilePrefs(prefs_.registry()); |
| 31 HostContentSettingsMap::RegisterProfilePrefs(prefs_.registry()); | 34 HostContentSettingsMap::RegisterProfilePrefs(prefs_.registry()); |
| 32 | 35 |
| 33 settings_map_ = new HostContentSettingsMap( | 36 settings_map_ = new HostContentSettingsMap( |
| 34 &prefs_, false /* incognito_profile */, false /* guest_profile */, | 37 &prefs_, false /* incognito_profile */, false /* guest_profile */, |
| 35 false /* store_last_modified */); | 38 false /* store_last_modified */); |
| 36 cookie_settings_ = | 39 cookie_settings_ = |
| 37 new content_settings::CookieSettings(settings_map_.get(), &prefs_, ""); | 40 new content_settings::CookieSettings(settings_map_.get(), &prefs_, ""); |
| 38 } | 41 } |
| 39 | 42 |
| 40 void TearDown() override { settings_map_->ShutdownOnUIThread(); } | 43 void TearDown() override { settings_map_->ShutdownOnUIThread(); } |
| 41 | 44 |
| 42 void CheckMirrorCookieRequest(const GURL& url, | 45 void CheckMirrorCookieRequest(const GURL& url, |
| 43 const std::string& account_id, | 46 const std::string& account_id, |
| 44 const std::string& expected_request) { | 47 const std::string& expected_request) { |
| 45 EXPECT_EQ(signin::BuildMirrorRequestCookieIfPossible( | 48 EXPECT_EQ( |
| 46 url, account_id, cookie_settings_.get(), | 49 BuildMirrorRequestCookieIfPossible( |
| 47 signin::PROFILE_MODE_DEFAULT), | 50 url, account_id, cookie_settings_.get(), PROFILE_MODE_DEFAULT), |
| 48 expected_request); | 51 expected_request); |
| 49 } | 52 } |
| 50 | 53 |
| 51 std::unique_ptr<net::URLRequest> CreateRequest( | 54 std::unique_ptr<net::URLRequest> CreateRequest( |
| 52 const GURL& url, | 55 const GURL& url, |
| 53 const std::string& account_id) { | 56 const std::string& account_id) { |
| 54 std::unique_ptr<net::URLRequest> url_request = | 57 std::unique_ptr<net::URLRequest> url_request = |
| 55 url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, | 58 url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, |
| 56 TRAFFIC_ANNOTATION_FOR_TESTS); | 59 TRAFFIC_ANNOTATION_FOR_TESTS); |
| 57 signin::AppendOrRemoveAccountConsistentyRequestHeader( | 60 AppendOrRemoveAccountConsistentyRequestHeader( |
| 58 url_request.get(), GURL(), account_id, cookie_settings_.get(), | 61 url_request.get(), GURL(), account_id, cookie_settings_.get(), |
| 59 signin::PROFILE_MODE_DEFAULT); | 62 PROFILE_MODE_DEFAULT); |
| 60 return url_request; | 63 return url_request; |
| 61 } | 64 } |
| 62 | 65 |
| 63 void CheckAccountConsistencyHeaderRequest( | 66 void CheckAccountConsistencyHeaderRequest( |
| 64 net::URLRequest* url_request, | 67 net::URLRequest* url_request, |
| 65 const char* header_name, | 68 const char* header_name, |
| 66 const std::string& expected_request) { | 69 const std::string& expected_request) { |
| 67 bool expected_result = !expected_request.empty(); | 70 bool expected_result = !expected_request.empty(); |
| 68 std::string request; | 71 std::string request; |
| 69 EXPECT_EQ( | 72 EXPECT_EQ( |
| 70 url_request->extra_request_headers().GetHeader(header_name, &request), | 73 url_request->extra_request_headers().GetHeader(header_name, &request), |
| 71 expected_result); | 74 expected_result); |
| 72 if (expected_result) { | 75 if (expected_result) { |
| 73 EXPECT_EQ(expected_request, request); | 76 EXPECT_EQ(expected_request, request); |
| 74 } | 77 } |
| 75 } | 78 } |
| 76 | 79 |
| 77 void CheckMirrorHeaderRequest(const GURL& url, | 80 void CheckMirrorHeaderRequest(const GURL& url, |
| 78 const std::string& account_id, | 81 const std::string& account_id, |
| 79 const std::string& expected_request) { | 82 const std::string& expected_request) { |
| 80 std::unique_ptr<net::URLRequest> url_request = | 83 std::unique_ptr<net::URLRequest> url_request = |
| 81 CreateRequest(url, account_id); | 84 CreateRequest(url, account_id); |
| 82 CheckAccountConsistencyHeaderRequest( | 85 CheckAccountConsistencyHeaderRequest( |
| 83 url_request.get(), signin::kChromeConnectedHeader, expected_request); | 86 url_request.get(), kChromeConnectedHeader, expected_request); |
| 84 } | 87 } |
| 85 | 88 |
| 86 #if !defined(OS_IOS) && !defined(OS_ANDROID) | 89 #if !defined(OS_IOS) && !defined(OS_ANDROID) |
| 87 void CheckDiceHeaderRequest(const GURL& url, | 90 void CheckDiceHeaderRequest(const GURL& url, |
| 88 const std::string& account_id, | 91 const std::string& account_id, |
| 89 const std::string& expected_mirror_request, | 92 const std::string& expected_mirror_request, |
| 90 const std::string& expected_dice_request) { | 93 const std::string& expected_dice_request) { |
| 91 std::unique_ptr<net::URLRequest> url_request = | 94 std::unique_ptr<net::URLRequest> url_request = |
| 92 CreateRequest(url, account_id); | 95 CreateRequest(url, account_id); |
| 93 CheckAccountConsistencyHeaderRequest(url_request.get(), | |
| 94 signin::kChromeConnectedHeader, | |
| 95 expected_mirror_request); | |
| 96 CheckAccountConsistencyHeaderRequest( | 96 CheckAccountConsistencyHeaderRequest( |
| 97 url_request.get(), signin::kDiceRequestHeader, expected_dice_request); | 97 url_request.get(), kChromeConnectedHeader, expected_mirror_request); |
| 98 CheckAccountConsistencyHeaderRequest(url_request.get(), kDiceRequestHeader, | |
| 99 expected_dice_request); | |
| 98 } | 100 } |
| 99 #endif | 101 #endif |
| 100 | 102 |
| 101 base::MessageLoop loop_; | 103 base::MessageLoop loop_; |
| 102 | 104 |
| 103 sync_preferences::TestingPrefServiceSyncable prefs_; | 105 sync_preferences::TestingPrefServiceSyncable prefs_; |
| 104 net::TestURLRequestContext url_request_context_; | 106 net::TestURLRequestContext url_request_context_; |
| 105 | 107 |
| 106 scoped_refptr<HostContentSettingsMap> settings_map_; | 108 scoped_refptr<HostContentSettingsMap> settings_map_; |
| 107 scoped_refptr<content_settings::CookieSettings> cookie_settings_; | 109 scoped_refptr<content_settings::CookieSettings> cookie_settings_; |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 215 switches::EnableAccountConsistencyMirrorForTesting( | 217 switches::EnableAccountConsistencyMirrorForTesting( |
| 216 base::CommandLine::ForCurrentProcess()); | 218 base::CommandLine::ForCurrentProcess()); |
| 217 CheckMirrorHeaderRequest( | 219 CheckMirrorHeaderRequest( |
| 218 GURL("https://docs.google.com/document"), "0123456789", | 220 GURL("https://docs.google.com/document"), "0123456789", |
| 219 "id=0123456789,mode=0,enable_account_consistency=true"); | 221 "id=0123456789,mode=0,enable_account_consistency=true"); |
| 220 CheckMirrorCookieRequest( | 222 CheckMirrorCookieRequest( |
| 221 GURL("https://drive.google.com/drive"), "0123456789", | 223 GURL("https://drive.google.com/drive"), "0123456789", |
| 222 "id=0123456789:mode=0:enable_account_consistency=true"); | 224 "id=0123456789:mode=0:enable_account_consistency=true"); |
| 223 } | 225 } |
| 224 | 226 |
| 227 TEST_F(SigninHeaderHelperTest, TestDiceInvalidResponseParams) { | |
| 228 DiceResponseParams params = BuildDiceResponseParams("blah"); | |
| 229 EXPECT_EQ(DiceAction::NONE, params.user_intention); | |
| 230 } | |
| 231 | |
| 232 TEST_F(SigninHeaderHelperTest, TestBuildDiceResponseParams) { | |
| 233 const char kAuthorizationCode[] = "authorization_code"; | |
| 234 const char kEmail[] = "foo@example.com"; | |
| 235 const char kLogoutURL[] = "https://example.com/logout"; | |
| 236 const char kObfuscatedGaiaID[] = "obfuscated_gaia_id"; | |
| 237 const char kSessionIndex[] = "session_index"; | |
| 238 | |
| 239 DiceResponseParams params = BuildDiceResponseParams(base::StringPrintf( | |
| 240 "action=%s,id=%s,email=%s,authuser=%s,authorization_code=%s,logout=%s", | |
| 241 "SIGNIN", kObfuscatedGaiaID, kEmail, kSessionIndex, kAuthorizationCode, | |
| 242 kLogoutURL)); | |
| 243 EXPECT_EQ(DiceAction::SIGNIN, params.user_intention); | |
|
msarda
2017/06/12 11:52:21
I think we should test the following cases:
* vali
droger
2017/06/12 12:39:16
SIGNIN and SIGNOUT done.
However: what would be t
msarda
2017/06/12 14:03:42
I wanted a test that shows how the parse is done i
droger
2017/06/12 16:12:58
Done. I'm now doing validation and return NONE if
| |
| 244 EXPECT_EQ(kObfuscatedGaiaID, params.obfuscated_gaia_id); | |
| 245 EXPECT_EQ(kEmail, params.email); | |
| 246 EXPECT_EQ(kSessionIndex, params.session_index); | |
| 247 EXPECT_EQ(kAuthorizationCode, params.authorization_code); | |
| 248 EXPECT_EQ(GURL(kLogoutURL), params.logout_url); | |
| 249 } | |
| 250 | |
| 225 #endif // !defined(OS_ANDROID) && !defined(OS_IOS) | 251 #endif // !defined(OS_ANDROID) && !defined(OS_IOS) |
| 226 | 252 |
| 227 // Tests that the Mirror header request is returned normally when the redirect | 253 // Tests that the Mirror header request is returned normally when the redirect |
| 228 // URL is eligible. | 254 // URL is eligible. |
| 229 TEST_F(SigninHeaderHelperTest, TestMirrorHeaderEligibleRedirectURL) { | 255 TEST_F(SigninHeaderHelperTest, TestMirrorHeaderEligibleRedirectURL) { |
| 230 switches::EnableAccountConsistencyMirrorForTesting( | 256 switches::EnableAccountConsistencyMirrorForTesting( |
| 231 base::CommandLine::ForCurrentProcess()); | 257 base::CommandLine::ForCurrentProcess()); |
| 232 const GURL url("https://docs.google.com/document"); | 258 const GURL url("https://docs.google.com/document"); |
| 233 const GURL redirect_url("https://www.google.com"); | 259 const GURL redirect_url("https://www.google.com"); |
| 234 const std::string account_id = "0123456789"; | 260 const std::string account_id = "0123456789"; |
| 235 std::unique_ptr<net::URLRequest> url_request = | 261 std::unique_ptr<net::URLRequest> url_request = |
| 236 url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, | 262 url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, |
| 237 TRAFFIC_ANNOTATION_FOR_TESTS); | 263 TRAFFIC_ANNOTATION_FOR_TESTS); |
| 238 signin::AppendOrRemoveAccountConsistentyRequestHeader( | 264 AppendOrRemoveAccountConsistentyRequestHeader( |
| 239 url_request.get(), redirect_url, account_id, cookie_settings_.get(), | 265 url_request.get(), redirect_url, account_id, cookie_settings_.get(), |
| 240 signin::PROFILE_MODE_DEFAULT); | 266 PROFILE_MODE_DEFAULT); |
| 241 EXPECT_TRUE(url_request->extra_request_headers().HasHeader( | 267 EXPECT_TRUE( |
| 242 signin::kChromeConnectedHeader)); | 268 url_request->extra_request_headers().HasHeader(kChromeConnectedHeader)); |
| 243 } | 269 } |
| 244 | 270 |
| 245 // Tests that the Mirror header request is stripped when the redirect URL is not | 271 // Tests that the Mirror header request is stripped when the redirect URL is not |
| 246 // eligible. | 272 // eligible. |
| 247 TEST_F(SigninHeaderHelperTest, TestMirrorHeaderNonEligibleRedirectURL) { | 273 TEST_F(SigninHeaderHelperTest, TestMirrorHeaderNonEligibleRedirectURL) { |
| 248 switches::EnableAccountConsistencyMirrorForTesting( | 274 switches::EnableAccountConsistencyMirrorForTesting( |
| 249 base::CommandLine::ForCurrentProcess()); | 275 base::CommandLine::ForCurrentProcess()); |
| 250 const GURL url("https://docs.google.com/document"); | 276 const GURL url("https://docs.google.com/document"); |
| 251 const GURL redirect_url("http://www.foo.com"); | 277 const GURL redirect_url("http://www.foo.com"); |
| 252 const std::string account_id = "0123456789"; | 278 const std::string account_id = "0123456789"; |
| 253 std::unique_ptr<net::URLRequest> url_request = | 279 std::unique_ptr<net::URLRequest> url_request = |
| 254 url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, | 280 url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, |
| 255 TRAFFIC_ANNOTATION_FOR_TESTS); | 281 TRAFFIC_ANNOTATION_FOR_TESTS); |
| 256 signin::AppendOrRemoveAccountConsistentyRequestHeader( | 282 AppendOrRemoveAccountConsistentyRequestHeader( |
| 257 url_request.get(), redirect_url, account_id, cookie_settings_.get(), | 283 url_request.get(), redirect_url, account_id, cookie_settings_.get(), |
| 258 signin::PROFILE_MODE_DEFAULT); | 284 PROFILE_MODE_DEFAULT); |
| 259 EXPECT_FALSE(url_request->extra_request_headers().HasHeader( | 285 EXPECT_FALSE( |
| 260 signin::kChromeConnectedHeader)); | 286 url_request->extra_request_headers().HasHeader(kChromeConnectedHeader)); |
| 261 } | 287 } |
| 262 | 288 |
| 263 // Tests that the Mirror header, whatever its value is, is untouched when both | 289 // Tests that the Mirror header, whatever its value is, is untouched when both |
| 264 // the current and the redirect URL are non-eligible. | 290 // the current and the redirect URL are non-eligible. |
| 265 TEST_F(SigninHeaderHelperTest, TestIgnoreMirrorHeaderNonEligibleURLs) { | 291 TEST_F(SigninHeaderHelperTest, TestIgnoreMirrorHeaderNonEligibleURLs) { |
| 266 switches::EnableAccountConsistencyMirrorForTesting( | 292 switches::EnableAccountConsistencyMirrorForTesting( |
| 267 base::CommandLine::ForCurrentProcess()); | 293 base::CommandLine::ForCurrentProcess()); |
| 268 const GURL url("https://www.bar.com"); | 294 const GURL url("https://www.bar.com"); |
| 269 const GURL redirect_url("http://www.foo.com"); | 295 const GURL redirect_url("http://www.foo.com"); |
| 270 const std::string account_id = "0123456789"; | 296 const std::string account_id = "0123456789"; |
| 271 const std::string fake_header = "foo,bar"; | 297 const std::string fake_header = "foo,bar"; |
| 272 std::unique_ptr<net::URLRequest> url_request = | 298 std::unique_ptr<net::URLRequest> url_request = |
| 273 url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, | 299 url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, |
| 274 TRAFFIC_ANNOTATION_FOR_TESTS); | 300 TRAFFIC_ANNOTATION_FOR_TESTS); |
| 275 url_request->SetExtraRequestHeaderByName(signin::kChromeConnectedHeader, | 301 url_request->SetExtraRequestHeaderByName(kChromeConnectedHeader, fake_header, |
| 276 fake_header, false); | 302 false); |
| 277 signin::AppendOrRemoveAccountConsistentyRequestHeader( | 303 AppendOrRemoveAccountConsistentyRequestHeader( |
| 278 url_request.get(), redirect_url, account_id, cookie_settings_.get(), | 304 url_request.get(), redirect_url, account_id, cookie_settings_.get(), |
| 279 signin::PROFILE_MODE_DEFAULT); | 305 PROFILE_MODE_DEFAULT); |
| 280 std::string header; | 306 std::string header; |
| 281 EXPECT_TRUE(url_request->extra_request_headers().GetHeader( | 307 EXPECT_TRUE(url_request->extra_request_headers().GetHeader( |
| 282 signin::kChromeConnectedHeader, &header)); | 308 kChromeConnectedHeader, &header)); |
| 283 EXPECT_EQ(fake_header, header); | 309 EXPECT_EQ(fake_header, header); |
| 284 } | 310 } |
| 311 | |
| 312 } // namespace signin | |
| OLD | NEW |