Move update API benchmark tests to separate binary 24/322524/5
authorJakub Wlostowski <j.wlostowski@samsung.com>
Thu, 10 Apr 2025 10:14:01 +0000 (12:14 +0200)
committerJakub Wlostowski <j.wlostowski@samsung.com>
Thu, 17 Apr 2025 10:18:39 +0000 (12:18 +0200)
Some tests from test_ckm_logic.cpp can be deleted,
as they are duplicates from security-tests.

Change-Id: Ie52feb3326ead6105668970eb86fe42b615474c8

misc/CMakeLists.txt
misc/update_perf/CMakeLists.txt [new file with mode: 0644]
misc/update_perf/test_update_perf.cpp [new file with mode: 0644]
misc/update_perf/timer.h [new file with mode: 0644]
packaging/key-manager.spec
unit-tests/CMakeLists.txt
unit-tests/test_ckm_logic.cpp [deleted file]
unit-tests/timer.h [deleted file]

index 140e01497c7b053ad10358fe03c17b8e442052f1..bc9c46dac8622d1a709e07a9e08b669cd46d2410 100644 (file)
@@ -49,4 +49,5 @@ ADD_SUBDIRECTORY(ckm_db_tool)
 ADD_SUBDIRECTORY(ckm_initial_values)
 ADD_SUBDIRECTORY(encryption_scheme)
 ADD_SUBDIRECTORY(db_perf)
+ADD_SUBDIRECTORY(update_perf)
 ADD_SUBDIRECTORY(encryption_perf)
