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