| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // This file declares the C++ side of PyAuto, the python interface to |
| // Chromium automation. It access Chromium's internals using Automation Proxy. |
| |
| #ifndef CHROME_TEST_PYAUTOLIB_PYAUTOLIB_H_ |
| #define CHROME_TEST_PYAUTOLIB_PYAUTOLIB_H_ |
| |
| #include "base/compiler_specific.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/test/test_timeouts.h" |
| #include "base/time/time.h" |
| #include "chrome/test/ui/ui_test.h" |
| #include "chrome/test/ui/ui_test_suite.h" |
| |
| #if defined(OS_MACOSX) |
| #include "base/mac/scoped_nsautorelease_pool.h" |
| #endif |
| |
| class AutomationProxy; |
| |
| // The C++ style guide forbids using default arguments but I'm taking the |
| // liberty of allowing it in this file. The sole purpose of this (and the |
| // .cc) is to support the python interface, and default args are allowed in |
| // python. Strictly adhering to the guide here would mean having to re-define |
| // all methods in python just for the sake of providing default args. This |
| // seems cumbersome and unwanted. |
| |
| // Test Suite for Pyauto tests. All one-time initializations go here. |
| class PyUITestSuiteBase : public UITestSuite { |
| public: |
| PyUITestSuiteBase(int argc, char** argv); |
| virtual ~PyUITestSuiteBase(); |
| |
| void InitializeWithPath(const base::FilePath& browser_dir); |
| |
| void SetCrSourceRoot(const base::FilePath& path); |
| |
| private: |
| #if defined(OS_MACOSX) |
| base::mac::ScopedNSAutoreleasePool pool_; |
| #endif |
| }; |
| |
| // The primary class that interfaces with Automation Proxy. |
| // This class is accessed from python using swig. |
| class PyUITestBase : public UITestBase { |
| public: |
| // Only public methods are accessible from swig. |
| |
| // Constructor. Lookup pyauto.py for doc on these args. |
| PyUITestBase(bool clear_profile, std::wstring homepage); |
| virtual ~PyUITestBase(); |
| |
| // Initialize the setup. Should be called before launching the browser. |
| // |browser_dir| is the path to dir containing chromium binaries. |
| void Initialize(const base::FilePath& browser_dir); |
| |
| void UseNamedChannelID(const std::string& named_channel_id) { |
| named_channel_id_ = named_channel_id; |
| launcher_.reset(CreateProxyLauncher()); |
| } |
| |
| virtual ProxyLauncher* CreateProxyLauncher() OVERRIDE; |
| |
| // SetUp,TearDown is redeclared as public to make it accessible from swig. |
| virtual void SetUp() OVERRIDE; |
| virtual void TearDown() OVERRIDE; |
| |
| // AutomationProxy methods |
| |
| // Meta-methods. Generic pattern of passing args and response as |
| // JSON dict to avoid future use of the SWIG interface and |
| // automation proxy additions. Returns response as JSON dict. |
| // Use -ve window_index for automation calls not targetted at a browser |
| // window. Example: Login call for chromeos. |
| std::string _SendJSONRequest(int window_index, |
| const std::string& request, |
| int timeout); |
| |
| // Sets a cookie value for a url. Returns true on success. |
| bool SetCookie(const GURL& cookie_url, const std::string& value, |
| int window_index = 0, int tab_index = 0); |
| // Gets a cookie value for the given url. |
| std::string GetCookie(const GURL& cookie_url, int window_index = 0, |
| int tab_index = 0); |
| |
| protected: |
| // Gets the automation proxy and checks that it exists. |
| virtual AutomationProxy* automation() const OVERRIDE; |
| |
| virtual void SetLaunchSwitches() OVERRIDE; |
| |
| private: |
| // Create JSON error responses. |
| void ErrorResponse(const std::string& error_string, |
| const std::string& request, |
| bool is_timeout, |
| std::string* response); |
| void RequestFailureResponse( |
| const std::string& request, |
| const base::TimeDelta& duration, |
| const base::TimeDelta& timeout, |
| std::string* response); |
| |
| // Enables PostTask to main thread. |
| // Should be shared across multiple instances of PyUITestBase so that this |
| // class is re-entrant and multiple instances can be created. |
| // This is necessary since python's unittest module creates instances of |
| // TestCase at load time itself. |
| static base::MessageLoop* GetSharedMessageLoop( |
| base::MessageLoop::Type msg_loop_type); |
| static base::MessageLoop* message_loop_; |
| |
| // Path to named channel id. |
| std::string named_channel_id_; |
| }; |
| |
| #endif // CHROME_TEST_PYAUTOLIB_PYAUTOLIB_H_ |