| Index: chrome/browser/importer/firefox_profile_lock_unittest.cc
|
| diff --git a/chrome/browser/importer/firefox_profile_lock_unittest.cc b/chrome/browser/importer/firefox_profile_lock_unittest.cc
|
| index 4345048032bb78dd43352cba04c9f56c1d644f6c..fc5c9117586a4f9938e2677e8453c7be1d784dd4 100644
|
| --- a/chrome/browser/importer/firefox_profile_lock_unittest.cc
|
| +++ b/chrome/browser/importer/firefox_profile_lock_unittest.cc
|
| @@ -8,8 +8,10 @@
|
| #include "base/path_service.h"
|
| #include "base/process_util.h"
|
| #include "base/string_util.h"
|
| +#include "build/build_config.h"
|
| #include "chrome/browser/importer/firefox_profile_lock.h"
|
| #include "chrome/common/chrome_paths.h"
|
| +#include "chrome/test/file_test_utils.h"
|
|
|
| class FirefoxProfileLockTest : public testing::Test {
|
| public:
|
| @@ -39,3 +41,90 @@ TEST_F(FirefoxProfileLockTest, LockTest) {
|
| lock1.Lock();
|
| ASSERT_TRUE(lock1.HasAcquired());
|
| }
|
| +
|
| +// Tests basic functionality and verifies that the lock file is deleted after
|
| +// use.
|
| +TEST_F(FirefoxProfileLockTest, ProfileLock) {
|
| + std::wstring test_path;
|
| + file_util::CreateNewTempDirectory(L"firefox_profile", &test_path);
|
| + FilePath lock_file_path = FilePath::FromWStringHack(test_path);
|
| + FileAutoDeleter deleter(lock_file_path);
|
| + lock_file_path = lock_file_path.Append(FirefoxProfileLock::kLockFileName);
|
| +
|
| + scoped_ptr<FirefoxProfileLock> lock;
|
| + EXPECT_EQ(static_cast<FirefoxProfileLock*>(NULL), lock.get());
|
| + EXPECT_FALSE(file_util::PathExists(lock_file_path));
|
| + lock.reset(new FirefoxProfileLock(test_path));
|
| + EXPECT_TRUE(lock->HasAcquired());
|
| + EXPECT_TRUE(file_util::PathExists(lock_file_path));
|
| + lock->Unlock();
|
| + EXPECT_FALSE(lock->HasAcquired());
|
| +
|
| + // In the posix code, we don't delete the file when releasing the lock.
|
| +#if !defined(OS_POSIX)
|
| + EXPECT_FALSE(file_util::PathExists(lock_file_path));
|
| +#endif // !defined(OS_POSIX)
|
| + lock->Lock();
|
| + EXPECT_TRUE(lock->HasAcquired());
|
| + EXPECT_TRUE(file_util::PathExists(lock_file_path));
|
| + lock->Lock();
|
| + EXPECT_TRUE(lock->HasAcquired());
|
| + lock->Unlock();
|
| + EXPECT_FALSE(lock->HasAcquired());
|
| + // In the posix code, we don't delete the file when releasing the lock.
|
| +#if !defined(OS_POSIX)
|
| + EXPECT_FALSE(file_util::PathExists(lock_file_path));
|
| +#endif // !defined(OS_POSIX)
|
| +}
|
| +
|
| +// If for some reason the lock file is left behind by the previous owner, we
|
| +// should still be able to lock it, at least in the Windows implementation.
|
| +TEST_F(FirefoxProfileLockTest, ProfileLockOrphaned) {
|
| + std::wstring test_path;
|
| + file_util::CreateNewTempDirectory(L"firefox_profile", &test_path);
|
| + FilePath lock_file_path = FilePath::FromWStringHack(test_path);
|
| + FileAutoDeleter deleter(lock_file_path);
|
| + lock_file_path = lock_file_path.Append(FirefoxProfileLock::kLockFileName);
|
| +
|
| + // Create the orphaned lock file.
|
| + FILE* lock_file = file_util::OpenFile(lock_file_path, "w");
|
| + ASSERT_TRUE(lock_file);
|
| + file_util::CloseFile(lock_file);
|
| + EXPECT_TRUE(file_util::PathExists(lock_file_path));
|
| +
|
| + scoped_ptr<FirefoxProfileLock> lock;
|
| + EXPECT_EQ(static_cast<FirefoxProfileLock*>(NULL), lock.get());
|
| + lock.reset(new FirefoxProfileLock(test_path));
|
| + EXPECT_TRUE(lock->HasAcquired());
|
| + lock->Unlock();
|
| + EXPECT_FALSE(lock->HasAcquired());
|
| +}
|
| +
|
| +// This is broken on POSIX since the same process is allowed to reacquire a
|
| +// lock.
|
| +#if !defined(OS_POSIX)
|
| +// Tests two locks contending for the same lock file.
|
| +TEST_F(FirefoxProfileLockTest, ProfileLockContention) {
|
| + std::wstring test_path;
|
| + file_util::CreateNewTempDirectory(L"firefox_profile", &test_path);
|
| + FileAutoDeleter deleter(FilePath::FromWStringHack(test_path));
|
| +
|
| + scoped_ptr<FirefoxProfileLock> lock1;
|
| + EXPECT_EQ(static_cast<FirefoxProfileLock*>(NULL), lock1.get());
|
| + lock1.reset(new FirefoxProfileLock(test_path));
|
| + EXPECT_TRUE(lock1->HasAcquired());
|
| +
|
| + scoped_ptr<FirefoxProfileLock> lock2;
|
| + EXPECT_EQ(static_cast<FirefoxProfileLock*>(NULL), lock2.get());
|
| + lock2.reset(new FirefoxProfileLock(test_path));
|
| + EXPECT_FALSE(lock2->HasAcquired());
|
| +
|
| + lock1->Unlock();
|
| + EXPECT_FALSE(lock1->HasAcquired());
|
| +
|
| + lock2->Lock();
|
| + EXPECT_TRUE(lock2->HasAcquired());
|
| + lock2->Unlock();
|
| + EXPECT_FALSE(lock2->HasAcquired());
|
| +}
|
| +#endif
|
|
|