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

Side by Side Diff: ppapi/proxy/plugin_var_tracker_unittest.cc

Issue 7578001: Unify var tracking between webkit and the proxy. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 4 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
« no previous file with comments | « ppapi/proxy/plugin_var_tracker.cc ('k') | ppapi/proxy/ppapi_proxy_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 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 "ipc/ipc_test_sink.h" 5 #include "ipc/ipc_test_sink.h"
6 #include "ppapi/proxy/plugin_var_tracker.h" 6 #include "ppapi/proxy/plugin_var_tracker.h"
7 #include "ppapi/proxy/ppapi_messages.h" 7 #include "ppapi/proxy/ppapi_messages.h"
8 #include "ppapi/proxy/ppapi_proxy_test.h" 8 #include "ppapi/proxy/ppapi_proxy_test.h"
9 9
10 namespace pp { 10 namespace pp {
11 namespace proxy { 11 namespace proxy {
12 12
13 namespace { 13 namespace {
14 14
15 PP_Var MakeObject(PluginVarTracker::VarID object_id) { 15 PP_Var MakeObject(int32 object_id) {
16 PP_Var ret; 16 PP_Var ret;
17 ret.type = PP_VARTYPE_OBJECT; 17 ret.type = PP_VARTYPE_OBJECT;
18 ret.value.as_id = object_id; 18 ret.value.as_id = object_id;
19 return ret; 19 return ret;
20 } 20 }
21 21
22 // Creates a PP_Var from the given string ID.
23 PP_Var MakeString(PluginVarTracker::VarID string_id) {
24 PP_Var ret;
25 ret.type = PP_VARTYPE_STRING;
26 ret.value.as_id = string_id;
27 return ret;
28 }
29
30 } // namespace 22 } // namespace
31 23
32 class PluginVarTrackerTest : public PluginProxyTest { 24 class PluginVarTrackerTest : public PluginProxyTest {
33 public: 25 public:
34 PluginVarTrackerTest() {} 26 PluginVarTrackerTest() {}
35 27
36 protected: 28 protected:
37 // Asserts that there is a unique "release object" IPC message in the test 29 // Asserts that there is a unique "release object" IPC message in the test
38 // sink. This will return the var ID from the message or -1 if none found. 30 // sink. This will return the var ID from the message or -1 if none found.
39 PluginVarTracker::VarID GetObjectIDForUniqueReleaseObject() { 31 int32 GetObjectIDForUniqueReleaseObject() {
40 const IPC::Message* release_msg = sink().GetUniqueMessageMatching( 32 const IPC::Message* release_msg = sink().GetUniqueMessageMatching(
41 PpapiHostMsg_PPBVar_ReleaseObject::ID); 33 PpapiHostMsg_PPBVar_ReleaseObject::ID);
42 if (!release_msg) 34 if (!release_msg)
43 return -1; 35 return -1;
44 36
45 Tuple1<int64> id; 37 Tuple1<int64> id;
46 PpapiHostMsg_PPBVar_ReleaseObject::Read(release_msg, &id); 38 PpapiHostMsg_PPBVar_ReleaseObject::Read(release_msg, &id);
47 return id.a; 39 return id.a;
48 } 40 }
49 }; 41 };
50 42
51 TEST_F(PluginVarTrackerTest, Strings) {
52 std::string str("Hello");
53 PluginVarTracker::VarID str_id1 = var_tracker().MakeString(str);
54 EXPECT_NE(0, str_id1);
55
56 PluginVarTracker::VarID str_id2 = var_tracker().MakeString(
57 str.c_str(), static_cast<uint32_t>(str.size()));
58 EXPECT_NE(0, str_id2);
59
60 // Make sure the strings come out the other end.
61 const std::string* result =
62 var_tracker().GetExistingString(MakeString(str_id1));
63 EXPECT_EQ(str, *result);
64 result = var_tracker().GetExistingString(MakeString(str_id2));
65 EXPECT_EQ(str, *result);
66 }
67
68 TEST_F(PluginVarTrackerTest, GetHostObject) { 43 TEST_F(PluginVarTrackerTest, GetHostObject) {
69 PP_Var host_object = MakeObject(12345); 44 PP_Var host_object = MakeObject(12345);
70 45
71 // Round-trip through the tracker to make sure the host object comes out the 46 // Round-trip through the tracker to make sure the host object comes out the
72 // other end. 47 // other end.
73 PP_Var plugin_object = var_tracker().ReceiveObjectPassRef( 48 PP_Var plugin_object = var_tracker().ReceiveObjectPassRef(
74 host_object, plugin_dispatcher()); 49 host_object, plugin_dispatcher());
75 PP_Var host_object2 = var_tracker().GetHostObject(plugin_object); 50 PP_Var host_object2 = var_tracker().GetHostObject(plugin_object);
76 EXPECT_EQ(PP_VARTYPE_OBJECT, host_object2.type); 51 EXPECT_EQ(PP_VARTYPE_OBJECT, host_object2.type);
77 EXPECT_EQ(host_object.value.as_id, host_object2.value.as_id); 52 EXPECT_EQ(host_object.value.as_id, host_object2.value.as_id);
78 53
79 var_tracker().Release(plugin_object); 54 var_tracker().ReleaseVar(plugin_object);
80 } 55 }
81 56
82 TEST_F(PluginVarTrackerTest, ReceiveObjectPassRef) { 57 TEST_F(PluginVarTrackerTest, ReceiveObjectPassRef) {
83 PP_Var host_object = MakeObject(12345); 58 PP_Var host_object = MakeObject(12345);
84 59
85 // Receive the object, we should have one ref and no messages. 60 // Receive the object, we should have one ref and no messages.
86 PP_Var plugin_object = var_tracker().ReceiveObjectPassRef( 61 PP_Var plugin_object = var_tracker().ReceiveObjectPassRef(
87 host_object, plugin_dispatcher()); 62 host_object, plugin_dispatcher());
88 EXPECT_EQ(0u, sink().message_count()); 63 EXPECT_EQ(0u, sink().message_count());
89 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_object)); 64 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_object));
90 EXPECT_EQ(0, 65 EXPECT_EQ(0,
91 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_object)); 66 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_object));
92 67
93 // Receive the same object again, we should get the same plugin ID out. 68 // Receive the same object again, we should get the same plugin ID out.
94 PP_Var plugin_object2 = var_tracker().ReceiveObjectPassRef( 69 PP_Var plugin_object2 = var_tracker().ReceiveObjectPassRef(
95 host_object, plugin_dispatcher()); 70 host_object, plugin_dispatcher());
96 EXPECT_EQ(plugin_object.value.as_id, plugin_object2.value.as_id); 71 EXPECT_EQ(plugin_object.value.as_id, plugin_object2.value.as_id);
97 EXPECT_EQ(2, var_tracker().GetRefCountForObject(plugin_object)); 72 EXPECT_EQ(2, var_tracker().GetRefCountForObject(plugin_object));
98 EXPECT_EQ(0, 73 EXPECT_EQ(0,
99 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_object)); 74 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_object));
100 75
101 // It should have sent one message to decerment the refcount in the host. 76 // It should have sent one message to decerment the refcount in the host.
102 // This is because it only maintains one host refcount for all references 77 // This is because it only maintains one host refcount for all references
103 // in the plugin, but the host just sent the second one. 78 // in the plugin, but the host just sent the second one.
104 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject()); 79 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject());
105 sink().ClearMessages(); 80 sink().ClearMessages();
106 81
107 // Release the object, one ref at a time. The second release should free 82 // Release the object, one ref at a time. The second release should free
108 // the tracking data and send a release message to the browser. 83 // the tracking data and send a release message to the browser.
109 var_tracker().Release(plugin_object); 84 var_tracker().ReleaseVar(plugin_object);
110 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_object)); 85 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_object));
111 var_tracker().Release(plugin_object); 86 var_tracker().ReleaseVar(plugin_object);
112 EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_object)); 87 EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_object));
113 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject()); 88 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject());
114 } 89 }
115 90
116 // Tests freeing objects that have both refcounts and "tracked with no ref". 91 // Tests freeing objects that have both refcounts and "tracked with no ref".
117 TEST_F(PluginVarTrackerTest, FreeTrackedAndReferencedObject) { 92 TEST_F(PluginVarTrackerTest, FreeTrackedAndReferencedObject) {
118 PP_Var host_object = MakeObject(12345); 93 PP_Var host_object = MakeObject(12345);
119 94
120 // Phase one: First receive via a "pass ref", then a tracked with no ref. 95 // Phase one: First receive via a "pass ref", then a tracked with no ref.
121 PP_Var plugin_var = var_tracker().ReceiveObjectPassRef( 96 PP_Var plugin_var = var_tracker().ReceiveObjectPassRef(
122 host_object, plugin_dispatcher()); 97 host_object, plugin_dispatcher());
123 PP_Var plugin_var2 = var_tracker().TrackObjectWithNoReference( 98 PP_Var plugin_var2 = var_tracker().TrackObjectWithNoReference(
124 host_object, plugin_dispatcher()); 99 host_object, plugin_dispatcher());
125 EXPECT_EQ(plugin_var.value.as_id, plugin_var2.value.as_id); 100 EXPECT_EQ(plugin_var.value.as_id, plugin_var2.value.as_id);
126 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_var)); 101 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_var));
127 EXPECT_EQ(1, 102 EXPECT_EQ(1,
128 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); 103 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var));
129 104
130 // Free via the refcount, this should release the object to the browser but 105 // Free via the refcount, this should release the object to the browser but
131 // maintain the tracked object. 106 // maintain the tracked object.
132 var_tracker().Release(plugin_var); 107 var_tracker().ReleaseVar(plugin_var);
133 EXPECT_EQ(0, var_tracker().GetRefCountForObject(plugin_var)); 108 EXPECT_EQ(0, var_tracker().GetRefCountForObject(plugin_var));
134 EXPECT_EQ(1u, sink().message_count()); 109 EXPECT_EQ(1u, sink().message_count());
135 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject()); 110 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject());
136 111
137 // Now free via the tracked object, this should free it. 112 // Now free via the tracked object, this should free it.
138 var_tracker().StopTrackingObjectWithNoReference(plugin_var); 113 var_tracker().StopTrackingObjectWithNoReference(plugin_var);
139 EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_var)); 114 EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_var));
140 115
141 // Phase two: Receive via a tracked, then get an addref. 116 // Phase two: Receive via a tracked, then get an addref.
142 sink().ClearMessages(); 117 sink().ClearMessages();
143 plugin_var = var_tracker().TrackObjectWithNoReference( 118 plugin_var = var_tracker().TrackObjectWithNoReference(
144 host_object, plugin_dispatcher()); 119 host_object, plugin_dispatcher());
145 plugin_var2 = var_tracker().ReceiveObjectPassRef( 120 plugin_var2 = var_tracker().ReceiveObjectPassRef(
146 host_object, plugin_dispatcher()); 121 host_object, plugin_dispatcher());
147 EXPECT_EQ(plugin_var.value.as_id, plugin_var2.value.as_id); 122 EXPECT_EQ(plugin_var.value.as_id, plugin_var2.value.as_id);
148 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_var)); 123 EXPECT_EQ(1, var_tracker().GetRefCountForObject(plugin_var));
149 EXPECT_EQ(1, 124 EXPECT_EQ(1,
150 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); 125 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var));
151 126
152 // Free via the tracked object, this should have no effect. 127 // Free via the tracked object, this should have no effect.
153 var_tracker().StopTrackingObjectWithNoReference(plugin_var); 128 var_tracker().StopTrackingObjectWithNoReference(plugin_var);
154 EXPECT_EQ(0, 129 EXPECT_EQ(0,
155 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); 130 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var));
156 EXPECT_EQ(0u, sink().message_count()); 131 EXPECT_EQ(0u, sink().message_count());
157 132
158 // Now free via the refcount, this should delete it. 133 // Now free via the refcount, this should delete it.
159 var_tracker().Release(plugin_var); 134 var_tracker().ReleaseVar(plugin_var);
160 EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_var)); 135 EXPECT_EQ(-1, var_tracker().GetRefCountForObject(plugin_var));
161 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject()); 136 EXPECT_EQ(host_object.value.as_id, GetObjectIDForUniqueReleaseObject());
162 } 137 }
163 138
164 TEST_F(PluginVarTrackerTest, RecursiveTrackWithNoRef) { 139 TEST_F(PluginVarTrackerTest, RecursiveTrackWithNoRef) {
165 PP_Var host_object = MakeObject(12345); 140 PP_Var host_object = MakeObject(12345);
166 141
167 // Receive a tracked object twice. 142 // Receive a tracked object twice.
168 PP_Var plugin_var = var_tracker().TrackObjectWithNoReference( 143 PP_Var plugin_var = var_tracker().TrackObjectWithNoReference(
169 host_object, plugin_dispatcher()); 144 host_object, plugin_dispatcher());
(...skipping 10 matching lines...) Expand all
180 var_tracker().StopTrackingObjectWithNoReference(plugin_var); 155 var_tracker().StopTrackingObjectWithNoReference(plugin_var);
181 EXPECT_EQ(1, 156 EXPECT_EQ(1,
182 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); 157 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var));
183 var_tracker().StopTrackingObjectWithNoReference(plugin_var); 158 var_tracker().StopTrackingObjectWithNoReference(plugin_var);
184 EXPECT_EQ(-1, 159 EXPECT_EQ(-1,
185 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var)); 160 var_tracker().GetTrackedWithNoReferenceCountForObject(plugin_var));
186 } 161 }
187 162
188 } // namespace proxy 163 } // namespace proxy
189 } // namespace pp 164 } // namespace pp
OLDNEW
« no previous file with comments | « ppapi/proxy/plugin_var_tracker.cc ('k') | ppapi/proxy/ppapi_proxy_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698