\ No newline at end of file
diff --git a/misc/update_perf/CMakeLists.txt b/misc/update_perf/CMakeLists.txt
new file mode 100644 (file)
index 0000000..47e26b5
--- /dev/null
@@ -0,0 +1,65 @@
+ADD_DEFINITIONS("-DBOOST_TEST_DYN_LINK")
+ADD_DEFINITIONS("-DMISC_DIR=\"${MISC_DIR}\"")
+
+SET(MANAGER_PATH ${PROJECT_SOURCE_DIR}/src/manager)
+
+INCLUDE_DIRECTORIES(SYSTEM ${KEY_MANAGER_DEP_INCLUDE_DIRS})
+
+INCLUDE_DIRECTORIES(
+    ${MANAGER_PATH}/dpl/db/include
+    ${MANAGER_PATH}/dpl/core/include
+    ${MANAGER_PATH}/dpl/log/include
+    ${MANAGER_PATH}/crypto
+    ${MANAGER_PATH}/main
+    ${MANAGER_PATH}/service
+    ${MANAGER_PATH}/common
+    ${PROJECT_SOURCE_DIR}/common
+    ${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+SET(UPDATE_PERF_SOURCES
+    ${CMAKE_CURRENT_SOURCE_DIR}/test_update_perf.cpp
+
+    ${PROJECT_SOURCE_DIR}/common/colour_log_formatter.cpp
+
+    ${MANAGER_PATH}/crypto/platform/decider.cpp
+    ${MANAGER_PATH}/crypto/sw-backend/internals.cpp
+    ${MANAGER_PATH}/crypto/sw-backend/obj.cpp
+    ${MANAGER_PATH}/crypto/sw-backend/store.cpp
+    ${MANAGER_PATH}/crypto/sw-backend/kbkdf.cpp
+    ${MANAGER_PATH}/crypto/sw-backend/ctx.cpp
+    ${MANAGER_PATH}/dpl/core/src/colors.cpp
+    ${MANAGER_PATH}/dpl/db/src/naive_synchronization_object.cpp
+    ${MANAGER_PATH}/dpl/db/src/sql_connection.cpp
+    ${MANAGER_PATH}/service/access-control.cpp
+    ${MANAGER_PATH}/service/certificate-config.cpp
+    ${MANAGER_PATH}/service/certificate-store.cpp
+    ${MANAGER_PATH}/service/ckm-logic.cpp
+    ${MANAGER_PATH}/service/crypto-logic.cpp
+    ${MANAGER_PATH}/service/db-crypto.cpp
+    ${MANAGER_PATH}/service/file-lock.cpp
+    ${MANAGER_PATH}/service/file-system.cpp
+    ${MANAGER_PATH}/service/for-each-file.cpp
+    ${MANAGER_PATH}/service/key-provider.cpp
+    ${MANAGER_PATH}/service/ss-migrate.cpp
+    ${MANAGER_PATH}/service/ss-crypto.cpp
+    ${MANAGER_PATH}/service/permission.cpp
+    ${SE_BACKEND_SOURCES}
+    ${TZ_BACKEND_SOURCES}
+)
+
+SET(TARGET_CKM_UPDATE_PERF "ckm_update_perf")
+
+ADD_EXECUTABLE(
+    ${TARGET_CKM_UPDATE_PERF}
+    ${UPDATE_PERF_SOURCES}
+)
+
+TARGET_LINK_LIBRARIES(
+    ${TARGET_CKM_UPDATE_PERF}
+    ${TARGET_KEY_MANAGER_COMMON}
+    ${KEY_MANAGER_DEP_LIBRARIES}
+    boost_unit_test_framework
+)
+
+INSTALL(TARGETS ${TARGET_CKM_UPDATE_PERF} DESTINATION bin)
diff --git a/misc/update_perf/test_update_perf.cpp b/misc/update_perf/test_update_perf.cpp
new file mode 100644 (file)
index 0000000..84d29d3
--- /dev/null
@@ -0,0 +1,292 @@
+/*
+ *  Copyright (c) 2025 Samsung Electronics Co., Ltd. All rights reserved
+ *
+ *  Contact: Dongsun Lee <ds73.lee@samsung.com>
+ *
+ *  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
+ */
+
+#define BOOST_TEST_MODULE KEY_MANAGER_UPDATE_PERF
+#include <boost/test/results_reporter.hpp>
+#include <boost/test/unit_test.hpp>
+#include <boost/test/unit_test_log.hpp>
+#include <fstream>
+
+#include <boost_macros_wrapper.h>
+#include <ckm-logic.h>
+#include <colour_log_formatter.h>
+#include <log-setup.h>
+#include <timer.h>
+#if defined TZ_BACKEND_ENABLED || defined SE_BACKEND_ENABLED
+#include <hal/hal-security-keys.h>
+#endif
+
+using namespace CKM;
+
+namespace {
+
+struct TestConfig {
+       TestConfig()
+       {
+#if defined TZ_BACKEND_ENABLED || defined SE_BACKEND_ENABLED
+               if (hal_security_keys_get_backend())
+                       LogError("Can't get Security Keys backend");
+#endif
+               boost::unit_test::unit_test_log.set_threshold_level(
+                       boost::unit_test::log_test_units);
+               boost::unit_test::results_reporter::set_level(boost::unit_test::SHORT_REPORT);
+               boost::unit_test::unit_test_log.set_formatter(new colour_log_formatter);
+       }
+
+       ~TestConfig()
+       {
+#if defined TZ_BACKEND_ENABLED || defined SE_BACKEND_ENABLED
+               hal_security_keys_put_backend();
+#endif
+       }
+};
+
+struct LogSetup {
+       LogSetup()
+       {
+               SetupClientLogSystem();
+               Singleton<Log::LogSystem>::Instance().SetTag("CKM_UPDATE_PERF_TESTS");
+       }
+
+       ~LogSetup() {}
+};
+
+ClientId generateOwner(const size_t id)
+{
+       std::stringstream ss;
+       ss << "OWNER_" << id;
+       return ss.str();
+}
+
+PKCS12ShPtr readPKCS12(const std::string &path)
+{
+       std::ifstream is(path);
+       BOOST_REQUIRE(is);
+
+       std::istreambuf_iterator<char> begin(is), end;
+       RawBuffer pkcsBuffer(begin, end);
+       const auto pkcs = PKCS12::create(pkcsBuffer, Password());
+       BOOST_REQUIRE(pkcs);
+       BOOST_REQUIRE(!pkcs->empty());
+
+       return pkcs;
+}
+
+int getRetCodeSaveData(RawBuffer&& response)
+{
+       MessageBuffer message;
+       message.Push(std::move(response));
+       int msgId = 0, retCode = 0;
+       DataType dataType;
+       message.Deserialize(msgId, retCode, dataType);
+       return retCode;
+}
+
+int getRetCodeSavePKCS12(RawBuffer&& response)
+{
+       MessageBuffer message;
+       message.Push(std::move(response));
+       int msgId = 0, retCode = 0;
+       message.Deserialize(msgId, retCode);
+       return retCode;
+}
+
+int getRetCodeRemoveData(RawBuffer&& response)
+{
+       return getRetCodeSavePKCS12(std::move(response));
+}
+
+const Name NAME = "NAME";
+constexpr uid_t CLIENT_UID = 5001;
+const Password PASSWORD = "";
+const Policy OVERWRITABLE_POLICY(PASSWORD, false, PolicyBackend::DEFAULT, true);
+const Policy NON_OVERWRITABLE_POLICY(PASSWORD, false, PolicyBackend::DEFAULT, false);
+
+int messageId = 0;
+
+const DataType DATA_TYPE = DataType::Type::BINARY_DATA;
+constexpr unsigned char DATA[] = { "DATA" };
+const RawBuffer RAW_DATA( DATA, DATA + strlen((char*)DATA) );
+
+const auto pkcs = readPKCS12(MISC_DIR "/encryption-scheme.p12");
+
+class CKMLogicFixture
+{
+public:
+       CKMLogicFixture()
+       {
+               logic.unlockUserKey(CLIENT_UID, PASSWORD);
+       }
+
+       ~CKMLogicFixture()
+       {
+               try {
+                       logic.lockUserKey(CLIENT_UID);
+               } catch (...) {
+                       std::cerr << "Unexpected exception in CKMLogic::lockUserKey\n";
+               }
+       }
+
+       CKMLogic logic{};
+};
+
+void generateData(CKMLogic& logic, const size_t dataCount, const size_t pkcs12Count)
+{
+       for (size_t i = 0; i < dataCount; ++i)
+       {
+               const auto clientId = generateOwner(i);
+               auto response = logic.saveData(Credentials(CLIENT_UID, clientId), ++messageId, NAME,
+                                                                          clientId, Crypto::Data(DATA_TYPE, RAW_DATA),
+                                                                          PolicySerializable(OVERWRITABLE_POLICY));
+               BOOST_REQUIRE(getRetCodeSaveData(std::move(response)) == CKM_API_SUCCESS);
+       }
+
+       for (size_t i = dataCount; i < dataCount + pkcs12Count; ++i)
+       {
+               const auto clientId = generateOwner(i);
+               auto response = logic.savePKCS12(Credentials(CLIENT_UID, clientId), ++messageId, NAME,
+                                                                                clientId, PKCS12Serializable(*pkcs.get()),
+                                                                                PolicySerializable(OVERWRITABLE_POLICY),
+                                                                                PolicySerializable(OVERWRITABLE_POLICY));
+               BOOST_REQUIRE(getRetCodeSavePKCS12(std::move(response)) == CKM_API_SUCCESS);
+       }
+}
+
+void removeGeneratedData(CKMLogic& logic, const size_t dataCount, const size_t pkcs12Count)
+{
+       for (size_t i = 0; i < dataCount + pkcs12Count; ++i)
+       {
+               const auto clientId = generateOwner(i);
+               auto response = logic.removeData(Credentials(CLIENT_UID, clientId), ++messageId,
+                                                                                NAME, clientId);
+               BOOST_REQUIRE(getRetCodeRemoveData(std::move(response)) == CKM_API_SUCCESS);
+       }
+}
+
+double measureSaveApi(
+       CKMLogic& logic,
+       const size_t dataCount,
+       const bool isPKCS12,
+       const Policy &policy,
+       bool isNeedToRemove)
+{
+       if (dataCount == 0) return 0;
+
+       size_t averageSaveApiTime = 0;
+
+       for (size_t i = 0; i < dataCount; ++i)
+       {
+               const auto clientId = generateOwner(i);
+               Credentials credentials(CLIENT_UID, clientId);
+
+               if (isNeedToRemove)
+               {
+                       auto [response, time] = measure(&CKMLogic::removeData, logic,
+                                                                                       credentials, ++messageId, NAME, clientId);
+                       BOOST_REQUIRE(getRetCodeRemoveData(std::move(response)) == CKM_API_SUCCESS);
+                       averageSaveApiTime += time;
+               }
+
+               if (isPKCS12)
+               {
+                       auto [response, time] = measure(&CKMLogic::savePKCS12, logic, credentials,
+                                                                                       ++messageId, NAME, clientId,
+                                                                                       PKCS12Serializable(*pkcs.get()),
+                                                                                       PolicySerializable(policy),
+                                                                                       PolicySerializable(policy));
+                       BOOST_REQUIRE(getRetCodeSavePKCS12(std::move(response)) == CKM_API_SUCCESS);
+                       averageSaveApiTime += time;
+               }
+               else
+               {
+                       auto [response, time] = measure(&CKMLogic::saveData, logic,
+                                                                                       credentials, ++messageId, NAME, clientId,
+                                                                                       Crypto::Data(DATA_TYPE, RAW_DATA),
+                                                                                       PolicySerializable(policy));
+                       BOOST_REQUIRE(getRetCodeSaveData(std::move(response)) == CKM_API_SUCCESS);
+                       averageSaveApiTime += time;
+               }
+       }
+
+       return averageSaveApiTime / (double)dataCount;
+}
+
+void printTime(const size_t dataCount, const size_t pkcs12Count,
+                          const int64_t averageSaveApiTime, const int64_t averageUpdateApiTime)
+{
+       std::cout << "data=" << dataCount << " pkcs12=" << pkcs12Count << "\n"
+               << "remove + save: " << averageSaveApiTime << "ms\n"
+               << "update: " << averageUpdateApiTime << "ms\n" << std::endl;
+}
+
+void doBenchmark(CKMLogic& logic, const size_t dataCount,
+                                const size_t pkcs12Count, const bool isPKCS12)
+{
+       generateData(logic, dataCount, pkcs12Count);
+       const auto averageSaveTime = measureSaveApi(logic, dataCount + pkcs12Count,
+                                                                                               isPKCS12, NON_OVERWRITABLE_POLICY, true);
+       removeGeneratedData(logic, dataCount, pkcs12Count);
+
+       generateData(logic, dataCount, pkcs12Count);
+       const auto averageUpdateTime = measureSaveApi(logic, dataCount + pkcs12Count,
+                                                                                                 isPKCS12, OVERWRITABLE_POLICY, false);
+       removeGeneratedData(logic, dataCount, pkcs12Count);
+
+       printTime(dataCount, pkcs12Count, averageSaveTime, averageUpdateTime);
+}
+
+} // namespace
+
+BOOST_GLOBAL_FIXTURE(TestConfig);
+BOOST_GLOBAL_FIXTURE(LogSetup);
+
+BOOST_FIXTURE_TEST_SUITE(UPDATE_API_BENCHMARKS, CKMLogicFixture)
+
+POSITIVE_TEST_CASE(UpdateDataWithData)
+{
+       doBenchmark(logic, 1, 0, false);
+       doBenchmark(logic, 10, 0, false);
+       doBenchmark(logic, 50, 0, false);
+       doBenchmark(logic, 100, 0, false);
+}
+
+POSITIVE_TEST_CASE(UpdatePKCS12WithData)
+{
+       doBenchmark(logic, 0, 1, false);
+       doBenchmark(logic, 0, 10, false);
+       doBenchmark(logic, 0, 50, false);
+       doBenchmark(logic, 0, 100, false);
+}
+
+POSITIVE_TEST_CASE(UpdateDataAndPKCS12WithData)
+{
+       doBenchmark(logic, 1, 1, false);
+       doBenchmark(logic, 10, 10, false);
+       doBenchmark(logic, 50, 50, false);
+       doBenchmark(logic, 100, 100, false);
+}
+
+POSITIVE_TEST_CASE(UpdateDataAndPKCS12WithPKCS12)
+{
+       doBenchmark(logic, 1, 1, true);
+       doBenchmark(logic, 10, 10, true);
+       doBenchmark(logic, 50, 50, true);
+       doBenchmark(logic, 100, 100, true);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/misc/update_perf/timer.h b/misc/update_perf/timer.h
new file mode 100644 (file)
index 0000000..e61dd57
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ *  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        timer.h
+ * @author      Andrei Vakulich (a.vakulich@samsung.com)
+ * @version
+ * @brief
+ */
+
+#pragma once
+
+#include <cassert>
+#include <chrono>
+#include <functional>
+
+namespace CKM {
+
+class Timer {
+public:
+       Timer() = default;
+
+       void start() {
+               assert(m_state != State::Started);
+               m_state = State::Started;
+               m_start = std::chrono::high_resolution_clock::now();
+       }
+
+       void stop() {
+               assert(m_state == State::Started);
+               m_state = State::Stopped;
+               m_finish = std::chrono::high_resolution_clock::now();
+       }
+
+       auto elapsedMs() {
+               assert(m_state == State::Stopped);
+               const auto elps = m_finish - m_start;
+               const auto msec = std::chrono::duration_cast<std::chrono::milliseconds>(elps);
+               return msec.count();
+       }
+
+private:
+       enum class State : std::uint8_t {
+               Cold = 0,
+               Started,
+               Stopped
+       };
+       State m_state = State::Cold;
+
+       std::chrono::high_resolution_clock::time_point m_start, m_finish;
+};
+
+template <typename T, typename... Args>
+auto measure(T callable, Args&&... args) {
+       Timer timer;
+       timer.start();
+       const auto result = std::invoke(callable, std::forward<Args>(args)...);
+       timer.stop();
+       return std::pair{ result, timer.elapsedMs() };
+}
+
+}
index 784bf245fafc0c7f19f7a769dbd6fbe852a6070a..27af156d91f7ce5a3668c800a354b1d341daff6e 100644 (file)
@@ -395,6 +395,7 @@ fi
 %{bin_dir}/ckm_generate_db
 %{bin_dir}/ckm_db_perf
 %{bin_dir}/ckm_enc_perf
+%{bin_dir}/ckm_update_perf
 %misc_dir
 
 %endif
index bea207aad9fde2a0c345cb2d1b3e413f08f1b926..9050da2ad69ef4291ad8b6f1e79e70c285d40db5 100644 (file)
@@ -31,7 +31,6 @@ SET(PKCS12_TEST_DIR ${UNIT_TESTS_DIR}/pkcs12/)
 ADD_DEFINITIONS("-DDB_TEST_DIR=\"${DB_TEST_DIR}\"")
 ADD_DEFINITIONS("-DSS_TEST_DIR=\"${SS_TEST_DIR}\"")
 ADD_DEFINITIONS("-DPKCS12_TEST_DIR=\"${PKCS12_TEST_DIR}\"")
-ADD_DEFINITIONS("-DMISC_DIR=\"${MISC_DIR}\"")
 
 ADD_DEFINITIONS("-DBOOST_TEST_DYN_LINK")
 ADD_DEFINITIONS("-DOVERRIDE_SOCKET_TIMEOUT=10")
@@ -44,7 +43,6 @@ INCLUDE_DIRECTORIES(SYSTEM ${KEY_MANAGER_DEP_INCLUDE_DIRS})
 
 INCLUDE_DIRECTORIES(
     ${MANAGER_PATH}/dpl/db/include
-    ${MANAGER_PATH}/dpl/db/include/dpl/db
     ${MANAGER_PATH}/dpl/core/include
     ${MANAGER_PATH}/dpl/log/include
     ${MANAGER_PATH}/service
@@ -97,7 +95,6 @@ SET(UNIT_TESTS_SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/test_sw-backend.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/test_xml-parser.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/test_xml-utils.cpp
-    ${CMAKE_CURRENT_SOURCE_DIR}/test_ckm_logic.cpp
 
     ${MANAGER_PATH}/client/client-common.cpp
     ${MANAGER_PATH}/client-async/descriptor-set.cpp
@@ -143,13 +140,6 @@ SET(UNIT_TESTS_SOURCES
     ${MANAGER_PATH}/service/key-provider.cpp
     ${MANAGER_PATH}/service/ss-crypto.cpp
     ${MANAGER_PATH}/service/access-control.cpp
-    ${MANAGER_PATH}/service/certificate-config.cpp
-    ${MANAGER_PATH}/service/certificate-store.cpp
-    ${MANAGER_PATH}/service/ckm-logic.cpp
-    ${MANAGER_PATH}/service/file-lock.cpp
-    ${MANAGER_PATH}/service/file-system.cpp
-    ${MANAGER_PATH}/service/ss-migrate.cpp
-    ${MANAGER_PATH}/service/permission.cpp
     ${SE_BACKEND_SOURCES}
 )
 
diff --git a/unit-tests/test_ckm_logic.cpp b/unit-tests/test_ckm_logic.cpp
deleted file mode 100644 (file)
index c548ae8..0000000
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- *  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        test_ckm_logic.cpp
- * @author      Andrei Vakulich (a.vakulich@samsung.com)
- * @version
- * @brief
- */
-
-#include <fstream>
-#include <utility>
-#include <iostream>
-#include <boost_macros_wrapper.h>
-#include <ckm/ckm-type.h>
-#include <test_common.h>
-#include <ckm-logic.h>
-#include <sql_connection.h>
-#include <timer.h>
-
-using namespace CKM;
-
-namespace {
-
-ClientId generateOwner(const size_t id)
-{
-    std::stringstream ss;
-    ss << "OWNER_" << id;
-    return ss.str();
-}
-
-PKCS12ShPtr readPKCS12(const std::string &path)
-{
-    std::ifstream is(path);
-    BOOST_REQUIRE(is);
-
-    std::istreambuf_iterator<char> begin(is), end;
-    RawBuffer pkcsBuffer(begin, end);
-    const auto pkcs = PKCS12::create(pkcsBuffer, Password());
-    BOOST_REQUIRE(pkcs);
-    BOOST_REQUIRE(!pkcs->empty());
-
-    return pkcs;
-}
-
-int getRetCodeSaveData(RawBuffer&& response)
-{
-    MessageBuffer message;
-    message.Push(std::move(response));
-    int msgId = 0, retCode = 0;
-    DataType dataType;
-    message.Deserialize(msgId, retCode, dataType);
-    return retCode;
-}
-
-int getRetCodeSavePKCS12(RawBuffer&& response)
-{
-    MessageBuffer message;
-    message.Push(std::move(response));
-    int msgId = 0, retCode = 0;
-    message.Deserialize(msgId, retCode);
-    return retCode;
-}
-
-int getRetCodeRemoveData(RawBuffer&& response)
-{
-    return getRetCodeSavePKCS12(std::move(response));
-}
-
-const Name NAME = "NAME";
-constexpr uid_t CLIENT_UID = 5001;
-const ClientId CLIENT_ID = generateOwner(0);
-const Password PASSWORD = "";
-const Credentials CREDENTIALS(CLIENT_UID, CLIENT_ID);
-const Policy OVERWRITABLE_POLICY(PASSWORD, false, PolicyBackend::DEFAULT, true);
-const Policy NON_OVERWRITABLE_POLICY(PASSWORD, false, PolicyBackend::DEFAULT, false);
-
-int messageId = 0;
-
-const DataType DATA_TYPE = DataType::Type::BINARY_DATA;
-constexpr unsigned char DATA[] = { "DATA" };
-const RawBuffer RAW_DATA( DATA, DATA + strlen((char*)DATA) );
-
-const DataType KEY_RSA_PUBLIC_TYPE = DataType::Type::KEY_RSA_PUBLIC;
-constexpr unsigned char KEY_RSA_PUBLIC[] = {
-    "-----BEGIN PUBLIC KEY-----\n"
-    "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMP6sKttnQ58BAi27b8X+8KVQt\n"
-    "JgpJhhCF0RtWaTVqAhVDG3y4x6IuAvXDtPSjLe/2E01fYGVxNComPJOmUOfUD06B\n"
-    "CWPYH2+7jOfQIOy/TMlt+W7xfou9rqnPRoKRaodoLqH5WK0ahkntWCAjstoKZoG+\n"
-    "3Op0tEjy0jpmzeyNiQIDAQAB\n"
-    "-----END PUBLIC KEY-----"
-};
-const RawBuffer RAW_KEY_RSA_PUBLIC( KEY_RSA_PUBLIC,
-                                    KEY_RSA_PUBLIC + strlen((char*)KEY_RSA_PUBLIC) );
-
-const auto pkcs = readPKCS12(MISC_DIR "/encryption-scheme.p12");
-
-} // namespace
-
-namespace CKM {
-
-namespace DB {
-
-class FailedSqlConnection : public DB::SqlConnection
-{
-public:
-    FailedSqlConnection(DB::SqlConnection&& sqlConnection)
-    {
-        m_connection = std::exchange(sqlConnection.m_connection, nullptr);
-        m_isKeySet = std::exchange(sqlConnection.m_isKeySet, false);
-        m_synchronizationObject = std::exchange(sqlConnection.m_synchronizationObject, nullptr);
-    }
-
-    void CommitTransaction() override
-    {
-        ThrowMsg(Exc::InternalError, "Failed transaction commit");
-    }
-};
-
-}
-
-class CKMLogicFail : public CKMLogic
-{
-public:
-    using CKMLogic::saveData;
-    using CKMLogic::savePKCS12;
-
-    CKMLogicFail(
-        const uid_t clientUid,
-        const CKM::Credentials &credentials,
-        const CKM::Name &name,
-        const CKM::ClientId &clientId) :
-        m_clientUid(clientUid),
-        m_credentials(credentials),
-        m_name(name),
-        m_clientId(clientId)
-    {}
-
-    void setFailedConnection()
-    {
-        auto connection = std::make_unique<CKM::DB::FailedSqlConnection>(
-            std::move(*m_userDataMap.at(m_clientUid).database.m_connection)
-        );
-
-        m_userDataMap.at(m_clientUid).database.m_connection = std::move(connection);
-    }
-
-    bool isNameOwnerPresent(const CKM::Name &name, const CKM::ClientId &owner) const
-    {
-        return m_userDataMap.at(m_clientUid).database.isNameOwnerPresent(name, owner);
-    }
-
-    int saveData(const Crypto::Data &data, const PolicySerializable &policy)
-    {
-        auto response = saveData(m_credentials, ++messageId, m_name, m_clientId,
-                                 data, policy);
-
-        return getRetCodeSaveData(std::move(response));
-    }
-
-    int savePKCS12(
-        const PKCS12Serializable &pkcs12,
-        const PolicySerializable &keyPolicy,
-        const PolicySerializable &certPolicy)
-    {
-        auto response = savePKCS12(m_credentials, ++messageId, m_name, m_clientId,
-                                   pkcs12, keyPolicy, certPolicy);
-
-        return getRetCodeSavePKCS12(std::move(response));
-    }
-
-private:
-    const uid_t m_clientUid;
-    const CKM::Credentials m_credentials;
-    const CKM::Name m_name;
-    const CKM::ClientId m_clientId;
-};
-
-}
-
-namespace {
-
-class CKMLogicFailFixture
-{
-public:
-    CKMLogicFailFixture()
-        : logicFail(CLIENT_UID, CREDENTIALS, NAME, CLIENT_ID)
-    {
-        logicFail.unlockUserKey(CLIENT_UID, PASSWORD);
-        logicFail.removeData(CREDENTIALS, ++messageId, NAME, CLIENT_ID);
-    }
-
-    ~CKMLogicFailFixture()
-    {
-        try {
-            logicFail.lockUserKey(CLIENT_UID);
-        } catch (...) {
-            std::cerr << "Unexpected exception in CKMLogic::lockUserKey\n";
-        }
-    }
-
-    CKMLogicFail logicFail;
-};
-
-} // namespace
-
-BOOST_AUTO_TEST_SUITE(CKMLOGIC_TEST)
-
-BOOST_FIXTURE_TEST_CASE(DBTestSaveApi, CKMLogicFailFixture)
-{
-    logicFail.setFailedConnection();
-
-    auto retCode = logicFail.saveData(Crypto::Data(DATA_TYPE, RAW_DATA),
-                                      PolicySerializable(NON_OVERWRITABLE_POLICY));
-    BOOST_REQUIRE(retCode == CKM_API_ERROR_SERVER_ERROR);
-    BOOST_REQUIRE(!logicFail.isNameOwnerPresent(NAME, CLIENT_ID));
-
-    retCode = logicFail.saveData(Crypto::Data(DATA_TYPE, RAW_DATA),
-                                 PolicySerializable(OVERWRITABLE_POLICY));
-    BOOST_REQUIRE(retCode == CKM_API_ERROR_SERVER_ERROR);
-    BOOST_REQUIRE(!logicFail.isNameOwnerPresent(NAME, CLIENT_ID));
-}
-
-BOOST_FIXTURE_TEST_CASE(DBTestSaveDataUpdateDataApi, CKMLogicFailFixture)
-{
-    auto retCode = logicFail.saveData(Crypto::Data(DATA_TYPE, RAW_DATA),
-                                      PolicySerializable(NON_OVERWRITABLE_POLICY));
-    BOOST_REQUIRE(retCode == CKM_API_SUCCESS);
-    BOOST_REQUIRE(logicFail.isNameOwnerPresent(NAME, CLIENT_ID));
-
-    logicFail.setFailedConnection();
-
-    retCode = logicFail.saveData(Crypto::Data(DATA_TYPE, RAW_DATA),
-                                 PolicySerializable(OVERWRITABLE_POLICY));
-    BOOST_REQUIRE(retCode == CKM_API_ERROR_SERVER_ERROR);
-    BOOST_REQUIRE(!logicFail.isNameOwnerPresent(NAME, CLIENT_ID));
-}
-
-BOOST_FIXTURE_TEST_CASE(DBTestSaveKeyUpdateDataApi, CKMLogicFailFixture)
-{
-    auto retCode = logicFail.saveData(Crypto::Data(KEY_RSA_PUBLIC_TYPE, RAW_KEY_RSA_PUBLIC),
-                                      PolicySerializable(NON_OVERWRITABLE_POLICY));
-    BOOST_REQUIRE(retCode == CKM_API_SUCCESS);
-    BOOST_REQUIRE(logicFail.isNameOwnerPresent(NAME, CLIENT_ID));
-
-    logicFail.setFailedConnection();
-
-    retCode = logicFail.saveData(Crypto::Data(DATA_TYPE, RAW_DATA),
-                                      PolicySerializable(OVERWRITABLE_POLICY));
-    BOOST_REQUIRE(retCode == CKM_API_ERROR_SERVER_ERROR);
-    BOOST_REQUIRE(!logicFail.isNameOwnerPresent(NAME, CLIENT_ID));
-}
-
-BOOST_FIXTURE_TEST_CASE(DBTestSavePKCS12UpdateDataApi, CKMLogicFailFixture)
-{
-    auto retCode = logicFail.savePKCS12(PKCS12Serializable(*pkcs.get()),
-                                        PolicySerializable(NON_OVERWRITABLE_POLICY),
-                                        PolicySerializable(NON_OVERWRITABLE_POLICY));
-    BOOST_REQUIRE(retCode == CKM_API_SUCCESS);
-    BOOST_REQUIRE(logicFail.isNameOwnerPresent(NAME, CLIENT_ID));
-
-    logicFail.setFailedConnection();
-
-    retCode = logicFail.saveData(Crypto::Data(DATA_TYPE, RAW_DATA),
-                                 PolicySerializable(OVERWRITABLE_POLICY));
-    BOOST_REQUIRE(retCode == CKM_API_ERROR_SERVER_ERROR);
-    BOOST_REQUIRE(!logicFail.isNameOwnerPresent(NAME, CLIENT_ID));
-}
-
-BOOST_FIXTURE_TEST_CASE(DBTestSaveDataUpdatePKCS12Api, CKMLogicFailFixture)
-{
-    auto retCode = logicFail.saveData(Crypto::Data(DATA_TYPE, RAW_DATA),
-                                      PolicySerializable(NON_OVERWRITABLE_POLICY));
-    BOOST_REQUIRE(retCode == CKM_API_SUCCESS);
-    BOOST_REQUIRE(logicFail.isNameOwnerPresent(NAME, CLIENT_ID));
-
-    logicFail.setFailedConnection();
-
-    retCode = logicFail.savePKCS12(PKCS12Serializable(*pkcs.get()),
-                                   PolicySerializable(OVERWRITABLE_POLICY),
-                                   PolicySerializable(OVERWRITABLE_POLICY));
-    BOOST_REQUIRE(retCode == CKM_API_ERROR_SERVER_ERROR);
-    BOOST_REQUIRE(!logicFail.isNameOwnerPresent(NAME, CLIENT_ID));
-}
-
-BOOST_FIXTURE_TEST_CASE(DBTestSavePKCS12UpdatePKCS12Api, CKMLogicFailFixture)
-{
-    auto retCode = logicFail.savePKCS12(PKCS12Serializable(*pkcs.get()),
-                                        PolicySerializable(NON_OVERWRITABLE_POLICY),
-                                        PolicySerializable(NON_OVERWRITABLE_POLICY));
-    BOOST_REQUIRE(retCode == CKM_API_SUCCESS);
-    BOOST_REQUIRE(logicFail.isNameOwnerPresent(NAME, CLIENT_ID));
-
-    logicFail.setFailedConnection();
-
-    retCode = logicFail.savePKCS12(PKCS12Serializable(*pkcs.get()),
-                                   PolicySerializable(OVERWRITABLE_POLICY),
-                                   PolicySerializable(OVERWRITABLE_POLICY));
-    BOOST_REQUIRE(retCode == CKM_API_ERROR_SERVER_ERROR);
-    BOOST_REQUIRE(!logicFail.isNameOwnerPresent(NAME, CLIENT_ID));
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-namespace {
-
-class CKMLogicFixture
-{
-public:
-    CKMLogicFixture()
-    {
-        logic.unlockUserKey(CLIENT_UID, PASSWORD);
-    }
-
-    ~CKMLogicFixture()
-    {
-        try {
-            logic.lockUserKey(CLIENT_UID);
-        } catch (...) {
-            std::cerr << "Unexpected exception in CKMLogic::lockUserKey\n";
-        }
-    }
-
-    CKMLogic logic{};
-};
-
-void generateData(CKMLogic& logic, const size_t dataCount, const size_t pkcs12Count)
-{
-    for (size_t i = 0; i < dataCount; ++i)
-    {
-        const auto clientId = generateOwner(i);
-        auto response = logic.saveData(Credentials(CLIENT_UID, clientId), ++messageId, NAME,
-                                       clientId, Crypto::Data(DATA_TYPE, RAW_DATA),
-                                       PolicySerializable(OVERWRITABLE_POLICY));
-        BOOST_REQUIRE(getRetCodeSaveData(std::move(response)) == CKM_API_SUCCESS);
-    }
-
-    for (size_t i = dataCount; i < dataCount + pkcs12Count; ++i)
-    {
-        const auto clientId = generateOwner(i);
-        auto response = logic.savePKCS12(Credentials(CLIENT_UID, clientId), ++messageId, NAME,
-                                         clientId, PKCS12Serializable(*pkcs.get()),
-                                         PolicySerializable(OVERWRITABLE_POLICY),
-                                         PolicySerializable(OVERWRITABLE_POLICY));
-        BOOST_REQUIRE(getRetCodeSavePKCS12(std::move(response)) == CKM_API_SUCCESS);
-    }
-}
-
-void removeGeneratedData(CKMLogic& logic, const size_t dataCount, const size_t pkcs12Count)
-{
-    for (size_t i = 0; i < dataCount + pkcs12Count; ++i)
-    {
-        const auto clientId = generateOwner(i);
-        auto response = logic.removeData(Credentials(CLIENT_UID, clientId), ++messageId,
-                                         NAME, clientId);
-        BOOST_REQUIRE(getRetCodeRemoveData(std::move(response)) == CKM_API_SUCCESS);
-    }
-}
-
-double measureSaveApi(
-    CKMLogic& logic,
-    const size_t dataCount,
-    const bool isPKCS12,
-    const Policy &policy,
-    bool isNeedToRemove)
-{
-    if (dataCount == 0) return 0;
-
-    size_t averageSaveApiTime = 0;
-
-    for (size_t i = 0; i < dataCount; ++i)
-    {
-        const auto clientId = generateOwner(i);
-        Credentials credentials(CLIENT_UID, clientId);
-
-        if (isNeedToRemove)
-        {
-            auto [response, time] = measure(&CKMLogic::removeData, logic,
-                                            credentials, ++messageId, NAME, clientId);
-            BOOST_REQUIRE(getRetCodeRemoveData(std::move(response)) == CKM_API_SUCCESS);
-            averageSaveApiTime += time;
-        }
-
-        if (isPKCS12)
-        {
-            auto [response, time] = measure(&CKMLogic::savePKCS12, logic, credentials,
-                                            ++messageId, NAME, clientId,
-                                            PKCS12Serializable(*pkcs.get()),
-                                            PolicySerializable(policy),
-                                            PolicySerializable(policy));
-            BOOST_REQUIRE(getRetCodeSavePKCS12(std::move(response)) == CKM_API_SUCCESS);
-            averageSaveApiTime += time;
-        }
-        else
-        {
-            auto [response, time] = measure(&CKMLogic::saveData, logic,
-                                            credentials, ++messageId, NAME, clientId,
-                                            Crypto::Data(DATA_TYPE, RAW_DATA),
-                                            PolicySerializable(policy));
-            BOOST_REQUIRE(getRetCodeSaveData(std::move(response)) == CKM_API_SUCCESS);
-            averageSaveApiTime += time;
-        }
-    }
-
-    return averageSaveApiTime / (double)dataCount;
-}
-
-void printTime(const size_t dataCount, const size_t pkcs12Count,
-    const int64_t averageSaveApiTime, const int64_t averageUpdateApiTime)
-{
-    std::cout << "data=" << dataCount << " pkcs12=" << pkcs12Count << "\n"
-        << "remove + save: " << averageSaveApiTime << "ms\n"
-        << "update: " << averageUpdateApiTime << "ms\n" << std::endl;
-}
-
-void doBenchmark(CKMLogic& logic, const size_t dataCount,
-    const size_t pkcs12Count, const bool isPKCS12)
-{
-    generateData(logic, dataCount, pkcs12Count);
-    const auto averageSaveTime = measureSaveApi(logic, dataCount + pkcs12Count,
-                                                isPKCS12, NON_OVERWRITABLE_POLICY, true);
-    removeGeneratedData(logic, dataCount, pkcs12Count);
-
-    generateData(logic, dataCount, pkcs12Count);
-    const auto averageUpdateTime = measureSaveApi(logic, dataCount + pkcs12Count,
-                                                  isPKCS12, OVERWRITABLE_POLICY, false);
-    removeGeneratedData(logic, dataCount, pkcs12Count);
-
-    printTime(dataCount, pkcs12Count, averageSaveTime, averageUpdateTime);
-}
-
-} // namespace
-
-BOOST_FIXTURE_TEST_SUITE(UPDATE_API_BENCHMARKS, CKMLogicFixture)
-
-POSITIVE_TEST_CASE(UpdateDataWithData)
-{
-    doBenchmark(logic, 1, 0, false);
-    doBenchmark(logic, 10, 0, false);
-    doBenchmark(logic, 50, 0, false);
-    doBenchmark(logic, 100, 0, false);
-}
-
-POSITIVE_TEST_CASE(UpdatePKCS12WithData)
-{
-    doBenchmark(logic, 0, 1, false);
-    doBenchmark(logic, 0, 10, false);
-    doBenchmark(logic, 0, 50, false);
-    doBenchmark(logic, 0, 100, false);
-}
-
-POSITIVE_TEST_CASE(UpdateDataAndPKCS12WithData)
-{
-    doBenchmark(logic, 1, 1, false);
-    doBenchmark(logic, 10, 10, false);
-    doBenchmark(logic, 50, 50, false);
-    doBenchmark(logic, 100, 100, false);
-}
-
-POSITIVE_TEST_CASE(UpdateDataAndPKCS12WithPKCS12)
-{
-    doBenchmark(logic, 1, 1, true);
-    doBenchmark(logic, 10, 10, true);
-    doBenchmark(logic, 50, 50, true);
-    doBenchmark(logic, 100, 100, true);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
diff --git a/unit-tests/timer.h b/unit-tests/timer.h
deleted file mode 100644 (file)
index e61dd57..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *  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        timer.h
- * @author      Andrei Vakulich (a.vakulich@samsung.com)
- * @version
- * @brief
- */
-
-#pragma once
-
-#include <cassert>
-#include <chrono>
-#include <functional>
-
-namespace CKM {
-
-class Timer {
-public:
-       Timer() = default;
-
-       void start() {
-               assert(m_state != State::Started);
-               m_state = State::Started;
-               m_start = std::chrono::high_resolution_clock::now();
-       }
-
-       void stop() {
-               assert(m_state == State::Started);
-               m_state = State::Stopped;
-               m_finish = std::chrono::high_resolution_clock::now();
-       }
-
-       auto elapsedMs() {
-               assert(m_state == State::Stopped);
-               const auto elps = m_finish - m_start;
-               const auto msec = std::chrono::duration_cast<std::chrono::milliseconds>(elps);
-               return msec.count();
-       }
-
-private:
-       enum class State : std::uint8_t {
-               Cold = 0,
-               Started,
-               Stopped
-       };
-       State m_state = State::Cold;
-
-       std::chrono::high_resolution_clock::time_point m_start, m_finish;
-};
-
-template <typename T, typename... Args>
-auto measure(T callable, Args&&... args) {
-       Timer timer;
-       timer.start();
-       const auto result = std::invoke(callable, std::forward<Args>(args)...);
-       timer.stop();
-       return std::pair{ result, timer.elapsedMs() };
-}
-
-}