chromium/chrome/browser/ash/extensions/gfx_utils_unittest.cc

// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ash/extensions/gfx_utils.h"

#include "ash/components/arc/test/fake_app_instance.h"
#include "base/containers/contains.h"
#include "chrome/browser/ash/app_list/arc/arc_app_test.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_service_test_base.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/test/base/testing_profile.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_builder.h"

namespace extensions {

namespace {

constexpr char kGmailArcPackage[] = "com.google.android.gm";
constexpr char kGmailArcActivity[] =
    "com.google.android.gm.ConversationListActivityGmail";
constexpr char kGmailExtensionId1[] = "pjkljhegncpnkpknbcohdijeoejaedia";
constexpr char kGmailExtensionId2[] = "bjdhhokmhgelphffoafoejjmlfblpdha";

constexpr char kDriveArcPackage[] = "com.google.android.apps.docs";
constexpr char kKeepExtensionId[] = "hmjkmjkepdijhoojdojkdfohbdgmmhki";

}  // namespace

class DualBadgeMapTest : public ExtensionServiceTestBase {
 public:
  DualBadgeMapTest() {}

  DualBadgeMapTest(const DualBadgeMapTest&) = delete;
  DualBadgeMapTest& operator=(const DualBadgeMapTest&) = delete;

  ~DualBadgeMapTest() override { profile_.reset(); }

  void SetUp() override {
    extensions::ExtensionServiceTestBase::SetUp();
    InitializeEmptyExtensionService();
    arc_test_.SetUp(profile_.get());
  }

  void TearDown() override {
    arc_test_.TearDown();
    extensions::ExtensionServiceTestBase::TearDown();
  }

  Profile* profile() { return profile_.get(); }

 protected:
  arc::mojom::ArcPackageInfoPtr CreateArcPackage(
      const std::string& package_name) {
    return arc::mojom::ArcPackageInfo::New(
        package_name, 1 /* package_version */, 1 /* last_backup_android_id */,
        1 /* last_backup_time */, false /* sync */);
  }

  void AddArcPackage(arc::mojom::ArcPackageInfoPtr package) {
    arc_test_.app_instance()->SendPackageAdded(std::move(package));
  }

  void RemoveArcPackage(const std::string& package_name) {
    arc_test_.app_instance()->SendPackageUninstalled(package_name);
  }

  arc::mojom::AppInfoPtr CreateArcApp(const std::string& name,
                                      const std::string& package,
                                      const std::string& activity) {
    return arc::mojom::AppInfo::New(name, package, activity, false /* sticky */,
                                    false /* notifications_enabled */);
  }

  void AddArcApp(arc::mojom::AppInfoPtr app) {
    arc_test_.app_instance()->SendAppAdded(*app);
  }

  scoped_refptr<const Extension> CreateExtension(const std::string& id) {
    return ExtensionBuilder("test").SetID(id).Build();
  }

  void AddExtension(const Extension* extension) {
    service()->AddExtension(extension);
  }

  void RemoveExtension(const Extension* extension) {
    service()->UninstallExtension(
        extension->id(), extensions::UNINSTALL_REASON_FOR_TESTING, nullptr);
  }

 private:
  ArcAppTest arc_test_;
};

TEST_F(DualBadgeMapTest, ExtensionToArcAppMapTest) {
  // Install two Gmail extension apps.
  AddExtension(CreateExtension(kGmailExtensionId1).get());
  AddExtension(CreateExtension(kGmailExtensionId2).get());

  EXPECT_FALSE(extensions::util::HasEquivalentInstalledArcApp(
      profile(), kGmailExtensionId1));
  EXPECT_FALSE(extensions::util::HasEquivalentInstalledArcApp(
      profile(), kGmailExtensionId2));

  // Install Gmail Playstore app.
  AddArcPackage(CreateArcPackage(kGmailArcPackage));
  EXPECT_FALSE(extensions::util::HasEquivalentInstalledArcApp(
      profile(), kGmailExtensionId1));
  EXPECT_FALSE(extensions::util::HasEquivalentInstalledArcApp(
      profile(), kGmailExtensionId2));

  AddArcApp(CreateArcApp("gmail", kGmailArcPackage, kGmailArcActivity));
  EXPECT_TRUE(extensions::util::HasEquivalentInstalledArcApp(
      profile(), kGmailExtensionId1));
  EXPECT_TRUE(extensions::util::HasEquivalentInstalledArcApp(
      profile(), kGmailExtensionId2));

  RemoveArcPackage(kGmailArcPackage);
  EXPECT_FALSE(extensions::util::HasEquivalentInstalledArcApp(
      profile(), kGmailExtensionId1));
  EXPECT_FALSE(extensions::util::HasEquivalentInstalledArcApp(
      profile(), kGmailExtensionId2));

  // Install an unrelated Playstore app.
  AddArcPackage(CreateArcPackage(kDriveArcPackage));
  EXPECT_FALSE(extensions::util::HasEquivalentInstalledArcApp(
      profile(), kGmailExtensionId1));
  EXPECT_FALSE(extensions::util::HasEquivalentInstalledArcApp(
      profile(), kGmailExtensionId2));
}

TEST_F(DualBadgeMapTest, ArcAppToExtensionMapTest) {
  // Install Gmail Playstore app.
  AddArcPackage(CreateArcPackage(kGmailArcPackage));
  AddArcApp(CreateArcApp("gmail", kGmailArcPackage, kGmailArcActivity));

  std::vector<std::string> extension_ids =
      extensions::util::GetEquivalentInstalledExtensions(profile(),
                                                         kGmailArcPackage);
  EXPECT_TRUE(0 == extension_ids.size());

  // Install Gmail extension app.
  scoped_refptr<const Extension> extension1 =
      CreateExtension(kGmailExtensionId1);
  AddExtension(extension1.get());
  extension_ids = extensions::util::GetEquivalentInstalledExtensions(
      profile(), kGmailArcPackage);
  EXPECT_TRUE(1 == extension_ids.size());
  EXPECT_TRUE(base::Contains(extension_ids, kGmailExtensionId1));

  // Install another Gmail extension app.
  scoped_refptr<const Extension> extension2 =
      CreateExtension(kGmailExtensionId2);
  AddExtension(extension2.get());
  extension_ids = extensions::util::GetEquivalentInstalledExtensions(
      profile(), kGmailArcPackage);
  EXPECT_TRUE(2 == extension_ids.size());
  EXPECT_TRUE(base::Contains(extension_ids, kGmailExtensionId1));
  EXPECT_TRUE(base::Contains(extension_ids, kGmailExtensionId2));

  RemoveExtension(extension1.get());
  extension_ids = extensions::util::GetEquivalentInstalledExtensions(
      profile(), kGmailArcPackage);
  EXPECT_TRUE(1 == extension_ids.size());
  EXPECT_FALSE(base::Contains(extension_ids, kGmailExtensionId1));
  EXPECT_TRUE(base::Contains(extension_ids, kGmailExtensionId2));

  RemoveExtension(extension2.get());
  extension_ids = extensions::util::GetEquivalentInstalledExtensions(
      profile(), kGmailArcPackage);
  EXPECT_TRUE(0 == extension_ids.size());

  // Install an unrelated Google Keep extension app.
  scoped_refptr<const Extension> extension = CreateExtension(kKeepExtensionId);
  AddExtension(extension.get());
  extension_ids = extensions::util::GetEquivalentInstalledExtensions(
      profile(), kGmailArcPackage);
  EXPECT_TRUE(0 == extension_ids.size());
}

}  // namespace extensions