Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1213)

Side by Side Diff: base/memory/pass_scoped_ptr_unittest.cc

Issue 8224026: Add a PassScopedPtr into base/memory. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed it. Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/memory/pass_scoped_ptr.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011 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.
4
5 #include "base/memory/pass_scoped_ptr.h"
6
7 #include "base/basictypes.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9
10 namespace base {
11
12 namespace {
13
14 class ConDecLogger {
15 public:
16 ConDecLogger() : ptr_(NULL) { }
17 explicit ConDecLogger(int* ptr) { set_ptr(ptr); }
18 ~ConDecLogger() { --*ptr_; }
19
20 private:
21 void set_ptr(int* ptr) { ptr_ = ptr; ++*ptr_; }
22
23 int* ptr_;
24 DISALLOW_COPY_AND_ASSIGN(ConDecLogger);
25 };
26
27 PassScopedPtr<ConDecLogger> PassThru(PassScopedPtr<ConDecLogger> logger) {
28 return logger.Pass();
29 }
30
31 void GrabAndDrop(PassScopedPtr<ConDecLogger> logger) {
32 }
33
34 } // namespace
35
36 TEST(PassScopedPtrTest, BasicMethods) {
37 int constructed = 0;
38
39 {
40 ConDecLogger* logger = new ConDecLogger(&constructed);
41 PassScopedPtr<ConDecLogger> pass_scoped_ptr(MakePassScopedPtr(logger));
42 EXPECT_EQ(1, constructed);
43 EXPECT_EQ(logger, pass_scoped_ptr.value_.raw_ptr);
44 EXPECT_TRUE(pass_scoped_ptr.is_valid());
45 }
46 EXPECT_EQ(0, constructed);
47
48 // Test ToScopedPtr();
49 {
50 ConDecLogger* logger = new ConDecLogger(&constructed);
51 PassScopedPtr<ConDecLogger> pass_scoped_ptr(MakePassScopedPtr(logger));
52 EXPECT_EQ(1, constructed);
53
54 scoped_ptr<ConDecLogger> scoped;
55 pass_scoped_ptr.ToScopedPtr(&scoped);
56 EXPECT_EQ(logger, scoped.get());
57 EXPECT_TRUE(pass_scoped_ptr.value_.raw_ptr == NULL);
58 EXPECT_FALSE(pass_scoped_ptr.is_valid());
59 EXPECT_EQ(1, constructed);
60 }
61 EXPECT_EQ(0, constructed);
62 }
63
64 TEST(PassScopedPtrTest, PassBehavior) {
65 int constructed = 0;
66 // Test Pass constructor;
67 {
68 ConDecLogger* logger = new ConDecLogger(&constructed);
69 PassScopedPtr<ConDecLogger> pass_scoped_ptr(MakePassScopedPtr(logger));
70 EXPECT_EQ(1, constructed);
71
72 PassScopedPtr<ConDecLogger> pass_scoped_ptr2(pass_scoped_ptr.Pass());
73 EXPECT_EQ(1, constructed);
74 EXPECT_FALSE(pass_scoped_ptr.is_valid());
75 EXPECT_TRUE(pass_scoped_ptr2.is_valid());
76 }
77
78 // Test uncaught Pass() does not leak.
79 {
80 ConDecLogger* logger = new ConDecLogger(&constructed);
81 PassScopedPtr<ConDecLogger> pass_scoped_ptr(MakePassScopedPtr(logger));
82 EXPECT_EQ(1, constructed);
83
84 // Should auto-destruct logger by end of scope.
85 pass_scoped_ptr.Pass();
86 EXPECT_FALSE(pass_scoped_ptr.is_valid());
87 }
88 EXPECT_EQ(0, constructed);
89
90 // Test that passing to function which does nothing does not leak.
91 {
92 ConDecLogger* logger = new ConDecLogger(&constructed);
93 PassScopedPtr<ConDecLogger> pass_scoped_ptr(MakePassScopedPtr(logger));
94 EXPECT_EQ(1, constructed);
95
96 // Should auto-destruct logger by end of scope.
97 GrabAndDrop(pass_scoped_ptr.Pass());
98 EXPECT_FALSE(pass_scoped_ptr.is_valid());
99 }
100 EXPECT_EQ(0, constructed);
101 }
102
103 TEST(PassScopedPtrTest, ReturnTypeBehavior) {
104 int constructed = 0;
105
106 // Test that we can return a PassScopedPtr.
107 {
108 ConDecLogger* logger = new ConDecLogger(&constructed);
109 PassScopedPtr<ConDecLogger> pass_scoped_ptr(MakePassScopedPtr(logger));
110 EXPECT_EQ(1, constructed);
111
112 PassThru(pass_scoped_ptr.Pass());
113 EXPECT_FALSE(pass_scoped_ptr.is_valid());
114 }
115 EXPECT_EQ(0, constructed);
116
117
118 // Test uncaught return type not leak.
119 {
120 ConDecLogger* logger = new ConDecLogger(&constructed);
121 PassScopedPtr<ConDecLogger> pass_scoped_ptr(MakePassScopedPtr(logger));
122 EXPECT_EQ(1, constructed);
123
124 // Should auto-destruct logger by end of scope.
125 PassThru(pass_scoped_ptr.Pass());
126 EXPECT_FALSE(pass_scoped_ptr.is_valid());
127 }
128 EXPECT_EQ(0, constructed);
129 }
130
131 TEST(PassScopedPtrTest, AnchorBehavior) {
132 int constructed = 0;
133 // Test destruction semantics when anchored.
134 {
135 ConDecLogger* logger = new ConDecLogger(&constructed);
136 subtle::PassScopedPtrAnchor<ConDecLogger> anchor(
137 MakePassScopedPtr(logger));
138 EXPECT_EQ(1, constructed);
139 {
140 // Deletion of PassScopedPtr when anchored does nothing.
141 PassScopedPtr<ConDecLogger> pass_scoped_ptr(&anchor);
142 EXPECT_EQ(1, constructed);
143 }
144 EXPECT_EQ(1, constructed);
145
146 PassScopedPtr<ConDecLogger> pass_scoped_ptr(&anchor);
147 pass_scoped_ptr.Pass();
148 EXPECT_EQ(0, constructed);
149 EXPECT_FALSE(pass_scoped_ptr.is_valid());
150
151 // A second PassScopedPtr for an anchor should be immediately invalid.
152 PassScopedPtr<ConDecLogger> pass_scoped_ptr2(&anchor);
153 EXPECT_FALSE(pass_scoped_ptr2.is_valid());
154 }
155 EXPECT_EQ(0, constructed);
156 }
157
158 } // namespace base
OLDNEW
« no previous file with comments | « base/memory/pass_scoped_ptr.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698