1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Use of this source code is governed by a BSD-style license that can be
321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// found in the LICENSE file.
421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/task.h"
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "testing/gtest/include/gtest/gtest.h"
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennamespace {
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass CancelInDestructor : public base::RefCounted<CancelInDestructor> {
1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public:
1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CancelInDestructor() : cancelable_task_(NULL) {}
1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void Start() {
1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (cancelable_task_) {
1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      ADD_FAILURE();
1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      return;
1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    }
2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    AddRef();
2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    cancelable_task_ = NewRunnableMethod(
2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        this, &CancelInDestructor::NeverIssuedCallback);
2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    Release();
2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
2521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CancelableTask* cancelable_task() {
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return cancelable_task_;
2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen private:
3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  friend class base::RefCounted<CancelInDestructor>;
3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ~CancelInDestructor() {
3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (cancelable_task_)
3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      cancelable_task_->Cancel();
3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void NeverIssuedCallback() { NOTREACHED(); }
3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CancelableTask* cancelable_task_;
4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen};
4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST(TaskTest, TestCancelInDestructor) {
4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Intentionally not using a scoped_refptr for cancel_in_destructor.
4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CancelInDestructor* cancel_in_destructor = new CancelInDestructor();
4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  cancel_in_destructor->Start();
4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CancelableTask* cancelable_task = cancel_in_destructor->cancelable_task();
4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(cancelable_task);
4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  delete cancelable_task;
5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}  // namespace
53