/*
 *  Copyright (c) 2020 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef AUDIO_VOIP_TEST_MOCK_TASK_QUEUE_H_
#define AUDIO_VOIP_TEST_MOCK_TASK_QUEUE_H_

#include <memory>

#include "absl/strings/string_view.h"
#include "api/task_queue/task_queue_base.h"
#include "api/task_queue/task_queue_factory.h"
#include "api/task_queue/test/mock_task_queue_base.h"

namespace webrtc {

// MockTaskQueue enables immediate task run from global TaskQueueBase.
// It's necessary for some tests depending on TaskQueueBase internally.
class MockTaskQueue : public MockTaskQueueBase {
 public:
  MockTaskQueue() : current_(this) {}

  // Delete is deliberately defined as no-op as MockTaskQueue is expected to
  // hold onto current global TaskQueueBase throughout the testing.
  void Delete() override {}

 private:
  CurrentTaskQueueSetter current_;
};

class MockTaskQueueFactory : public TaskQueueFactory {
 public:
  explicit MockTaskQueueFactory(MockTaskQueue* task_queue)
      : task_queue_(task_queue) {}

  std::unique_ptr<TaskQueueBase, TaskQueueDeleter> CreateTaskQueue(
      absl::string_view /* name */,
      Priority /* priority */) const override {
    // Default MockTaskQueue::Delete is no-op, therefore it's safe to pass the
    // raw pointer.
    return std::unique_ptr<TaskQueueBase, TaskQueueDeleter>(task_queue_);
  }

 private:
  MockTaskQueue* task_queue_;
};

}  // namespace webrtc

#endif  // AUDIO_VOIP_TEST_MOCK_TASK_QUEUE_H_
