1 // Copyright (c) 2012 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.
5 #include "base/memory/ref_counted.h"
6 #include "testing/gtest/include/gtest/gtest.h"
10 class SelfAssign
: public base::RefCounted
<SelfAssign
> {
11 friend class base::RefCounted
<SelfAssign
>;
16 class CheckDerivedMemberAccess
: public scoped_refptr
<SelfAssign
> {
18 CheckDerivedMemberAccess() {
19 // This shouldn't compile if we don't have access to the member variable.
20 SelfAssign
** pptr
= &ptr_
;
21 EXPECT_EQ(*pptr
, ptr_
);
25 class ScopedRefPtrToSelf
: public base::RefCounted
<ScopedRefPtrToSelf
> {
27 ScopedRefPtrToSelf() : self_ptr_(this) {}
29 static bool was_destroyed() { return was_destroyed_
; }
31 void SelfDestruct() { self_ptr_
= NULL
; }
34 friend class base::RefCounted
<ScopedRefPtrToSelf
>;
35 ~ScopedRefPtrToSelf() { was_destroyed_
= true; }
37 static bool was_destroyed_
;
39 scoped_refptr
<ScopedRefPtrToSelf
> self_ptr_
;
42 bool ScopedRefPtrToSelf::was_destroyed_
= false;
46 TEST(RefCountedUnitTest
, TestSelfAssignment
) {
47 SelfAssign
* p
= new SelfAssign
;
48 scoped_refptr
<SelfAssign
> var(p
);
50 EXPECT_EQ(var
.get(), p
);
53 TEST(RefCountedUnitTest
, ScopedRefPtrMemberAccess
) {
54 CheckDerivedMemberAccess check
;
57 TEST(RefCountedUnitTest
, ScopedRefPtrToSelf
) {
58 ScopedRefPtrToSelf
* check
= new ScopedRefPtrToSelf();
59 EXPECT_FALSE(ScopedRefPtrToSelf::was_destroyed());
60 check
->SelfDestruct();
61 EXPECT_TRUE(ScopedRefPtrToSelf::was_destroyed());