| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/logging.h" |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/extensions/apps_promo.h" |
| #include "chrome/browser/prefs/browser_prefs.h" |
| #include "chrome/common/extensions/extension.h" |
| #include "chrome/common/pref_names.h" |
| #include "chrome/test/base/testing_browser_process.h" |
| #include "chrome/test/base/testing_pref_service.h" |
| #include "googleurl/src/gurl.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace { |
| |
| const char kPromoId[] = "23123123"; |
| const char kPromoHeader[] = "Get great apps!"; |
| const char kPromoButton[] = "Click for apps!"; |
| const char kPromoLink[] = "http://apps.com"; |
| const char kPromoLogo[] = "chrome://theme/IDR_WEBSTORE_ICON"; |
| const char kPromoExpire[] = "No thanks."; |
| const int kPromoUserGroup = |
| AppsPromo::USERS_NEW | AppsPromo::USERS_EXISTING; |
| |
| } // namespace |
| |
| class ExtensionAppsPromo : public testing::Test { |
| public: |
| TestingPrefService* prefs() { return &prefs_; } |
| AppsPromo* apps_promo() { return &apps_promo_; } |
| |
| protected: |
| explicit ExtensionAppsPromo(); |
| |
| // testing::Test |
| virtual void SetUp(); |
| |
| private: |
| TestingPrefService prefs_; |
| ScopedTestingLocalState local_state_; |
| AppsPromo apps_promo_; |
| }; |
| |
| ExtensionAppsPromo::ExtensionAppsPromo() |
| : local_state_(static_cast<TestingBrowserProcess*>(g_browser_process)), |
| apps_promo_(&prefs_) { |
| } |
| |
| void ExtensionAppsPromo::SetUp() { |
| browser::RegisterUserPrefs(&prefs_); |
| } |
| |
| // TODO(dpolukhin): On Chrome OS all apps are installed via external extensions, |
| // and the web store promo is never shown. |
| #if !defined(OS_CHROMEOS) |
| |
| TEST_F(ExtensionAppsPromo, HappyPath) { |
| const extensions::ExtensionIdSet& default_app_ids = |
| apps_promo()->old_default_apps(); |
| |
| EXPECT_GT(default_app_ids.size(), 0u); |
| |
| // The promo counter should default to the max, since we only use the counter |
| // if they were installed from older versions of Chrome. |
| EXPECT_EQ(AppsPromo::kDefaultAppsCounterMax + 1, |
| apps_promo()->GetPromoCounter()); |
| |
| // The app launcher and promo should not be shown if there are no extensions |
| // installed and no promo is set. |
| extensions::ExtensionIdSet installed_ids; |
| bool promo_just_expired = false; |
| EXPECT_FALSE(AppsPromo::IsPromoSupportedForLocale()); |
| EXPECT_FALSE(apps_promo()->ShouldShowAppLauncher(installed_ids)); |
| EXPECT_FALSE(apps_promo()->ShouldShowPromo(installed_ids, |
| &promo_just_expired)); |
| EXPECT_FALSE(promo_just_expired); |
| |
| // Make sure the web store can be supported even when the promo is not active. |
| AppsPromo::SetWebStoreSupportedForLocale(true); |
| EXPECT_FALSE(AppsPromo::IsPromoSupportedForLocale()); |
| EXPECT_TRUE(apps_promo()->ShouldShowAppLauncher(installed_ids)); |
| EXPECT_FALSE(apps_promo()->ShouldShowPromo(installed_ids, |
| &promo_just_expired)); |
| |
| // We should be able to disable the web store as well. |
| AppsPromo::SetWebStoreSupportedForLocale(false); |
| EXPECT_FALSE(AppsPromo::IsPromoSupportedForLocale()); |
| EXPECT_FALSE(apps_promo()->ShouldShowAppLauncher(installed_ids)); |
| EXPECT_FALSE(apps_promo()->ShouldShowPromo(installed_ids, |
| &promo_just_expired)); |
| |
| // Once the promo is set, we show both the promo and app launcher. |
| AppsPromo::PromoData promo_data(kPromoId, kPromoHeader, kPromoButton, |
| GURL(kPromoLink), kPromoExpire, GURL(""), |
| kPromoUserGroup); |
| AppsPromo::SetPromo(promo_data); |
| AppsPromo::SetWebStoreSupportedForLocale(true); |
| EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale()); |
| EXPECT_TRUE(apps_promo()->ShouldShowAppLauncher(installed_ids)); |
| EXPECT_TRUE(apps_promo()->ShouldShowPromo(installed_ids, |
| &promo_just_expired)); |
| EXPECT_FALSE(promo_just_expired); |
| |
| // Now install an app and the promo should not be shown. |
| installed_ids.insert(*(default_app_ids.begin())); |
| EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale()); |
| EXPECT_TRUE(apps_promo()->ShouldShowAppLauncher(installed_ids)); |
| EXPECT_FALSE(apps_promo()->ShouldShowPromo(installed_ids, |
| &promo_just_expired)); |
| EXPECT_FALSE(promo_just_expired); |
| |
| // Even if the user installs the exact set of default apps, we still don't |
| // show the promo. |
| installed_ids = default_app_ids; |
| EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale()); |
| EXPECT_TRUE(apps_promo()->ShouldShowAppLauncher(installed_ids)); |
| EXPECT_FALSE(apps_promo()->ShouldShowPromo(installed_ids, |
| &promo_just_expired)); |
| EXPECT_FALSE(promo_just_expired); |
| |
| // If the user then uninstalls the apps, the app launcher should remain |
| // and the promo should return. |
| installed_ids.clear(); |
| EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale()); |
| EXPECT_TRUE(apps_promo()->ShouldShowAppLauncher(installed_ids)); |
| EXPECT_TRUE(apps_promo()->ShouldShowPromo(installed_ids, |
| &promo_just_expired)); |
| EXPECT_FALSE(promo_just_expired); |
| } |
| |
| // Tests get and set of promo content. |
| TEST_F(ExtensionAppsPromo, PromoPrefs) { |
| // Store a promo.... |
| AppsPromo::PromoData promo_data(kPromoId, kPromoHeader, kPromoButton, |
| GURL(kPromoLink), kPromoExpire, GURL(""), |
| kPromoUserGroup); |
| AppsPromo::SetPromo(promo_data); |
| |
| // ... then make sure AppsPromo can access it. |
| AppsPromo::PromoData actual_data = AppsPromo::GetPromo(); |
| EXPECT_EQ(kPromoId, actual_data.id); |
| EXPECT_EQ(kPromoHeader, actual_data.header); |
| EXPECT_EQ(kPromoButton, actual_data.button); |
| EXPECT_EQ(GURL(kPromoLink), actual_data.link); |
| EXPECT_EQ(kPromoExpire, actual_data.expire); |
| EXPECT_EQ(kPromoUserGroup, actual_data.user_group); |
| // The promo logo should be the default value. |
| EXPECT_EQ(GURL(kPromoLogo), actual_data.logo); |
| EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale()); |
| |
| AppsPromo::ClearPromo(); |
| actual_data = AppsPromo::GetPromo(); |
| EXPECT_EQ("", actual_data.id); |
| EXPECT_EQ("", actual_data.header); |
| EXPECT_EQ("", actual_data.button); |
| EXPECT_EQ(GURL(""), actual_data.link); |
| EXPECT_EQ("", actual_data.expire); |
| EXPECT_EQ(AppsPromo::USERS_NONE, actual_data.user_group); |
| EXPECT_EQ(GURL(kPromoLogo), actual_data.logo); |
| EXPECT_FALSE(AppsPromo::IsPromoSupportedForLocale()); |
| |
| // Make sure we can set the logo to something other than the default. |
| std::string promo_logo = "data:image/png;base64,iVBORw0kGgoAAAN"; |
| promo_data.logo = GURL(promo_logo); |
| AppsPromo::SetPromo(promo_data); |
| EXPECT_EQ(GURL(promo_logo), AppsPromo::GetPromo().logo); |
| EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale()); |
| |
| // Verify that the default is returned instead of HTTP or HTTPS URLs. |
| promo_data.logo = GURL("http://google.com/logo.png"); |
| AppsPromo::SetPromo(promo_data); |
| EXPECT_EQ(GURL(kPromoLogo), AppsPromo::GetPromo().logo); |
| EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale()); |
| |
| promo_data.logo = GURL("https://google.com/logo.png"); |
| AppsPromo::SetPromo(promo_data); |
| EXPECT_EQ(GURL(kPromoLogo), AppsPromo::GetPromo().logo); |
| EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale()); |
| |
| // Try an invalid URL. |
| promo_data.logo = GURL("sldkfjlsdn"); |
| AppsPromo::SetPromo(promo_data); |
| EXPECT_EQ(GURL(kPromoLogo), AppsPromo::GetPromo().logo); |
| EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale()); |
| |
| // Try the web store supported flag. |
| EXPECT_FALSE(AppsPromo::IsWebStoreSupportedForLocale()); |
| AppsPromo::SetWebStoreSupportedForLocale(true); |
| EXPECT_TRUE(AppsPromo::IsWebStoreSupportedForLocale()); |
| AppsPromo::SetWebStoreSupportedForLocale(false); |
| EXPECT_FALSE(AppsPromo::IsWebStoreSupportedForLocale()); |
| |
| // Try setting and getting the source logo URL. |
| GURL expected_source("https://www.google.com/images/test.png"); |
| AppsPromo::SetSourcePromoLogoURL(expected_source); |
| EXPECT_EQ(expected_source, AppsPromo::GetSourcePromoLogoURL()); |
| } |
| |
| TEST_F(ExtensionAppsPromo, PromoHiddenByPref) { |
| prefs()->SetInteger(prefs::kAppsPromoCounter, 0); |
| prefs()->SetBoolean(prefs::kDefaultAppsInstalled, true); |
| |
| // When the "hide" pref is false, the promo should still appear. |
| prefs()->SetBoolean(prefs::kNtpHideWebStorePromo, false); |
| AppsPromo::PromoData promo_data( |
| kPromoId, kPromoHeader, kPromoButton, GURL(kPromoLink), kPromoExpire, |
| GURL(""), AppsPromo::USERS_NEW | AppsPromo::USERS_EXISTING); |
| AppsPromo::SetPromo(promo_data); |
| bool just_expired; |
| bool show_promo = apps_promo()->ShouldShowPromo( |
| apps_promo()->old_default_apps(), &just_expired); |
| EXPECT_TRUE(show_promo); |
| |
| // When the "hide" pref is true, the promo should NOT appear. |
| prefs()->SetBoolean(prefs::kNtpHideWebStorePromo, true); |
| show_promo = apps_promo()->ShouldShowPromo( |
| apps_promo()->old_default_apps(), &just_expired); |
| EXPECT_FALSE(show_promo); |
| } |
| |
| #endif // OS_CHROMEOS |