// Copyright (c) 2011 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/extensions/apps_promo.h" #include "chrome/browser/prefs/browser_prefs.h" #include "chrome/browser/ui/webui/ntp/shown_sections_handler.h" #include "chrome/common/extensions/extension.h" #include "chrome/common/pref_names.h" #include "chrome/test/testing_browser_process_test.h" #include "chrome/test/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 kPromoExpire[] = "No thanks."; } // namespace class ExtensionAppsPromo : public TestingBrowserProcessTest { 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_(testing_browser_process_.get()), 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 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. 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); // Once the promo is set, we show both the promo and app launcher. AppsPromo::SetPromo( kPromoId, kPromoHeader, kPromoButton, GURL(kPromoLink), kPromoExpire); 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::SetPromo( kPromoId, kPromoHeader, kPromoButton, GURL(kPromoLink), kPromoExpire); // ... then make sure AppsPromo can access it. EXPECT_EQ(kPromoId, AppsPromo::GetPromoId()); EXPECT_EQ(kPromoHeader, AppsPromo::GetPromoHeaderText()); EXPECT_EQ(kPromoButton, AppsPromo::GetPromoButtonText()); EXPECT_EQ(GURL(kPromoLink), AppsPromo::GetPromoLink()); EXPECT_EQ(kPromoExpire, AppsPromo::GetPromoExpireText()); EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale()); AppsPromo::ClearPromo(); EXPECT_EQ("", AppsPromo::GetPromoId()); EXPECT_EQ("", AppsPromo::GetPromoHeaderText()); EXPECT_EQ("", AppsPromo::GetPromoButtonText()); EXPECT_EQ(GURL(""), AppsPromo::GetPromoLink()); EXPECT_EQ("", AppsPromo::GetPromoExpireText()); EXPECT_FALSE(AppsPromo::IsPromoSupportedForLocale()); } // Tests that the apps section is maxmized when showing a promo for the first // time. TEST_F(ExtensionAppsPromo, UpdatePromoFocus) { ExtensionIdSet installed_ids; bool promo_just_expired = false; EXPECT_FALSE(apps_promo()->ShouldShowPromo(installed_ids, &promo_just_expired)); EXPECT_FALSE(promo_just_expired); // Set the promo content. AppsPromo::SetPromo( kPromoId, kPromoHeader, kPromoButton, GURL(kPromoLink), kPromoExpire); // After asking if we should show the promo, the EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale()); EXPECT_TRUE(apps_promo()->ShouldShowPromo(installed_ids, &promo_just_expired)); apps_promo()->MaximizeAppsIfFirstView(); EXPECT_TRUE( (ShownSectionsHandler::GetShownSections(prefs()) & APPS) != 0); EXPECT_FALSE( (ShownSectionsHandler::GetShownSections(prefs()) & THUMB) != 0); apps_promo()->HidePromo(); EXPECT_TRUE((ShownSectionsHandler::GetShownSections(prefs()) & (MENU_APPS | THUMB)) != 0); } #endif // OS_CHROMEOS