1 // Copyright 2018 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 "chrome/browser/extensions/api/identity/identity_api.h"
6
7 #include <memory>
8
9 #include "base/optional.h"
10 #include "base/threading/thread_task_runner_handle.h"
11 #include "chrome/browser/extensions/test_extension_prefs.h"
12 #include "chrome/test/base/testing_profile.h"
13 #include "components/signin/public/base/signin_buildflags.h"
14 #include "components/signin/public/identity_manager/identity_test_environment.h"
15 #include "content/public/test/browser_task_environment.h"
16 #include "google_apis/gaia/core_account_id.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18
19 namespace extensions {
20
21 class IdentityAPITest : public testing::Test {
22 public:
IdentityAPITest()23 IdentityAPITest()
24 : prefs_(base::ThreadTaskRunnerHandle::Get()),
25 event_router_(prefs_.profile(), prefs_.prefs()),
26 api_(CreateIdentityAPI()) {
27 // IdentityAPITest requires the extended account info callbacks to be fired
28 // on account update/removal.
29 identity_env_.EnableRemovalOfExtendedAccountInfo();
30 }
31
~IdentityAPITest()32 ~IdentityAPITest() override { api_->Shutdown(); }
33
CreateIdentityAPI()34 std::unique_ptr<IdentityAPI> CreateIdentityAPI() {
35 return base::WrapUnique(new IdentityAPI(prefs_.profile(),
36 identity_env_.identity_manager(),
37 prefs_.prefs(), &event_router_));
38 }
39
ResetIdentityAPI(std::unique_ptr<IdentityAPI> new_api)40 void ResetIdentityAPI(std::unique_ptr<IdentityAPI> new_api) {
41 api_ = std::move(new_api);
42 }
43
task_env()44 content::BrowserTaskEnvironment* task_env() { return &task_env_; }
45
identity_env()46 signin::IdentityTestEnvironment* identity_env() { return &identity_env_; }
47
prefs()48 TestExtensionPrefs* prefs() { return &prefs_; }
49
api()50 IdentityAPI* api() { return api_.get(); }
51
52 private:
53 content::BrowserTaskEnvironment task_env_;
54 signin::IdentityTestEnvironment identity_env_;
55 TestExtensionPrefs prefs_;
56 EventRouter event_router_;
57 std::unique_ptr<IdentityAPI> api_;
58 };
59
60 // Tests that all accounts in extensions is enabled for regular profiles.
TEST_F(IdentityAPITest,AllAccountsExtensionEnabled)61 TEST_F(IdentityAPITest, AllAccountsExtensionEnabled) {
62 EXPECT_FALSE(api()->AreExtensionsRestrictedToPrimaryAccount());
63 }
64
TEST_F(IdentityAPITest,GetGaiaIdForExtension)65 TEST_F(IdentityAPITest, GetGaiaIdForExtension) {
66 std::string extension_id = prefs()->AddExtensionAndReturnId("extension");
67 std::string gaia_id =
68 identity_env()->MakeAccountAvailable("test@example.com").gaia;
69 api()->SetGaiaIdForExtension(extension_id, gaia_id);
70 EXPECT_EQ(api()->GetGaiaIdForExtension(extension_id), gaia_id);
71
72 std::string another_extension_id =
73 prefs()->AddExtensionAndReturnId("another_extension");
74 EXPECT_EQ(api()->GetGaiaIdForExtension(another_extension_id), base::nullopt);
75 }
76
TEST_F(IdentityAPITest,GetGaiaIdForExtension_SurvivesShutdown)77 TEST_F(IdentityAPITest, GetGaiaIdForExtension_SurvivesShutdown) {
78 std::string extension_id = prefs()->AddExtensionAndReturnId("extension");
79 std::string gaia_id =
80 identity_env()->MakeAccountAvailable("test@example.com").gaia;
81 api()->SetGaiaIdForExtension(extension_id, gaia_id);
82 EXPECT_EQ(api()->GetGaiaIdForExtension(extension_id), gaia_id);
83
84 api()->Shutdown();
85 ResetIdentityAPI(CreateIdentityAPI());
86 EXPECT_EQ(api()->GetGaiaIdForExtension(extension_id), gaia_id);
87 }
88
TEST_F(IdentityAPITest,EraseGaiaIdForExtension)89 TEST_F(IdentityAPITest, EraseGaiaIdForExtension) {
90 std::string extension_id = prefs()->AddExtensionAndReturnId("extension");
91 CoreAccountInfo account =
92 identity_env()->MakeAccountAvailable("test@example.com");
93 api()->SetGaiaIdForExtension(extension_id, account.gaia);
94 EXPECT_EQ(api()->GetGaiaIdForExtension(extension_id), account.gaia);
95
96 api()->EraseGaiaIdForExtension(extension_id);
97 EXPECT_EQ(api()->GetGaiaIdForExtension(extension_id), base::nullopt);
98 }
99
TEST_F(IdentityAPITest,GaiaIdErasedAfterSignOut)100 TEST_F(IdentityAPITest, GaiaIdErasedAfterSignOut) {
101 std::string extension_id = prefs()->AddExtensionAndReturnId("extension");
102 CoreAccountInfo account =
103 identity_env()->MakeAccountAvailable("test@example.com");
104 api()->SetGaiaIdForExtension(extension_id, account.gaia);
105 EXPECT_EQ(api()->GetGaiaIdForExtension(extension_id), account.gaia);
106
107 identity_env()->RemoveRefreshTokenForAccount(account.account_id);
108 EXPECT_EQ(api()->GetGaiaIdForExtension(extension_id), base::nullopt);
109 }
110
TEST_F(IdentityAPITest,GaiaIdErasedAfterSignOut_TwoAccounts)111 TEST_F(IdentityAPITest, GaiaIdErasedAfterSignOut_TwoAccounts) {
112 std::string extension1_id = prefs()->AddExtensionAndReturnId("extension1");
113 CoreAccountInfo account1 =
114 identity_env()->MakeAccountAvailable("test1@example.com");
115 api()->SetGaiaIdForExtension(extension1_id, account1.gaia);
116 EXPECT_EQ(api()->GetGaiaIdForExtension(extension1_id), account1.gaia);
117
118 std::string extension2_id = prefs()->AddExtensionAndReturnId("extension2");
119 CoreAccountInfo account2 =
120 identity_env()->MakeAccountAvailable("test2@example.com");
121 api()->SetGaiaIdForExtension(extension2_id, account2.gaia);
122 EXPECT_EQ(api()->GetGaiaIdForExtension(extension2_id), account2.gaia);
123
124 identity_env()->RemoveRefreshTokenForAccount(account1.account_id);
125 EXPECT_EQ(api()->GetGaiaIdForExtension(extension1_id), base::nullopt);
126 EXPECT_EQ(api()->GetGaiaIdForExtension(extension2_id), account2.gaia);
127 }
128
TEST_F(IdentityAPITest,GaiaIdErasedAfterSignOut_AfterShutdown)129 TEST_F(IdentityAPITest, GaiaIdErasedAfterSignOut_AfterShutdown) {
130 std::string extension_id = prefs()->AddExtensionAndReturnId("extension");
131 CoreAccountInfo account =
132 identity_env()->MakeAccountAvailable("test@example.com");
133 api()->SetGaiaIdForExtension(extension_id, account.gaia);
134 EXPECT_EQ(api()->GetGaiaIdForExtension(extension_id), account.gaia);
135
136 api()->Shutdown();
137 ResetIdentityAPI(nullptr);
138
139 identity_env()->RemoveRefreshTokenForAccount(account.account_id);
140 ResetIdentityAPI(CreateIdentityAPI());
141 EXPECT_EQ(api()->GetGaiaIdForExtension(extension_id), base::nullopt);
142 }
143
144 } // namespace extensions
145