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