147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2009 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <string> 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/event.h" 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/filelock.h" 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/fileutils.h" 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/gunit.h" 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/pathutils.h" 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/scoped_ptr.h" 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/thread.h" 20a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.org#include "webrtc/test/testsupport/gtest_disable.h" 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst static std::string kLockFile = "TestLockFile"; 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst static int kTimeoutMS = 5000; 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass FileLockTest : public testing::Test, public Runnable { 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org FileLockTest() : done_(false, false), thread_lock_failed_(false) { 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void Run(Thread* t) { 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org scoped_ptr<FileLock> lock(FileLock::TryLock(temp_file_.pathname())); 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // The lock is already owned by the main thread of 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // this test, therefore the TryLock(...) call should fail. 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org thread_lock_failed_ = lock.get() == NULL; 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org done_.Set(); 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void SetUp() { 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org thread_lock_failed_ = false; 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Filesystem::GetAppTempFolder(&temp_dir_); 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org temp_file_ = Pathname(temp_dir_.pathname(), kLockFile); 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void LockOnThread() { 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org locker_.Start(this); 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org done_.Wait(kTimeoutMS); 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Event done_; 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Thread locker_; 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool thread_lock_failed_; 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Pathname temp_dir_; 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Pathname temp_file_; 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(FileLockTest, TestLockFileDeleted) { 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org scoped_ptr<FileLock> lock(FileLock::TryLock(temp_file_.pathname())); 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(lock.get() != NULL); 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(Filesystem::IsAbsent(temp_file_.pathname())); 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org lock->Unlock(); 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(Filesystem::IsAbsent(temp_file_.pathname())); 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(FileLockTest, TestLock) { 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org scoped_ptr<FileLock> lock(FileLock::TryLock(temp_file_.pathname())); 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(lock.get() != NULL); 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(FileLockTest, TestLockX2) { 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org scoped_ptr<FileLock> lock1(FileLock::TryLock(temp_file_.pathname())); 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(lock1.get() != NULL); 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org scoped_ptr<FileLock> lock2(FileLock::TryLock(temp_file_.pathname())); 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(lock2.get() == NULL); 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 80a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.orgTEST_F(FileLockTest, DISABLED_ON_MAC(TestThreadedLock)) { 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org scoped_ptr<FileLock> lock(FileLock::TryLock(temp_file_.pathname())); 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(lock.get() != NULL); 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LockOnThread(); 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(thread_lock_failed_); 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 89