OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/basictypes.h" | 5 #include "base/basictypes.h" |
6 #include "base/bind.h" | |
6 #include "base/ios/weak_nsobject.h" | 7 #include "base/ios/weak_nsobject.h" |
7 #include "base/mac/scoped_nsobject.h" | 8 #include "base/mac/scoped_nsobject.h" |
9 #include "base/message_loop/message_loop.h" | |
10 #include "base/single_thread_task_runner.h" | |
11 #include "base/threading/thread.h" | |
8 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
9 | 13 |
10 using base::WeakNSObject; | 14 namespace base { |
11 | |
12 namespace { | 15 namespace { |
13 | 16 |
14 TEST(WeakNSObjectTest, WeakNSObject) { | 17 TEST(WeakNSObjectTest, WeakNSObject) { |
15 base::scoped_nsobject<NSObject> p1([[NSObject alloc] init]); | 18 scoped_nsobject<NSObject> p1([[NSObject alloc] init]); |
16 WeakNSObject<NSObject> w1(p1); | 19 WeakNSObject<NSObject> w1(p1); |
17 EXPECT_TRUE(w1); | 20 EXPECT_TRUE(w1); |
18 p1.reset(); | 21 p1.reset(); |
19 EXPECT_FALSE(w1); | 22 EXPECT_FALSE(w1); |
20 } | 23 } |
21 | 24 |
22 TEST(WeakNSObjectTest, MultipleWeakNSObject) { | 25 TEST(WeakNSObjectTest, MultipleWeakNSObject) { |
23 base::scoped_nsobject<NSObject> p1([[NSObject alloc] init]); | 26 scoped_nsobject<NSObject> p1([[NSObject alloc] init]); |
24 WeakNSObject<NSObject> w1(p1); | 27 WeakNSObject<NSObject> w1(p1); |
25 WeakNSObject<NSObject> w2(w1); | 28 WeakNSObject<NSObject> w2(w1); |
26 EXPECT_TRUE(w1); | 29 EXPECT_TRUE(w1); |
27 EXPECT_TRUE(w2); | 30 EXPECT_TRUE(w2); |
28 EXPECT_TRUE(w1.get() == w2.get()); | 31 EXPECT_TRUE(w1.get() == w2.get()); |
29 p1.reset(); | 32 p1.reset(); |
30 EXPECT_FALSE(w1); | 33 EXPECT_FALSE(w1); |
31 EXPECT_FALSE(w2); | 34 EXPECT_FALSE(w2); |
32 } | 35 } |
33 | 36 |
34 TEST(WeakNSObjectTest, WeakNSObjectDies) { | 37 TEST(WeakNSObjectTest, WeakNSObjectDies) { |
35 base::scoped_nsobject<NSObject> p1([[NSObject alloc] init]); | 38 scoped_nsobject<NSObject> p1([[NSObject alloc] init]); |
36 { | 39 { |
37 WeakNSObject<NSObject> w1(p1); | 40 WeakNSObject<NSObject> w1(p1); |
38 EXPECT_TRUE(w1); | 41 EXPECT_TRUE(w1); |
39 } | 42 } |
40 } | 43 } |
41 | 44 |
42 TEST(WeakNSObjectTest, WeakNSObjectReset) { | 45 TEST(WeakNSObjectTest, WeakNSObjectReset) { |
43 base::scoped_nsobject<NSObject> p1([[NSObject alloc] init]); | 46 scoped_nsobject<NSObject> p1([[NSObject alloc] init]); |
44 WeakNSObject<NSObject> w1(p1); | 47 WeakNSObject<NSObject> w1(p1); |
45 EXPECT_TRUE(w1); | 48 EXPECT_TRUE(w1); |
46 w1.reset(); | 49 w1.reset(); |
47 EXPECT_FALSE(w1); | 50 EXPECT_FALSE(w1); |
48 EXPECT_TRUE(p1); | 51 EXPECT_TRUE(p1); |
49 EXPECT_TRUE([p1 description]); | 52 EXPECT_TRUE([p1 description]); |
50 } | 53 } |
51 | 54 |
52 TEST(WeakNSObjectTest, WeakNSObjectResetWithObject) { | 55 TEST(WeakNSObjectTest, WeakNSObjectResetWithObject) { |
53 base::scoped_nsobject<NSObject> p1([[NSObject alloc] init]); | 56 scoped_nsobject<NSObject> p1([[NSObject alloc] init]); |
54 base::scoped_nsobject<NSObject> p2([[NSObject alloc] init]); | 57 scoped_nsobject<NSObject> p2([[NSObject alloc] init]); |
55 WeakNSObject<NSObject> w1(p1); | 58 WeakNSObject<NSObject> w1(p1); |
56 EXPECT_TRUE(w1); | 59 EXPECT_TRUE(w1); |
57 w1.reset(p2); | 60 w1.reset(p2); |
58 EXPECT_TRUE(w1); | 61 EXPECT_TRUE(w1); |
59 EXPECT_TRUE([p1 description]); | 62 EXPECT_TRUE([p1 description]); |
60 EXPECT_TRUE([p2 description]); | 63 EXPECT_TRUE([p2 description]); |
61 } | 64 } |
62 | 65 |
63 TEST(WeakNSObjectTest, WeakNSObjectEmpty) { | 66 TEST(WeakNSObjectTest, WeakNSObjectEmpty) { |
64 base::scoped_nsobject<NSObject> p1([[NSObject alloc] init]); | 67 scoped_nsobject<NSObject> p1([[NSObject alloc] init]); |
65 WeakNSObject<NSObject> w1; | 68 WeakNSObject<NSObject> w1; |
66 EXPECT_FALSE(w1); | 69 EXPECT_FALSE(w1); |
67 w1.reset(p1); | 70 w1.reset(p1); |
68 EXPECT_TRUE(w1); | 71 EXPECT_TRUE(w1); |
69 p1.reset(); | 72 p1.reset(); |
70 EXPECT_FALSE(w1); | 73 EXPECT_FALSE(w1); |
71 } | 74 } |
72 | 75 |
73 TEST(WeakNSObjectTest, WeakNSObjectCopy) { | 76 TEST(WeakNSObjectTest, WeakNSObjectCopy) { |
74 base::scoped_nsobject<NSObject> p1([[NSObject alloc] init]); | 77 scoped_nsobject<NSObject> p1([[NSObject alloc] init]); |
75 WeakNSObject<NSObject> w1(p1); | 78 WeakNSObject<NSObject> w1(p1); |
76 WeakNSObject<NSObject> w2(w1); | 79 WeakNSObject<NSObject> w2(w1); |
77 EXPECT_TRUE(w1); | 80 EXPECT_TRUE(w1); |
78 EXPECT_TRUE(w2); | 81 EXPECT_TRUE(w2); |
79 p1.reset(); | 82 p1.reset(); |
80 EXPECT_FALSE(w1); | 83 EXPECT_FALSE(w1); |
81 EXPECT_FALSE(w2); | 84 EXPECT_FALSE(w2); |
82 } | 85 } |
83 | 86 |
84 TEST(WeakNSObjectTest, WeakNSObjectAssignment) { | 87 TEST(WeakNSObjectTest, WeakNSObjectAssignment) { |
85 base::scoped_nsobject<NSObject> p1([[NSObject alloc] init]); | 88 scoped_nsobject<NSObject> p1([[NSObject alloc] init]); |
86 WeakNSObject<NSObject> w1(p1); | 89 WeakNSObject<NSObject> w1(p1); |
87 WeakNSObject<NSObject> w2; | 90 WeakNSObject<NSObject> w2; |
88 EXPECT_FALSE(w2); | 91 EXPECT_FALSE(w2); |
89 w2 = w1; | 92 w2 = w1; |
90 EXPECT_TRUE(w1); | 93 EXPECT_TRUE(w1); |
91 EXPECT_TRUE(w2); | 94 EXPECT_TRUE(w2); |
92 p1.reset(); | 95 p1.reset(); |
93 EXPECT_FALSE(w1); | 96 EXPECT_FALSE(w1); |
94 EXPECT_FALSE(w2); | 97 EXPECT_FALSE(w2); |
95 } | 98 } |
96 | 99 |
100 void TouchWeakData(const WeakNSObject<NSMutableData>& weak_data) { | |
stuartmorgan
2015/01/15 14:51:42
Please comment the utility methods.
| |
101 if (!weak_data) | |
102 return; | |
103 [weak_data increaseLengthBy:1]; | |
104 } | |
105 | |
106 void CopyWeakNSObjectAndPost(const WeakNSObject<NSMutableData>& weak_object, | |
107 scoped_refptr<SingleThreadTaskRunner> runner) { | |
108 WeakNSObject<NSMutableData> weak_copy(weak_object); | |
109 runner->PostTask(FROM_HERE, Bind(&TouchWeakData, weak_copy)); | |
110 } | |
111 | |
112 // Tests that the weak object can be copied on a different thread. | |
113 TEST(WeakNSObjectTest, WeakNSObjectCopyOnOtherThread) { | |
114 MessageLoop loop; | |
115 Thread other_thread("WeakNSObjectCopyOnOtherThread"); | |
116 other_thread.Start(); | |
117 | |
118 scoped_nsobject<NSMutableData> data([[NSMutableData alloc] init]); | |
119 WeakNSObject<NSMutableData> weak(data); | |
120 | |
121 scoped_refptr<SingleThreadTaskRunner> runner = loop.task_runner(); | |
122 other_thread.task_runner()->PostTask( | |
123 FROM_HERE, Bind(&CopyWeakNSObjectAndPost, weak, runner)); | |
124 other_thread.Stop(); | |
125 loop.RunUntilIdle(); | |
126 | |
127 EXPECT_EQ(1u, [data length]); | |
128 } | |
129 | |
97 } // namespace | 130 } // namespace |
131 } // namespace base | |
OLD | NEW |