--- /dev/null
+/*
+ * 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()
+++ /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 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()