15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef CONTENT_BROWSER_SERVICE_WORKER_EMBEDDED_WORKER_TEST_HELPER_H_ 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define CONTENT_BROWSER_SERVICE_WORKER_EMBEDDED_WORKER_TEST_HELPER_H_ 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector> 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/weak_ptr.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ipc/ipc_listener.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ipc/ipc_test_sink.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "url/gurl.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustruct EmbeddedWorkerMsg_StartWorker_Params; 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class GURL; 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content { 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class EmbeddedWorkerRegistry; 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class EmbeddedWorkerTestHelper; 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ServiceWorkerContextCore; 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass ServiceWorkerContextWrapper; 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)struct ServiceWorkerFetchRequest; 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// In-Process EmbeddedWorker test helper. 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Usage: create an instance of this class to test browser-side embedded worker 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// code without creating a child process. This class will create a 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// ServiceWorkerContextWrapper and ServiceWorkerContextCore for you. 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// By default this class just notifies back WorkerStarted and WorkerStopped 3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// for StartWorker and StopWorker requests. The default implementation 3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// also returns success for event messages (e.g. InstallEvent, FetchEvent). 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 38e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Alternatively consumers can subclass this helper and override On*() 39e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// methods to add their own logic/verification code. 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// See embedded_worker_instance_unittest.cc for example usages. 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class EmbeddedWorkerTestHelper : public IPC::Sender, 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public IPC::Listener { 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Initialize this helper for |context|, and enable this as an IPC 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // sender for |mock_render_process_id|. 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) explicit EmbeddedWorkerTestHelper(int mock_render_process_id); 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~EmbeddedWorkerTestHelper(); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Call this to simulate add/associate a process to a pattern. 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This also registers this sender for the process. 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SimulateAddProcessToPattern(const GURL& pattern, int process_id); 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // IPC::Sender implementation. 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool Send(IPC::Message* message) OVERRIDE; 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // IPC::Listener implementation. 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // IPC sink for EmbeddedWorker messages. 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC::TestSink* ipc_sink() { return &sink_; } 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Inner IPC sink for script context messages sent via EmbeddedWorker. 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC::TestSink* inner_ipc_sink() { return &inner_sink_; } 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ServiceWorkerContextCore* context(); 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ServiceWorkerContextWrapper* context_wrapper() { return wrapper_.get(); } 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void ShutdownContext(); 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int mock_render_process_id() const { return mock_render_process_id_;} 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Called when StartWorker, StopWorker and SendMessageToWorker message 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // is sent to the embedded worker. Override if necessary. By default 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // they verify given parameters and: 76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // - OnStartWorker calls SimulateWorkerStarted 77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // - OnStopWorker calls SimulateWorkerStoped 78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // - OnSendMessageToWorker calls the message's respective On*Event handler 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnStartWorker(int embedded_worker_id, 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 service_worker_version_id, 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const GURL& scope, 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GURL& script_url, 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool pause_after_download); 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void OnResumeAfterDownload(int embedded_worker_id); 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnStopWorker(int embedded_worker_id); 860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual bool OnMessageToWorker(int thread_id, 870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int embedded_worker_id, 880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const IPC::Message& message); 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // On*Event handlers. Called by the default implementation of 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // OnMessageToWorker when events are sent to the embedded 92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // worker. By default they just return success via 930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // SimulateSendReplyToBrowser. 94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual void OnActivateEvent(int embedded_worker_id, int request_id); 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnInstallEvent(int embedded_worker_id, 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int request_id, 97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int active_version_id); 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnFetchEvent(int embedded_worker_id, 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int request_id, 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ServiceWorkerFetchRequest& request); 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // These functions simulate sending an EmbeddedHostMsg message to the 1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // browser. 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void SimulatePausedAfterDownload(int embedded_worker_id); 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void SimulateWorkerReadyForInspection(int embedded_worker_id); 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SimulateWorkerScriptLoaded(int thread_id, int embedded_worker_id); 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SimulateWorkerStarted(int embedded_worker_id); 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SimulateWorkerStopped(int embedded_worker_id); 1090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void SimulateSend(IPC::Message* message); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EmbeddedWorkerRegistry* registry(); 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnStartWorkerStub(const EmbeddedWorkerMsg_StartWorker_Params& params); 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void OnResumeAfterDownloadStub(int embedded_worker_id); 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnStopWorkerStub(int embedded_worker_id); 1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void OnMessageToWorkerStub(int thread_id, 1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int embedded_worker_id, 1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const IPC::Message& message); 1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnActivateEventStub(int request_id); 1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnInstallEventStub(int request_id, int active_version_id); 1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void OnFetchEventStub(int request_id, 1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const ServiceWorkerFetchRequest& request); 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_refptr<ServiceWorkerContextWrapper> wrapper_; 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC::TestSink sink_; 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC::TestSink inner_sink_; 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int next_thread_id_; 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int mock_render_process_id_; 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Updated each time MessageToWorker message is received. 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int current_embedded_worker_id_; 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::WeakPtrFactory<EmbeddedWorkerTestHelper> weak_factory_; 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerTestHelper); 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace content 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // CONTENT_BROWSER_SERVICE_WORKER_EMBEDDED_WORKER_TEST_HELPER_H_ 144