Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Unified Diff: chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc

Issue 2745533005: Show notification during ARC managed provision (Closed)
Patch Set: Update message Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/chromeos/arc/notification/arc_provision_notification_service.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc
diff --git a/chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc b/chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..6a855d2e11671adf0275f3c44ccbdb38de16f506
--- /dev/null
+++ b/chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc
@@ -0,0 +1,299 @@
+// 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/chromeos/arc/notification/arc_provision_notification_service.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/command_line.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/memory/ptr_util.h"
+#include "base/values.h"
+#include "chrome/browser/chromeos/arc/arc_auth_notification.h"
+#include "chrome/browser/chromeos/arc/arc_optin_uma.h"
+#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/testing_profile.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/fake_session_manager_client.h"
+#include "components/arc/arc_bridge_service.h"
+#include "components/arc/arc_service_manager.h"
+#include "components/arc/arc_util.h"
+#include "components/arc/test/fake_arc_session.h"
+#include "components/prefs/pref_service.h"
+#include "components/sync_preferences/testing_pref_service_syncable.h"
+#include "components/user_manager/user_manager.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using testing::AnyNumber;
+using testing::AtLeast;
+using testing::Mock;
+using testing::StrictMock;
+
+namespace arc {
+
+namespace {
+
+class MockArcProvisionNotificationServiceDelegate
+ : public ArcProvisionNotificationService::Delegate {
+ public:
+ MOCK_METHOD0(ShowManagedProvisionNotification, void());
+ MOCK_METHOD0(RemoveManagedProvisionNotification, void());
+};
+
+class ArcProvisionNotificationServiceTest : public testing::Test {
+ protected:
+ ArcProvisionNotificationServiceTest()
+ : user_manager_enabler_(new chromeos::FakeChromeUserManager()) {}
+
+ void SetUp() override {
+ chromeos::DBusThreadManager::GetSetterForTesting()->SetSessionManagerClient(
+ base::MakeUnique<chromeos::FakeSessionManagerClient>());
+ chromeos::DBusThreadManager::Initialize();
+
+ SetArcAvailableCommandLineForTesting(
+ base::CommandLine::ForCurrentProcess());
+ ArcSessionManager::DisableUIForTesting();
+ ArcAuthNotification::DisableForTesting();
+
+ ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+ TestingProfile::Builder profile_builder;
+ profile_builder.SetProfileName("user@gmail.com");
+ profile_builder.SetPath(temp_dir_.GetPath().AppendASCII("TestArcProfile"));
+ profile_ = profile_builder.Build();
+
+ arc_service_manager_ = base::MakeUnique<ArcServiceManager>(nullptr);
+ arc_session_manager_ = base::MakeUnique<ArcSessionManager>(
+ base::MakeUnique<ArcSessionRunner>(base::Bind(FakeArcSession::Create)));
+ std::unique_ptr<MockArcProvisionNotificationServiceDelegate>
+ mock_arc_provision_notification_service_delegate = base::MakeUnique<
+ StrictMock<MockArcProvisionNotificationServiceDelegate>>();
+ arc_provision_notification_service_delegate_ =
+ mock_arc_provision_notification_service_delegate.get();
+ arc_provision_notification_service_ =
+ ArcProvisionNotificationService::CreateForTesting(
+ arc_bridge_service(),
+ std::move(mock_arc_provision_notification_service_delegate));
+
+ const AccountId account_id(AccountId::FromUserEmailGaiaId(
+ profile()->GetProfileUserName(), "1234567890"));
+ GetFakeUserManager()->AddUser(account_id);
+ GetFakeUserManager()->LoginUser(account_id);
+ }
+
+ void TearDown() override {
+ EXPECT_CALL(*arc_provision_notification_service_delegate(),
+ RemoveManagedProvisionNotification())
+ .Times(AtLeast(1));
+ arc_provision_notification_service_.reset();
+ arc_provision_notification_service_delegate_ = nullptr;
+ arc_session_manager_.reset();
+ arc_service_manager_.reset();
+ profile_.reset();
+ chromeos::DBusThreadManager::Shutdown();
+ }
+
+ TestingProfile* profile() { return profile_.get(); }
+ ArcServiceManager* arc_service_manager() {
+ return arc_service_manager_.get();
+ }
+ ArcBridgeService* arc_bridge_service() {
+ return arc_service_manager_->arc_bridge_service();
+ }
+ ArcSessionManager* arc_session_manager() {
+ return arc_session_manager_.get();
+ }
+ MockArcProvisionNotificationServiceDelegate*
+ arc_provision_notification_service_delegate() {
+ return arc_provision_notification_service_delegate_;
+ }
+ ArcProvisionNotificationService* arc_provision_notification_service() {
+ return arc_provision_notification_service_.get();
+ }
+ chromeos::FakeChromeUserManager* GetFakeUserManager() {
+ return static_cast<chromeos::FakeChromeUserManager*>(
+ user_manager::UserManager::Get());
+ }
+
+ private:
+ content::TestBrowserThreadBundle thread_bundle_;
+ chromeos::ScopedUserManagerEnabler user_manager_enabler_;
+ base::ScopedTempDir temp_dir_;
+ std::unique_ptr<TestingProfile> profile_;
+ std::unique_ptr<ArcServiceManager> arc_service_manager_;
+ std::unique_ptr<ArcSessionManager> arc_session_manager_;
+ std::unique_ptr<ArcProvisionNotificationService>
+ arc_provision_notification_service_;
+ MockArcProvisionNotificationServiceDelegate*
+ arc_provision_notification_service_delegate_ = nullptr;
+
+ DISALLOW_COPY_AND_ASSIGN(ArcProvisionNotificationServiceTest);
+};
+
+} // namespace
+
+// The managed provision notification is displayed from the beginning of the
+// silent opt-in till its successful finish.
+TEST_F(ArcProvisionNotificationServiceTest,
+ ManagedProvisionNotification_Basic) {
+ // Set up managed ARC and assign managed values to all opt-in prefs.
+ profile()->GetTestingPrefService()->SetManagedPref(
+ prefs::kArcEnabled, base::MakeUnique<base::Value>(true));
+ profile()->GetTestingPrefService()->SetManagedPref(
+ prefs::kArcBackupRestoreEnabled, base::MakeUnique<base::Value>(false));
+ profile()->GetTestingPrefService()->SetManagedPref(
+ prefs::kArcLocationServiceEnabled, base::MakeUnique<base::Value>(false));
+
+ arc_session_manager()->SetProfile(profile());
+
+ // Trigger opt-in flow. The notification gets shown.
+ EXPECT_CALL(*arc_provision_notification_service_delegate(),
+ ShowManagedProvisionNotification());
+ arc_session_manager()->RequestEnable();
+ EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager()->state());
+ Mock::VerifyAndClearExpectations(
+ arc_provision_notification_service_delegate());
+
+ // Emulate successful provisioning. The notification gets removed.
+ EXPECT_CALL(*arc_provision_notification_service_delegate(),
+ RemoveManagedProvisionNotification())
+ .Times(AtLeast(1));
+ arc_session_manager()->OnProvisioningFinished(ProvisioningResult::SUCCESS);
+ Mock::VerifyAndClearExpectations(
+ arc_provision_notification_service_delegate());
+}
+
+// The managed provision notification is not displayed after the restart if the
+// provisioning was successful.
+TEST_F(ArcProvisionNotificationServiceTest,
+ ManagedProvisionNotification_Restart) {
+ // No notifications are expected to be shown in this test, but the delegate
+ // method that removes the notification is allowed to be called.
+ EXPECT_CALL(*arc_provision_notification_service_delegate(),
+ RemoveManagedProvisionNotification())
+ .Times(AnyNumber());
+
+ // Set up managed ARC and assign managed values to all opt-in prefs.
+ profile()->GetTestingPrefService()->SetManagedPref(
+ prefs::kArcEnabled, base::MakeUnique<base::Value>(true));
+ profile()->GetTestingPrefService()->SetManagedPref(
+ prefs::kArcBackupRestoreEnabled, base::MakeUnique<base::Value>(false));
+ profile()->GetTestingPrefService()->SetManagedPref(
+ prefs::kArcLocationServiceEnabled, base::MakeUnique<base::Value>(false));
+ // Set the pref that indicates that signing into ARC has already been
+ // performed.
+ profile()->GetPrefs()->SetBoolean(prefs::kArcSignedIn, true);
+
+ arc_session_manager()->SetProfile(profile());
+
+ // Enable ARC. The opt-in flow doesn't take place, and no notification is
+ // shown.
+ arc_session_manager()->RequestEnable();
+ EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager()->state());
+ arc_session_manager()->OnProvisioningFinished(ProvisioningResult::SUCCESS);
+}
+
+// The managed provision notification is displayed from the beginning of the
+// silent opt-in till the failure of the provision.
+TEST_F(ArcProvisionNotificationServiceTest,
+ ManagedProvisionNotification_Failure) {
+ // Set up managed ARC and assign managed values to all opt-in prefs.
+ profile()->GetTestingPrefService()->SetManagedPref(
+ prefs::kArcEnabled, base::MakeUnique<base::Value>(true));
+ profile()->GetTestingPrefService()->SetManagedPref(
+ prefs::kArcBackupRestoreEnabled, base::MakeUnique<base::Value>(false));
+ profile()->GetTestingPrefService()->SetManagedPref(
+ prefs::kArcLocationServiceEnabled, base::MakeUnique<base::Value>(false));
+
+ arc_session_manager()->SetProfile(profile());
+
+ // Trigger opt-in flow. The notification gets shown.
+ EXPECT_CALL(*arc_provision_notification_service_delegate(),
+ ShowManagedProvisionNotification());
+ arc_session_manager()->RequestEnable();
+ EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager()->state());
+ Mock::VerifyAndClearExpectations(
+ arc_provision_notification_service_delegate());
+
+ // Emulate provisioning failure that leads to stopping ARC. The notification
+ // gets removed.
+ EXPECT_CALL(*arc_provision_notification_service_delegate(),
+ RemoveManagedProvisionNotification())
+ .Times(AtLeast(1));
+ arc_session_manager()->OnProvisioningFinished(
+ ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR);
+ Mock::VerifyAndClearExpectations(
+ arc_provision_notification_service_delegate());
+}
+
+// The managed provision notification is displayed from the beginning of the
+// silent opt-in till the failure of the provision.
+TEST_F(ArcProvisionNotificationServiceTest,
+ ManagedProvisionNotification_FailureNotStopping) {
+ // Set up managed ARC and assign managed values to all opt-in prefs.
+ profile()->GetTestingPrefService()->SetManagedPref(
+ prefs::kArcEnabled, base::MakeUnique<base::Value>(true));
+ profile()->GetTestingPrefService()->SetManagedPref(
+ prefs::kArcBackupRestoreEnabled, base::MakeUnique<base::Value>(false));
+ profile()->GetTestingPrefService()->SetManagedPref(
+ prefs::kArcLocationServiceEnabled, base::MakeUnique<base::Value>(false));
+
+ arc_session_manager()->SetProfile(profile());
+
+ // Trigger opt-in flow. The notification gets shown.
+ EXPECT_CALL(*arc_provision_notification_service_delegate(),
+ ShowManagedProvisionNotification());
+ arc_session_manager()->RequestEnable();
+ EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager()->state());
+ Mock::VerifyAndClearExpectations(
+ arc_provision_notification_service_delegate());
+
+ // Emulate provisioning failure that leads to showing an error screen without
+ // shutting ARC down. The notification gets removed.
+ EXPECT_CALL(*arc_provision_notification_service_delegate(),
+ RemoveManagedProvisionNotification())
+ .Times(AtLeast(1));
+ arc_session_manager()->OnProvisioningFinished(
+ ProvisioningResult::NO_NETWORK_CONNECTION);
+ Mock::VerifyAndClearExpectations(
+ arc_provision_notification_service_delegate());
+}
+
+// The managed provision notification is not displayed when opt-in prefs are not
+// managed.
+TEST_F(ArcProvisionNotificationServiceTest,
+ ManagedProvisionNotification_NotSilent) {
+ // No notifications are expected to be shown in this test, but the delegate
+ // method that removes the notification is allowed to be called.
+ EXPECT_CALL(*arc_provision_notification_service_delegate(),
+ RemoveManagedProvisionNotification())
+ .Times(AnyNumber());
+
+ // Set ARC to be managed.
+ profile()->GetTestingPrefService()->SetManagedPref(
+ prefs::kArcEnabled, base::MakeUnique<base::Value>(true));
+
+ arc_session_manager()->SetProfile(profile());
+
+ // Trigger opt-in flow. The notification is not shown.
+ arc_session_manager()->RequestEnable();
+ EXPECT_EQ(ArcSessionManager::State::NEGOTIATING_TERMS_OF_SERVICE,
+ arc_session_manager()->state());
+
+ // Emulate accepting the terms of service.
+ profile()->GetPrefs()->SetBoolean(prefs::kArcTermsAccepted, true);
+ arc_session_manager()->StartArcForTesting();
+ EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager()->state());
+
+ // Emulate successful provisioning.
+ arc_session_manager()->OnProvisioningFinished(ProvisioningResult::SUCCESS);
+}
+
+} // namespace arc
« no previous file with comments | « chrome/browser/chromeos/arc/notification/arc_provision_notification_service.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698