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