|  | // Copyright 2017 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "chrome/browser/offline_pages/prefetch/gcm_token.h" | 
|  |  | 
|  | #include "base/bind.h" | 
|  | #include "base/memory/raw_ptr.h" | 
|  | #include "base/run_loop.h" | 
|  | #include "base/test/scoped_feature_list.h" | 
|  | #include "base/test/task_environment.h" | 
|  | #include "build/build_config.h" | 
|  | #include "chrome/browser/gcm/gcm_profile_service_factory.h" | 
|  | #include "chrome/test/base/testing_profile.h" | 
|  | #include "components/gcm_driver/fake_gcm_profile_service.h" | 
|  | #include "components/gcm_driver/instance_id/instance_id.h" | 
|  | #include "components/offline_pages/core/offline_page_feature.h" | 
|  | #include "content/public/test/browser_task_environment.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | #if BUILDFLAG(IS_ANDROID) | 
|  | #include "components/gcm_driver/instance_id/instance_id_android.h" | 
|  | #include "components/gcm_driver/instance_id/scoped_use_fake_instance_id_android.h" | 
|  | #endif  // BUILDFLAG(IS_ANDROID) | 
|  |  | 
|  | using instance_id::InstanceID; | 
|  |  | 
|  | namespace offline_pages { | 
|  | namespace { | 
|  | const char kAppIdForTest[] = "com.google.test.PrefetchInstanceIDProxyTest"; | 
|  | } | 
|  |  | 
|  | class PrefetchInstanceIDProxyTest : public testing::Test { | 
|  | public: | 
|  | PrefetchInstanceIDProxyTest() = default; | 
|  |  | 
|  | PrefetchInstanceIDProxyTest(const PrefetchInstanceIDProxyTest&) = delete; | 
|  | PrefetchInstanceIDProxyTest& operator=(const PrefetchInstanceIDProxyTest&) = | 
|  | delete; | 
|  |  | 
|  | ~PrefetchInstanceIDProxyTest() override = default; | 
|  |  | 
|  | // testing::Test: | 
|  | void SetUp() override; | 
|  | void TearDown() override; | 
|  |  | 
|  | void WaitForAsyncOperation(); | 
|  |  | 
|  | // Sync wrapper for async version. | 
|  | std::string GetToken(); | 
|  |  | 
|  | protected: | 
|  | void GetTokenCompleted(const std::string& token, InstanceID::Result result); | 
|  |  | 
|  | content::BrowserTaskEnvironment task_environment_; | 
|  | TestingProfile profile_; | 
|  |  | 
|  | raw_ptr<gcm::FakeGCMProfileService> gcm_profile_service_; | 
|  |  | 
|  | #if BUILDFLAG(IS_ANDROID) | 
|  | instance_id::InstanceIDAndroid::ScopedBlockOnAsyncTasksForTesting | 
|  | block_async_; | 
|  | #endif  // BUILDFLAG(IS_ANDROID) | 
|  |  | 
|  | std::string token_; | 
|  | InstanceID::Result result_ = InstanceID::UNKNOWN_ERROR; | 
|  |  | 
|  | bool async_operation_completed_ = false; | 
|  | base::OnceClosure async_operation_completed_callback_; | 
|  | base::test::ScopedFeatureList scoped_feature_list_; | 
|  | }; | 
|  |  | 
|  | void PrefetchInstanceIDProxyTest::SetUp() { | 
|  | scoped_feature_list_.InitAndEnableFeature(kPrefetchingOfflinePagesFeature); | 
|  | gcm_profile_service_ = static_cast<gcm::FakeGCMProfileService*>( | 
|  | gcm::GCMProfileServiceFactory::GetInstance()->SetTestingFactoryAndUse( | 
|  | &profile_, base::BindRepeating(&gcm::FakeGCMProfileService::Build))); | 
|  | } | 
|  |  | 
|  | void PrefetchInstanceIDProxyTest::TearDown() { | 
|  | base::RunLoop().RunUntilIdle(); | 
|  | } | 
|  |  | 
|  | void PrefetchInstanceIDProxyTest::WaitForAsyncOperation() { | 
|  | // No need to wait if async operation is not needed. | 
|  | if (async_operation_completed_) | 
|  | return; | 
|  | base::RunLoop run_loop; | 
|  | async_operation_completed_callback_ = run_loop.QuitClosure(); | 
|  | run_loop.Run(); | 
|  | } | 
|  |  | 
|  | std::string PrefetchInstanceIDProxyTest::GetToken() { | 
|  | async_operation_completed_ = false; | 
|  | token_.clear(); | 
|  | result_ = InstanceID::UNKNOWN_ERROR; | 
|  |  | 
|  | GetGCMToken(&profile_, kAppIdForTest, | 
|  | base::BindOnce(&PrefetchInstanceIDProxyTest::GetTokenCompleted, | 
|  | base::Unretained(this))); | 
|  | WaitForAsyncOperation(); | 
|  | return token_; | 
|  | } | 
|  |  | 
|  | void PrefetchInstanceIDProxyTest::GetTokenCompleted(const std::string& token, | 
|  | InstanceID::Result result) { | 
|  | DCHECK(!async_operation_completed_); | 
|  | async_operation_completed_ = true; | 
|  | token_ = token; | 
|  | result_ = result; | 
|  | if (!async_operation_completed_callback_.is_null()) | 
|  | std::move(async_operation_completed_callback_).Run(); | 
|  | } | 
|  |  | 
|  | TEST_F(PrefetchInstanceIDProxyTest, GetToken) { | 
|  | std::string token = GetToken(); | 
|  | EXPECT_NE("", token); | 
|  | } | 
|  |  | 
|  | }  // namespace offline_pages |