• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <vector>
6 
7 #include "chrome/browser/apps/ephemeral_app_browsertest.h"
8 #include "chrome/browser/apps/ephemeral_app_service.h"
9 #include "chrome/browser/extensions/extension_service.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "content/public/test/test_utils.h"
12 #include "extensions/browser/extension_prefs.h"
13 #include "extensions/browser/extension_system.h"
14 #include "extensions/common/manifest.h"
15 
16 using extensions::Extension;
17 using extensions::ExtensionPrefs;
18 using extensions::ExtensionSystem;
19 
20 namespace {
21 
22 const int kNumTestApps = 2;
23 const char* kTestApps[] = {
24   "app_window/generic",
25   "minimal"
26 };
27 
28 }  // namespace
29 
30 class EphemeralAppServiceBrowserTest : public EphemeralAppTestBase {
31  protected:
LoadApps()32   void LoadApps() {
33     for (int i = 0; i < kNumTestApps; ++i) {
34       const Extension* extension = InstallEphemeralApp(kTestApps[i]);
35       ASSERT_TRUE(extension);
36       app_ids_.push_back(extension->id());
37     }
38 
39     ASSERT_EQ(kNumTestApps, (int) app_ids_.size());
40   }
41 
GarbageCollectEphemeralApps()42   void GarbageCollectEphemeralApps() {
43     EphemeralAppService* ephemeral_service = EphemeralAppService::Get(
44         browser()->profile());
45     ASSERT_TRUE(ephemeral_service);
46     ephemeral_service->GarbageCollectApps();
47   }
48 
InitEphemeralAppCount(EphemeralAppService * ephemeral_service)49   void InitEphemeralAppCount(EphemeralAppService* ephemeral_service) {
50     ephemeral_service->InitEphemeralAppCount();
51   }
52 
53   std::vector<std::string> app_ids_;
54 };
55 
56 // Verifies that inactive ephemeral apps are uninstalled and active apps are
57 // not removed. Extensive testing of the ephemeral app cache's replacement
58 // policies is done in the unit tests for EphemeralAppService. This is more
59 // like an integration test.
IN_PROC_BROWSER_TEST_F(EphemeralAppServiceBrowserTest,GarbageCollectInactiveApps)60 IN_PROC_BROWSER_TEST_F(EphemeralAppServiceBrowserTest,
61                        GarbageCollectInactiveApps) {
62   EphemeralAppService* ephemeral_service =
63       EphemeralAppService::Get(browser()->profile());
64   ASSERT_TRUE(ephemeral_service);
65   InitEphemeralAppCount(ephemeral_service);
66 
67   LoadApps();
68 
69   const base::Time time_now = base::Time::Now();
70   ExtensionPrefs* prefs = ExtensionPrefs::Get(browser()->profile());
71   ASSERT_TRUE(prefs);
72 
73   // Set launch time for an inactive app.
74   std::string inactive_app_id = app_ids_[0];
75   base::Time inactive_launch = time_now -
76       base::TimeDelta::FromDays(EphemeralAppService::kAppInactiveThreshold + 1);
77   prefs->SetLastLaunchTime(inactive_app_id, inactive_launch);
78 
79   // Set launch time for an active app.
80   std::string active_app_id = app_ids_[1];
81   base::Time active_launch = time_now -
82       base::TimeDelta::FromDays(EphemeralAppService::kAppKeepThreshold);
83   prefs->SetLastLaunchTime(active_app_id, active_launch);
84 
85   // Perform garbage collection.
86   content::WindowedNotificationObserver uninstall_signal(
87       chrome::NOTIFICATION_EXTENSION_UNINSTALLED_DEPRECATED,
88       content::Source<Profile>(browser()->profile()));
89   GarbageCollectEphemeralApps();
90   uninstall_signal.Wait();
91 
92   ExtensionService* service = ExtensionSystem::Get(browser()->profile())
93       ->extension_service();
94   ASSERT_TRUE(service);
95   EXPECT_FALSE(service->GetInstalledExtension(inactive_app_id));
96   EXPECT_TRUE(service->GetInstalledExtension(active_app_id));
97 
98   EXPECT_EQ(1, ephemeral_service->ephemeral_app_count());
99 }
100 
101 // Verify that the count of ephemeral apps is maintained correctly.
IN_PROC_BROWSER_TEST_F(EphemeralAppServiceBrowserTest,EphemeralAppCount)102 IN_PROC_BROWSER_TEST_F(EphemeralAppServiceBrowserTest,
103                        EphemeralAppCount) {
104   EphemeralAppService* ephemeral_service =
105       EphemeralAppService::Get(browser()->profile());
106   ASSERT_TRUE(ephemeral_service);
107   InitEphemeralAppCount(ephemeral_service);
108 
109   // The count should not increase for regular installed apps.
110   EXPECT_TRUE(InstallPlatformApp("minimal"));
111   EXPECT_EQ(0, ephemeral_service->ephemeral_app_count());
112 
113   // The count should increase when an ephemeral app is added.
114   const Extension* app = InstallEphemeralApp(kMessagingReceiverApp);
115   ASSERT_TRUE(app);
116   EXPECT_EQ(1, ephemeral_service->ephemeral_app_count());
117 
118   // The count should remain constant if the ephemeral app is updated.
119   const std::string app_id = app->id();
120   app = UpdateEphemeralApp(
121       app_id, GetTestPath(kMessagingReceiverAppV2),
122       GetTestPath(kMessagingReceiverApp).ReplaceExtension(
123           FILE_PATH_LITERAL(".pem")));
124   ASSERT_TRUE(app);
125   EXPECT_EQ(1, ephemeral_service->ephemeral_app_count());
126 
127   // The count should decrease when an ephemeral app is promoted to a regular
128   // installed app.
129   PromoteEphemeralApp(app);
130   EXPECT_EQ(0, ephemeral_service->ephemeral_app_count());
131 }
132