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