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 "chrome/test/base/chrome_test_suite.h"
6
7#if defined(OS_CHROMEOS)
8#include <stdio.h>
9#include <unistd.h>
10#endif
11
12#include "base/command_line.h"
13#include "base/memory/ref_counted.h"
14#include "base/path_service.h"
15#include "base/strings/utf_string_conversions.h"
16#include "chrome/browser/browser_process.h"
17#include "chrome/common/chrome_constants.h"
18#include "chrome/common/chrome_paths.h"
19#include "chrome/common/url_constants.h"
20#include "components/content_settings/core/common/content_settings_pattern.h"
21#include "content/public/test/test_launcher.h"
22#include "extensions/common/constants.h"
23#include "testing/gtest/include/gtest/gtest.h"
24
25#if defined(OS_ANDROID)
26#include "base/android/jni_android.h"
27#include "chrome/browser/android/chrome_jni_registrar.h"
28#include "net/android/net_jni_registrar.h"
29#include "ui/base/android/ui_base_jni_registrar.h"
30#include "ui/gfx/android/gfx_jni_registrar.h"
31#include "ui/gl/android/gl_jni_registrar.h"
32#endif
33
34#if defined(OS_CHROMEOS)
35#include "base/process/process_metrics.h"
36#include "chromeos/chromeos_paths.h"
37#endif
38
39#if defined(OS_MACOSX)
40#include "base/mac/bundle_locations.h"
41#include "base/mac/scoped_nsautorelease_pool.h"
42#if !defined(OS_IOS)
43#include "base/mac/mac_util.h"
44#include "chrome/browser/chrome_browser_application_mac.h"
45#endif  // !defined(OS_IOS)
46#endif
47
48#if !defined(OS_IOS)
49#include "media/base/media.h"
50#endif
51
52namespace {
53
54bool IsCrosPythonProcess() {
55#if defined(OS_CHROMEOS)
56  char buf[80];
57  int num_read = readlink(base::kProcSelfExe, buf, sizeof(buf) - 1);
58  if (num_read == -1)
59    return false;
60  buf[num_read] = 0;
61  const char kPythonPrefix[] = "/python";
62  return !strncmp(strrchr(buf, '/'), kPythonPrefix, sizeof(kPythonPrefix) - 1);
63#else
64  return false;
65#endif  // defined(OS_CHROMEOS)
66}
67
68}  // namespace
69
70ChromeTestSuite::ChromeTestSuite(int argc, char** argv)
71    : content::ContentTestSuiteBase(argc, argv) {
72}
73
74ChromeTestSuite::~ChromeTestSuite() {
75}
76
77void ChromeTestSuite::Initialize() {
78#if defined(OS_MACOSX)
79  base::mac::ScopedNSAutoreleasePool autorelease_pool;
80#if !defined(OS_IOS)
81  chrome_browser_application_mac::RegisterBrowserCrApp();
82#endif  // !defined(OS_IOS)
83#endif
84
85#if defined(OS_ANDROID)
86  // Register JNI bindings for android.
87  gfx::android::RegisterJni(base::android::AttachCurrentThread());
88  net::android::RegisterJni(base::android::AttachCurrentThread());
89  ui::android::RegisterJni(base::android::AttachCurrentThread());
90  ui::gl::android::RegisterJni(base::android::AttachCurrentThread());
91  chrome::android::RegisterJni(base::android::AttachCurrentThread());
92#endif
93
94  if (!browser_dir_.empty()) {
95    PathService::Override(base::DIR_EXE, browser_dir_);
96    PathService::Override(base::DIR_MODULE, browser_dir_);
97  }
98
99#if !defined(OS_IOS)
100  // Disable external libraries load if we are under python process in
101  // ChromeOS.  That means we are autotest and, if ASAN is used,
102  // external libraries load crashes.
103  if (!IsCrosPythonProcess())
104    media::InitializeMediaLibraryForTesting();
105#endif
106
107  // Initialize after overriding paths as some content paths depend on correct
108  // values for DIR_EXE and DIR_MODULE.
109  content::ContentTestSuiteBase::Initialize();
110
111  ContentSettingsPattern::SetNonWildcardDomainNonPortScheme(
112      extensions::kExtensionScheme);
113
114#if defined(OS_MACOSX) && !defined(OS_IOS)
115  // Look in the framework bundle for resources.
116  base::FilePath path;
117  PathService::Get(base::DIR_EXE, &path);
118  path = path.Append(chrome::kFrameworkName);
119  base::mac::SetOverrideFrameworkBundlePath(path);
120#endif
121}
122
123void ChromeTestSuite::Shutdown() {
124#if defined(OS_MACOSX) && !defined(OS_IOS)
125  base::mac::SetOverrideFrameworkBundle(NULL);
126#endif
127
128  content::ContentTestSuiteBase::Shutdown();
129}
130