// Copyright 2013 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 #include "chrome/browser/apps/ephemeral_app_browsertest.h" #include "chrome/browser/apps/ephemeral_app_service.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/profiles/profile.h" #include "content/public/test/test_utils.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_system.h" #include "extensions/common/manifest.h" using extensions::Extension; using extensions::ExtensionPrefs; using extensions::ExtensionSystem; namespace { const int kNumTestApps = 2; const char* kTestApps[] = { "app_window/generic", "minimal" }; } // namespace class EphemeralAppServiceBrowserTest : public EphemeralAppTestBase { protected: void LoadApps() { for (int i = 0; i < kNumTestApps; ++i) { const Extension* extension = InstallEphemeralApp(kTestApps[i]); ASSERT_TRUE(extension); app_ids_.push_back(extension->id()); } ASSERT_EQ(kNumTestApps, (int) app_ids_.size()); } void GarbageCollectEphemeralApps() { EphemeralAppService* ephemeral_service = EphemeralAppService::Get( browser()->profile()); ASSERT_TRUE(ephemeral_service); ephemeral_service->GarbageCollectApps(); } void InitEphemeralAppCount(EphemeralAppService* ephemeral_service) { ephemeral_service->InitEphemeralAppCount(); } std::vector app_ids_; }; // Verifies that inactive ephemeral apps are uninstalled and active apps are // not removed. Extensive testing of the ephemeral app cache's replacement // policies is done in the unit tests for EphemeralAppService. This is more // like an integration test. IN_PROC_BROWSER_TEST_F(EphemeralAppServiceBrowserTest, GarbageCollectInactiveApps) { EphemeralAppService* ephemeral_service = EphemeralAppService::Get(browser()->profile()); ASSERT_TRUE(ephemeral_service); InitEphemeralAppCount(ephemeral_service); LoadApps(); const base::Time time_now = base::Time::Now(); ExtensionPrefs* prefs = ExtensionPrefs::Get(browser()->profile()); ASSERT_TRUE(prefs); // Set launch time for an inactive app. std::string inactive_app_id = app_ids_[0]; base::Time inactive_launch = time_now - base::TimeDelta::FromDays(EphemeralAppService::kAppInactiveThreshold + 1); prefs->SetLastLaunchTime(inactive_app_id, inactive_launch); // Set launch time for an active app. std::string active_app_id = app_ids_[1]; base::Time active_launch = time_now - base::TimeDelta::FromDays(EphemeralAppService::kAppKeepThreshold); prefs->SetLastLaunchTime(active_app_id, active_launch); // Perform garbage collection. content::WindowedNotificationObserver uninstall_signal( chrome::NOTIFICATION_EXTENSION_UNINSTALLED_DEPRECATED, content::Source(browser()->profile())); GarbageCollectEphemeralApps(); uninstall_signal.Wait(); ExtensionService* service = ExtensionSystem::Get(browser()->profile()) ->extension_service(); ASSERT_TRUE(service); EXPECT_FALSE(service->GetInstalledExtension(inactive_app_id)); EXPECT_TRUE(service->GetInstalledExtension(active_app_id)); EXPECT_EQ(1, ephemeral_service->ephemeral_app_count()); } // Verify that the count of ephemeral apps is maintained correctly. IN_PROC_BROWSER_TEST_F(EphemeralAppServiceBrowserTest, EphemeralAppCount) { EphemeralAppService* ephemeral_service = EphemeralAppService::Get(browser()->profile()); ASSERT_TRUE(ephemeral_service); InitEphemeralAppCount(ephemeral_service); // The count should not increase for regular installed apps. EXPECT_TRUE(InstallPlatformApp("minimal")); EXPECT_EQ(0, ephemeral_service->ephemeral_app_count()); // The count should increase when an ephemeral app is added. const Extension* app = InstallEphemeralApp(kMessagingReceiverApp); ASSERT_TRUE(app); EXPECT_EQ(1, ephemeral_service->ephemeral_app_count()); // The count should remain constant if the ephemeral app is updated. const std::string app_id = app->id(); app = UpdateEphemeralApp( app_id, GetTestPath(kMessagingReceiverAppV2), GetTestPath(kMessagingReceiverApp).ReplaceExtension( FILE_PATH_LITERAL(".pem"))); ASSERT_TRUE(app); EXPECT_EQ(1, ephemeral_service->ephemeral_app_count()); // The count should decrease when an ephemeral app is promoted to a regular // installed app. PromoteEphemeralApp(app); EXPECT_EQ(0, ephemeral_service->ephemeral_app_count()); }