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