// Copyright 2019 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/throttle_observer.h"

#include "base/functional/bind.h"
#include "base/memory/weak_ptr.h"
#include "base/template_util.h"
#include "base/test/task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace ash {

constexpr const char kObserverName[] = "TestObserver";

class ThrottleObserverTest
    : public testing::Test,
      public base::SupportsWeakPtr<ThrottleObserverTest> {
 public:
  ThrottleObserverTest() {
    observer_.StartObserving(
        nullptr /* content::BrowserContext* */,
        base::BindRepeating(&ThrottleObserverTest::OnObserverStateChanged,
                            AsWeakPtr()));
  }

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

  void OnObserverStateChanged(const ThrottleObserver*) { notify_count_++; }

 protected:
  ThrottleObserver* observer() { return &observer_; }
  size_t notify_count() const { return notify_count_; }

 private:
  ThrottleObserver observer_{kObserverName};
  size_t notify_count_{0};
};

// Tests that ThrottleObserver can be constructed and destructed.
TEST_F(ThrottleObserverTest, TestConstructDestruct) {}

// Tests that ThrottleObserver's name is properly set.
TEST_F(ThrottleObserverTest, TestObserverName) {
  EXPECT_EQ(kObserverName, observer()->name());
}

// Tests that ThrottleObserver notifies observers on SetActive().
TEST_F(ThrottleObserverTest, TestSetActive) {
  EXPECT_EQ(0U, notify_count());
  EXPECT_FALSE(observer()->active());

  observer()->SetActive(true);
  EXPECT_TRUE(observer()->active());
  EXPECT_EQ(1U, notify_count());

  observer()->SetActive(true);
  EXPECT_TRUE(observer()->active());
  EXPECT_EQ(2U, notify_count());

  observer()->SetActive(false);
  EXPECT_FALSE(observer()->active());
  EXPECT_EQ(3U, notify_count());
}

// Tests that ThrottleObserver notifies observers on SetEnforced().
TEST_F(ThrottleObserverTest, TestSetEnforced) {
  EXPECT_EQ(0U, notify_count());
  EXPECT_FALSE(observer()->enforced());

  observer()->SetEnforced(true);
  EXPECT_TRUE(observer()->enforced());
  EXPECT_EQ(1U, notify_count());

  observer()->SetEnforced(true);
  EXPECT_TRUE(observer()->enforced());
  EXPECT_EQ(2U, notify_count());

  observer()->SetEnforced(false);
  EXPECT_FALSE(observer()->enforced());
  EXPECT_EQ(3U, notify_count());
}

// Tests that the callback is not called after StopObserving.
TEST_F(ThrottleObserverTest, TestStopObserving) {
  observer()->StopObserving();
  EXPECT_EQ(0U, notify_count());

  observer()->SetActive(true);
  EXPECT_EQ(0U, notify_count());

  observer()->SetEnforced(true);
  EXPECT_EQ(0U, notify_count());
}

}  // namespace ash
