1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
// Copyright 2018 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/arc/notification/arc_management_transition_notification.h"
#include <memory>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/run_loop.h"
#include "chrome/app/vector_icons/vector_icons.h"
#include "chrome/browser/ash/app_list/arc/arc_app_list_prefs.h"
#include "chrome/browser/ash/app_list/arc/arc_app_test.h"
#include "chrome/browser/ash/app_list/arc/arc_app_utils.h"
#include "chrome/browser/notifications/notification_display_service_tester.h"
#include "chrome/test/base/testing_profile.h"
#include "chromeos/ash/experiences/arc/arc_prefs.h"
#include "chromeos/ash/experiences/arc/metrics/arc_metrics_constants.h"
#include "chromeos/ash/experiences/arc/session/arc_management_transition.h"
#include "chromeos/ash/experiences/arc/test/fake_app_instance.h"
#include "chromeos/ui/vector_icons/vector_icons.h"
#include "components/prefs/pref_service.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace arc {
namespace {
struct TransitionNotificationParams {
TransitionNotificationParams(ArcManagementTransition arc_transition,
const gfx::VectorIcon* notification_icon)
: arc_transition(arc_transition), notification_icon(notification_icon) {}
ArcManagementTransition arc_transition;
raw_ptr<const gfx::VectorIcon> notification_icon;
};
} // namespace
class ArcManagementTransitionNotificationTest
: public testing::Test,
public testing::WithParamInterface<TransitionNotificationParams> {
public:
ArcManagementTransitionNotificationTest() = default;
~ArcManagementTransitionNotificationTest() override = default;
ArcManagementTransitionNotificationTest(
const ArcManagementTransitionNotificationTest&) = delete;
ArcManagementTransitionNotificationTest& operator=(
const ArcManagementTransitionNotificationTest&) = delete;
void SetUp() override {
profile_ = std::make_unique<TestingProfile>();
display_service_ =
std::make_unique<NotificationDisplayServiceTester>(profile());
arc_app_test_.SetUp(profile());
}
void TearDown() override {
arc_app_test_.TearDown();
display_service_.reset();
profile_.reset();
}
Profile* profile() { return profile_.get(); }
NotificationDisplayServiceTester* display_service() {
return display_service_.get();
}
ArcAppTest* arc_app_test() { return &arc_app_test_; }
const gfx::VectorIcon* expected_notification_icon() {
return GetParam().notification_icon;
}
ArcManagementTransition arc_transition() { return GetParam().arc_transition; }
private:
std::unique_ptr<TestingProfile> profile_;
std::unique_ptr<NotificationDisplayServiceTester> display_service_;
ArcAppTest arc_app_test_;
content::BrowserTaskEnvironment task_environment_;
};
INSTANTIATE_TEST_SUITE_P(
All,
ArcManagementTransitionNotificationTest,
::testing::Values(
TransitionNotificationParams(ArcManagementTransition::NO_TRANSITION,
nullptr),
TransitionNotificationParams(ArcManagementTransition::CHILD_TO_REGULAR,
&kNotificationFamilyLinkIcon),
TransitionNotificationParams(ArcManagementTransition::REGULAR_TO_CHILD,
&kNotificationFamilyLinkIcon),
TransitionNotificationParams(
ArcManagementTransition::UNMANAGED_TO_MANAGED,
&chromeos::kEnterpriseIcon)));
TEST_P(ArcManagementTransitionNotificationTest, BaseFlow) {
ASSERT_TRUE(arc_app_test()->fake_apps().size());
arc_app_test()->app_instance()->SendRefreshAppList(
arc_app_test()->fake_apps());
const std::string app_id =
ArcAppTest::GetAppId(*arc_app_test()->fake_apps()[0]);
profile()->GetPrefs()->SetInteger(prefs::kArcManagementTransition,
static_cast<int>(arc_transition()));
// Attempt to launch ARC app triggers notification.
LaunchApp(profile(), app_id, 0 /* event_flags */,
UserInteractionType::NOT_USER_INITIATED);
std::unique_ptr<ArcAppListPrefs::AppInfo> app_info =
arc_app_test()->arc_app_list_prefs()->GetApp(app_id);
ASSERT_TRUE(app_info);
// In case no management transition in progress notification is not
// triggered.
if (arc_transition() == ArcManagementTransition::NO_TRANSITION) {
EXPECT_FALSE(display_service()->GetNotification(
kManagementTransitionNotificationId));
// Last launch is set, indicating that launch attempt was not blocked.
EXPECT_FALSE(app_info->last_launch_time.is_null());
return;
}
{
auto notification =
display_service()->GetNotification(kManagementTransitionNotificationId);
// Notification is shown.
ASSERT_TRUE(notification);
// Notification has expected icon.
EXPECT_EQ(¬ification->vector_small_image(),
expected_notification_icon());
}
// Last launch is not set, indicating that launch attempt was blocked.
EXPECT_TRUE(app_info->last_launch_time.is_null());
// Finishing transition automatically dismisses notification.
profile()->GetPrefs()->SetInteger(
prefs::kArcManagementTransition,
static_cast<int>(ArcManagementTransition::NO_TRANSITION));
EXPECT_FALSE(
display_service()->GetNotification(kManagementTransitionNotificationId));
// Re-activate notification and check opt out. On opt-out notification is also
// automatically dismissed.
profile()->GetPrefs()->SetInteger(prefs::kArcManagementTransition,
static_cast<int>(arc_transition()));
ShowManagementTransitionNotification(profile());
EXPECT_TRUE(
display_service()->GetNotification(kManagementTransitionNotificationId));
profile()->GetPrefs()->SetBoolean(prefs::kArcEnabled, false);
EXPECT_FALSE(
display_service()->GetNotification(kManagementTransitionNotificationId));
}
} // namespace arc
|