/* * Win32FileLocktests.cpp * * Copyright (C) 2009-16 by RStudio, PBC * * Unless you have received this program directly from RStudio pursuant * to the terms of a commercial license agreement with RStudio, then * this program is licensed to you under the terms of version 3 of the * GNU Affero General Public License. This program is distributed WITHOUT * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. * */ #ifdef _WIN32 #include #include #include #include #define RSTUDIO_NO_TESTTHAT_ALIASES #include namespace rstudio { namespace core { namespace tests { namespace { FilePath tempLockFilePath() { std::string home = core::system::getenv("USERPROFILE"); return FilePath(home + "\\rstudio-lock-file"); } FilePath s_lockFilePath = tempLockFilePath(); } // end anonymous namespace TEST_CASE("File Locking") { SECTION("basic advisory file lock assumptions hold true") { Error error; // create lock file error = s_lockFilePath.ensureFile(); CHECK(error == Success()); // ensure file is not locked AdvisoryFileLock lock; CHECK(s_lockFilePath.exists()); CHECK_FALSE(lock.isLocked(s_lockFilePath)); // attempt to acquire that lock error = lock.acquire(s_lockFilePath); CHECK(error == Success()); // attempt to acquire lock with alternate object AdvisoryFileLock otherLock; error = otherLock.acquire(s_lockFilePath); CHECK_FALSE(error == Success()); // check that attempts to ascertain lockedness // don't incidentally release the lock CHECK(lock.isLocked(s_lockFilePath)); CHECK(otherLock.isLocked(s_lockFilePath)); // release lock error = lock.release(); CHECK(error == Success()); // ensure released CHECK_FALSE(lock.isLocked(s_lockFilePath)); // check that destructor releases lock { AdvisoryFileLock scopedLock; error = scopedLock.acquire(s_lockFilePath); CHECK(error == Success()); } CHECK_FALSE(lock.isLocked(s_lockFilePath)); // clean up file s_lockFilePath.removeIfExists(); } } } // end namespace tests } // end namespace core } // end namespace rstudio #endif // _WIN32