| /* | 
 |  *  Copyright 2009 The WebRTC Project Authors. All rights reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #include <string> | 
 |  | 
 | #include "webrtc/base/event.h" | 
 | #include "webrtc/base/filelock.h" | 
 | #include "webrtc/base/fileutils.h" | 
 | #include "webrtc/base/gunit.h" | 
 | #include "webrtc/base/pathutils.h" | 
 | #include "webrtc/base/scoped_ptr.h" | 
 | #include "webrtc/base/thread.h" | 
 | #include "webrtc/test/testsupport/gtest_disable.h" | 
 |  | 
 | namespace rtc { | 
 |  | 
 | const static std::string kLockFile = "TestLockFile"; | 
 | const static int kTimeoutMS = 5000; | 
 |  | 
 | class FileLockTest : public testing::Test, public Runnable { | 
 |  public: | 
 |   FileLockTest() : done_(false, false), thread_lock_failed_(false) { | 
 |   } | 
 |  | 
 |   virtual void Run(Thread* t) { | 
 |     scoped_ptr<FileLock> lock(FileLock::TryLock(temp_file_.pathname())); | 
 |     // The lock is already owned by the main thread of | 
 |     // this test, therefore the TryLock(...) call should fail. | 
 |     thread_lock_failed_ = lock.get() == NULL; | 
 |     done_.Set(); | 
 |   } | 
 |  | 
 |  protected: | 
 |   virtual void SetUp() { | 
 |     thread_lock_failed_ = false; | 
 |     Pathname temp_dir; | 
 |     Filesystem::GetAppTempFolder(&temp_dir); | 
 |     temp_file_.SetPathname(rtc::Filesystem::TempFilename(temp_dir, kLockFile)); | 
 |   } | 
 |  | 
 |   void LockOnThread() { | 
 |     locker_.Start(this); | 
 |     done_.Wait(kTimeoutMS); | 
 |   } | 
 |  | 
 |   Event done_; | 
 |   Thread locker_; | 
 |   bool thread_lock_failed_; | 
 |   Pathname temp_file_; | 
 | }; | 
 |  | 
 | TEST_F(FileLockTest, TestLockFileDeleted) { | 
 |   scoped_ptr<FileLock> lock(FileLock::TryLock(temp_file_.pathname())); | 
 |   EXPECT_TRUE(lock.get() != NULL); | 
 |   EXPECT_FALSE(Filesystem::IsAbsent(temp_file_.pathname())); | 
 |   lock->Unlock(); | 
 |   EXPECT_TRUE(Filesystem::IsAbsent(temp_file_.pathname())); | 
 | } | 
 |  | 
 | TEST_F(FileLockTest, TestLock) { | 
 |   scoped_ptr<FileLock> lock(FileLock::TryLock(temp_file_.pathname())); | 
 |   EXPECT_TRUE(lock.get() != NULL); | 
 | } | 
 |  | 
 | TEST_F(FileLockTest, TestLockX2) { | 
 |   scoped_ptr<FileLock> lock1(FileLock::TryLock(temp_file_.pathname())); | 
 |   EXPECT_TRUE(lock1.get() != NULL); | 
 |  | 
 |   scoped_ptr<FileLock> lock2(FileLock::TryLock(temp_file_.pathname())); | 
 |   EXPECT_TRUE(lock2.get() == NULL); | 
 | } | 
 |  | 
 | TEST_F(FileLockTest, TestThreadedLock) { | 
 |   scoped_ptr<FileLock> lock(FileLock::TryLock(temp_file_.pathname())); | 
 |   EXPECT_TRUE(lock.get() != NULL); | 
 |  | 
 |   LockOnThread(); | 
 |   EXPECT_TRUE(thread_lock_failed_); | 
 | } | 
 |  | 
 | }  // namespace rtc |