OLD | NEW |
| (Empty) |
1 // Copyright 2014 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 "content/browser/devtools/embedded_worker_devtools_manager.h" | |
6 | |
7 #include "base/memory/scoped_ptr.h" | |
8 #include "base/message_loop/message_loop.h" | |
9 #include "base/run_loop.h" | |
10 #include "content/browser/browser_thread_impl.h" | |
11 #include "content/browser/devtools/devtools_agent_host_impl.h" | |
12 #include "content/browser/devtools/embedded_worker_devtools_agent_host.h" | |
13 #include "content/browser/shared_worker/shared_worker_instance.h" | |
14 #include "content/browser/shared_worker/worker_storage_partition.h" | |
15 #include "content/public/test/test_browser_context.h" | |
16 #include "testing/gtest/include/gtest/gtest.h" | |
17 | |
18 namespace content { | |
19 namespace { | |
20 | |
21 class TestDevToolsClientHost : public DevToolsAgentHostClient { | |
22 public: | |
23 TestDevToolsClientHost() {} | |
24 ~TestDevToolsClientHost() override {} | |
25 void DispatchProtocolMessage(DevToolsAgentHost* agent_host, | |
26 const std::string& message) override {} | |
27 void AgentHostClosed(DevToolsAgentHost* agent_host, bool replaced) override {} | |
28 | |
29 void InspectAgentHost(DevToolsAgentHost* agent_host) { | |
30 if (agent_host_.get()) | |
31 agent_host_->DetachClient(); | |
32 agent_host_ = agent_host; | |
33 if (agent_host_.get()) | |
34 agent_host_->AttachClient(this); | |
35 } | |
36 private: | |
37 scoped_refptr<DevToolsAgentHost> agent_host_; | |
38 DISALLOW_COPY_AND_ASSIGN(TestDevToolsClientHost); | |
39 }; | |
40 } | |
41 | |
42 class EmbeddedWorkerDevToolsManagerTest : public testing::Test { | |
43 public: | |
44 typedef EmbeddedWorkerDevToolsAgentHost::WorkerState WorkerState; | |
45 | |
46 EmbeddedWorkerDevToolsManagerTest() | |
47 : ui_thread_(BrowserThread::UI, &message_loop_), | |
48 browser_context_(new TestBrowserContext()), | |
49 partition_( | |
50 new WorkerStoragePartition(browser_context_->GetRequestContext(), | |
51 NULL, | |
52 NULL, | |
53 NULL, | |
54 NULL, | |
55 NULL, | |
56 NULL, | |
57 NULL)), | |
58 partition_id_(*partition_.get()) {} | |
59 | |
60 protected: | |
61 void SetUp() override { | |
62 manager_ = EmbeddedWorkerDevToolsManager::GetInstance(); | |
63 } | |
64 void TearDown() override { | |
65 EmbeddedWorkerDevToolsManager::GetInstance()->ResetForTesting(); | |
66 } | |
67 | |
68 void CheckWorkerState(int worker_process_id, | |
69 int worker_route_id, | |
70 WorkerState state) { | |
71 const EmbeddedWorkerDevToolsManager::WorkerId id(worker_process_id, | |
72 worker_route_id); | |
73 EmbeddedWorkerDevToolsManager::AgentHostMap::iterator it = | |
74 manager_->workers_.find(id); | |
75 EXPECT_TRUE(manager_->workers_.end() != it); | |
76 EXPECT_EQ(state, it->second->state_); | |
77 } | |
78 | |
79 void CheckWorkerNotExist(int worker_process_id, int worker_route_id) { | |
80 const EmbeddedWorkerDevToolsManager::WorkerId id(worker_process_id, | |
81 worker_route_id); | |
82 EXPECT_TRUE(manager_->workers_.end() == manager_->workers_.find(id)); | |
83 } | |
84 | |
85 void CheckWorkerCount(size_t size) { | |
86 EXPECT_EQ(size, manager_->workers_.size()); | |
87 } | |
88 | |
89 base::MessageLoopForIO message_loop_; | |
90 BrowserThreadImpl ui_thread_; | |
91 scoped_ptr<TestBrowserContext> browser_context_; | |
92 scoped_ptr<WorkerStoragePartition> partition_; | |
93 const WorkerStoragePartitionId partition_id_; | |
94 EmbeddedWorkerDevToolsManager* manager_; | |
95 }; | |
96 | |
97 TEST_F(EmbeddedWorkerDevToolsManagerTest, BasicTest) { | |
98 scoped_refptr<DevToolsAgentHostImpl> agent_host; | |
99 | |
100 SharedWorkerInstance instance1(GURL("http://example.com/w.js"), | |
101 base::string16(), | |
102 base::string16(), | |
103 blink::WebContentSecurityPolicyTypeReport, | |
104 browser_context_->GetResourceContext(), | |
105 partition_id_); | |
106 | |
107 agent_host = manager_->GetDevToolsAgentHostForWorker(1, 1); | |
108 EXPECT_FALSE(agent_host.get()); | |
109 | |
110 // Created -> Started -> Destroyed | |
111 CheckWorkerNotExist(1, 1); | |
112 manager_->SharedWorkerCreated(1, 1, instance1); | |
113 CheckWorkerState(1, 1, WorkerState::WORKER_UNINSPECTED); | |
114 manager_->WorkerReadyForInspection(1, 1); | |
115 CheckWorkerState(1, 1, WorkerState::WORKER_UNINSPECTED); | |
116 manager_->WorkerDestroyed(1, 1); | |
117 CheckWorkerNotExist(1, 1); | |
118 | |
119 // Created -> GetDevToolsAgentHost -> Started -> Destroyed | |
120 CheckWorkerNotExist(1, 2); | |
121 manager_->SharedWorkerCreated(1, 2, instance1); | |
122 CheckWorkerState(1, 2, WorkerState::WORKER_UNINSPECTED); | |
123 agent_host = manager_->GetDevToolsAgentHostForWorker(1, 2); | |
124 EXPECT_TRUE(agent_host.get()); | |
125 CheckWorkerState(1, 2, WorkerState::WORKER_UNINSPECTED); | |
126 EXPECT_EQ(agent_host.get(), manager_->GetDevToolsAgentHostForWorker(1, 2)); | |
127 manager_->WorkerReadyForInspection(1, 2); | |
128 CheckWorkerState(1, 2, WorkerState::WORKER_UNINSPECTED); | |
129 manager_->WorkerDestroyed(1, 2); | |
130 CheckWorkerState(1, 2, WorkerState::WORKER_TERMINATED); | |
131 agent_host = NULL; | |
132 CheckWorkerNotExist(1, 2); | |
133 | |
134 // Created -> Started -> GetDevToolsAgentHost -> Destroyed | |
135 CheckWorkerNotExist(1, 3); | |
136 manager_->SharedWorkerCreated(1, 3, instance1); | |
137 CheckWorkerState(1, 3, WorkerState::WORKER_UNINSPECTED); | |
138 manager_->WorkerReadyForInspection(1, 3); | |
139 CheckWorkerState(1, 3, WorkerState::WORKER_UNINSPECTED); | |
140 agent_host = manager_->GetDevToolsAgentHostForWorker(1, 3); | |
141 EXPECT_TRUE(agent_host.get()); | |
142 CheckWorkerState(1, 3, WorkerState::WORKER_UNINSPECTED); | |
143 manager_->WorkerDestroyed(1, 3); | |
144 CheckWorkerState(1, 3, WorkerState::WORKER_TERMINATED); | |
145 agent_host = NULL; | |
146 CheckWorkerNotExist(1, 3); | |
147 | |
148 // Created -> Destroyed | |
149 CheckWorkerNotExist(1, 4); | |
150 manager_->SharedWorkerCreated(1, 4, instance1); | |
151 CheckWorkerState(1, 4, WorkerState::WORKER_UNINSPECTED); | |
152 manager_->WorkerDestroyed(1, 4); | |
153 CheckWorkerNotExist(1, 4); | |
154 | |
155 // Created -> GetDevToolsAgentHost -> Destroyed | |
156 CheckWorkerNotExist(1, 5); | |
157 manager_->SharedWorkerCreated(1, 5, instance1); | |
158 CheckWorkerState(1, 5, WorkerState::WORKER_UNINSPECTED); | |
159 agent_host = manager_->GetDevToolsAgentHostForWorker(1, 5); | |
160 EXPECT_TRUE(agent_host.get()); | |
161 CheckWorkerState(1, 5, WorkerState::WORKER_UNINSPECTED); | |
162 manager_->WorkerDestroyed(1, 5); | |
163 CheckWorkerState(1, 5, WorkerState::WORKER_TERMINATED); | |
164 agent_host = NULL; | |
165 CheckWorkerNotExist(1, 5); | |
166 | |
167 // Created -> GetDevToolsAgentHost -> Free agent_host -> Destroyed | |
168 CheckWorkerNotExist(1, 6); | |
169 manager_->SharedWorkerCreated(1, 6, instance1); | |
170 CheckWorkerState(1, 6, WorkerState::WORKER_UNINSPECTED); | |
171 agent_host = manager_->GetDevToolsAgentHostForWorker(1, 6); | |
172 EXPECT_TRUE(agent_host.get()); | |
173 CheckWorkerState(1, 6, WorkerState::WORKER_UNINSPECTED); | |
174 agent_host = NULL; | |
175 manager_->WorkerDestroyed(1, 6); | |
176 CheckWorkerNotExist(1, 6); | |
177 } | |
178 | |
179 TEST_F(EmbeddedWorkerDevToolsManagerTest, AttachTest) { | |
180 scoped_refptr<DevToolsAgentHostImpl> agent_host1; | |
181 scoped_refptr<DevToolsAgentHostImpl> agent_host2; | |
182 | |
183 SharedWorkerInstance instance1(GURL("http://example.com/w1.js"), | |
184 base::string16(), | |
185 base::string16(), | |
186 blink::WebContentSecurityPolicyTypeReport, | |
187 browser_context_->GetResourceContext(), | |
188 partition_id_); | |
189 SharedWorkerInstance instance2(GURL("http://example.com/w2.js"), | |
190 base::string16(), | |
191 base::string16(), | |
192 blink::WebContentSecurityPolicyTypeReport, | |
193 browser_context_->GetResourceContext(), | |
194 partition_id_); | |
195 | |
196 // Created -> GetDevToolsAgentHost -> Register -> Started -> Destroyed | |
197 scoped_ptr<TestDevToolsClientHost> client_host1(new TestDevToolsClientHost()); | |
198 CheckWorkerNotExist(2, 1); | |
199 manager_->SharedWorkerCreated(2, 1, instance1); | |
200 CheckWorkerState(2, 1, WorkerState::WORKER_UNINSPECTED); | |
201 agent_host1 = manager_->GetDevToolsAgentHostForWorker(2, 1); | |
202 EXPECT_TRUE(agent_host1.get()); | |
203 CheckWorkerState(2, 1, WorkerState::WORKER_UNINSPECTED); | |
204 EXPECT_EQ(agent_host1.get(), manager_->GetDevToolsAgentHostForWorker(2, 1)); | |
205 client_host1->InspectAgentHost(agent_host1.get()); | |
206 CheckWorkerState(2, 1, WorkerState::WORKER_INSPECTED); | |
207 manager_->WorkerReadyForInspection(2, 1); | |
208 CheckWorkerState(2, 1, WorkerState::WORKER_INSPECTED); | |
209 manager_->WorkerDestroyed(2, 1); | |
210 CheckWorkerState(2, 1, WorkerState::WORKER_TERMINATED); | |
211 EXPECT_EQ(agent_host1.get(), manager_->GetDevToolsAgentHostForWorker(2, 1)); | |
212 | |
213 // Created -> Started -> GetDevToolsAgentHost -> Register -> Destroyed | |
214 scoped_ptr<TestDevToolsClientHost> client_host2(new TestDevToolsClientHost()); | |
215 manager_->SharedWorkerCreated(2, 2, instance2); | |
216 CheckWorkerState(2, 2, WorkerState::WORKER_UNINSPECTED); | |
217 manager_->WorkerReadyForInspection(2, 2); | |
218 CheckWorkerState(2, 2, WorkerState::WORKER_UNINSPECTED); | |
219 agent_host2 = manager_->GetDevToolsAgentHostForWorker(2, 2); | |
220 EXPECT_TRUE(agent_host2.get()); | |
221 EXPECT_NE(agent_host1.get(), agent_host2.get()); | |
222 EXPECT_EQ(agent_host2.get(), manager_->GetDevToolsAgentHostForWorker(2, 2)); | |
223 CheckWorkerState(2, 2, WorkerState::WORKER_UNINSPECTED); | |
224 client_host2->InspectAgentHost(agent_host2.get()); | |
225 CheckWorkerState(2, 2, WorkerState::WORKER_INSPECTED); | |
226 manager_->WorkerDestroyed(2, 2); | |
227 CheckWorkerState(2, 2, WorkerState::WORKER_TERMINATED); | |
228 EXPECT_EQ(agent_host2.get(), manager_->GetDevToolsAgentHostForWorker(2, 2)); | |
229 | |
230 // Re-created -> Started -> ClientHostClosing -> Destroyed | |
231 CheckWorkerState(2, 1, WorkerState::WORKER_TERMINATED); | |
232 manager_->SharedWorkerCreated(2, 3, instance1); | |
233 CheckWorkerNotExist(2, 1); | |
234 CheckWorkerState(2, 3, WorkerState::WORKER_PAUSED_FOR_REATTACH); | |
235 EXPECT_EQ(agent_host1.get(), manager_->GetDevToolsAgentHostForWorker(2, 3)); | |
236 manager_->WorkerReadyForInspection(2, 3); | |
237 CheckWorkerState(2, 3, WorkerState::WORKER_INSPECTED); | |
238 client_host1->InspectAgentHost(NULL); | |
239 manager_->WorkerDestroyed(2, 3); | |
240 CheckWorkerState(2, 3, WorkerState::WORKER_TERMINATED); | |
241 agent_host1 = NULL; | |
242 CheckWorkerNotExist(2, 3); | |
243 | |
244 // Re-created -> Destroyed | |
245 CheckWorkerState(2, 2, WorkerState::WORKER_TERMINATED); | |
246 manager_->SharedWorkerCreated(2, 4, instance2); | |
247 CheckWorkerNotExist(2, 2); | |
248 CheckWorkerState(2, 4, WorkerState::WORKER_PAUSED_FOR_REATTACH); | |
249 EXPECT_EQ(agent_host2.get(), manager_->GetDevToolsAgentHostForWorker(2, 4)); | |
250 manager_->WorkerDestroyed(2, 4); | |
251 CheckWorkerNotExist(2, 2); | |
252 CheckWorkerState(2, 4, WorkerState::WORKER_TERMINATED); | |
253 | |
254 // Re-created -> ClientHostClosing -> Destroyed | |
255 manager_->SharedWorkerCreated(2, 5, instance2); | |
256 CheckWorkerNotExist(2, 2); | |
257 CheckWorkerState(2, 5, WorkerState::WORKER_PAUSED_FOR_REATTACH); | |
258 EXPECT_EQ(agent_host2.get(), manager_->GetDevToolsAgentHostForWorker(2, 5)); | |
259 client_host2->InspectAgentHost(NULL); | |
260 CheckWorkerCount(1); | |
261 agent_host2 = NULL; | |
262 CheckWorkerCount(1); | |
263 manager_->WorkerDestroyed(2, 5); | |
264 CheckWorkerCount(0); | |
265 } | |
266 | |
267 TEST_F(EmbeddedWorkerDevToolsManagerTest, ReattachTest) { | |
268 SharedWorkerInstance instance(GURL("http://example.com/w3.js"), | |
269 base::string16(), | |
270 base::string16(), | |
271 blink::WebContentSecurityPolicyTypeReport, | |
272 browser_context_->GetResourceContext(), | |
273 partition_id_); | |
274 scoped_ptr<TestDevToolsClientHost> client_host(new TestDevToolsClientHost()); | |
275 // Created -> GetDevToolsAgentHost -> Register -> Destroyed | |
276 manager_->SharedWorkerCreated(3, 1, instance); | |
277 CheckWorkerState(3, 1, WorkerState::WORKER_UNINSPECTED); | |
278 scoped_refptr<DevToolsAgentHost> agent_host( | |
279 manager_->GetDevToolsAgentHostForWorker(3, 1)); | |
280 EXPECT_TRUE(agent_host.get()); | |
281 CheckWorkerState(3, 1, WorkerState::WORKER_UNINSPECTED); | |
282 client_host->InspectAgentHost(agent_host.get()); | |
283 CheckWorkerState(3, 1, WorkerState::WORKER_INSPECTED); | |
284 manager_->WorkerDestroyed(3, 1); | |
285 CheckWorkerState(3, 1, WorkerState::WORKER_TERMINATED); | |
286 // ClientHostClosing -> Re-created -> release agent_host -> Destroyed | |
287 client_host->InspectAgentHost(NULL); | |
288 CheckWorkerState(3, 1, WorkerState::WORKER_TERMINATED); | |
289 manager_->SharedWorkerCreated(3, 2, instance); | |
290 CheckWorkerState(3, 2, WorkerState::WORKER_UNINSPECTED); | |
291 agent_host = NULL; | |
292 CheckWorkerState(3, 2, WorkerState::WORKER_UNINSPECTED); | |
293 manager_->WorkerDestroyed(3, 2); | |
294 CheckWorkerNotExist(3, 2); | |
295 CheckWorkerCount(0); | |
296 } | |
297 | |
298 } // namespace content | |
OLD | NEW |