// 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 "ui/aura/mus/user_activity_forwarder.h"

#include <memory>
#include <vector>

#include "base/macros.h"
#include "base/time/time.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "services/ws/common/task_runner_test_base.h"
#include "services/ws/public/mojom/user_activity_monitor.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/user_activity/user_activity_detector.h"

namespace {

// Fake implementation of ws::mojom::UserActivityMonitor for testing that just
// supports tracking and notifying observers.
class FakeUserActivityMonitor : public ws::mojom::UserActivityMonitor {
 public:
  FakeUserActivityMonitor() : binding_(this) {}
  ~FakeUserActivityMonitor() override {}

  ws::mojom::UserActivityMonitorPtr GetPtr() {
    ws::mojom::UserActivityMonitorPtr ptr;
    binding_.Bind(mojo::MakeRequest(&ptr));
    return ptr;
  }

  // Notifies all observers about user activity.
  // ws::TaskRunnerTestBase::RunUntilIdle() must be called after this method in
  // order for observers to receive notifications.
  void NotifyUserActivityObservers() {
    for (auto& observer : activity_observers_)
      observer->OnUserActivity();
  }

  // ws::mojom::UserActivityMonitor:
  void AddUserActivityObserver(
      uint32_t delay_between_notify_secs,
      ws::mojom::UserActivityObserverPtr observer) override {
    activity_observers_.push_back(std::move(observer));
  }
  void AddUserIdleObserver(uint32_t idleness_in_minutes,
                           ws::mojom::UserIdleObserverPtr observer) override {
    NOTREACHED() << "Unexpected AddUserIdleObserver call";
  }

 private:
  mojo::Binding<ws::mojom::UserActivityMonitor> binding_;
  std::vector<ws::mojom::UserActivityObserverPtr> activity_observers_;

  DISALLOW_COPY_AND_ASSIGN(FakeUserActivityMonitor);
};

}  // namespace

namespace aura {

using UserActivityForwarderTest = ws::TaskRunnerTestBase;

TEST_F(UserActivityForwarderTest, ForwardActivityToDetector) {
  FakeUserActivityMonitor monitor;
  ui::UserActivityDetector detector;
  UserActivityForwarder forwarder(monitor.GetPtr(), &detector);

  // Run pending tasks so |monitor| receives |forwarder|'s registration.
  RunUntilIdle();

  base::TimeTicks now =
      base::TimeTicks() + base::TimeDelta::FromMicroseconds(1000);
  detector.set_now_for_test(now);
  monitor.NotifyUserActivityObservers();
  RunUntilIdle();
  EXPECT_EQ(now, detector.last_activity_time());

  now += base::TimeDelta::FromSeconds(10);
  detector.set_now_for_test(now);
  monitor.NotifyUserActivityObservers();
  RunUntilIdle();
  EXPECT_EQ(now, detector.last_activity_time());
}

}  // namespace aura
