// Copyright 2017 The Chromium OS 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/bind.h>
#include <base/location.h>
#include <base/threading/platform_thread.h>
#include <base/threading/thread.h>
#include <brillo/bind_lambda.h>
#include <gtest/gtest.h>

#include "virtual_file_provider/operation_throttle.h"

namespace virtual_file_provider {

namespace {

constexpr base::TimeDelta kTestTimeout = base::TimeDelta::FromMilliseconds(100);

}  // namespace

TEST(OperationThrottleTest, OnlyOneTask) {
  OperationThrottle throttle(1);
  auto operation1 = throttle.StartOperation();
}

TEST(OperationThrottleTest, TwoTasksUnderLimit) {
  // Start operation #1 on this thread.
  OperationThrottle throttle(2);
  auto operation1 = throttle.StartOperation();

  // Start operation #2 on another thread. This shouldn't get blocked.
  bool done = false;
  base::Thread thread("Test thread");
  ASSERT_TRUE(thread.Start());
  thread.task_runner()->PostTask(
      FROM_HERE, base::Bind(
                     [](OperationThrottle* throttle, bool* done) {
                       auto operation2 = throttle->StartOperation();
                       *done = true;
                     },
                     &throttle, &done));

  // Wait for operation #2 to finish.
  thread.Stop();
  EXPECT_TRUE(done);
}

TEST(OperationThrottleTest, TwoTasksOverLimit) {
  // Start operation #1 on this thread.
  OperationThrottle throttle(1);
  auto operation1 = throttle.StartOperation();

  // Start operation #2 on another thread. This should get blocked.
  bool done = false;
  base::Thread thread("Test thread");
  ASSERT_TRUE(thread.Start());
  thread.task_runner()->PostTask(
      FROM_HERE, base::Bind(
                     [](OperationThrottle* throttle, bool* done) {
                       auto operation2 = throttle->StartOperation();
                       *done = true;
                     },
                     &throttle, &done));

  // Wait for operation #2 to get blocked.
  base::PlatformThread::Sleep(kTestTimeout);
  EXPECT_FALSE(done);

  // Finish the operation #1 to unblock #2.
  operation1.reset();

  // Wait for operation #2 to finish.
  thread.Stop();
  EXPECT_TRUE(done);
}

}  // namespace virtual_file_provider
