blob: cce784414f49243d0f82338efaf50f840381f408 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/app_list/arc/arc_vpn_provider_manager.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/app_list/app_list_test_util.h"
#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
#include "chrome/browser/ui/app_list/arc/arc_app_test.h"
#include "components/arc/test/fake_app_instance.h"
constexpr char kVpnAppName[] = "vpn.app.name";
constexpr char kVpnAppNameUpdate[] = "vpn.app.name.update";
constexpr char kVpnAppActivity[] = "vpn.app.activity";
constexpr char kVpnPackageName[] = "vpn.app.package.name";
constexpr char kNonVpnAppName[] = "non.vpn.app.name";
constexpr char kNonVpnAppActivity[] = "non.vpn.app.activity";
constexpr char kNonVpnPackageName[] = "non.vpn.app.package.name";
class ArcVpnObserver : public app_list::ArcVpnProviderManager::Observer {
public:
ArcVpnObserver() = default;
~ArcVpnObserver() override = default;
int GetArcVpnProviderUpdateCount(const std::string& package_name) {
return arc_vpn_provider_counter_[package_name];
}
// ArcVpnProviderManager::Observer::
void OnArcVpnProvidersRefreshed(
const std::vector<
std::unique_ptr<app_list::ArcVpnProviderManager::ArcVpnProvider>>&
arc_vpn_providers) override {
for (const auto& arc_vpn_provider : arc_vpn_providers)
arc_vpn_provider_counter_[arc_vpn_provider->package_name] = 1;
}
void OnArcVpnProviderUpdated(app_list::ArcVpnProviderManager::ArcVpnProvider*
arc_vpn_provider) override {
arc_vpn_provider_counter_[arc_vpn_provider->package_name] += 1;
}
void OnArcVpnProviderRemoved(const std::string& pacakge_name) override {
arc_vpn_provider_counter_.erase(pacakge_name);
}
const std::map<std::string, int>& arc_vpn_provider_counter() const {
return arc_vpn_provider_counter_;
}
private:
std::map<std::string, int> arc_vpn_provider_counter_;
DISALLOW_COPY_AND_ASSIGN(ArcVpnObserver);
};
class ArcVpnProviderTest : public AppListTestBase {
public:
ArcVpnProviderTest() = default;
~ArcVpnProviderTest() override = default;
// AppListTestBase:
void SetUp() override {
AppListTestBase::SetUp();
arc_test_.SetUp(profile());
app_list::ArcVpnProviderManager* arc_vpn_provider_manager =
app_list::ArcVpnProviderManager::Get(profile());
DCHECK(arc_vpn_provider_manager);
arc_vpn_provider_manager->AddObserver(&arc_vpn_observer_);
}
void TearDown() override {
app_list::ArcVpnProviderManager* arc_vpn_provider_manager =
app_list::ArcVpnProviderManager::Get(profile());
DCHECK(arc_vpn_provider_manager);
arc_vpn_provider_manager->RemoveObserver(&arc_vpn_observer_);
arc_test_.TearDown();
AppListTestBase::TearDown();
}
void AddArcApp(const std::string& app_name,
const std::string& package_name,
const std::string& activity) {
arc::mojom::AppInfo app_info;
app_info.name = app_name;
app_info.package_name = package_name;
app_info.activity = activity;
app_instance()->SendPackageAppListRefreshed(package_name, {app_info});
}
void AddArcPackage(const std::string& package_name, bool vpn_provider) {
arc::mojom::ArcPackageInfo package;
package.package_name = package_name;
package.package_version = 0;
package.last_backup_android_id = 0;
package.last_backup_time = 0;
package.sync = false;
package.vpn_provider = vpn_provider;
app_instance()->SendPackageAdded(package);
}
void RemovePackage(const std::string& package_name) {
app_instance()->UninstallPackage(package_name);
}
ArcAppTest& arc_test() { return arc_test_; }
arc::FakeAppInstance* app_instance() { return arc_test_.app_instance(); }
ArcVpnObserver& arc_vpn_observer() { return arc_vpn_observer_; }
private:
ArcAppTest arc_test_;
ArcVpnObserver arc_vpn_observer_;
};
TEST_F(ArcVpnProviderTest, ArcVpnProviderUpdateCount) {
// Starts with no arc vpn provider.
app_instance()->SendRefreshAppList(std::vector<arc::mojom::AppInfo>());
app_instance()->SendRefreshPackageList(
std::vector<arc::mojom::ArcPackageInfo>());
// Arc Vpn Observer should observe Arc Vpn app installation.
AddArcApp(kVpnAppName, kVpnPackageName, kVpnAppActivity);
AddArcPackage(kVpnPackageName, true);
EXPECT_EQ(1u, arc_vpn_observer().arc_vpn_provider_counter().size());
EXPECT_EQ(1,
arc_vpn_observer().GetArcVpnProviderUpdateCount(kVpnPackageName));
// Arc Vpn Observer ignores non Arc Vpn app installation.
AddArcApp(kNonVpnAppName, kNonVpnPackageName, kNonVpnAppActivity);
AddArcPackage(kNonVpnPackageName, false);
EXPECT_EQ(1u, arc_vpn_observer().arc_vpn_provider_counter().size());
// Arc Vpn Observer observes Arc Vpn app launch time and app name updates.
std::string vpnAppId =
ArcAppListPrefs::GetAppId(kVpnPackageName, kVpnAppActivity);
arc_test().arc_app_list_prefs()->SetLastLaunchTime(vpnAppId);
EXPECT_EQ(2,
arc_vpn_observer().GetArcVpnProviderUpdateCount(kVpnPackageName));
AddArcApp(kVpnAppNameUpdate, kVpnPackageName, kVpnAppActivity);
// Update Arc Vpn app name. No new app installed.
EXPECT_EQ(1u, arc_vpn_observer().arc_vpn_provider_counter().size());
EXPECT_EQ(3,
arc_vpn_observer().GetArcVpnProviderUpdateCount(kVpnPackageName));
// Arc Vpn Observer should observe Arc Vpn app uninstallation.
RemovePackage(kVpnPackageName);
EXPECT_EQ(0u, arc_vpn_observer().arc_vpn_provider_counter().size());
}