diff options
author | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-29 06:04:47 +0000 |
---|---|---|
committer | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-29 06:04:47 +0000 |
commit | 7dee421c6babb91e637db6074774c8c6d0b67a56 (patch) | |
tree | 065996c45c0903a694b8ec01c3168c752a1f7474 /chrome/browser/process_singleton_linux_uitest.cc | |
parent | e001b82b7023f8b8a2dfec90e9615eb4bfdd374e (diff) | |
download | chromium_src-7dee421c6babb91e637db6074774c8c6d0b67a56.zip chromium_src-7dee421c6babb91e637db6074774c8c6d0b67a56.tar.gz chromium_src-7dee421c6babb91e637db6074774c8c6d0b67a56.tar.bz2 |
Linux: Adds ACKs to ProcessSingletonLinux.
Patch contributed by suzhe@google.com (http://codereview.chromium.org/155772)
BUG=http://crbug.com/12343
TEST=In one terminal, launch chrome and stop the process by pressing ctrl-z,
then launch chrome again in another terminal. The second chrome shall be started
in 5 seconds, and the first one shall be killed.
Review URL: http://codereview.chromium.org/159577
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@21943 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/process_singleton_linux_uitest.cc')
-rw-r--r-- | chrome/browser/process_singleton_linux_uitest.cc | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/chrome/browser/process_singleton_linux_uitest.cc b/chrome/browser/process_singleton_linux_uitest.cc new file mode 100644 index 0000000..63347a8 --- /dev/null +++ b/chrome/browser/process_singleton_linux_uitest.cc @@ -0,0 +1,98 @@ +// Copyright (c) 2009 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 "chrome/browser/process_singleton.h" + +#include <sys/types.h> +#include <sys/wait.h> +#include <signal.h> +#include <unistd.h> +#include <vector> +#include <string> + +#include "base/path_service.h" +#include "base/string_util.h" +#include "base/thread.h" +#include "chrome/browser/browser.h" +#include "chrome/browser/browser_process.h" +#include "chrome/common/chrome_constants.h" +#include "chrome/common/chrome_paths.h" +#include "chrome/test/ui/ui_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +class ProcessSingletonLinuxTest : public UITest { + protected: + // A helper method to call ProcessSingleton::NotifyOtherProcess(). + // |url| will be added to CommandLine for current process, so that it can be + // sent to browser process by ProcessSingleton::NotifyOtherProcess(). + void NotifyOtherProcess(const std::string& url, bool expect_result) { + FilePath user_data_dir; + PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); + + std::vector<std::string> old_argv = + CommandLine::ForCurrentProcess()->argv(); + std::vector<std::string> argv; + argv.push_back(old_argv[0]); + argv.push_back(url); + + CommandLine::Reset(); + CommandLine::Init(argv); + + ProcessSingleton process_singleton(user_data_dir); + + if (expect_result) + EXPECT_TRUE(process_singleton.NotifyOtherProcess()); + else + EXPECT_FALSE(process_singleton.NotifyOtherProcess()); + } +}; + +// Test if the socket file and symbol link created by ProcessSingletonLinux +// are valid. When running this test, the ProcessSingleton object is already +// initiated by UITest. So we just test against this existing object. +TEST_F(ProcessSingletonLinuxTest, CheckSocketFile) { + FilePath user_data_dir; + FilePath path; + PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); + + path = user_data_dir.Append(chrome::kSingletonSocketFilename); + + struct stat statbuf; + ASSERT_EQ(0, lstat(path.value().c_str(), &statbuf)); + ASSERT_TRUE(S_ISLNK(statbuf.st_mode)); + char buf[PATH_MAX + 1]; + ssize_t len = readlink(path.value().c_str(), buf, PATH_MAX); + ASSERT_GT(len, 0); + buf[len] = '\0'; + + path = user_data_dir.Append(buf); + ASSERT_EQ(0, lstat(path.value().c_str(), &statbuf)); + ASSERT_TRUE(S_ISSOCK(statbuf.st_mode)); +} + +// TODO(james.su@gmail.com): port following tests to Windows. +// Test success case of NotifyOtherProcess(). +TEST_F(ProcessSingletonLinuxTest, NotifyOtherProcessSuccess) { + std::string url("about:blank"); + int original_tab_count = GetTabCount(); + + NotifyOtherProcess(url, true); + EXPECT_EQ(original_tab_count + 1, GetTabCount()); + EXPECT_EQ(url, GetActiveTabURL().spec()); +} + +// Test failure case of NotifyOtherProcess(). +TEST_F(ProcessSingletonLinuxTest, NotifyOtherProcessFailure) { + // Block the browser process, then it'll be killed by + // ProcessSingleton::NotifyOtherProcess(). + kill(process(), SIGSTOP); + + std::string url("about:blank"); + NotifyOtherProcess(url, false); + + // Wait for a while to make sure the browser process is actually killed. + usleep(10000); + + EXPECT_FALSE(IsBrowserRunning()); +} |