Home | History | Annotate | Download | only in base
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      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/callback_helpers.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/callback.h"
      9 #include "testing/gtest/include/gtest/gtest.h"
     10 
     11 namespace {
     12 
     13 void Increment(int* value) {
     14   (*value)++;
     15 }
     16 
     17 TEST(CallbackHelpersTest, TestResetAndReturn) {
     18   int run_count = 0;
     19 
     20   base::Closure cb = base::Bind(&Increment, &run_count);
     21   EXPECT_EQ(0, run_count);
     22   base::ResetAndReturn(&cb).Run();
     23   EXPECT_EQ(1, run_count);
     24   EXPECT_FALSE(cb);
     25 
     26   run_count = 0;
     27 
     28   base::OnceClosure cb2 = base::BindOnce(&Increment, &run_count);
     29   EXPECT_EQ(0, run_count);
     30   base::ResetAndReturn(&cb2).Run();
     31   EXPECT_EQ(1, run_count);
     32   EXPECT_FALSE(cb2);
     33 }
     34 
     35 TEST(CallbackHelpersTest, TestScopedClosureRunnerExitScope) {
     36   int run_count = 0;
     37   {
     38     base::ScopedClosureRunner runner(base::Bind(&Increment, &run_count));
     39     EXPECT_EQ(0, run_count);
     40   }
     41   EXPECT_EQ(1, run_count);
     42 }
     43 
     44 TEST(CallbackHelpersTest, TestScopedClosureRunnerRelease) {
     45   int run_count = 0;
     46   base::Closure c;
     47   {
     48     base::ScopedClosureRunner runner(base::Bind(&Increment, &run_count));
     49     c = runner.Release();
     50     EXPECT_EQ(0, run_count);
     51   }
     52   EXPECT_EQ(0, run_count);
     53   c.Run();
     54   EXPECT_EQ(1, run_count);
     55 }
     56 
     57 TEST(CallbackHelpersTest, TestScopedClosureRunnerReplaceClosure) {
     58   int run_count_1 = 0;
     59   int run_count_2 = 0;
     60   {
     61     base::ScopedClosureRunner runner;
     62     runner.ReplaceClosure(base::Bind(&Increment, &run_count_1));
     63     runner.ReplaceClosure(base::Bind(&Increment, &run_count_2));
     64     EXPECT_EQ(0, run_count_1);
     65     EXPECT_EQ(0, run_count_2);
     66   }
     67   EXPECT_EQ(0, run_count_1);
     68   EXPECT_EQ(1, run_count_2);
     69 }
     70 
     71 TEST(CallbackHelpersTest, TestScopedClosureRunnerRunAndReset) {
     72   int run_count_3 = 0;
     73   {
     74     base::ScopedClosureRunner runner(base::Bind(&Increment, &run_count_3));
     75     EXPECT_EQ(0, run_count_3);
     76     runner.RunAndReset();
     77     EXPECT_EQ(1, run_count_3);
     78   }
     79   EXPECT_EQ(1, run_count_3);
     80 }
     81 
     82 TEST(CallbackHelpersTest, TestScopedClosureRunnerMoveConstructor) {
     83   int run_count = 0;
     84   {
     85     std::unique_ptr<base::ScopedClosureRunner> runner(
     86         new base::ScopedClosureRunner(base::Bind(&Increment, &run_count)));
     87     base::ScopedClosureRunner runner2(std::move(*runner));
     88     runner.reset();
     89     EXPECT_EQ(0, run_count);
     90   }
     91   EXPECT_EQ(1, run_count);
     92 }
     93 
     94 TEST(CallbackHelpersTest, TestScopedClosureRunnerMoveAssignment) {
     95   int run_count_1 = 0;
     96   int run_count_2 = 0;
     97   {
     98     base::ScopedClosureRunner runner(base::Bind(&Increment, &run_count_1));
     99     {
    100       base::ScopedClosureRunner runner2(base::Bind(&Increment, &run_count_2));
    101       runner = std::move(runner2);
    102       EXPECT_EQ(0, run_count_1);
    103       EXPECT_EQ(0, run_count_2);
    104     }
    105     EXPECT_EQ(0, run_count_1);
    106     EXPECT_EQ(0, run_count_2);
    107   }
    108   EXPECT_EQ(0, run_count_1);
    109   EXPECT_EQ(1, run_count_2);
    110 }
    111 
    112 }  // namespace
    113