1// Copyright (c) 2012 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/public/test/test_launcher.h" 6 7#include "base/base_paths.h" 8#include "base/command_line.h" 9#include "base/debug/stack_trace.h" 10#include "base/i18n/icu_util.h" 11#include "base/logging.h" 12#include "base/path_service.h" 13#include "base/process/memory.h" 14#include "base/sys_info.h" 15#include "base/test/test_suite.h" 16#include "base/test/test_timeouts.h" 17#include "content/public/common/content_switches.h" 18#include "content/public/test/content_test_suite_base.h" 19#include "content/shell/app/shell_main_delegate.h" 20#include "content/shell/common/shell_switches.h" 21#include "media/base/media_switches.h" 22#include "testing/gtest/include/gtest/gtest.h" 23 24#if defined(OS_ANDROID) 25#include "base/message_loop/message_loop.h" 26#include "content/app/mojo/mojo_init.h" 27#include "content/common/url_schemes.h" 28#include "content/public/common/content_paths.h" 29#include "content/public/test/nested_message_pump_android.h" 30#include "content/shell/browser/shell_content_browser_client.h" 31#include "content/shell/common/shell_content_client.h" 32#include "ui/base/ui_base_paths.h" 33#endif 34 35namespace content { 36 37#if defined(OS_ANDROID) 38scoped_ptr<base::MessagePump> CreateMessagePumpForUI() { 39 return scoped_ptr<base::MessagePump>(new NestedMessagePumpAndroid()); 40}; 41#endif 42 43class ContentBrowserTestSuite : public ContentTestSuiteBase { 44 public: 45 ContentBrowserTestSuite(int argc, char** argv) 46 : ContentTestSuiteBase(argc, argv) { 47 } 48 virtual ~ContentBrowserTestSuite() { 49 } 50 51 protected: 52 virtual void Initialize() OVERRIDE { 53 54#if defined(OS_ANDROID) 55 base::i18n::AllowMultipleInitializeCallsForTesting(); 56 base::i18n::InitializeICU(); 57 58 // This needs to be done before base::TestSuite::Initialize() is called, 59 // as it also tries to set MessagePumpForUIFactory. 60 if (!base::MessageLoop::InitMessagePumpForUIFactory( 61 &CreateMessagePumpForUI)) 62 VLOG(0) << "MessagePumpForUIFactory already set, unable to override."; 63 64 // For all other platforms, we call ContentMain for browser tests which goes 65 // through the normal browser initialization paths. For Android, we must set 66 // things up manually. 67 content_client_.reset(new ShellContentClient); 68 browser_content_client_.reset(new ShellContentBrowserClient()); 69 SetContentClient(content_client_.get()); 70 SetBrowserClientForTesting(browser_content_client_.get()); 71 72 content::RegisterContentSchemes(false); 73 RegisterPathProvider(); 74 ui::RegisterPathProvider(); 75 RegisterInProcessThreads(); 76 77 InitializeMojo(); 78#endif 79 80 ContentTestSuiteBase::Initialize(); 81 } 82 83#if defined(OS_ANDROID) 84 scoped_ptr<ShellContentClient> content_client_; 85 scoped_ptr<ShellContentBrowserClient> browser_content_client_; 86#endif 87 88 DISALLOW_COPY_AND_ASSIGN(ContentBrowserTestSuite); 89}; 90 91class ContentTestLauncherDelegate : public TestLauncherDelegate { 92 public: 93 ContentTestLauncherDelegate() {} 94 virtual ~ContentTestLauncherDelegate() {} 95 96 virtual int RunTestSuite(int argc, char** argv) OVERRIDE { 97 return ContentBrowserTestSuite(argc, argv).Run(); 98 } 99 100 virtual bool AdjustChildProcessCommandLine( 101 CommandLine* command_line, const base::FilePath& temp_data_dir) OVERRIDE { 102 command_line->AppendSwitchPath(switches::kContentShellDataPath, 103 temp_data_dir); 104 command_line->AppendSwitch(switches::kUseFakeDeviceForMediaStream); 105 command_line->AppendSwitch(switches::kUseFakeUIForMediaStream); 106 return true; 107 } 108 109 protected: 110 virtual ContentMainDelegate* CreateContentMainDelegate() OVERRIDE { 111 return new ShellMainDelegate(); 112 } 113 114 private: 115 DISALLOW_COPY_AND_ASSIGN(ContentTestLauncherDelegate); 116}; 117 118} // namespace content 119 120int main(int argc, char** argv) { 121 int default_jobs = std::max(1, base::SysInfo::NumberOfProcessors() / 2); 122 content::ContentTestLauncherDelegate launcher_delegate; 123 return LaunchTests(&launcher_delegate, default_jobs, argc, argv); 124} 125