blob: b095674dcce448d7522c25f6d8a1ddd38e6a8d4c [file] [log] [blame]
// 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 <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::BindOnce(
[](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::BindOnce(
[](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