Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / apps / ephemeral_app_service_browsertest.cc
index 24f7f15..ea1fce1 100644 (file)
@@ -4,41 +4,35 @@
 
 #include <vector>
 
-#include "chrome/browser/apps/app_browsertest_util.h"
+#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/extensions/extension_system.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/test/test_utils.h"
 #include "extensions/browser/extension_prefs.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/browser/notification_types.h"
 #include "extensions/common/manifest.h"
 
-using extensions::PlatformAppBrowserTest;
 using extensions::Extension;
 using extensions::ExtensionPrefs;
-using extensions::ExtensionSystem;
+using extensions::ExtensionRegistry;
 
 namespace {
 
 const int kNumTestApps = 2;
 const char* kTestApps[] = {
-  "platform_apps/shell_window/generic",
-  "platform_apps/minimal"
+  "app_window/generic",
+  "minimal"
 };
 
 }  // namespace
 
-class EphemeralAppServiceBrowserTest : public PlatformAppBrowserTest {
+class EphemeralAppServiceBrowserTest : public EphemeralAppTestBase {
  protected:
   void LoadApps() {
     for (int i = 0; i < kNumTestApps; ++i) {
-      base::FilePath path = test_data_dir_.AppendASCII(kTestApps[i]);
-      const Extension* extension =
-          InstallExtensionWithSourceAndFlags(
-              path,
-              1,
-              extensions::Manifest::UNPACKED,
-              Extension::IS_EPHEMERAL);
+      const Extension* extension = InstallEphemeralApp(kTestApps[i]);
+      ASSERT_TRUE(extension);
       app_ids_.push_back(extension->id());
     }
 
@@ -52,6 +46,17 @@ class EphemeralAppServiceBrowserTest : public PlatformAppBrowserTest {
     ephemeral_service->GarbageCollectApps();
   }
 
+  void InitEphemeralAppCount(EphemeralAppService* ephemeral_service) {
+    ephemeral_service->InitEphemeralAppCount();
+  }
+
+  void DisableEphemeralAppsOnStartup() {
+    EphemeralAppService* ephemeral_service =
+        EphemeralAppService::Get(browser()->profile());
+    ASSERT_TRUE(ephemeral_service);
+    ephemeral_service->DisableEphemeralAppsOnStartup();
+  }
+
   std::vector<std::string> app_ids_;
 };
 
@@ -61,6 +66,11 @@ class EphemeralAppServiceBrowserTest : public PlatformAppBrowserTest {
 // 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();
@@ -81,14 +91,119 @@ IN_PROC_BROWSER_TEST_F(EphemeralAppServiceBrowserTest,
 
   // Perform garbage collection.
   content::WindowedNotificationObserver uninstall_signal(
-      chrome::NOTIFICATION_EXTENSION_UNINSTALLED,
+      extensions::NOTIFICATION_EXTENSION_UNINSTALLED_DEPRECATED,
       content::Source<Profile>(browser()->profile()));
   GarbageCollectEphemeralApps();
   uninstall_signal.Wait();
 
-  ExtensionService* service = ExtensionSystem::Get(browser()->profile())
-      ->extension_service();
-  EXPECT_TRUE(service);
-  EXPECT_FALSE(service->GetInstalledExtension(inactive_app_id));
-  EXPECT_TRUE(service->GetInstalledExtension(active_app_id));
+  ExtensionRegistry* registry = ExtensionRegistry::Get(profile());
+  ASSERT_TRUE(registry);
+  EXPECT_FALSE(registry->GetExtensionById(inactive_app_id,
+                                          ExtensionRegistry::EVERYTHING));
+  EXPECT_TRUE(
+      registry->GetExtensionById(active_app_id, ExtensionRegistry::EVERYTHING));
+
+  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());
+}
+
+// Verify that the cache of ephemeral apps is correctly cleared. Running apps
+// should not be removed.
+IN_PROC_BROWSER_TEST_F(EphemeralAppServiceBrowserTest, ClearCachedApps) {
+  const Extension* running_app =
+      InstallAndLaunchEphemeralApp(kMessagingReceiverApp);
+  const Extension* inactive_app =
+      InstallAndLaunchEphemeralApp(kDispatchEventTestApp);
+  std::string inactive_app_id = inactive_app->id();
+  std::string running_app_id = running_app->id();
+  CloseAppWaitForUnload(inactive_app_id);
+
+  EphemeralAppService* ephemeral_service =
+      EphemeralAppService::Get(browser()->profile());
+  ASSERT_TRUE(ephemeral_service);
+  EXPECT_EQ(2, ephemeral_service->ephemeral_app_count());
+
+  ephemeral_service->ClearCachedApps();
+
+  ExtensionRegistry* registry = ExtensionRegistry::Get(profile());
+  ASSERT_TRUE(registry);
+  EXPECT_FALSE(registry->GetExtensionById(inactive_app_id,
+                                          ExtensionRegistry::EVERYTHING));
+  EXPECT_TRUE(registry->GetExtensionById(running_app_id,
+                                         ExtensionRegistry::EVERYTHING));
+
+  EXPECT_EQ(1, ephemeral_service->ephemeral_app_count());
+}
+
+// Verify that the service will unload and disable ephemeral apps on startup.
+IN_PROC_BROWSER_TEST_F(EphemeralAppServiceBrowserTest,
+                       DisableEphemeralAppsOnStartup) {
+  const Extension* installed_app = InstallPlatformApp(kNotificationsTestApp);
+  const Extension* running_app =
+      InstallAndLaunchEphemeralApp(kMessagingReceiverApp);
+  const Extension* inactive_app = InstallEphemeralApp(kDispatchEventTestApp);
+  const Extension* disabled_app = InstallEphemeralApp(kFileSystemTestApp);
+  ASSERT_TRUE(installed_app);
+  ASSERT_TRUE(running_app);
+  ASSERT_TRUE(inactive_app);
+  ASSERT_TRUE(disabled_app);
+  DisableEphemeralApp(disabled_app, Extension::DISABLE_PERMISSIONS_INCREASE);
+
+  ExtensionRegistry* registry = ExtensionRegistry::Get(profile());
+  ASSERT_TRUE(registry);
+  EXPECT_TRUE(registry->enabled_extensions().Contains(installed_app->id()));
+  EXPECT_TRUE(registry->enabled_extensions().Contains(running_app->id()));
+  EXPECT_TRUE(registry->enabled_extensions().Contains(inactive_app->id()));
+  EXPECT_TRUE(registry->disabled_extensions().Contains(disabled_app->id()));
+
+  DisableEphemeralAppsOnStartup();
+
+  // Verify that the inactive app is disabled.
+  EXPECT_TRUE(registry->enabled_extensions().Contains(installed_app->id()));
+  EXPECT_TRUE(registry->enabled_extensions().Contains(running_app->id()));
+  EXPECT_TRUE(registry->disabled_extensions().Contains(inactive_app->id()));
+  EXPECT_TRUE(registry->disabled_extensions().Contains(disabled_app->id()));
+
+  ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
+  ASSERT_TRUE(prefs);
+  EXPECT_FALSE(prefs->HasDisableReason(
+      installed_app->id(), Extension::DISABLE_INACTIVE_EPHEMERAL_APP));
+  EXPECT_FALSE(prefs->HasDisableReason(
+      running_app->id(), Extension::DISABLE_INACTIVE_EPHEMERAL_APP));
+  EXPECT_TRUE(prefs->HasDisableReason(
+      inactive_app->id(), Extension::DISABLE_INACTIVE_EPHEMERAL_APP));
+  EXPECT_TRUE(prefs->HasDisableReason(
+      disabled_app->id(), Extension::DISABLE_INACTIVE_EPHEMERAL_APP));
+  EXPECT_TRUE(prefs->HasDisableReason(
+      disabled_app->id(), Extension::DISABLE_PERMISSIONS_INCREASE));
 }