// Copyright 2015 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 "base/test/sequenced_task_runner_test_template.h"
#include "base/test/task_runner_test_template.h"
#include "base/threading/simple_thread.h"
#include "cc/test/task_graph_runner_test_template.h"
#include "content/renderer/categorized_worker_pool.h"

namespace base {
namespace {

// Number of threads spawned in tests.
const int kNumThreads = 4;

class CategorizedWorkerPoolTestDelegate {
 public:
  CategorizedWorkerPoolTestDelegate()
      : categorized_worker_pool_(new content::CategorizedWorkerPool()) {}

  void StartTaskRunner() { categorized_worker_pool_->Start(kNumThreads); }

  scoped_refptr<content::CategorizedWorkerPool> GetTaskRunner() {
    return categorized_worker_pool_;
  }

  void StopTaskRunner() { categorized_worker_pool_->FlushForTesting(); }

  ~CategorizedWorkerPoolTestDelegate() { categorized_worker_pool_->Shutdown(); }

 private:
  scoped_refptr<content::CategorizedWorkerPool> categorized_worker_pool_;
};

INSTANTIATE_TYPED_TEST_CASE_P(CategorizedWorkerPool,
                              TaskRunnerTest,
                              CategorizedWorkerPoolTestDelegate);

class CategorizedWorkerPoolSequencedTestDelegate {
 public:
  CategorizedWorkerPoolSequencedTestDelegate()
      : categorized_worker_pool_(new content::CategorizedWorkerPool()) {}

  void StartTaskRunner() { categorized_worker_pool_->Start(kNumThreads); }

  scoped_refptr<base::SequencedTaskRunner> GetTaskRunner() {
    return categorized_worker_pool_->CreateSequencedTaskRunner();
  }

  void StopTaskRunner() { categorized_worker_pool_->FlushForTesting(); }

  ~CategorizedWorkerPoolSequencedTestDelegate() {
    categorized_worker_pool_->Shutdown();
  }

 private:
  scoped_refptr<content::CategorizedWorkerPool> categorized_worker_pool_;
};

INSTANTIATE_TYPED_TEST_CASE_P(CategorizedWorkerPool,
                              SequencedTaskRunnerTest,
                              CategorizedWorkerPoolSequencedTestDelegate);

}  // namespace
}  // namespace base

namespace cc {
namespace {

template <int NumThreads>
class CategorizedWorkerPoolTaskGraphRunnerTestDelegate {
 public:
  CategorizedWorkerPoolTaskGraphRunnerTestDelegate()
      : categorized_worker_pool_(new content::CategorizedWorkerPool()) {}

  void StartTaskGraphRunner() { categorized_worker_pool_->Start(NumThreads); }

  cc::TaskGraphRunner* GetTaskGraphRunner() {
    return categorized_worker_pool_->GetTaskGraphRunner();
  }

  void StopTaskGraphRunner() { categorized_worker_pool_->FlushForTesting(); }

  ~CategorizedWorkerPoolTaskGraphRunnerTestDelegate() {
    categorized_worker_pool_->Shutdown();
  }

 private:
  scoped_refptr<content::CategorizedWorkerPool> categorized_worker_pool_;
};

// Multithreaded tests.
INSTANTIATE_TYPED_TEST_CASE_P(
    CategorizedWorkerPool_1_Threads,
    TaskGraphRunnerTest,
    CategorizedWorkerPoolTaskGraphRunnerTestDelegate<1>);
INSTANTIATE_TYPED_TEST_CASE_P(
    CategorizedWorkerPool_2_Threads,
    TaskGraphRunnerTest,
    CategorizedWorkerPoolTaskGraphRunnerTestDelegate<2>);
INSTANTIATE_TYPED_TEST_CASE_P(
    CategorizedWorkerPool_3_Threads,
    TaskGraphRunnerTest,
    CategorizedWorkerPoolTaskGraphRunnerTestDelegate<3>);
INSTANTIATE_TYPED_TEST_CASE_P(
    CategorizedWorkerPool_4_Threads,
    TaskGraphRunnerTest,
    CategorizedWorkerPoolTaskGraphRunnerTestDelegate<4>);
INSTANTIATE_TYPED_TEST_CASE_P(
    CategorizedWorkerPool_5_Threads,
    TaskGraphRunnerTest,
    CategorizedWorkerPoolTaskGraphRunnerTestDelegate<5>);

// Single threaded tests.
INSTANTIATE_TYPED_TEST_CASE_P(
    CategorizedWorkerPool,
    SingleThreadTaskGraphRunnerTest,
    CategorizedWorkerPoolTaskGraphRunnerTestDelegate<1>);

}  // namespace
}  // namespace cc
