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

Side by Side Diff: ppapi/shared_impl/proxy_lock_unittest.cc

Issue 19492014: PPAPI: Purposely leak ProxyLock, fix shutdown race (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Make the destructor lock [sometimes] Created 7 years, 5 months 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
OLDNEW
(Empty)
1 // Copyright (c) 2013 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 <string>
6
7 #include "base/bind.h"
8 #include "base/callback.h"
9 #include "base/compiler_specific.h"
10 #include "base/logging.h"
11 #include "base/memory/ref_counted.h"
12 #include "ppapi/shared_impl/proxy_lock.h"
13 #include "ppapi/shared_impl/test_globals.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 namespace ppapi {
17
18 namespace {
19
20 bool expect_to_be_locked = false;
21 void CheckLockState() {
22 if (expect_to_be_locked) {
23 ProxyLock::AssertAcquired();
24 } else {
25 // If we expect to be unlocked, try to lock. We rely on the checking inside
26 // base::Lock that prevents recursive locking.
27 ProxyAutoLock lock;
28 }
29 }
30
31 int called_num = 0;
32
33 class CheckLockStateInDestructor
34 : public base::RefCounted<CheckLockStateInDestructor> {
35 public:
36 CheckLockStateInDestructor() {}
37 void Method() {
38 ++called_num;
39 }
40 private:
41 friend class base::RefCounted<CheckLockStateInDestructor>;
42 ~CheckLockStateInDestructor() {
43 CheckLockState();
44 }
45 DISALLOW_COPY_AND_ASSIGN(CheckLockStateInDestructor);
46 };
47
48 void TestCallback_0() {
49 CheckLockState();
50 ++called_num;
51 }
52
53 void TestCallback_1(int p1) {
54 CheckLockState();
55 ++called_num;
56 }
57
58 void TestCallback_2(int p1, const std::string& p2) {
59 CheckLockState();
60 ++called_num;
61 }
62
63 struct Param {};
64 void TestCallback_3(int p1, const std::string& p2, Param p3) {
65 CheckLockState();
66 ++called_num;
67 }
68
69 } // namespace
70
71 TEST(PpapiProxyLockTest, Locking) {
72 TestGlobals globals;
73 base::Lock lock;
74 globals.set_proxy_lock(&lock);
75 expect_to_be_locked = true;
76
77 base::Callback<void()> cb0;
78 {
79 ProxyAutoLock lock;
80 cb0 = RunWhileLocked(base::Bind(TestCallback_0));
81 }
82 cb0.Run();
83 ASSERT_EQ(1, called_num);
84 called_num = 0;
85
86 {
87 ProxyAutoLock lock;
88 cb0 = RunWhileLocked(base::Bind(TestCallback_1, 123));
89 }
90 cb0.Run();
91 ASSERT_EQ(1, called_num);
92 called_num = 0;
93
94 {
95 ProxyAutoLock lock;
96 scoped_refptr<CheckLockStateInDestructor> object =
97 new CheckLockStateInDestructor();
98 cb0 = RunWhileLocked(
99 base::Bind(&CheckLockStateInDestructor::Method,
100 object));
101 // Note after this scope, the Callback owns the only reference.
102 }
103 cb0.Run();
104 ASSERT_EQ(1, called_num);
105 called_num = 0;
106
107 base::Callback<void(int)> cb1;
108 {
109 ProxyAutoLock lock;
110 cb1 = RunWhileLocked(base::Bind(TestCallback_1));
111 }
112 cb1.Run(123);
113 ASSERT_EQ(1, called_num);
114 called_num = 0;
115
116 base::Callback<void(int, const std::string&)> cb2;
117 {
118 ProxyAutoLock lock;
119 cb2 = RunWhileLocked(base::Bind(TestCallback_2));
120 }
121 cb2.Run(123, std::string("yo"));
122 ASSERT_EQ(1, called_num);
123 called_num = 0;
124
125 base::Callback<void(int, const std::string&, Param)> cb3;
126 {
127 ProxyAutoLock lock;
128 cb3 = RunWhileLocked(base::Bind(TestCallback_3));
129 }
130 cb3.Run(123, std::string("yo"), Param());
131 ASSERT_EQ(1, called_num);
132 called_num = 0;
133
134 base::Callback<void(const std::string&)> cb1_string;
135 {
136 ProxyAutoLock lock;
137 cb1_string = RunWhileLocked(base::Bind(TestCallback_2, 123));
138 }
139 cb1_string.Run(std::string("yo"));
140 ASSERT_EQ(1, called_num);
141 called_num = 0;
142
143 {
144 ProxyAutoLock lock;
145 cb0 = RunWhileLocked(base::Bind(TestCallback_2, 123, std::string("yo")));
146 }
147 cb0.Run();
148 ASSERT_EQ(1, called_num);
149 called_num = 0;
150 }
151
152 TEST(PpapiProxyLockTest, Unlocking) {
153 TestGlobals globals;
154 base::Lock lock;
155 globals.set_proxy_lock(&lock);
156 expect_to_be_locked = false;
157 // These calls should all try to _unlock_, so we must be locked before
158 // entering them.
159 ProxyAutoLock auto_lock;
160
161 {
162 CallWhileUnlocked(TestCallback_0);
163 ASSERT_EQ(1, called_num);
164 called_num = 0;
165 } {
166 CallWhileUnlocked(TestCallback_1, 123);
167 ASSERT_EQ(1, called_num);
168 called_num = 0;
169 } {
170 // TODO(dmichael): Make const-ref arguments work properly with type
171 // deduction.
172 CallWhileUnlocked<void, int, const std::string&>(
173 TestCallback_2, 123, std::string("yo"));
174 ASSERT_EQ(1, called_num);
175 called_num = 0;
176 } {
177 base::Callback<void()> callback(base::Bind(TestCallback_0));
178 CallWhileUnlocked(callback);
179 ASSERT_EQ(1, called_num);
180 called_num = 0;
181 }
182 }
183
184 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698