| Index: components/ukm/observers/sync_disable_observer_unittest.cc | 
| diff --git a/components/ukm/observers/sync_disable_observer_unittest.cc b/components/ukm/observers/sync_disable_observer_unittest.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..4e4080e38fb002f4ffad4a31675c292f1364af55 | 
| --- /dev/null | 
| +++ b/components/ukm/observers/sync_disable_observer_unittest.cc | 
| @@ -0,0 +1,216 @@ | 
| +// 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 "components/ukm/observers/sync_disable_observer.h" | 
| + | 
| +#include "base/observer_list.h" | 
| +#include "components/sync/driver/fake_sync_service.h" | 
| +#include "testing/gtest/include/gtest/gtest.h" | 
| + | 
| +namespace ukm { | 
| + | 
| +namespace { | 
| + | 
| +class MockSyncService : public syncer::FakeSyncService { | 
| + public: | 
| +  MockSyncService() {} | 
| +  ~MockSyncService() override { Shutdown(); } | 
| + | 
| +  void SetStatus(bool has_passphrase, bool enabled) { | 
| +    initialized_ = true; | 
| +    has_passphrase_ = has_passphrase; | 
| +    preferred_data_types_ = | 
| +        enabled ? syncer::ModelTypeSet(syncer::HISTORY_DELETE_DIRECTIVES) | 
| +                : syncer::ModelTypeSet(); | 
| +    for (auto& observer : observers_) { | 
| +      observer.OnStateChanged(this); | 
| +    } | 
| +  } | 
| + | 
| +  void Shutdown() { | 
| +    for (auto& observer : observers_) { | 
| +      observer.OnSyncShutdown(this); | 
| +    } | 
| +  } | 
| + | 
| + private: | 
| +  // syncer::FakeSyncService: | 
| +  void AddObserver(syncer::SyncServiceObserver* observer) override { | 
| +    observers_.AddObserver(observer); | 
| +  } | 
| +  void RemoveObserver(syncer::SyncServiceObserver* observer) override { | 
| +    observers_.RemoveObserver(observer); | 
| +  } | 
| +  bool IsEngineInitialized() const override { return initialized_; } | 
| +  bool IsUsingSecondaryPassphrase() const override { return has_passphrase_; } | 
| +  syncer::ModelTypeSet GetPreferredDataTypes() const override { | 
| +    return preferred_data_types_; | 
| +  } | 
| + | 
| +  bool initialized_ = false; | 
| +  bool has_passphrase_ = false; | 
| +  syncer::ModelTypeSet preferred_data_types_; | 
| + | 
| +  // The list of observers of the SyncService state. | 
| +  base::ObserverList<syncer::SyncServiceObserver> observers_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(MockSyncService); | 
| +}; | 
| + | 
| +class TestSyncDisableObserver : public SyncDisableObserver { | 
| + public: | 
| +  TestSyncDisableObserver() : purged_(false), notified_(false) {} | 
| +  ~TestSyncDisableObserver() override {} | 
| + | 
| +  bool ResetPurged() { | 
| +    bool was_purged = purged_; | 
| +    purged_ = false; | 
| +    return was_purged; | 
| +  } | 
| + | 
| +  bool ResetNotified() { | 
| +    bool notified = notified_; | 
| +    notified_ = false; | 
| +    return notified; | 
| +  } | 
| + | 
| + private: | 
| +  // SyncDisableObserver: | 
| +  void OnSyncPrefsChanged(bool must_purge) override { | 
| +    notified_ = true; | 
| +    purged_ = purged_ || must_purge; | 
| +  } | 
| +  bool purged_; | 
| +  bool notified_; | 
| +  DISALLOW_COPY_AND_ASSIGN(TestSyncDisableObserver); | 
| +}; | 
| + | 
| +class SyncDisableObserverTest : public testing::Test { | 
| + public: | 
| +  SyncDisableObserverTest() {} | 
| + | 
| + private: | 
| +  DISALLOW_COPY_AND_ASSIGN(SyncDisableObserverTest); | 
| +}; | 
| + | 
| +}  // namespace | 
| + | 
| +TEST_F(SyncDisableObserverTest, NoProfiles) { | 
| +  TestSyncDisableObserver observer; | 
| +  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles()); | 
| +  EXPECT_FALSE(observer.ResetNotified()); | 
| +  EXPECT_FALSE(observer.ResetPurged()); | 
| +} | 
| + | 
| +TEST_F(SyncDisableObserverTest, OneEnabled) { | 
| +  TestSyncDisableObserver observer; | 
| +  MockSyncService sync; | 
| +  sync.SetStatus(false, true); | 
| +  observer.ObserveServiceForSyncDisables(&sync); | 
| +  EXPECT_TRUE(observer.IsHistorySyncEnabledOnAllProfiles()); | 
| +  EXPECT_TRUE(observer.ResetNotified()); | 
| +  EXPECT_FALSE(observer.ResetPurged()); | 
| +} | 
| + | 
| +TEST_F(SyncDisableObserverTest, Passphrase) { | 
| +  TestSyncDisableObserver observer; | 
| +  MockSyncService sync; | 
| +  sync.SetStatus(true, true); | 
| +  observer.ObserveServiceForSyncDisables(&sync); | 
| +  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles()); | 
| +  EXPECT_FALSE(observer.ResetNotified()); | 
| +  EXPECT_FALSE(observer.ResetPurged()); | 
| +} | 
| + | 
| +TEST_F(SyncDisableObserverTest, HistoryDisabled) { | 
| +  TestSyncDisableObserver observer; | 
| +  MockSyncService sync; | 
| +  sync.SetStatus(false, false); | 
| +  observer.ObserveServiceForSyncDisables(&sync); | 
| +  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles()); | 
| +  EXPECT_FALSE(observer.ResetNotified()); | 
| +  EXPECT_FALSE(observer.ResetPurged()); | 
| +} | 
| + | 
| +TEST_F(SyncDisableObserverTest, MixedProfiles1) { | 
| +  TestSyncDisableObserver observer; | 
| +  MockSyncService sync1; | 
| +  sync1.SetStatus(false, false); | 
| +  observer.ObserveServiceForSyncDisables(&sync1); | 
| +  MockSyncService sync2; | 
| +  sync2.SetStatus(false, true); | 
| +  observer.ObserveServiceForSyncDisables(&sync2); | 
| +  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles()); | 
| +  EXPECT_FALSE(observer.ResetNotified()); | 
| +  EXPECT_FALSE(observer.ResetPurged()); | 
| +} | 
| + | 
| +TEST_F(SyncDisableObserverTest, MixedProfiles2) { | 
| +  TestSyncDisableObserver observer; | 
| +  MockSyncService sync1; | 
| +  sync1.SetStatus(false, true); | 
| +  observer.ObserveServiceForSyncDisables(&sync1); | 
| +  EXPECT_TRUE(observer.ResetNotified()); | 
| +  MockSyncService sync2; | 
| +  sync2.SetStatus(false, false); | 
| +  observer.ObserveServiceForSyncDisables(&sync2); | 
| +  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles()); | 
| +  EXPECT_TRUE(observer.ResetNotified()); | 
| +  EXPECT_FALSE(observer.ResetPurged()); | 
| +  sync2.Shutdown(); | 
| +  EXPECT_TRUE(observer.IsHistorySyncEnabledOnAllProfiles()); | 
| +  EXPECT_TRUE(observer.ResetNotified()); | 
| +  EXPECT_FALSE(observer.ResetPurged()); | 
| +} | 
| + | 
| +TEST_F(SyncDisableObserverTest, TwoEnabled) { | 
| +  TestSyncDisableObserver observer; | 
| +  MockSyncService sync1; | 
| +  sync1.SetStatus(false, true); | 
| +  observer.ObserveServiceForSyncDisables(&sync1); | 
| +  EXPECT_TRUE(observer.ResetNotified()); | 
| +  MockSyncService sync2; | 
| +  sync2.SetStatus(false, true); | 
| +  observer.ObserveServiceForSyncDisables(&sync2); | 
| +  EXPECT_TRUE(observer.IsHistorySyncEnabledOnAllProfiles()); | 
| +  EXPECT_FALSE(observer.ResetNotified()); | 
| +  EXPECT_FALSE(observer.ResetPurged()); | 
| +} | 
| + | 
| +TEST_F(SyncDisableObserverTest, OneAddRemove) { | 
| +  TestSyncDisableObserver observer; | 
| +  MockSyncService sync; | 
| +  observer.ObserveServiceForSyncDisables(&sync); | 
| +  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles()); | 
| +  EXPECT_FALSE(observer.ResetNotified()); | 
| +  EXPECT_FALSE(observer.ResetPurged()); | 
| +  sync.SetStatus(false, true); | 
| +  EXPECT_TRUE(observer.IsHistorySyncEnabledOnAllProfiles()); | 
| +  EXPECT_TRUE(observer.ResetNotified()); | 
| +  EXPECT_FALSE(observer.ResetPurged()); | 
| +  sync.Shutdown(); | 
| +  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles()); | 
| +  EXPECT_TRUE(observer.ResetNotified()); | 
| +  EXPECT_FALSE(observer.ResetPurged()); | 
| +} | 
| + | 
| +TEST_F(SyncDisableObserverTest, PurgeOnDisable) { | 
| +  TestSyncDisableObserver observer; | 
| +  MockSyncService sync; | 
| +  sync.SetStatus(false, true); | 
| +  observer.ObserveServiceForSyncDisables(&sync); | 
| +  EXPECT_TRUE(observer.IsHistorySyncEnabledOnAllProfiles()); | 
| +  EXPECT_TRUE(observer.ResetNotified()); | 
| +  EXPECT_FALSE(observer.ResetPurged()); | 
| +  sync.SetStatus(false, false); | 
| +  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles()); | 
| +  EXPECT_TRUE(observer.ResetNotified()); | 
| +  EXPECT_TRUE(observer.ResetPurged()); | 
| +  sync.Shutdown(); | 
| +  EXPECT_FALSE(observer.IsHistorySyncEnabledOnAllProfiles()); | 
| +  EXPECT_FALSE(observer.ResetNotified()); | 
| +  EXPECT_FALSE(observer.ResetPurged()); | 
| +} | 
| + | 
| +}  // namespace ukm | 
|  |