15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/callback_work_item.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A callback that always fails (returns false).
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestFailureCallback(const CallbackWorkItem& work_item) {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the work item returns false when a callback returns failure.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(CallbackWorkItemTest, TestFailure) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CallbackWorkItem work_item(base::Bind(&TestFailureCallback));
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(work_item.Do());
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum TestCallbackState {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TCS_UNDEFINED,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TCS_CALLED_FORWARD,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TCS_CALLED_ROLLBACK,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A callback that sets |state| according to whether it is rolling forward or
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// backward.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestForwardBackwardCallback(TestCallbackState* state,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const CallbackWorkItem& work_item) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *state = work_item.IsRollback() ? TCS_CALLED_ROLLBACK : TCS_CALLED_FORWARD;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the callback is invoked correclty during Do() and Rollback().
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(CallbackWorkItemTest, TestForwardBackward) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCallbackState state = TCS_UNDEFINED;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CallbackWorkItem work_item(base::Bind(&TestForwardBackwardCallback, &state));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(work_item.Do());
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TCS_CALLED_FORWARD, state);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_item.Rollback();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(TCS_CALLED_ROLLBACK, state);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55