ephemeral_app_service_browsertest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector> 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/apps/app_browsertest_util.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/apps/ephemeral_app_service.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/test/test_utils.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_prefs.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/manifest.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using extensions::PlatformAppBrowserTest; 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using extensions::Extension; 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using extensions::ExtensionPrefs; 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using extensions::ExtensionSystem; 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kNumTestApps = 2; 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char* kTestApps[] = { 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "platform_apps/shell_window/generic", 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "platform_apps/minimal" 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class EphemeralAppServiceBrowserTest : public PlatformAppBrowserTest { 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void LoadApps() { 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (int i = 0; i < kNumTestApps; ++i) { 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath path = test_data_dir_.AppendASCII(kTestApps[i]); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Extension* extension = 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InstallExtensionWithSourceAndFlags( 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) path, 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions::Manifest::UNPACKED, 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Extension::IS_EPHEMERAL); 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) app_ids_.push_back(extension->id()); 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(kNumTestApps, (int) app_ids_.size()); 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void GarbageCollectEphemeralApps() { 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EphemeralAppService* ephemeral_service = EphemeralAppService::Get( 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser()->profile()); 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(ephemeral_service); 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ephemeral_service->GarbageCollectApps(); 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<std::string> app_ids_; 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies that inactive ephemeral apps are uninstalled and active apps are 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// not removed. Extensive testing of the ephemeral app cache's replacement 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// policies is done in the unit tests for EphemeralAppService. This is more 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// like an integration test. 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(EphemeralAppServiceBrowserTest, 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GarbageCollectInactiveApps) { 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LoadApps(); 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Time time_now = base::Time::Now(); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionPrefs* prefs = ExtensionPrefs::Get(browser()->profile()); 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(prefs); 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Set launch time for an inactive app. 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string inactive_app_id = app_ids_[0]; 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time inactive_launch = time_now - 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta::FromDays(EphemeralAppService::kAppInactiveThreshold + 1); 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs->SetLastLaunchTime(inactive_app_id, inactive_launch); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Set launch time for an active app. 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string active_app_id = app_ids_[1]; 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Time active_launch = time_now - 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta::FromDays(EphemeralAppService::kAppKeepThreshold); 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs->SetLastLaunchTime(active_app_id, active_launch); 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Perform garbage collection. 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WindowedNotificationObserver uninstall_signal( 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome::NOTIFICATION_EXTENSION_UNINSTALLED, 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::Source<Profile>(browser()->profile())); 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GarbageCollectEphemeralApps(); 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uninstall_signal.Wait(); 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionService* service = ExtensionSystem::Get(browser()->profile()) 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->extension_service(); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(service); 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(service->GetInstalledExtension(inactive_app_id)); 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(service->GetInstalledExtension(active_app_id)); 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 95