mirror of
https://github.com/eclipse-openvehicle-api/openvehicle-api.git
synced 2026-08-30 12:15:12 +00:00
connection between 2 systems and bug fixes (#14)
This commit is contained in:
33
tests/unit_tests/permission_control/CMakeLists.txt
Normal file
33
tests/unit_tests/permission_control/CMakeLists.txt
Normal file
@@ -0,0 +1,33 @@
|
||||
#*******************************************************************************
|
||||
# Copyright (c) 2025-2026 ZF Friedrichshafen AG
|
||||
#
|
||||
# This program and the accompanying materials are made available under the
|
||||
# terms of the Apache License Version 2.0 which is available at
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Contributors:
|
||||
# Erik Verhoeven - initial API and implementation
|
||||
#*******************************************************************************
|
||||
|
||||
# Define project
|
||||
project (UnitTest_PermissionControl VERSION 1.0 LANGUAGES CXX)
|
||||
|
||||
# Compile the source code
|
||||
add_executable(UnitTest_PermissionControl
|
||||
"main.cpp"
|
||||
"permission_control_tests.cpp")
|
||||
target_link_libraries(UnitTest_PermissionControl ${CMAKE_DL_LIBS} GTest::GTest)
|
||||
|
||||
# Add the IDL Compiler unittest
|
||||
add_test(NAME UnitTest_PermissionControl COMMAND UnitTest_PermissionControl)
|
||||
|
||||
# Execute the test
|
||||
add_custom_command(TARGET UnitTest_PermissionControl POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E env TEST_EXECUTION_MODE=CMake "$<TARGET_FILE:UnitTest_PermissionControl>" --gtest_output=xml:${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/UnitTest_PermissionControl.xml
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
# Build dependencies
|
||||
add_dependencies(UnitTest_PermissionControl dependency_sdv_components)
|
||||
31
tests/unit_tests/permission_control/main.cpp
Normal file
31
tests/unit_tests/permission_control/main.cpp
Normal file
@@ -0,0 +1,31 @@
|
||||
/********************************************************************************
|
||||
* Copyright (c) 2025-2026 ZF Friedrichshafen AG
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the Apache License Version 2.0 which is available at
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Contributors:
|
||||
* Erik Verhoeven - initial API and implementation
|
||||
********************************************************************************/
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include "../../../global/process_watchdog.h"
|
||||
#include "../../../sdv_services/core/permission_control.cpp"
|
||||
|
||||
/**
|
||||
* @brief Main function
|
||||
*/
|
||||
#if defined(_WIN32) && defined(_UNICODE)
|
||||
extern "C" int wmain(int argc, wchar_t* argv[])
|
||||
#else
|
||||
extern "C" int main(int argc, char* argv[])
|
||||
#endif
|
||||
{
|
||||
CProcessWatchdog watchdog;
|
||||
|
||||
::testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
264
tests/unit_tests/permission_control/permission_control_tests.cpp
Normal file
264
tests/unit_tests/permission_control/permission_control_tests.cpp
Normal file
@@ -0,0 +1,264 @@
|
||||
/********************************************************************************
|
||||
* Copyright (c) 2025-2026 ZF Friedrichshafen AG
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the Apache License Version 2.0 which is available at
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Contributors:
|
||||
* Erik Verhoeven - initial API and implementation
|
||||
********************************************************************************/
|
||||
|
||||
#include <optional>
|
||||
#include "../../include/gtest_custom.h"
|
||||
#include "../../../sdv_services/core/permission_control.h"
|
||||
|
||||
TEST(PermissionControl, DefaultRestriction)
|
||||
{
|
||||
CPermissionControl control;
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
}
|
||||
|
||||
TEST(PermissionControl, SetRestrictionInternal)
|
||||
{
|
||||
CPermissionControl control;
|
||||
std::vector<CAccessPermission> vecPermissions;
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Full access
|
||||
vecPermissions.emplace_back(control.CreatePermissionObject(sdv::core::EAccessPermission::full_access));
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::full_access);
|
||||
|
||||
// Reduce access to local access
|
||||
vecPermissions.emplace_back(control.CreatePermissionObject(sdv::core::EAccessPermission::local_access));
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::local_access);
|
||||
|
||||
// Reduce access to remote access
|
||||
vecPermissions.emplace_back(control.CreatePermissionObject(sdv::core::EAccessPermission::remote_access));
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::remote_access);
|
||||
|
||||
// Reduce access to restricted access
|
||||
vecPermissions.emplace_back(control.CreatePermissionObject(sdv::core::EAccessPermission::restricted_access));
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Try increase access to full access - this should not have any change
|
||||
vecPermissions.emplace_back(control.CreatePermissionObject(sdv::core::EAccessPermission::full_access));
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Remove the local access index #1 - this should not have any change
|
||||
EXPECT_EQ(vecPermissions[1].Permission(), sdv::core::EAccessPermission::local_access);
|
||||
vecPermissions.erase(vecPermissions.begin() + 1);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Remove first full access index #0 - this should not have any change
|
||||
EXPECT_EQ(vecPermissions[0].Permission(), sdv::core::EAccessPermission::full_access);
|
||||
vecPermissions.erase(vecPermissions.begin());
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Remove remote access new index #0 - this should not have any change
|
||||
EXPECT_EQ(vecPermissions[0].Permission(), sdv::core::EAccessPermission::remote_access);
|
||||
vecPermissions.erase(vecPermissions.begin());
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Remove restricted access new index #0 - access will change to full access
|
||||
EXPECT_EQ(vecPermissions[0].Permission(), sdv::core::EAccessPermission::restricted_access);
|
||||
vecPermissions.erase(vecPermissions.begin());
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::full_access);
|
||||
|
||||
// Remove the remaining access - this would change to (default) restricted access again
|
||||
vecPermissions.clear();
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
}
|
||||
|
||||
TEST(PermissionControl, SetRestrictionExternal)
|
||||
{
|
||||
CPermissionControl control;
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Try to set external permission to full access; this will not work
|
||||
EXPECT_EQ(control.RestrictAccessPermission(sdv::core::EAccessPermission::full_access), 0u);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Try to set external permission to local access; this will not work
|
||||
EXPECT_EQ(control.RestrictAccessPermission(sdv::core::EAccessPermission::local_access), 0u);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Try to set external permission to remote access; this will not work
|
||||
EXPECT_EQ(control.RestrictAccessPermission(sdv::core::EAccessPermission::remote_access), 0u);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Try to set external permission to restricted access; this will not work
|
||||
EXPECT_EQ(control.RestrictAccessPermission(sdv::core::EAccessPermission::restricted_access), 0u);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
}
|
||||
|
||||
TEST(PermissionControl, InitializeRestrictionInternal_SetRestrictionExternal)
|
||||
{
|
||||
CPermissionControl control;
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Set restriction to full access
|
||||
std::optional<CAccessPermission> optPermission = control.CreatePermissionObject(sdv::core::EAccessPermission::full_access);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::full_access);
|
||||
|
||||
// Set external permission to local access
|
||||
sdv::core::TPermissionID permidLocalAccess = control.RestrictAccessPermission(sdv::core::EAccessPermission::local_access);
|
||||
EXPECT_NE(permidLocalAccess, 0u);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::local_access);
|
||||
|
||||
// Set external permission to remote access
|
||||
sdv::core::TPermissionID permidRemoteAccess = control.RestrictAccessPermission(sdv::core::EAccessPermission::remote_access);
|
||||
EXPECT_NE(permidRemoteAccess, 0u);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::remote_access);
|
||||
|
||||
// Set external permission to restricted access
|
||||
sdv::core::TPermissionID permidRestrictedAccess =
|
||||
control.RestrictAccessPermission(sdv::core::EAccessPermission::restricted_access);
|
||||
EXPECT_NE(permidRestrictedAccess, 0u);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Set external permission to full access - this will not change the access
|
||||
sdv::core::TPermissionID permidFullAccess = control.RestrictAccessPermission(sdv::core::EAccessPermission::full_access);
|
||||
EXPECT_NE(permidFullAccess, 0u);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Release not existing access ID - should not work
|
||||
EXPECT_FALSE(control.ReleaseAccessPermission(0));
|
||||
EXPECT_FALSE(control.ReleaseAccessPermission(1));
|
||||
|
||||
// Release local, restricted and full access - this will change access to remote access
|
||||
EXPECT_TRUE(control.ReleaseAccessPermission(permidLocalAccess));
|
||||
EXPECT_TRUE(control.ReleaseAccessPermission(permidRestrictedAccess));
|
||||
EXPECT_TRUE(control.ReleaseAccessPermission(permidFullAccess));
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::remote_access);
|
||||
|
||||
// Release local again - should not work
|
||||
EXPECT_FALSE(control.ReleaseAccessPermission(permidLocalAccess));
|
||||
|
||||
// Terminate internal full access - access should stay with remote access
|
||||
optPermission.reset();
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::remote_access);
|
||||
|
||||
// Release remote access - the access permission will change to restricted access again
|
||||
EXPECT_TRUE(control.ReleaseAccessPermission(permidRemoteAccess));
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
}
|
||||
|
||||
TEST(PermissionControl, DefaultThreadPermission)
|
||||
{
|
||||
CPermissionControl control;
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Set restriction to full access
|
||||
CAccessPermission permission = control.CreatePermissionObject(sdv::core::EAccessPermission::full_access);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::full_access);
|
||||
|
||||
// Start new thread - access should be restricted
|
||||
std::thread thread([&]()
|
||||
{
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
});
|
||||
thread.join();
|
||||
}
|
||||
|
||||
TEST(PermissionControl, InternalSetThreadPermission)
|
||||
{
|
||||
CPermissionControl control;
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Set restriction to local access
|
||||
CAccessPermission permission = control.CreatePermissionObject(sdv::core::EAccessPermission::local_access);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::local_access);
|
||||
|
||||
// Start new thread - access should be restricted
|
||||
std::thread thread([&]()
|
||||
{
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Set full access permission
|
||||
CAccessPermission permissionFullAccess = control.CreatePermissionObject(sdv::core::EAccessPermission::full_access);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::full_access);
|
||||
|
||||
// Set local access permission
|
||||
CAccessPermission permissionLocalAccess = control.CreatePermissionObject(sdv::core::EAccessPermission::local_access);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::local_access);
|
||||
|
||||
// Set remote access permission
|
||||
CAccessPermission permissionRemoteAccess = control.CreatePermissionObject(sdv::core::EAccessPermission::remote_access);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::remote_access);
|
||||
|
||||
// Set restricted access permission
|
||||
CAccessPermission permissionRestrictedAccess =
|
||||
control.CreatePermissionObject(sdv::core::EAccessPermission::restricted_access);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
});
|
||||
thread.join();
|
||||
|
||||
// Access permissions on main thread should still be local
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::local_access);
|
||||
}
|
||||
|
||||
TEST(PermissionControl, TransferThreadPermission)
|
||||
{
|
||||
CPermissionControl control;
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Set restriction to full access
|
||||
CAccessPermission permissionFullAccess = control.CreatePermissionObject(sdv::core::EAccessPermission::full_access);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::full_access);
|
||||
sdv::core::TPermissionID transferFullAccess = control.TransferCurrentPermission();
|
||||
EXPECT_NE(transferFullAccess, 0u);
|
||||
|
||||
// Set restriction to local access
|
||||
CAccessPermission permissionLocalAccess = control.CreatePermissionObject(sdv::core::EAccessPermission::local_access);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::local_access);
|
||||
sdv::core::TPermissionID transferLocalAccess = control.TransferCurrentPermission();
|
||||
EXPECT_NE(transferLocalAccess, 0u);
|
||||
|
||||
// Set restriction to remote access
|
||||
CAccessPermission permissionRemoteAccess = control.CreatePermissionObject(sdv::core::EAccessPermission::remote_access);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::remote_access);
|
||||
sdv::core::TPermissionID transferRemoteAccess = control.TransferCurrentPermission();
|
||||
EXPECT_NE(transferRemoteAccess, 0u);
|
||||
|
||||
// Set restriction to restricted access
|
||||
CAccessPermission permissionRestrictedAccess = control.CreatePermissionObject(sdv::core::EAccessPermission::restricted_access);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
sdv::core::TPermissionID transferRestrictedAccess = control.TransferCurrentPermission();
|
||||
EXPECT_NE(transferRestrictedAccess, 0u);
|
||||
|
||||
// Start new thread - access should be restricted
|
||||
std::thread thread([&]()
|
||||
{
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// Tets bogus transfer IDs
|
||||
EXPECT_FALSE(control.SetAccessPermission(0));
|
||||
EXPECT_FALSE(control.SetAccessPermission(1));
|
||||
|
||||
// Set full access permission from transfer ID
|
||||
sdv::core::TPermissionID permidFullAccess = control.SetAccessPermission(transferFullAccess);
|
||||
EXPECT_NE(permidFullAccess, 0u);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::full_access);
|
||||
|
||||
// Set local access permission from transfer ID
|
||||
sdv::core::TPermissionID permidLocalAccess = control.SetAccessPermission(transferLocalAccess);
|
||||
EXPECT_NE(permidLocalAccess, 0u);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::local_access);
|
||||
|
||||
// Set remote access permission from transfer ID
|
||||
sdv::core::TPermissionID permidRemoteAccess = control.SetAccessPermission(transferRemoteAccess);
|
||||
EXPECT_NE(permidRemoteAccess, 0u);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::remote_access);
|
||||
|
||||
// Set restricted access permission from transfer ID
|
||||
sdv::core::TPermissionID permidRestrictedAccess = control.SetAccessPermission(transferRestrictedAccess);
|
||||
EXPECT_NE(permidRestrictedAccess, 0u);
|
||||
EXPECT_EQ(control.GetCurrentPermission(), sdv::core::EAccessPermission::restricted_access);
|
||||
|
||||
// At the end of the thread, the IDs will be cleaned up automatically.
|
||||
});
|
||||
thread.join();
|
||||
}
|
||||
Reference in New Issue
Block a user