xref: /aosp_15_r20/external/cronet/base/functional/callback_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <memory>
8*6777b538SAndroid Build Coastguard Worker #include <utility>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_internal.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/test/bind.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/test/gtest_util.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/test/test_timeouts.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread.h"
20*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker namespace base {
23*6777b538SAndroid Build Coastguard Worker 
NopInvokeFunc()24*6777b538SAndroid Build Coastguard Worker void NopInvokeFunc() {}
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker // White-box testpoints to inject into a callback object for checking
27*6777b538SAndroid Build Coastguard Worker // comparators and emptiness APIs. Use a BindState that is specialized based on
28*6777b538SAndroid Build Coastguard Worker // a type we declared in the anonymous namespace above to remove any chance of
29*6777b538SAndroid Build Coastguard Worker // colliding with another instantiation and breaking the one-definition-rule.
30*6777b538SAndroid Build Coastguard Worker struct FakeBindState : internal::BindStateBase {
FakeBindStatebase::FakeBindState31*6777b538SAndroid Build Coastguard Worker   FakeBindState() : BindStateBase(&NopInvokeFunc, &Destroy) {}
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker  private:
34*6777b538SAndroid Build Coastguard Worker   ~FakeBindState() = default;
Destroybase::FakeBindState35*6777b538SAndroid Build Coastguard Worker   static void Destroy(const internal::BindStateBase* self) {
36*6777b538SAndroid Build Coastguard Worker     delete static_cast<const FakeBindState*>(self);
37*6777b538SAndroid Build Coastguard Worker   }
38*6777b538SAndroid Build Coastguard Worker };
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker namespace {
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker class CallbackTest : public ::testing::Test {
43*6777b538SAndroid Build Coastguard Worker  public:
CallbackTest()44*6777b538SAndroid Build Coastguard Worker   CallbackTest()
45*6777b538SAndroid Build Coastguard Worker       : callback_a_(new FakeBindState()), callback_b_(new FakeBindState()) {}
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker   ~CallbackTest() override = default;
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker  protected:
50*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void()> callback_a_;
51*6777b538SAndroid Build Coastguard Worker   const RepeatingCallback<void()> callback_b_;  // Ensure APIs work with const.
52*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void()> null_callback_;
53*6777b538SAndroid Build Coastguard Worker };
54*6777b538SAndroid Build Coastguard Worker 
TEST_F(CallbackTest,Types)55*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, Types) {
56*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<void, OnceClosure::ResultType>, "");
57*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<void(), OnceClosure::RunType>, "");
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker   using OnceCallbackT = OnceCallback<double(int, char)>;
60*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<double, OnceCallbackT::ResultType>, "");
61*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<double(int, char), OnceCallbackT::RunType>, "");
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<void, RepeatingClosure::ResultType>, "");
64*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<void(), RepeatingClosure::RunType>, "");
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker   using RepeatingCallbackT = RepeatingCallback<bool(float, short)>;
67*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<bool, RepeatingCallbackT::ResultType>, "");
68*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<bool(float, short), RepeatingCallbackT::RunType>,
69*6777b538SAndroid Build Coastguard Worker                 "");
70*6777b538SAndroid Build Coastguard Worker }
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker // Ensure we can create unbound callbacks. We need this to be able to store
73*6777b538SAndroid Build Coastguard Worker // them in class members that can be initialized later.
TEST_F(CallbackTest,DefaultConstruction)74*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, DefaultConstruction) {
75*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void()> c0;
76*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void(int)> c1;
77*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void(int, int)> c2;
78*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void(int, int, int)> c3;
79*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void(int, int, int, int)> c4;
80*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void(int, int, int, int, int)> c5;
81*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void(int, int, int, int, int, int)> c6;
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(c0.is_null());
84*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.is_null());
85*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(c2.is_null());
86*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(c3.is_null());
87*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(c4.is_null());
88*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(c5.is_null());
89*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(c6.is_null());
90*6777b538SAndroid Build Coastguard Worker }
91*6777b538SAndroid Build Coastguard Worker 
TEST_F(CallbackTest,IsNull)92*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, IsNull) {
93*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(null_callback_.is_null());
94*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(callback_a_.is_null());
95*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(callback_b_.is_null());
96*6777b538SAndroid Build Coastguard Worker }
97*6777b538SAndroid Build Coastguard Worker 
TEST_F(CallbackTest,Equals)98*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, Equals) {
99*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(callback_a_, callback_a_);
100*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(callback_a_, callback_b_);
101*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(callback_b_, callback_a_);
102*6777b538SAndroid Build Coastguard Worker 
103*6777b538SAndroid Build Coastguard Worker   // We should compare based on instance, not type.
104*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void()> callback_c(new FakeBindState());
105*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void()> callback_a2 = callback_a_;
106*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(callback_a_, callback_a2);
107*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(callback_a_, callback_c);
108*6777b538SAndroid Build Coastguard Worker 
109*6777b538SAndroid Build Coastguard Worker   // Empty, however, is always equal to empty.
110*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void()> empty2;
111*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(null_callback_, empty2);
112*6777b538SAndroid Build Coastguard Worker }
113*6777b538SAndroid Build Coastguard Worker 
TEST_F(CallbackTest,Reset)114*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, Reset) {
115*6777b538SAndroid Build Coastguard Worker   // Resetting should bring us back to empty.
116*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(callback_a_.is_null());
117*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(callback_a_, null_callback_);
118*6777b538SAndroid Build Coastguard Worker 
119*6777b538SAndroid Build Coastguard Worker   callback_a_.Reset();
120*6777b538SAndroid Build Coastguard Worker 
121*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(callback_a_.is_null());
122*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(callback_a_, null_callback_);
123*6777b538SAndroid Build Coastguard Worker }
124*6777b538SAndroid Build Coastguard Worker 
TEST_F(CallbackTest,Move)125*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, Move) {
126*6777b538SAndroid Build Coastguard Worker   // Moving should reset the callback.
127*6777b538SAndroid Build Coastguard Worker   ASSERT_FALSE(callback_a_.is_null());
128*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(callback_a_, null_callback_);
129*6777b538SAndroid Build Coastguard Worker 
130*6777b538SAndroid Build Coastguard Worker   auto tmp = std::move(callback_a_);
131*6777b538SAndroid Build Coastguard Worker 
132*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(callback_a_.is_null());
133*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(callback_a_, null_callback_);
134*6777b538SAndroid Build Coastguard Worker }
135*6777b538SAndroid Build Coastguard Worker 
TEST_F(CallbackTest,NullAfterMoveRun)136*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, NullAfterMoveRun) {
137*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void(void*)> cb = BindRepeating([](void* param) {
138*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(static_cast<RepeatingCallback<void(void*)>*>(param)->is_null());
139*6777b538SAndroid Build Coastguard Worker   });
140*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(cb);
141*6777b538SAndroid Build Coastguard Worker   std::move(cb).Run(&cb);
142*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(cb);
143*6777b538SAndroid Build Coastguard Worker 
144*6777b538SAndroid Build Coastguard Worker   const RepeatingClosure cb2 = BindRepeating([] {});
145*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(cb2);
146*6777b538SAndroid Build Coastguard Worker   std::move(cb2).Run();
147*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(cb2);
148*6777b538SAndroid Build Coastguard Worker 
149*6777b538SAndroid Build Coastguard Worker   OnceCallback<void(void*)> cb3 = BindOnce([](void* param) {
150*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(static_cast<OnceCallback<void(void*)>*>(param)->is_null());
151*6777b538SAndroid Build Coastguard Worker   });
152*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(cb3);
153*6777b538SAndroid Build Coastguard Worker   std::move(cb3).Run(&cb3);
154*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(cb3);
155*6777b538SAndroid Build Coastguard Worker }
156*6777b538SAndroid Build Coastguard Worker 
TEST_F(CallbackTest,MaybeValidReturnsTrue)157*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, MaybeValidReturnsTrue) {
158*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void()> cb = BindRepeating([]() {});
159*6777b538SAndroid Build Coastguard Worker   // By default, MaybeValid() just returns true all the time.
160*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(cb.MaybeValid());
161*6777b538SAndroid Build Coastguard Worker   cb.Run();
162*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(cb.MaybeValid());
163*6777b538SAndroid Build Coastguard Worker }
164*6777b538SAndroid Build Coastguard Worker 
TEST_F(CallbackTest,ThenResetsOriginalCallback)165*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, ThenResetsOriginalCallback) {
166*6777b538SAndroid Build Coastguard Worker   {
167*6777b538SAndroid Build Coastguard Worker     // OnceCallback::Then() always destroys the original callback.
168*6777b538SAndroid Build Coastguard Worker     OnceClosure orig = base::BindOnce([]() {});
169*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(!!orig);
170*6777b538SAndroid Build Coastguard Worker     OnceClosure joined = std::move(orig).Then(base::BindOnce([]() {}));
171*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(!!joined);
172*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(!!orig);
173*6777b538SAndroid Build Coastguard Worker   }
174*6777b538SAndroid Build Coastguard Worker   {
175*6777b538SAndroid Build Coastguard Worker     // RepeatingCallback::Then() destroys the original callback if it's an
176*6777b538SAndroid Build Coastguard Worker     // rvalue.
177*6777b538SAndroid Build Coastguard Worker     RepeatingClosure orig = base::BindRepeating([]() {});
178*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(!!orig);
179*6777b538SAndroid Build Coastguard Worker     RepeatingClosure joined =
180*6777b538SAndroid Build Coastguard Worker         std::move(orig).Then(base::BindRepeating([]() {}));
181*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(!!joined);
182*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(!!orig);
183*6777b538SAndroid Build Coastguard Worker   }
184*6777b538SAndroid Build Coastguard Worker   {
185*6777b538SAndroid Build Coastguard Worker     // RepeatingCallback::Then() doesn't destroy the original callback if it's
186*6777b538SAndroid Build Coastguard Worker     // not an rvalue.
187*6777b538SAndroid Build Coastguard Worker     RepeatingClosure orig = base::BindRepeating([]() {});
188*6777b538SAndroid Build Coastguard Worker     RepeatingClosure copy = orig;
189*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(!!orig);
190*6777b538SAndroid Build Coastguard Worker     RepeatingClosure joined = orig.Then(base::BindRepeating([]() {}));
191*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(!!joined);
192*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(!!orig);
193*6777b538SAndroid Build Coastguard Worker     // The original callback is not changed.
194*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(orig, copy);
195*6777b538SAndroid Build Coastguard Worker     EXPECT_NE(joined, copy);
196*6777b538SAndroid Build Coastguard Worker   }
197*6777b538SAndroid Build Coastguard Worker }
198*6777b538SAndroid Build Coastguard Worker 
199*6777b538SAndroid Build Coastguard Worker // A RepeatingCallback will implicitly convert to a OnceCallback, so a
200*6777b538SAndroid Build Coastguard Worker // once_callback.Then(repeating_callback) should turn into a OnceCallback
201*6777b538SAndroid Build Coastguard Worker // that holds 2 OnceCallbacks which it will run.
TEST_F(CallbackTest,ThenCanConvertRepeatingToOnce)202*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, ThenCanConvertRepeatingToOnce) {
203*6777b538SAndroid Build Coastguard Worker   {
204*6777b538SAndroid Build Coastguard Worker     RepeatingClosure repeating_closure = base::BindRepeating([]() {});
205*6777b538SAndroid Build Coastguard Worker     OnceClosure once_closure = base::BindOnce([]() {});
206*6777b538SAndroid Build Coastguard Worker     std::move(once_closure).Then(repeating_closure).Run();
207*6777b538SAndroid Build Coastguard Worker 
208*6777b538SAndroid Build Coastguard Worker     RepeatingCallback<int(int)> repeating_callback =
209*6777b538SAndroid Build Coastguard Worker         base::BindRepeating([](int i) { return i + 1; });
210*6777b538SAndroid Build Coastguard Worker     OnceCallback<int(int)> once_callback =
211*6777b538SAndroid Build Coastguard Worker         base::BindOnce([](int i) { return i * 2; });
212*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, std::move(once_callback).Then(repeating_callback).Run(1));
213*6777b538SAndroid Build Coastguard Worker   }
214*6777b538SAndroid Build Coastguard Worker   {
215*6777b538SAndroid Build Coastguard Worker     RepeatingClosure repeating_closure = base::BindRepeating([]() {});
216*6777b538SAndroid Build Coastguard Worker     OnceClosure once_closure = base::BindOnce([]() {});
217*6777b538SAndroid Build Coastguard Worker     std::move(once_closure).Then(std::move(repeating_closure)).Run();
218*6777b538SAndroid Build Coastguard Worker 
219*6777b538SAndroid Build Coastguard Worker     RepeatingCallback<int(int)> repeating_callback =
220*6777b538SAndroid Build Coastguard Worker         base::BindRepeating([](int i) { return i + 1; });
221*6777b538SAndroid Build Coastguard Worker     OnceCallback<int(int)> once_callback =
222*6777b538SAndroid Build Coastguard Worker         base::BindOnce([](int i) { return i * 2; });
223*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(
224*6777b538SAndroid Build Coastguard Worker         3, std::move(once_callback).Then(std::move(repeating_callback)).Run(1));
225*6777b538SAndroid Build Coastguard Worker   }
226*6777b538SAndroid Build Coastguard Worker }
227*6777b538SAndroid Build Coastguard Worker 
228*6777b538SAndroid Build Coastguard Worker // `Then()` should should allow a return value of type `R` to be passed to a
229*6777b538SAndroid Build Coastguard Worker // callback with one parameter of type `const R&` or type `R&&`.
TEST_F(CallbackTest,ThenWithCompatibleButNotSameType)230*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, ThenWithCompatibleButNotSameType) {
231*6777b538SAndroid Build Coastguard Worker   {
232*6777b538SAndroid Build Coastguard Worker     OnceCallback<std::string()> once_callback =
233*6777b538SAndroid Build Coastguard Worker         BindOnce([] { return std::string("hello"); });
234*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("hello",
235*6777b538SAndroid Build Coastguard Worker               std::move(once_callback)
236*6777b538SAndroid Build Coastguard Worker                   .Then(BindOnce([](const std::string& s) { return s; }))
237*6777b538SAndroid Build Coastguard Worker                   .Run());
238*6777b538SAndroid Build Coastguard Worker   }
239*6777b538SAndroid Build Coastguard Worker 
240*6777b538SAndroid Build Coastguard Worker   class NotCopied {
241*6777b538SAndroid Build Coastguard Worker    public:
242*6777b538SAndroid Build Coastguard Worker     NotCopied() = default;
243*6777b538SAndroid Build Coastguard Worker     NotCopied(NotCopied&&) = default;
244*6777b538SAndroid Build Coastguard Worker     NotCopied& operator=(NotCopied&&) = default;
245*6777b538SAndroid Build Coastguard Worker 
246*6777b538SAndroid Build Coastguard Worker     NotCopied(const NotCopied&) {
247*6777b538SAndroid Build Coastguard Worker       ADD_FAILURE() << "should not have been copied";
248*6777b538SAndroid Build Coastguard Worker     }
249*6777b538SAndroid Build Coastguard Worker 
250*6777b538SAndroid Build Coastguard Worker     NotCopied& operator=(const NotCopied&) {
251*6777b538SAndroid Build Coastguard Worker       ADD_FAILURE() << "should not have been copied";
252*6777b538SAndroid Build Coastguard Worker       return *this;
253*6777b538SAndroid Build Coastguard Worker     }
254*6777b538SAndroid Build Coastguard Worker   };
255*6777b538SAndroid Build Coastguard Worker 
256*6777b538SAndroid Build Coastguard Worker   {
257*6777b538SAndroid Build Coastguard Worker     OnceCallback<NotCopied()> once_callback =
258*6777b538SAndroid Build Coastguard Worker         BindOnce([] { return NotCopied(); });
259*6777b538SAndroid Build Coastguard Worker     std::move(once_callback).Then(BindOnce([](const NotCopied&) {})).Run();
260*6777b538SAndroid Build Coastguard Worker   }
261*6777b538SAndroid Build Coastguard Worker 
262*6777b538SAndroid Build Coastguard Worker   {
263*6777b538SAndroid Build Coastguard Worker     OnceCallback<NotCopied()> once_callback =
264*6777b538SAndroid Build Coastguard Worker         BindOnce([] { return NotCopied(); });
265*6777b538SAndroid Build Coastguard Worker     std::move(once_callback).Then(BindOnce([](NotCopied&&) {})).Run();
266*6777b538SAndroid Build Coastguard Worker   }
267*6777b538SAndroid Build Coastguard Worker }
268*6777b538SAndroid Build Coastguard Worker 
269*6777b538SAndroid Build Coastguard Worker // A factory class for building an outer and inner callback for calling
270*6777b538SAndroid Build Coastguard Worker // Then() on either a OnceCallback or RepeatingCallback with combinations of
271*6777b538SAndroid Build Coastguard Worker // void return types, non-void, and move-only return types.
272*6777b538SAndroid Build Coastguard Worker template <bool use_once, typename R, typename ThenR, typename... Args>
273*6777b538SAndroid Build Coastguard Worker class CallbackThenTest;
274*6777b538SAndroid Build Coastguard Worker template <bool use_once, typename R, typename ThenR, typename... Args>
275*6777b538SAndroid Build Coastguard Worker class CallbackThenTest<use_once, R(Args...), ThenR> {
276*6777b538SAndroid Build Coastguard Worker  public:
277*6777b538SAndroid Build Coastguard Worker   using CallbackType =
278*6777b538SAndroid Build Coastguard Worker       typename std::conditional<use_once,
279*6777b538SAndroid Build Coastguard Worker                                 OnceCallback<R(Args...)>,
280*6777b538SAndroid Build Coastguard Worker                                 RepeatingCallback<R(Args...)>>::type;
281*6777b538SAndroid Build Coastguard Worker   using ThenType =
282*6777b538SAndroid Build Coastguard Worker       typename std::conditional<use_once, OnceClosure, RepeatingClosure>::type;
283*6777b538SAndroid Build Coastguard Worker 
284*6777b538SAndroid Build Coastguard Worker   // Gets the Callback that will have Then() called on it. Has a return type
285*6777b538SAndroid Build Coastguard Worker   // of `R`, which would chain to the inner callback for Then(). Has inputs of
286*6777b538SAndroid Build Coastguard Worker   // type `Args...`.
GetOuter(std::string & s)287*6777b538SAndroid Build Coastguard Worker   static auto GetOuter(std::string& s) {
288*6777b538SAndroid Build Coastguard Worker     s = "";
289*6777b538SAndroid Build Coastguard Worker     return Bind(
290*6777b538SAndroid Build Coastguard Worker         [](std::string* s, Args... args) {
291*6777b538SAndroid Build Coastguard Worker           return Outer(s, std::forward<Args>(args)...);
292*6777b538SAndroid Build Coastguard Worker         },
293*6777b538SAndroid Build Coastguard Worker         &s);
294*6777b538SAndroid Build Coastguard Worker   }
295*6777b538SAndroid Build Coastguard Worker   // Gets the Callback that will be passed to Then(). Has a return type of
296*6777b538SAndroid Build Coastguard Worker   // `ThenR`, specified for the class instance. Receives as input the return
297*6777b538SAndroid Build Coastguard Worker   // type `R` from the function bound and returned in GetOuter().
GetInner(std::string & s)298*6777b538SAndroid Build Coastguard Worker   static auto GetInner(std::string& s) { return Bind(&Inner<R, ThenR>, &s); }
299*6777b538SAndroid Build Coastguard Worker 
300*6777b538SAndroid Build Coastguard Worker  private:
301*6777b538SAndroid Build Coastguard Worker   template <bool bind_once = use_once,
302*6777b538SAndroid Build Coastguard Worker             typename F,
303*6777b538SAndroid Build Coastguard Worker             typename... FArgs,
304*6777b538SAndroid Build Coastguard Worker             std::enable_if_t<bind_once, int> = 0>
Bind(F function,FArgs...args)305*6777b538SAndroid Build Coastguard Worker   static auto Bind(F function, FArgs... args) {
306*6777b538SAndroid Build Coastguard Worker     return BindOnce(function, std::forward<FArgs>(args)...);
307*6777b538SAndroid Build Coastguard Worker   }
308*6777b538SAndroid Build Coastguard Worker   template <bool bind_once = use_once,
309*6777b538SAndroid Build Coastguard Worker             typename F,
310*6777b538SAndroid Build Coastguard Worker             typename... FArgs,
311*6777b538SAndroid Build Coastguard Worker             std::enable_if_t<!bind_once, int> = 0>
Bind(F function,FArgs...args)312*6777b538SAndroid Build Coastguard Worker   static auto Bind(F function, FArgs... args) {
313*6777b538SAndroid Build Coastguard Worker     return BindRepeating(function, std::forward<FArgs>(args)...);
314*6777b538SAndroid Build Coastguard Worker   }
315*6777b538SAndroid Build Coastguard Worker 
316*6777b538SAndroid Build Coastguard Worker   template <typename R2 = R, std::enable_if_t<!std::is_void_v<R2>, int> = 0>
Outer(std::string * s,std::unique_ptr<int> a,std::unique_ptr<int> b)317*6777b538SAndroid Build Coastguard Worker   static int Outer(std::string* s,
318*6777b538SAndroid Build Coastguard Worker                    std::unique_ptr<int> a,
319*6777b538SAndroid Build Coastguard Worker                    std::unique_ptr<int> b) {
320*6777b538SAndroid Build Coastguard Worker     *s += "Outer";
321*6777b538SAndroid Build Coastguard Worker     *s += base::NumberToString(*a) + base::NumberToString(*b);
322*6777b538SAndroid Build Coastguard Worker     return *a + *b;
323*6777b538SAndroid Build Coastguard Worker   }
324*6777b538SAndroid Build Coastguard Worker   template <typename R2 = R, std::enable_if_t<!std::is_void_v<R2>, int> = 0>
Outer(std::string * s,int a,int b)325*6777b538SAndroid Build Coastguard Worker   static int Outer(std::string* s, int a, int b) {
326*6777b538SAndroid Build Coastguard Worker     *s += "Outer";
327*6777b538SAndroid Build Coastguard Worker     *s += base::NumberToString(a) + base::NumberToString(b);
328*6777b538SAndroid Build Coastguard Worker     return a + b;
329*6777b538SAndroid Build Coastguard Worker   }
330*6777b538SAndroid Build Coastguard Worker   template <typename R2 = R, std::enable_if_t<!std::is_void_v<R2>, int> = 0>
Outer(std::string * s)331*6777b538SAndroid Build Coastguard Worker   static int Outer(std::string* s) {
332*6777b538SAndroid Build Coastguard Worker     *s += "Outer";
333*6777b538SAndroid Build Coastguard Worker     *s += "None";
334*6777b538SAndroid Build Coastguard Worker     return 99;
335*6777b538SAndroid Build Coastguard Worker   }
336*6777b538SAndroid Build Coastguard Worker 
337*6777b538SAndroid Build Coastguard Worker   template <typename R2 = R, std::enable_if_t<std::is_void_v<R2>, int> = 0>
Outer(std::string * s,std::unique_ptr<int> a,std::unique_ptr<int> b)338*6777b538SAndroid Build Coastguard Worker   static void Outer(std::string* s,
339*6777b538SAndroid Build Coastguard Worker                     std::unique_ptr<int> a,
340*6777b538SAndroid Build Coastguard Worker                     std::unique_ptr<int> b) {
341*6777b538SAndroid Build Coastguard Worker     *s += "Outer";
342*6777b538SAndroid Build Coastguard Worker     *s += base::NumberToString(*a) + base::NumberToString(*b);
343*6777b538SAndroid Build Coastguard Worker   }
344*6777b538SAndroid Build Coastguard Worker   template <typename R2 = R, std::enable_if_t<std::is_void_v<R2>, int> = 0>
Outer(std::string * s,int a,int b)345*6777b538SAndroid Build Coastguard Worker   static void Outer(std::string* s, int a, int b) {
346*6777b538SAndroid Build Coastguard Worker     *s += "Outer";
347*6777b538SAndroid Build Coastguard Worker     *s += base::NumberToString(a) + base::NumberToString(b);
348*6777b538SAndroid Build Coastguard Worker   }
349*6777b538SAndroid Build Coastguard Worker   template <typename R2 = R, std::enable_if_t<std::is_void_v<R2>, int> = 0>
Outer(std::string * s)350*6777b538SAndroid Build Coastguard Worker   static void Outer(std::string* s) {
351*6777b538SAndroid Build Coastguard Worker     *s += "Outer";
352*6777b538SAndroid Build Coastguard Worker     *s += "None";
353*6777b538SAndroid Build Coastguard Worker   }
354*6777b538SAndroid Build Coastguard Worker 
355*6777b538SAndroid Build Coastguard Worker   template <typename OuterR,
356*6777b538SAndroid Build Coastguard Worker             typename InnerR,
357*6777b538SAndroid Build Coastguard Worker             std::enable_if_t<!std::is_void_v<OuterR>, int> = 0,
358*6777b538SAndroid Build Coastguard Worker             std::enable_if_t<!std::is_void_v<InnerR>, int> = 0>
Inner(std::string * s,OuterR a)359*6777b538SAndroid Build Coastguard Worker   static int Inner(std::string* s, OuterR a) {
360*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<InnerR, int>, "Use int return type");
361*6777b538SAndroid Build Coastguard Worker     *s += "Inner";
362*6777b538SAndroid Build Coastguard Worker     *s += base::NumberToString(a);
363*6777b538SAndroid Build Coastguard Worker     return a;
364*6777b538SAndroid Build Coastguard Worker   }
365*6777b538SAndroid Build Coastguard Worker   template <typename OuterR,
366*6777b538SAndroid Build Coastguard Worker             typename InnerR,
367*6777b538SAndroid Build Coastguard Worker             std::enable_if_t<std::is_void_v<OuterR>, int> = 0,
368*6777b538SAndroid Build Coastguard Worker             std::enable_if_t<!std::is_void_v<InnerR>, int> = 0>
Inner(std::string * s)369*6777b538SAndroid Build Coastguard Worker   static int Inner(std::string* s) {
370*6777b538SAndroid Build Coastguard Worker     static_assert(std::is_same_v<InnerR, int>, "Use int return type");
371*6777b538SAndroid Build Coastguard Worker     *s += "Inner";
372*6777b538SAndroid Build Coastguard Worker     *s += "None";
373*6777b538SAndroid Build Coastguard Worker     return 99;
374*6777b538SAndroid Build Coastguard Worker   }
375*6777b538SAndroid Build Coastguard Worker 
376*6777b538SAndroid Build Coastguard Worker   template <typename OuterR,
377*6777b538SAndroid Build Coastguard Worker             typename InnerR,
378*6777b538SAndroid Build Coastguard Worker             std::enable_if_t<!std::is_void_v<OuterR>, int> = 0,
379*6777b538SAndroid Build Coastguard Worker             std::enable_if_t<std::is_void_v<InnerR>, int> = 0>
Inner(std::string * s,OuterR a)380*6777b538SAndroid Build Coastguard Worker   static void Inner(std::string* s, OuterR a) {
381*6777b538SAndroid Build Coastguard Worker     *s += "Inner";
382*6777b538SAndroid Build Coastguard Worker     *s += base::NumberToString(a);
383*6777b538SAndroid Build Coastguard Worker   }
384*6777b538SAndroid Build Coastguard Worker   template <typename OuterR,
385*6777b538SAndroid Build Coastguard Worker             typename InnerR,
386*6777b538SAndroid Build Coastguard Worker             std::enable_if_t<std::is_void_v<OuterR>, int> = 0,
387*6777b538SAndroid Build Coastguard Worker             std::enable_if_t<std::is_void_v<InnerR>, int> = 0>
Inner(std::string * s)388*6777b538SAndroid Build Coastguard Worker   static void Inner(std::string* s) {
389*6777b538SAndroid Build Coastguard Worker     *s += "Inner";
390*6777b538SAndroid Build Coastguard Worker     *s += "None";
391*6777b538SAndroid Build Coastguard Worker   }
392*6777b538SAndroid Build Coastguard Worker };
393*6777b538SAndroid Build Coastguard Worker 
394*6777b538SAndroid Build Coastguard Worker template <typename R, typename ThenR = void, typename... Args>
395*6777b538SAndroid Build Coastguard Worker using CallbackThenOnceTest = CallbackThenTest<true, R, ThenR, Args...>;
396*6777b538SAndroid Build Coastguard Worker template <typename R, typename ThenR = void, typename... Args>
397*6777b538SAndroid Build Coastguard Worker using CallbackThenRepeatingTest = CallbackThenTest<false, R, ThenR, Args...>;
398*6777b538SAndroid Build Coastguard Worker 
TEST_F(CallbackTest,ThenOnce)399*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, ThenOnce) {
400*6777b538SAndroid Build Coastguard Worker   std::string s;
401*6777b538SAndroid Build Coastguard Worker 
402*6777b538SAndroid Build Coastguard Worker   // Void return from outer + void return from Then().
403*6777b538SAndroid Build Coastguard Worker   {
404*6777b538SAndroid Build Coastguard Worker     using VoidReturnWithoutArgs = void();
405*6777b538SAndroid Build Coastguard Worker     using ThenReturn = void;
406*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenOnceTest<VoidReturnWithoutArgs, ThenReturn>;
407*6777b538SAndroid Build Coastguard Worker     Test::GetOuter(s).Then(Test::GetInner(s)).Run();
408*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "OuterNoneInnerNone");
409*6777b538SAndroid Build Coastguard Worker   }
410*6777b538SAndroid Build Coastguard Worker   {
411*6777b538SAndroid Build Coastguard Worker     using VoidReturnWithArgs = void(int, int);
412*6777b538SAndroid Build Coastguard Worker     using ThenReturn = void;
413*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenOnceTest<VoidReturnWithArgs, ThenReturn>;
414*6777b538SAndroid Build Coastguard Worker     Test::GetOuter(s).Then(Test::GetInner(s)).Run(1, 2);
415*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12InnerNone");
416*6777b538SAndroid Build Coastguard Worker   }
417*6777b538SAndroid Build Coastguard Worker   {
418*6777b538SAndroid Build Coastguard Worker     using VoidReturnWithMoveOnlyArgs =
419*6777b538SAndroid Build Coastguard Worker         void(std::unique_ptr<int>, std::unique_ptr<int>);
420*6777b538SAndroid Build Coastguard Worker     using ThenReturn = void;
421*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenOnceTest<VoidReturnWithMoveOnlyArgs, ThenReturn>;
422*6777b538SAndroid Build Coastguard Worker     Test::GetOuter(s)
423*6777b538SAndroid Build Coastguard Worker         .Then(Test::GetInner(s))
424*6777b538SAndroid Build Coastguard Worker         .Run(std::make_unique<int>(1), std::make_unique<int>(2));
425*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12InnerNone");
426*6777b538SAndroid Build Coastguard Worker   }
427*6777b538SAndroid Build Coastguard Worker 
428*6777b538SAndroid Build Coastguard Worker   // Void return from outer + non-void return from Then().
429*6777b538SAndroid Build Coastguard Worker   {
430*6777b538SAndroid Build Coastguard Worker     using VoidReturnWithoutArgs = void();
431*6777b538SAndroid Build Coastguard Worker     using ThenReturn = int;
432*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenOnceTest<VoidReturnWithoutArgs, ThenReturn>;
433*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(99, Test::GetOuter(s).Then(Test::GetInner(s)).Run());
434*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "OuterNoneInnerNone");
435*6777b538SAndroid Build Coastguard Worker   }
436*6777b538SAndroid Build Coastguard Worker   {
437*6777b538SAndroid Build Coastguard Worker     using VoidReturnWithArgs = void(int, int);
438*6777b538SAndroid Build Coastguard Worker     using ThenReturn = int;
439*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenOnceTest<VoidReturnWithArgs, ThenReturn>;
440*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(99, Test::GetOuter(s).Then(Test::GetInner(s)).Run(1, 2));
441*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12InnerNone");
442*6777b538SAndroid Build Coastguard Worker   }
443*6777b538SAndroid Build Coastguard Worker   {
444*6777b538SAndroid Build Coastguard Worker     using VoidReturnWithMoveOnlyArgs =
445*6777b538SAndroid Build Coastguard Worker         void(std::unique_ptr<int>, std::unique_ptr<int>);
446*6777b538SAndroid Build Coastguard Worker     using ThenReturn = int;
447*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenOnceTest<VoidReturnWithMoveOnlyArgs, ThenReturn>;
448*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(99, Test::GetOuter(s)
449*6777b538SAndroid Build Coastguard Worker                       .Then(Test::GetInner(s))
450*6777b538SAndroid Build Coastguard Worker                       .Run(std::make_unique<int>(1), std::make_unique<int>(2)));
451*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12InnerNone");
452*6777b538SAndroid Build Coastguard Worker   }
453*6777b538SAndroid Build Coastguard Worker 
454*6777b538SAndroid Build Coastguard Worker   // Non-void return from outer + void return from Then().
455*6777b538SAndroid Build Coastguard Worker   {
456*6777b538SAndroid Build Coastguard Worker     using NonVoidReturnWithoutArgs = int();
457*6777b538SAndroid Build Coastguard Worker     using ThenReturn = void;
458*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenOnceTest<NonVoidReturnWithoutArgs, ThenReturn>;
459*6777b538SAndroid Build Coastguard Worker     Test::GetOuter(s).Then(Test::GetInner(s)).Run();
460*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "OuterNoneInner99");
461*6777b538SAndroid Build Coastguard Worker   }
462*6777b538SAndroid Build Coastguard Worker   {
463*6777b538SAndroid Build Coastguard Worker     using NonVoidReturnWithArgs = int(int, int);
464*6777b538SAndroid Build Coastguard Worker     using ThenReturn = void;
465*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenOnceTest<NonVoidReturnWithArgs, ThenReturn>;
466*6777b538SAndroid Build Coastguard Worker     Test::GetOuter(s).Then(Test::GetInner(s)).Run(1, 2);
467*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12Inner3");
468*6777b538SAndroid Build Coastguard Worker   }
469*6777b538SAndroid Build Coastguard Worker   {
470*6777b538SAndroid Build Coastguard Worker     using NonVoidReturnWithMoveOnlyArgs =
471*6777b538SAndroid Build Coastguard Worker         int(std::unique_ptr<int>, std::unique_ptr<int>);
472*6777b538SAndroid Build Coastguard Worker     using ThenReturn = void;
473*6777b538SAndroid Build Coastguard Worker     using Test =
474*6777b538SAndroid Build Coastguard Worker         CallbackThenOnceTest<NonVoidReturnWithMoveOnlyArgs, ThenReturn>;
475*6777b538SAndroid Build Coastguard Worker     Test::GetOuter(s)
476*6777b538SAndroid Build Coastguard Worker         .Then(Test::GetInner(s))
477*6777b538SAndroid Build Coastguard Worker         .Run(std::make_unique<int>(1), std::make_unique<int>(2));
478*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12Inner3");
479*6777b538SAndroid Build Coastguard Worker   }
480*6777b538SAndroid Build Coastguard Worker 
481*6777b538SAndroid Build Coastguard Worker   // Non-void return from outer + non-void return from Then().
482*6777b538SAndroid Build Coastguard Worker   {
483*6777b538SAndroid Build Coastguard Worker     using NonVoidReturnWithoutArgs = int();
484*6777b538SAndroid Build Coastguard Worker     using ThenReturn = int;
485*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenOnceTest<NonVoidReturnWithoutArgs, ThenReturn>;
486*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(99, Test::GetOuter(s).Then(Test::GetInner(s)).Run());
487*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "OuterNoneInner99");
488*6777b538SAndroid Build Coastguard Worker   }
489*6777b538SAndroid Build Coastguard Worker   {
490*6777b538SAndroid Build Coastguard Worker     using NonVoidReturnWithArgs = int(int, int);
491*6777b538SAndroid Build Coastguard Worker     using ThenReturn = int;
492*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenOnceTest<NonVoidReturnWithArgs, ThenReturn>;
493*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, Test::GetOuter(s).Then(Test::GetInner(s)).Run(1, 2));
494*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12Inner3");
495*6777b538SAndroid Build Coastguard Worker   }
496*6777b538SAndroid Build Coastguard Worker   {
497*6777b538SAndroid Build Coastguard Worker     using NonVoidReturnWithMoveOnlyArgs =
498*6777b538SAndroid Build Coastguard Worker         int(std::unique_ptr<int>, std::unique_ptr<int>);
499*6777b538SAndroid Build Coastguard Worker     using ThenReturn = int;
500*6777b538SAndroid Build Coastguard Worker     using Test =
501*6777b538SAndroid Build Coastguard Worker         CallbackThenOnceTest<NonVoidReturnWithMoveOnlyArgs, ThenReturn>;
502*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, Test::GetOuter(s)
503*6777b538SAndroid Build Coastguard Worker                      .Then(Test::GetInner(s))
504*6777b538SAndroid Build Coastguard Worker                      .Run(std::make_unique<int>(1), std::make_unique<int>(2)));
505*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12Inner3");
506*6777b538SAndroid Build Coastguard Worker   }
507*6777b538SAndroid Build Coastguard Worker }
508*6777b538SAndroid Build Coastguard Worker 
TEST_F(CallbackTest,ThenRepeating)509*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, ThenRepeating) {
510*6777b538SAndroid Build Coastguard Worker   std::string s;
511*6777b538SAndroid Build Coastguard Worker 
512*6777b538SAndroid Build Coastguard Worker   // Void return from outer + void return from Then().
513*6777b538SAndroid Build Coastguard Worker   {
514*6777b538SAndroid Build Coastguard Worker     using VoidReturnWithoutArgs = void();
515*6777b538SAndroid Build Coastguard Worker     using ThenReturn = void;
516*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenRepeatingTest<VoidReturnWithoutArgs, ThenReturn>;
517*6777b538SAndroid Build Coastguard Worker     auto outer = Test::GetOuter(s);
518*6777b538SAndroid Build Coastguard Worker     outer.Then(Test::GetInner(s)).Run();
519*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "OuterNoneInnerNone");
520*6777b538SAndroid Build Coastguard Worker     std::move(outer).Then(Test::GetInner(s)).Run();
521*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "OuterNoneInnerNoneOuterNoneInnerNone");
522*6777b538SAndroid Build Coastguard Worker   }
523*6777b538SAndroid Build Coastguard Worker   {
524*6777b538SAndroid Build Coastguard Worker     using VoidReturnWithArgs = void(int, int);
525*6777b538SAndroid Build Coastguard Worker     using ThenReturn = void;
526*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenRepeatingTest<VoidReturnWithArgs, ThenReturn>;
527*6777b538SAndroid Build Coastguard Worker     auto outer = Test::GetOuter(s);
528*6777b538SAndroid Build Coastguard Worker     outer.Then(Test::GetInner(s)).Run(1, 2);
529*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12InnerNone");
530*6777b538SAndroid Build Coastguard Worker     std::move(outer).Then(Test::GetInner(s)).Run(1, 2);
531*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12InnerNoneOuter12InnerNone");
532*6777b538SAndroid Build Coastguard Worker   }
533*6777b538SAndroid Build Coastguard Worker   {
534*6777b538SAndroid Build Coastguard Worker     using VoidReturnWithMoveOnlyArgs =
535*6777b538SAndroid Build Coastguard Worker         void(std::unique_ptr<int>, std::unique_ptr<int>);
536*6777b538SAndroid Build Coastguard Worker     using ThenReturn = void;
537*6777b538SAndroid Build Coastguard Worker     using Test =
538*6777b538SAndroid Build Coastguard Worker         CallbackThenRepeatingTest<VoidReturnWithMoveOnlyArgs, ThenReturn>;
539*6777b538SAndroid Build Coastguard Worker     auto outer = Test::GetOuter(s);
540*6777b538SAndroid Build Coastguard Worker     outer.Then(Test::GetInner(s))
541*6777b538SAndroid Build Coastguard Worker         .Run(std::make_unique<int>(1), std::make_unique<int>(2));
542*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12InnerNone");
543*6777b538SAndroid Build Coastguard Worker     std::move(outer)
544*6777b538SAndroid Build Coastguard Worker         .Then(Test::GetInner(s))
545*6777b538SAndroid Build Coastguard Worker         .Run(std::make_unique<int>(1), std::make_unique<int>(2));
546*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12InnerNoneOuter12InnerNone");
547*6777b538SAndroid Build Coastguard Worker   }
548*6777b538SAndroid Build Coastguard Worker 
549*6777b538SAndroid Build Coastguard Worker   // Void return from outer + non-void return from Then().
550*6777b538SAndroid Build Coastguard Worker   {
551*6777b538SAndroid Build Coastguard Worker     using VoidReturnWithoutArgs = void();
552*6777b538SAndroid Build Coastguard Worker     using ThenReturn = int;
553*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenRepeatingTest<VoidReturnWithoutArgs, ThenReturn>;
554*6777b538SAndroid Build Coastguard Worker     auto outer = Test::GetOuter(s);
555*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(99, outer.Then(Test::GetInner(s)).Run());
556*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "OuterNoneInnerNone");
557*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(99, std::move(outer).Then(Test::GetInner(s)).Run());
558*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "OuterNoneInnerNoneOuterNoneInnerNone");
559*6777b538SAndroid Build Coastguard Worker   }
560*6777b538SAndroid Build Coastguard Worker   {
561*6777b538SAndroid Build Coastguard Worker     using VoidReturnWithArgs = void(int, int);
562*6777b538SAndroid Build Coastguard Worker     using ThenReturn = int;
563*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenRepeatingTest<VoidReturnWithArgs, ThenReturn>;
564*6777b538SAndroid Build Coastguard Worker     auto outer = Test::GetOuter(s);
565*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(99, outer.Then(Test::GetInner(s)).Run(1, 2));
566*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12InnerNone");
567*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(99, std::move(outer).Then(Test::GetInner(s)).Run(1, 2));
568*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12InnerNoneOuter12InnerNone");
569*6777b538SAndroid Build Coastguard Worker   }
570*6777b538SAndroid Build Coastguard Worker   {
571*6777b538SAndroid Build Coastguard Worker     using VoidReturnWithMoveOnlyArgs =
572*6777b538SAndroid Build Coastguard Worker         void(std::unique_ptr<int>, std::unique_ptr<int>);
573*6777b538SAndroid Build Coastguard Worker     using ThenReturn = int;
574*6777b538SAndroid Build Coastguard Worker     using Test =
575*6777b538SAndroid Build Coastguard Worker         CallbackThenRepeatingTest<VoidReturnWithMoveOnlyArgs, ThenReturn>;
576*6777b538SAndroid Build Coastguard Worker     auto outer = Test::GetOuter(s);
577*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(99, outer.Then(Test::GetInner(s))
578*6777b538SAndroid Build Coastguard Worker                       .Run(std::make_unique<int>(1), std::make_unique<int>(2)));
579*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12InnerNone");
580*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(99, std::move(outer)
581*6777b538SAndroid Build Coastguard Worker                       .Then(Test::GetInner(s))
582*6777b538SAndroid Build Coastguard Worker                       .Run(std::make_unique<int>(1), std::make_unique<int>(2)));
583*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12InnerNoneOuter12InnerNone");
584*6777b538SAndroid Build Coastguard Worker   }
585*6777b538SAndroid Build Coastguard Worker 
586*6777b538SAndroid Build Coastguard Worker   // Non-void return from outer + void return from Then().
587*6777b538SAndroid Build Coastguard Worker   {
588*6777b538SAndroid Build Coastguard Worker     using NonVoidReturnWithoutArgs = int();
589*6777b538SAndroid Build Coastguard Worker     using ThenReturn = void;
590*6777b538SAndroid Build Coastguard Worker     using Test =
591*6777b538SAndroid Build Coastguard Worker         CallbackThenRepeatingTest<NonVoidReturnWithoutArgs, ThenReturn>;
592*6777b538SAndroid Build Coastguard Worker     auto outer = Test::GetOuter(s);
593*6777b538SAndroid Build Coastguard Worker     outer.Then(Test::GetInner(s)).Run();
594*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "OuterNoneInner99");
595*6777b538SAndroid Build Coastguard Worker     std::move(outer).Then(Test::GetInner(s)).Run();
596*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "OuterNoneInner99OuterNoneInner99");
597*6777b538SAndroid Build Coastguard Worker   }
598*6777b538SAndroid Build Coastguard Worker   {
599*6777b538SAndroid Build Coastguard Worker     using NonVoidReturnWithArgs = int(int, int);
600*6777b538SAndroid Build Coastguard Worker     using ThenReturn = void;
601*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenRepeatingTest<NonVoidReturnWithArgs, ThenReturn>;
602*6777b538SAndroid Build Coastguard Worker     auto outer = Test::GetOuter(s);
603*6777b538SAndroid Build Coastguard Worker     outer.Then(Test::GetInner(s)).Run(1, 2);
604*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12Inner3");
605*6777b538SAndroid Build Coastguard Worker     std::move(outer).Then(Test::GetInner(s)).Run(1, 2);
606*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12Inner3Outer12Inner3");
607*6777b538SAndroid Build Coastguard Worker   }
608*6777b538SAndroid Build Coastguard Worker   {
609*6777b538SAndroid Build Coastguard Worker     using NonVoidReturnWithMoveOnlyArgs =
610*6777b538SAndroid Build Coastguard Worker         int(std::unique_ptr<int>, std::unique_ptr<int>);
611*6777b538SAndroid Build Coastguard Worker     using ThenReturn = void;
612*6777b538SAndroid Build Coastguard Worker     using Test =
613*6777b538SAndroid Build Coastguard Worker         CallbackThenRepeatingTest<NonVoidReturnWithMoveOnlyArgs, ThenReturn>;
614*6777b538SAndroid Build Coastguard Worker     auto outer = Test::GetOuter(s);
615*6777b538SAndroid Build Coastguard Worker     outer.Then(Test::GetInner(s))
616*6777b538SAndroid Build Coastguard Worker         .Run(std::make_unique<int>(1), std::make_unique<int>(2));
617*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12Inner3");
618*6777b538SAndroid Build Coastguard Worker     std::move(outer)
619*6777b538SAndroid Build Coastguard Worker         .Then(Test::GetInner(s))
620*6777b538SAndroid Build Coastguard Worker         .Run(std::make_unique<int>(1), std::make_unique<int>(2));
621*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12Inner3Outer12Inner3");
622*6777b538SAndroid Build Coastguard Worker   }
623*6777b538SAndroid Build Coastguard Worker 
624*6777b538SAndroid Build Coastguard Worker   // Non-void return from outer + non-void return from Then().
625*6777b538SAndroid Build Coastguard Worker   {
626*6777b538SAndroid Build Coastguard Worker     using NonVoidReturnWithoutArgs = int();
627*6777b538SAndroid Build Coastguard Worker     using ThenReturn = int;
628*6777b538SAndroid Build Coastguard Worker     using Test =
629*6777b538SAndroid Build Coastguard Worker         CallbackThenRepeatingTest<NonVoidReturnWithoutArgs, ThenReturn>;
630*6777b538SAndroid Build Coastguard Worker     auto outer = Test::GetOuter(s);
631*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(99, outer.Then(Test::GetInner(s)).Run());
632*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "OuterNoneInner99");
633*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(99, std::move(outer).Then(Test::GetInner(s)).Run());
634*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "OuterNoneInner99OuterNoneInner99");
635*6777b538SAndroid Build Coastguard Worker   }
636*6777b538SAndroid Build Coastguard Worker   {
637*6777b538SAndroid Build Coastguard Worker     using NonVoidReturnWithArgs = int(int, int);
638*6777b538SAndroid Build Coastguard Worker     using ThenReturn = int;
639*6777b538SAndroid Build Coastguard Worker     using Test = CallbackThenRepeatingTest<NonVoidReturnWithArgs, ThenReturn>;
640*6777b538SAndroid Build Coastguard Worker     auto outer = Test::GetOuter(s);
641*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, outer.Then(Test::GetInner(s)).Run(1, 2));
642*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12Inner3");
643*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, std::move(outer).Then(Test::GetInner(s)).Run(1, 2));
644*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12Inner3Outer12Inner3");
645*6777b538SAndroid Build Coastguard Worker   }
646*6777b538SAndroid Build Coastguard Worker   {
647*6777b538SAndroid Build Coastguard Worker     using NonVoidReturnWithMoveOnlyArgs =
648*6777b538SAndroid Build Coastguard Worker         int(std::unique_ptr<int>, std::unique_ptr<int>);
649*6777b538SAndroid Build Coastguard Worker     using ThenReturn = int;
650*6777b538SAndroid Build Coastguard Worker     using Test =
651*6777b538SAndroid Build Coastguard Worker         CallbackThenRepeatingTest<NonVoidReturnWithMoveOnlyArgs, ThenReturn>;
652*6777b538SAndroid Build Coastguard Worker     auto outer = Test::GetOuter(s);
653*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, outer.Then(Test::GetInner(s))
654*6777b538SAndroid Build Coastguard Worker                      .Run(std::make_unique<int>(1), std::make_unique<int>(2)));
655*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12Inner3");
656*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(3, std::move(outer)
657*6777b538SAndroid Build Coastguard Worker                      .Then(Test::GetInner(s))
658*6777b538SAndroid Build Coastguard Worker                      .Run(std::make_unique<int>(1), std::make_unique<int>(2)));
659*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(s, "Outer12Inner3Outer12Inner3");
660*6777b538SAndroid Build Coastguard Worker   }
661*6777b538SAndroid Build Coastguard Worker }
662*6777b538SAndroid Build Coastguard Worker 
663*6777b538SAndroid Build Coastguard Worker // WeakPtr detection in BindRepeating() requires a method, not just any
664*6777b538SAndroid Build Coastguard Worker // function.
665*6777b538SAndroid Build Coastguard Worker class ClassWithAMethod {
666*6777b538SAndroid Build Coastguard Worker  public:
TheMethod()667*6777b538SAndroid Build Coastguard Worker   void TheMethod() { method_called = true; }
668*6777b538SAndroid Build Coastguard Worker 
669*6777b538SAndroid Build Coastguard Worker   bool method_called = false;
670*6777b538SAndroid Build Coastguard Worker };
671*6777b538SAndroid Build Coastguard Worker 
TEST_F(CallbackTest,MaybeValidInvalidateWeakPtrsOnSameSequence)672*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, MaybeValidInvalidateWeakPtrsOnSameSequence) {
673*6777b538SAndroid Build Coastguard Worker   ClassWithAMethod obj;
674*6777b538SAndroid Build Coastguard Worker   WeakPtrFactory<ClassWithAMethod> factory(&obj);
675*6777b538SAndroid Build Coastguard Worker   WeakPtr<ClassWithAMethod> ptr = factory.GetWeakPtr();
676*6777b538SAndroid Build Coastguard Worker 
677*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void()> cb =
678*6777b538SAndroid Build Coastguard Worker       BindRepeating(&ClassWithAMethod::TheMethod, ptr);
679*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(cb.MaybeValid());
680*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(cb.IsCancelled());
681*6777b538SAndroid Build Coastguard Worker 
682*6777b538SAndroid Build Coastguard Worker   factory.InvalidateWeakPtrs();
683*6777b538SAndroid Build Coastguard Worker   // MaybeValid() should be false and IsCancelled() should become true because
684*6777b538SAndroid Build Coastguard Worker   // InvalidateWeakPtrs() was called on the same thread.
685*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(cb.MaybeValid());
686*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(cb.IsCancelled());
687*6777b538SAndroid Build Coastguard Worker   // is_null() is not affected by the invalidated WeakPtr.
688*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(cb.is_null());
689*6777b538SAndroid Build Coastguard Worker }
690*6777b538SAndroid Build Coastguard Worker 
TEST_F(CallbackTest,MaybeValidInvalidateWeakPtrsOnOtherSequence)691*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, MaybeValidInvalidateWeakPtrsOnOtherSequence) {
692*6777b538SAndroid Build Coastguard Worker   ClassWithAMethod obj;
693*6777b538SAndroid Build Coastguard Worker   WeakPtrFactory<ClassWithAMethod> factory(&obj);
694*6777b538SAndroid Build Coastguard Worker   WeakPtr<ClassWithAMethod> ptr = factory.GetWeakPtr();
695*6777b538SAndroid Build Coastguard Worker 
696*6777b538SAndroid Build Coastguard Worker   RepeatingCallback<void()> cb =
697*6777b538SAndroid Build Coastguard Worker       BindRepeating(&ClassWithAMethod::TheMethod, ptr);
698*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(cb.MaybeValid());
699*6777b538SAndroid Build Coastguard Worker 
700*6777b538SAndroid Build Coastguard Worker   Thread other_thread("other_thread");
701*6777b538SAndroid Build Coastguard Worker   other_thread.StartAndWaitForTesting();
702*6777b538SAndroid Build Coastguard Worker   other_thread.task_runner()->PostTask(
703*6777b538SAndroid Build Coastguard Worker       FROM_HERE,
704*6777b538SAndroid Build Coastguard Worker       BindOnce(
705*6777b538SAndroid Build Coastguard Worker           [](RepeatingCallback<void()> cb) {
706*6777b538SAndroid Build Coastguard Worker             // Check that MaybeValid() _eventually_ returns false.
707*6777b538SAndroid Build Coastguard Worker             const TimeDelta timeout = TestTimeouts::tiny_timeout();
708*6777b538SAndroid Build Coastguard Worker             const TimeTicks begin = TimeTicks::Now();
709*6777b538SAndroid Build Coastguard Worker             while (cb.MaybeValid() && (TimeTicks::Now() - begin) < timeout)
710*6777b538SAndroid Build Coastguard Worker               PlatformThread::YieldCurrentThread();
711*6777b538SAndroid Build Coastguard Worker             EXPECT_FALSE(cb.MaybeValid());
712*6777b538SAndroid Build Coastguard Worker           },
713*6777b538SAndroid Build Coastguard Worker           cb));
714*6777b538SAndroid Build Coastguard Worker   factory.InvalidateWeakPtrs();
715*6777b538SAndroid Build Coastguard Worker   // |other_thread|'s destructor will join, ensuring we wait for the task to be
716*6777b538SAndroid Build Coastguard Worker   // run.
717*6777b538SAndroid Build Coastguard Worker }
718*6777b538SAndroid Build Coastguard Worker 
TEST_F(CallbackTest,ThenAfterWeakPtr)719*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, ThenAfterWeakPtr) {
720*6777b538SAndroid Build Coastguard Worker   ClassWithAMethod obj;
721*6777b538SAndroid Build Coastguard Worker   WeakPtrFactory<ClassWithAMethod> factory(&obj);
722*6777b538SAndroid Build Coastguard Worker   WeakPtr<ClassWithAMethod> ptr = factory.GetWeakPtr();
723*6777b538SAndroid Build Coastguard Worker 
724*6777b538SAndroid Build Coastguard Worker   // If the first callback of a chain is skipped due to InvalidateWeakPtrs(),
725*6777b538SAndroid Build Coastguard Worker   // the remaining callbacks should still run.
726*6777b538SAndroid Build Coastguard Worker   bool chained_closure_called = false;
727*6777b538SAndroid Build Coastguard Worker   OnceClosure closure =
728*6777b538SAndroid Build Coastguard Worker       BindOnce(&ClassWithAMethod::TheMethod, ptr)
729*6777b538SAndroid Build Coastguard Worker           .Then(BindLambdaForTesting(
730*6777b538SAndroid Build Coastguard Worker               [&chained_closure_called] { chained_closure_called = true; }));
731*6777b538SAndroid Build Coastguard Worker   factory.InvalidateWeakPtrs();
732*6777b538SAndroid Build Coastguard Worker   std::move(closure).Run();
733*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(obj.method_called);
734*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(chained_closure_called);
735*6777b538SAndroid Build Coastguard Worker }
736*6777b538SAndroid Build Coastguard Worker 
737*6777b538SAndroid Build Coastguard Worker class CallbackOwner : public base::RefCounted<CallbackOwner> {
738*6777b538SAndroid Build Coastguard Worker  public:
CallbackOwner(bool * deleted)739*6777b538SAndroid Build Coastguard Worker   explicit CallbackOwner(bool* deleted) {
740*6777b538SAndroid Build Coastguard Worker     // WrapRefCounted() here is needed to avoid the check failure in the
741*6777b538SAndroid Build Coastguard Worker     // BindRepeating implementation, that refuses to create the first reference
742*6777b538SAndroid Build Coastguard Worker     // to ref-counted objects.
743*6777b538SAndroid Build Coastguard Worker     callback_ = BindRepeating(&CallbackOwner::Unused, WrapRefCounted(this));
744*6777b538SAndroid Build Coastguard Worker     deleted_ = deleted;
745*6777b538SAndroid Build Coastguard Worker   }
Reset()746*6777b538SAndroid Build Coastguard Worker   void Reset() {
747*6777b538SAndroid Build Coastguard Worker     callback_.Reset();
748*6777b538SAndroid Build Coastguard Worker     // We are deleted here if no-one else had a ref to us.
749*6777b538SAndroid Build Coastguard Worker   }
750*6777b538SAndroid Build Coastguard Worker 
751*6777b538SAndroid Build Coastguard Worker  private:
752*6777b538SAndroid Build Coastguard Worker   friend class base::RefCounted<CallbackOwner>;
~CallbackOwner()753*6777b538SAndroid Build Coastguard Worker   virtual ~CallbackOwner() { *deleted_ = true; }
Unused()754*6777b538SAndroid Build Coastguard Worker   void Unused() { FAIL() << "Should never be called"; }
755*6777b538SAndroid Build Coastguard Worker 
756*6777b538SAndroid Build Coastguard Worker   RepeatingClosure callback_;
757*6777b538SAndroid Build Coastguard Worker   raw_ptr<bool> deleted_;
758*6777b538SAndroid Build Coastguard Worker };
759*6777b538SAndroid Build Coastguard Worker 
TEST_F(CallbackTest,CallbackHasLastRefOnContainingObject)760*6777b538SAndroid Build Coastguard Worker TEST_F(CallbackTest, CallbackHasLastRefOnContainingObject) {
761*6777b538SAndroid Build Coastguard Worker   bool deleted = false;
762*6777b538SAndroid Build Coastguard Worker   CallbackOwner* owner = new CallbackOwner(&deleted);
763*6777b538SAndroid Build Coastguard Worker   owner->Reset();
764*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(deleted);
765*6777b538SAndroid Build Coastguard Worker }
766*6777b538SAndroid Build Coastguard Worker 
767*6777b538SAndroid Build Coastguard Worker // According to legends, it is good practice to put death tests into their own
768*6777b538SAndroid Build Coastguard Worker // test suite, so they are grouped separately from regular tests, since death
769*6777b538SAndroid Build Coastguard Worker // tests are somewhat slow and have quirks that can slow down test running if
770*6777b538SAndroid Build Coastguard Worker // intermixed.
TEST(CallbackDeathTest,RunNullCallbackChecks)771*6777b538SAndroid Build Coastguard Worker TEST(CallbackDeathTest, RunNullCallbackChecks) {
772*6777b538SAndroid Build Coastguard Worker   {
773*6777b538SAndroid Build Coastguard Worker     base::OnceClosure closure;
774*6777b538SAndroid Build Coastguard Worker     EXPECT_CHECK_DEATH(std::move(closure).Run());
775*6777b538SAndroid Build Coastguard Worker   }
776*6777b538SAndroid Build Coastguard Worker 
777*6777b538SAndroid Build Coastguard Worker   {
778*6777b538SAndroid Build Coastguard Worker     base::RepeatingClosure closure;
779*6777b538SAndroid Build Coastguard Worker     EXPECT_CHECK_DEATH(std::move(closure).Run());
780*6777b538SAndroid Build Coastguard Worker   }
781*6777b538SAndroid Build Coastguard Worker 
782*6777b538SAndroid Build Coastguard Worker   {
783*6777b538SAndroid Build Coastguard Worker     base::RepeatingClosure closure;
784*6777b538SAndroid Build Coastguard Worker     EXPECT_CHECK_DEATH(closure.Run());
785*6777b538SAndroid Build Coastguard Worker   }
786*6777b538SAndroid Build Coastguard Worker }
787*6777b538SAndroid Build Coastguard Worker 
788*6777b538SAndroid Build Coastguard Worker }  // namespace
789*6777b538SAndroid Build Coastguard Worker }  // namespace base
790