DECLARE_EXCEPTION_TYPE(Base, InvalidParameter)
};
+class FileLockerException {
+public:
+ DECLARE_EXCEPTION_TYPE(WA::Exception, Base)
+ DECLARE_EXCEPTION_TYPE(Base, LockFailed)
+};
+
} // namespace WebAuthn
{
if (lockFile.empty()) {
LogError("File name can not be empty.");
- ThrowMsg(FileLocker::Exception::LockFailed,
+ ThrowMsg(FileLockerException::LockFailed,
"File name can not be empty.");
}
m_lockFileFd = open(lockFile.c_str(), O_RDWR | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
if (m_lockFileFd == -1) {
LogError("Lock file cannot be opened " << lockFile);
- ThrowMsg(FileLocker::Exception::LockFailed,
+ ThrowMsg(FileLockerException::LockFailed,
"Lock file cannot be opened " << lockFile);
}
m_locked = false;
FileLocker::~FileLocker()
{
- try {
- Unlock();
- } catch (...) {
- LogError("~FileLocker() threw an exception");
- }
+ Unlock();
(void)close(m_lockFileFd);
}
m_locked = ret == 0;
int err = errno;
if (ret && err != EWOULDBLOCK)
- LogAndThrowWithErrno(err, FileLocker::Exception::LockFailed, "locking a file " << m_lockFile);
+ LogErrno("locking a file " << m_lockFile);
if (m_locked)
LogDebug("We have a lock on " << m_lockFile << " file.");
int ret;
while ((ret = flock(m_lockFileFd, LOCK_UN)) && (errno == EINTR));
if (ret)
- LogAndThrowErrno(FileLocker::Exception::UnlockFailed, "unlocking a file " << m_lockFile);
+ LogErrno("unlocking a file " << m_lockFile);
m_locked = false;
LogDebug("Lock released.");
class FileLocker
{
public:
- class Exception
- {
- public:
- DECLARE_EXCEPTION_TYPE(WA::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, LockFailed)
- DECLARE_EXCEPTION_TYPE(Base, UnlockFailed)
- };
-
FileLocker(const std::string &lockFile, bool blocking = false);
virtual ~FileLocker();
*/
#include <service-file-locker.h>
-#define LOCKER_PATH_PREFIX "/run/"
-inline constexpr auto FILE_LOCKER = LOCKER_PATH_PREFIX "webauthn.lock";
-
namespace WA {
-ServiceFileLocker::ServiceFileLocker(bool blocking) :
- FileLocker(FILE_LOCKER, blocking) {}
+ServiceFileLocker::ServiceFileLocker(const std::string &lockFile, bool blocking) :
+ FileLocker(lockFile, blocking) {}
} /* namespace WebAuthn */
#pragma once
#include <file-lock.h>
+#define LOCKER_PATH_PREFIX "/run/"
+inline constexpr auto FILE_LOCKER = LOCKER_PATH_PREFIX "webauthn.lock";
namespace WA {
class ServiceFileLocker: public FileLocker
{
public:
- explicit ServiceFileLocker(bool blocking = false);
+ explicit ServiceFileLocker(const std::string &lockFile,
+ bool blocking = false);
};
} /* namespace WebAuthn */
LogError("WA::ServiceException::InActive: " << e.DumpToString());
std::cerr << "WA::ServiceException::InActive: " << e.DumpToString() << std::endl;
return WAUTHN_ERROR_SOCKET;
+ } catch (const FileLockerException::LockFailed &e) {
+ LogError("WA::FileLockerException::LockFailed: " << e.DumpToString());
+ std::cerr << "WA::FileLockerException::LockFailed: " << e.DumpToString() << std::endl;
+ return WAUTHN_ERROR_INVALID_STATE;
} catch (const std::logic_error &e) {
LogError("Invalid logic: " << e.what());
std::cerr << "Invalid logic: " << e.what() << std::endl;
UNHANDLED_EXCEPTION_HANDLER_BEGIN
{
WA::Singleton<WA::WebAuthnLog>::Instance().SetTag(WEBAUTHN_LOG_TAG);
- WA::ServiceFileLocker serviceLock(true);
+ WA::ServiceFileLocker serviceLock(FILE_LOCKER, true);
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGTERM);
SET(UNIT_TESTS_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/unittests.cpp
${CMAKE_CURRENT_SOURCE_DIR}/webauthn-client-test.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/file-lock-test.cpp
${CMAKE_CURRENT_SOURCE_DIR}/serialization-test.cpp
)
--- /dev/null
+/*
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd. All rights reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ *
+ *
+ * @file dl-loader-test.cpp
+ * @version 1.0
+ * @brief unit tests for dl-loader
+ */
+
+#include <file-lock.h>
+#include <gtest/gtest.h>
+#include <iostream>
+
+namespace WA {
+
+class FileLockerTest : public ::testing::Test {
+protected:
+ void SetUp() override {
+ // Do initialization if needed.
+ }
+
+ void TearDown() override {
+ // Do deinitialization if needed.
+ }
+};
+
+TEST_F(FileLockerTest, lock_and_unlock_P)
+{
+ int ret = 0;
+ try{
+ FileLocker fileLocker("/tmp/.webauthn-test.lock", true);
+ EXPECT_EQ(fileLocker.Locked(), true);
+ fileLocker.Unlock();
+ EXPECT_EQ(fileLocker.Locked(), false);
+ } catch (...)
+ {
+ std::cout << "Error in FileLocker" << std::endl;
+ ret = -1;
+ }
+ EXPECT_EQ(ret, 0);
+}
+
+TEST_F(FileLockerTest, lock_after_unlock_P)
+{
+ int ret = 0;
+ try{
+ FileLocker fileLocker("/tmp/.webauthn-test.lock", true);
+ EXPECT_EQ(fileLocker.Locked(), true);
+ fileLocker.Unlock();
+ EXPECT_EQ(fileLocker.Locked(), false);
+ FileLocker fileLocker2("/tmp/.webauthn-test.lock", true);
+ EXPECT_EQ(fileLocker2.Locked(), true);
+ fileLocker2.Unlock();
+ EXPECT_EQ(fileLocker2.Locked(), false);
+ } catch (...)
+ {
+ std::cout << "Error in FileLocker" << std::endl;
+ ret = -1;
+ }
+ EXPECT_EQ(ret, 0);
+}
+
+TEST_F(FileLockerTest, lock_empty_path_N)
+{
+ int ret = 0;
+ try{
+ FileLocker fileLocker("", true);
+ } catch (FileLockerException::LockFailed &e)
+ {
+ ret = 1;
+ } catch (...)
+ {
+ std::cout << "Error in FileLocker" << std::endl;
+ ret = -1;
+ }
+ EXPECT_EQ(ret, 1);
+}
+
+TEST_F(FileLockerTest, lock_invalid_path_N)
+{
+ int ret = 0;
+ try{
+ FileLocker fileLocker("/invalidpath/webauthn-test.lock", true);
+ } catch (FileLockerException::LockFailed &e)
+ {
+ ret = 1;
+ } catch (...)
+ {
+ std::cout << "Error in FileLocker" << std::endl;
+ ret = -1;
+ }
+ EXPECT_EQ(ret, 1);
+}
+
+TEST_F(FileLockerTest, lock_to_locked_path_N)
+{
+ int ret = 0;
+ try{
+ FileLocker fileLocker("/tmp/.webauthn-test.lock", true);
+ FileLocker fileLocker2("/tmp/.webauthn-test.lock", false);
+ EXPECT_EQ(fileLocker.Locked(), true);
+ EXPECT_EQ(fileLocker2.Locked(), false);
+ fileLocker.Unlock();
+ EXPECT_EQ(fileLocker.Locked(), false);
+ } catch (FileLockerException::LockFailed &e)
+ {
+ ret = 1;
+ } catch (...)
+ {
+ std::cout << "Error in FileLocker" << std::endl;
+ ret = -1;
+ }
+ EXPECT_EQ(ret, 0);
+}
+
+} // namespace WebAuthn