1 // Copyright 2024 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/functional/concurrent_closures.h" 6 7 #include <vector> 8 9 #include "base/functional/callback.h" 10 #include "base/test/gtest_util.h" 11 #include "base/test/task_environment.h" 12 #include "base/test/test_future.h" 13 #include "testing/gtest/include/gtest/gtest.h" 14 15 namespace base { 16 17 namespace { 18 TEST(ConcurrentClosuresTest,Empty)19TEST(ConcurrentClosuresTest, Empty) { 20 test::SingleThreadTaskEnvironment task_environment; 21 22 ConcurrentClosures concurrent; 23 24 test::TestFuture<void> future; 25 std::move(concurrent).Done(future.GetCallback()); 26 27 EXPECT_FALSE(future.IsReady()); 28 29 EXPECT_TRUE(future.Wait()); 30 } 31 TEST(ConcurrentClosuresTest,RunBeforeDone)32TEST(ConcurrentClosuresTest, RunBeforeDone) { 33 test::SingleThreadTaskEnvironment task_environment; 34 35 ConcurrentClosures concurrent; 36 37 for (size_t i = 0; i < 10; ++i) { 38 concurrent.CreateClosure().Run(); 39 } 40 41 test::TestFuture<void> future; 42 std::move(concurrent).Done(future.GetCallback()); 43 44 EXPECT_FALSE(future.IsReady()); 45 46 EXPECT_TRUE(future.Wait()); 47 } 48 TEST(ConcurrentClosuresTest,RunAfterDone)49TEST(ConcurrentClosuresTest, RunAfterDone) { 50 test::SingleThreadTaskEnvironment task_environment; 51 52 ConcurrentClosures concurrent; 53 54 std::vector<base::OnceClosure> closures; 55 for (size_t i = 0; i < 10; ++i) { 56 closures.push_back(concurrent.CreateClosure()); 57 } 58 59 test::TestFuture<void> future; 60 std::move(concurrent).Done(future.GetCallback()); 61 62 for (base::OnceClosure& callback : closures) { 63 std::move(callback).Run(); 64 } 65 66 EXPECT_FALSE(future.IsReady()); 67 68 EXPECT_TRUE(future.Wait()); 69 } 70 TEST(ConcurrentClosuresTest,CallbacksOutliveObject)71TEST(ConcurrentClosuresTest, CallbacksOutliveObject) { 72 test::SingleThreadTaskEnvironment task_environment; 73 74 std::vector<base::OnceClosure> closures; 75 test::TestFuture<void> future; 76 77 { 78 ConcurrentClosures concurrent; 79 for (size_t i = 0; i < 10; ++i) { 80 closures.push_back(concurrent.CreateClosure()); 81 } 82 std::move(concurrent).Done(future.GetCallback()); 83 } 84 85 for (base::OnceClosure& callback : closures) { 86 std::move(callback).Run(); 87 } 88 89 EXPECT_FALSE(future.IsReady()); 90 91 EXPECT_TRUE(future.Wait()); 92 } 93 94 } // namespace 95 96 } // namespace base 97