| // 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. |
| |
| #include "base/command_line.h" |
| #include "base/environment.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/common/env_vars.h" |
| #include "chrome/common/logging_chrome.h" |
| #include "chrome/common/url_constants.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| #include "content/public/browser/notification_service.h" |
| #include "content/public/browser/notification_types.h" |
| #include "content/public/browser/render_process_host.h" |
| #include "content/public/browser/web_contents.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "url/gurl.h" |
| |
| using content::RenderProcessHost; |
| |
| class ChromeLoggingTest : public testing::Test { |
| public: |
| // Stores the current value of the log file name environment |
| // variable and sets the variable to new_value. |
| void SaveEnvironmentVariable(std::string new_value) { |
| scoped_ptr<base::Environment> env(base::Environment::Create()); |
| if (!env->GetVar(env_vars::kLogFileName, &environment_filename_)) |
| environment_filename_ = ""; |
| |
| env->SetVar(env_vars::kLogFileName, new_value); |
| } |
| |
| // Restores the value of the log file nave environment variable |
| // previously saved by SaveEnvironmentVariable(). |
| void RestoreEnvironmentVariable() { |
| scoped_ptr<base::Environment> env(base::Environment::Create()); |
| env->SetVar(env_vars::kLogFileName, environment_filename_); |
| } |
| |
| private: |
| std::string environment_filename_; // Saves real environment value. |
| }; |
| |
| // Tests the log file name getter without an environment variable. |
| TEST_F(ChromeLoggingTest, LogFileName) { |
| SaveEnvironmentVariable(std::string()); |
| |
| base::FilePath filename = logging::GetLogFileName(); |
| ASSERT_NE(base::FilePath::StringType::npos, |
| filename.value().find(FILE_PATH_LITERAL("chrome_debug.log"))); |
| |
| RestoreEnvironmentVariable(); |
| } |
| |
| // Tests the log file name getter with an environment variable. |
| TEST_F(ChromeLoggingTest, EnvironmentLogFileName) { |
| SaveEnvironmentVariable("test value"); |
| |
| base::FilePath filename = logging::GetLogFileName(); |
| ASSERT_EQ(base::FilePath(FILE_PATH_LITERAL("test value")).value(), |
| filename.value()); |
| |
| RestoreEnvironmentVariable(); |
| } |
| |
| // Tests whether we correctly fail on browser crashes. |
| class RendererCrashTest : public InProcessBrowserTest, |
| public content::NotificationObserver{ |
| protected: |
| RendererCrashTest() : saw_crash_(false) {} |
| |
| virtual void Observe(int type, |
| const content::NotificationSource& source, |
| const content::NotificationDetails& details) OVERRIDE { |
| content::RenderProcessHost::RendererClosedDetails* process_details = |
| content::Details< |
| content::RenderProcessHost::RendererClosedDetails>( |
| details).ptr(); |
| base::TerminationStatus status = process_details->status; |
| if (status == base::TERMINATION_STATUS_PROCESS_CRASHED || |
| status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { |
| saw_crash_ = true; |
| base::MessageLoopForUI::current()->Quit(); |
| } |
| } |
| |
| bool saw_crash_; |
| content::NotificationRegistrar registrar_; |
| }; |
| |
| // Flaky, http://crbug.com/107226 . |
| IN_PROC_BROWSER_TEST_F(RendererCrashTest, DISABLED_Crash) { |
| registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, |
| content::NotificationService::AllSources()); |
| ui_test_utils::NavigateToURLWithDisposition( |
| browser(), GURL(content::kChromeUICrashURL), CURRENT_TAB, 0); |
| content::RunMessageLoop(); |
| ASSERT_TRUE(saw_crash_); |
| } |