xref: /aosp_15_r20/external/cronet/base/functional/concurrent_closures_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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)19 TEST(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)32 TEST(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)49 TEST(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)71 TEST(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