text: // Copyright (c) 2012 The Chromium 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 "chrome/installer/util/callback_work_item.h"
  
  #include "base/bind.h"
  #include "base/callback_helpers.h"
  #include "base/test/bind.h"
  #include "testing/gtest/include/gtest/gtest.h"
  
  namespace {
  
  // A callback that always fails (returns false).
  bool TestFailureCallback(const CallbackWorkItem& item) {
    return false;
  }
  
  }  // namespace
  
  // Test that the work item returns false when a callback returns failure.
  TEST(CallbackWorkItemTest, TestFailure) {
    CallbackWorkItem work_item(base::BindOnce(&TestFailureCallback),
                               base::DoNothing());
  
    EXPECT_FALSE(work_item.Do());
  }
  
  namespace {
  
  enum TestCallbackState {
    TCS_UNDEFINED,
    TCS_CALLED_FORWARD,
    TCS_CALLED_ROLLBACK,
  };
  
  }  // namespace
  
  // Test that the callback is invoked correctly during Do() and Rollback().
  TEST(CallbackWorkItemTest, TestForwardBackward) {
    TestCallbackState state = TCS_UNDEFINED;
  
    CallbackWorkItem work_item(
        base::BindLambdaForTesting([&](const CallbackWorkItem& item) -> bool {
          state = TCS_CALLED_FORWARD;
          return true;
        }),
        base::BindLambdaForTesting(
            [&](const CallbackWorkItem& item) { state = TCS_CALLED_ROLLBACK; }));
  
    EXPECT_TRUE(work_item.Do());
    EXPECT_EQ(TCS_CALLED_FORWARD, state);
  
    work_item.Rollback();
    EXPECT_EQ(TCS_CALLED_ROLLBACK, state);
  }
  