| Index: chrome/browser/process_singleton_mac_unittest.cc
|
| diff --git a/chrome/browser/process_singleton_mac_unittest.cc b/chrome/browser/process_singleton_mac_unittest.cc
|
| deleted file mode 100644
|
| index b6a5b7b49bf3e55bcd87c130f28fd92eec2aa1d2..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/process_singleton_mac_unittest.cc
|
| +++ /dev/null
|
| @@ -1,161 +0,0 @@
|
| -// 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 <errno.h>
|
| -#include <fcntl.h>
|
| -#include <sys/file.h>
|
| -
|
| -#include "chrome/browser/process_singleton.h"
|
| -
|
| -#include "base/file_util.h"
|
| -#include "base/files/scoped_file.h"
|
| -#include "base/path_service.h"
|
| -#include "base/posix/eintr_wrapper.h"
|
| -#include "chrome/common/chrome_constants.h"
|
| -#include "chrome/common/chrome_paths.h"
|
| -#include "chrome/test/base/testing_profile.h"
|
| -#include "testing/platform_test.h"
|
| -
|
| -namespace {
|
| -
|
| -class ProcessSingletonMacTest : public PlatformTest {
|
| - public:
|
| - virtual void SetUp() {
|
| - PlatformTest::SetUp();
|
| -
|
| - // Put the lock in a temporary directory. Doesn't need to be a
|
| - // full profile to test this code.
|
| - ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
|
| - lock_path_ = temp_dir_.path().Append(chrome::kSingletonLockFilename);
|
| - }
|
| -
|
| - virtual void TearDown() {
|
| - PlatformTest::TearDown();
|
| -
|
| - // Verify that the lock was released.
|
| - EXPECT_FALSE(IsLocked());
|
| - }
|
| -
|
| - // Return |true| if the file exists and is locked. Forces a failure
|
| - // in the containing test in case of error condition.
|
| - bool IsLocked() {
|
| - base::ScopedFD fd(HANDLE_EINTR(open(lock_path_.value().c_str(), O_RDONLY)));
|
| - if (!fd.is_valid()) {
|
| - EXPECT_EQ(ENOENT, errno) << "Unexpected error opening lockfile.";
|
| - return false;
|
| - }
|
| -
|
| - int rc = HANDLE_EINTR(flock(fd.get(), LOCK_EX|LOCK_NB));
|
| -
|
| - // Got the lock, so it wasn't already locked. Close releases.
|
| - if (rc != -1)
|
| - return false;
|
| -
|
| - // Someone else has the lock.
|
| - if (errno == EWOULDBLOCK)
|
| - return true;
|
| -
|
| - EXPECT_EQ(EWOULDBLOCK, errno) << "Unexpected error acquiring lock.";
|
| - return false;
|
| - }
|
| -
|
| - base::ScopedTempDir temp_dir_;
|
| - base::FilePath lock_path_;
|
| -};
|
| -
|
| -// Test that the base case doesn't blow up.
|
| -TEST_F(ProcessSingletonMacTest, Basic) {
|
| - ProcessSingleton ps(temp_dir_.path(),
|
| - ProcessSingleton::NotificationCallback());
|
| - EXPECT_FALSE(IsLocked());
|
| - EXPECT_TRUE(ps.Create());
|
| - EXPECT_TRUE(IsLocked());
|
| - ps.Cleanup();
|
| - EXPECT_FALSE(IsLocked());
|
| -}
|
| -
|
| -// The destructor should release the lock.
|
| -TEST_F(ProcessSingletonMacTest, DestructorReleases) {
|
| - EXPECT_FALSE(IsLocked());
|
| - {
|
| - ProcessSingleton ps(temp_dir_.path(),
|
| - ProcessSingleton::NotificationCallback());
|
| - EXPECT_TRUE(ps.Create());
|
| - EXPECT_TRUE(IsLocked());
|
| - }
|
| - EXPECT_FALSE(IsLocked());
|
| -}
|
| -
|
| -// Multiple singletons should interlock appropriately.
|
| -TEST_F(ProcessSingletonMacTest, Interlock) {
|
| - ProcessSingleton ps1(temp_dir_.path(),
|
| - ProcessSingleton::NotificationCallback());
|
| - ProcessSingleton ps2(temp_dir_.path(),
|
| - ProcessSingleton::NotificationCallback());
|
| -
|
| - // Windows and Linux use a command-line flag to suppress this, but
|
| - // it is on a sub-process so the scope is contained. Rather than
|
| - // add additional API to process_singleton.h in an #ifdef, just tell
|
| - // the reader what to expect and move on.
|
| - LOG(ERROR) << "Expect two failures to obtain the lock.";
|
| -
|
| - // When |ps1| has the lock, |ps2| cannot get it.
|
| - EXPECT_FALSE(IsLocked());
|
| - EXPECT_TRUE(ps1.Create());
|
| - EXPECT_TRUE(IsLocked());
|
| - EXPECT_FALSE(ps2.Create());
|
| - ps1.Cleanup();
|
| -
|
| - // And when |ps2| has the lock, |ps1| cannot get it.
|
| - EXPECT_FALSE(IsLocked());
|
| - EXPECT_TRUE(ps2.Create());
|
| - EXPECT_TRUE(IsLocked());
|
| - EXPECT_FALSE(ps1.Create());
|
| - ps2.Cleanup();
|
| - EXPECT_FALSE(IsLocked());
|
| -}
|
| -
|
| -// Like |Interlock| test, but via |NotifyOtherProcessOrCreate()|.
|
| -TEST_F(ProcessSingletonMacTest, NotifyOtherProcessOrCreate) {
|
| - ProcessSingleton ps1(temp_dir_.path(),
|
| - ProcessSingleton::NotificationCallback());
|
| - ProcessSingleton ps2(temp_dir_.path(),
|
| - ProcessSingleton::NotificationCallback());
|
| -
|
| - // Windows and Linux use a command-line flag to suppress this, but
|
| - // it is on a sub-process so the scope is contained. Rather than
|
| - // add additional API to process_singleton.h in an #ifdef, just tell
|
| - // the reader what to expect and move on.
|
| - LOG(ERROR) << "Expect two failures to obtain the lock.";
|
| -
|
| - // When |ps1| has the lock, |ps2| cannot get it.
|
| - EXPECT_FALSE(IsLocked());
|
| - EXPECT_EQ(
|
| - ProcessSingleton::PROCESS_NONE,
|
| - ps1.NotifyOtherProcessOrCreate());
|
| - EXPECT_TRUE(IsLocked());
|
| - EXPECT_EQ(
|
| - ProcessSingleton::PROFILE_IN_USE,
|
| - ps2.NotifyOtherProcessOrCreate());
|
| - ps1.Cleanup();
|
| -
|
| - // And when |ps2| has the lock, |ps1| cannot get it.
|
| - EXPECT_FALSE(IsLocked());
|
| - EXPECT_EQ(
|
| - ProcessSingleton::PROCESS_NONE,
|
| - ps2.NotifyOtherProcessOrCreate());
|
| - EXPECT_TRUE(IsLocked());
|
| - EXPECT_EQ(
|
| - ProcessSingleton::PROFILE_IN_USE,
|
| - ps1.NotifyOtherProcessOrCreate());
|
| - ps2.Cleanup();
|
| - EXPECT_FALSE(IsLocked());
|
| -}
|
| -
|
| -// TODO(shess): Test that the lock is released when the process dies.
|
| -// DEATH_TEST? I don't know. If the code to communicate between
|
| -// browser processes is ever written, this all would need to be tested
|
| -// more like the other platforms, in which case it would be easy.
|
| -
|
| -} // namespace
|
|
|