Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / content / browser / devtools / embedded_worker_devtools_manager_unittest.cc
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