// Copyright 2018 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.

#ifndef NET_TEST_TEST_WITH_SCOPED_TASK_ENVIRONMENT_H_
#define NET_TEST_TEST_WITH_SCOPED_TASK_ENVIRONMENT_H_

#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/test/scoped_task_environment.h"
#include "base/time/time.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace base {
class TickClock;
}  // namespace base

namespace net {

// Inherit from this class if a ScopedTaskEnvironment is needed in a test.
// Use in class hierachies where inheritance from ::testing::Test at the same
// time is not desirable or possible (for example, when inheriting from
// PlatformTest at the same time).
class WithScopedTaskEnvironment {
 protected:
  WithScopedTaskEnvironment()
      : scoped_task_environment_(
            base::test::ScopedTaskEnvironment::MainThreadType::IO) {}
  WithScopedTaskEnvironment(
      base::test::ScopedTaskEnvironment::MainThreadType type)
      : scoped_task_environment_(type) {}

  bool MainThreadHasPendingTask() const WARN_UNUSED_RESULT {
    return scoped_task_environment_.MainThreadHasPendingTask();
  }

  void RunUntilIdle() { scoped_task_environment_.RunUntilIdle(); }

  void FastForwardBy(base::TimeDelta delta) {
    scoped_task_environment_.FastForwardBy(delta);
  }

  void FastForwardUntilNoTasksRemain() {
    scoped_task_environment_.FastForwardUntilNoTasksRemain();
  }

  const base::TickClock* GetMockTickClock() WARN_UNUSED_RESULT {
    return scoped_task_environment_.GetMockTickClock();
  }

  size_t GetPendingMainThreadTaskCount() const WARN_UNUSED_RESULT {
    return scoped_task_environment_.GetPendingMainThreadTaskCount();
  }

  base::TimeDelta NextMainThreadPendingTaskDelay() const WARN_UNUSED_RESULT {
    return scoped_task_environment_.NextMainThreadPendingTaskDelay();
  }

 private:
  base::test::ScopedTaskEnvironment scoped_task_environment_;

  DISALLOW_COPY_AND_ASSIGN(WithScopedTaskEnvironment);
};

// Inherit from this class instead of ::testing::Test directly if a
// ScopedTaskEnvironment is needed in a test.
class TestWithScopedTaskEnvironment : public ::testing::Test,
                                      public WithScopedTaskEnvironment {
 protected:
  TestWithScopedTaskEnvironment() = default;
  TestWithScopedTaskEnvironment(
      base::test::ScopedTaskEnvironment::MainThreadType type)
      : WithScopedTaskEnvironment(type) {}

  DISALLOW_COPY_AND_ASSIGN(TestWithScopedTaskEnvironment);
};

}  // namespace net

#endif  // NET_TEST_TEST_WITH_SCOPED_TASK_ENVIRONMENT_H_
