Add extracted tools: CitrineOS, OpenOCPP, ShapeShifter

- CitrineOS core extracted (CSMS OCPP 2.0.1)
- OpenOCPP extracted (firmware OCPP 1.6J/2.0.1)
- ShapeShifter library installed (pip install -e)
- ShapeShifter specification extracted
- EVerest extracted

TODO updated with progress
This commit is contained in:
Eric F
2026-06-08 00:38:27 -04:00
parent 468cfeaa50
commit d398a6ced2
7326 changed files with 1177561 additions and 7 deletions

View File

@@ -0,0 +1,28 @@
set(TEST_TARGET_NAME ${PROJECT_NAME}_transaction_handler_tests)
add_executable(${TEST_TARGET_NAME})
add_dependencies(${TEST_TARGET_NAME} ${MODULE_NAME})
get_target_property(GENERATED_INCLUDE_DIR generate_cpp_files EVEREST_GENERATED_INCLUDE_DIR)
target_include_directories(${TEST_TARGET_NAME} PUBLIC
..
${GENERATED_INCLUDE_DIR}
${CMAKE_BINARY_DIR}/generated/modules/${MODULE_NAME}
)
target_sources(${TEST_TARGET_NAME}
PRIVATE
ocpp_conversions_test.cpp
transaction_handler_tests.cpp
../transaction_handler.cpp
)
target_link_libraries(${TEST_TARGET_NAME}
PRIVATE
everest::ocpp
everest::framework
GTest::gtest_main
)
add_test(${TEST_TARGET_NAME} ${TEST_TARGET_NAME})
ev_register_test_target(${TEST_TARGET_NAME})

View File

@@ -0,0 +1,36 @@
// SPDX-License-Identifier: Apache-2.0
// Copyright Pionix GmbH and Contributors to EVerest
#include <gtest/gtest.h>
#include <ocpp_generic/ocppImpl.hpp>
namespace {
using namespace module::ocpp_generic;
TEST(MonitorList, insert) {
// check that duplicates are avoided
ocppImpl::MonitorList list;
ocppImpl::MonitorListEntry entryA{{"Component"}, {"Variable"}};
ocppImpl::MonitorListEntry entryB{{"Component"}, {"Variable", "Instance"}};
auto result = list.insert(entryA);
EXPECT_TRUE(std::get<bool>(result));
result = list.insert(entryB);
EXPECT_TRUE(std::get<bool>(result));
ASSERT_EQ(list.size(), 2);
// attempt to add same object again
result = list.insert(entryB);
EXPECT_FALSE(std::get<bool>(result));
ASSERT_EQ(list.size(), 2);
// attempt to add new object with same values
ocppImpl::MonitorListEntry entryC{{"Component"}, {"Variable"}};
result = list.insert(entryC);
EXPECT_FALSE(std::get<bool>(result));
ASSERT_EQ(list.size(), 2);
}
} // namespace

View File

@@ -0,0 +1,133 @@
// SPDX-License-Identifier: Apache-2.0
// Copyright Pionix GmbH and Contributors to EVerest
#include <gtest/gtest.h>
#include <transaction_handler.hpp>
namespace module {
class TransactionHandlerTest : public ::testing::Test {
protected:
void SetUp() override {
}
void TearDown() override {
}
std::shared_ptr<TransactionData> transaction_data() {
return std::make_shared<TransactionData>(1, "123", ocpp::DateTime(), ocpp::v2::TriggerReasonEnum::Authorized,
ocpp::v2::ChargingStateEnum::Idle);
}
};
TEST_F(TransactionHandlerTest, test_authorized) {
TransactionHandler transaction_handler(2, {TxStartStopPoint::Authorized}, {TxStartStopPoint::Authorized});
transaction_handler.add_transaction_data(1, transaction_data());
auto res = transaction_handler.submit_event(1, TxEvent::AUTHORIZED);
ASSERT_EQ(res, TxEventEffect::START_TRANSACTION);
transaction_handler.get_transaction_data(1)->started = true;
res = transaction_handler.submit_event(1, TxEvent::AUTHORIZED);
ASSERT_EQ(res, TxEventEffect::NONE);
res = transaction_handler.submit_event(1, TxEvent::DEAUTHORIZED);
ASSERT_EQ(res, TxEventEffect::STOP_TRANSACTION);
}
TEST_F(TransactionHandlerTest, test_power_path_closed) {
TransactionHandler transaction_handler(2, {TxStartStopPoint::PowerPathClosed}, {TxStartStopPoint::PowerPathClosed});
transaction_handler.add_transaction_data(1, transaction_data());
auto res = transaction_handler.submit_event(1, TxEvent::AUTHORIZED);
ASSERT_EQ(res, TxEventEffect::NONE);
res = transaction_handler.submit_event(1, TxEvent::EV_CONNECTED);
ASSERT_EQ(res, TxEventEffect::START_TRANSACTION);
transaction_handler.get_transaction_data(1)->started = true;
res = transaction_handler.submit_event(1, TxEvent::PARKING_BAY_UNOCCUPIED);
ASSERT_EQ(res, TxEventEffect::NONE);
res = transaction_handler.submit_event(1, TxEvent::EV_CONNECTED);
ASSERT_EQ(res, TxEventEffect::NONE);
res = transaction_handler.submit_event(1, TxEvent::EV_DISCONNECTED);
ASSERT_EQ(res, TxEventEffect::STOP_TRANSACTION);
}
TEST_F(TransactionHandlerTest, test_ev_connected) {
TransactionHandler transaction_handler(2, {TxStartStopPoint::EVConnected}, {TxStartStopPoint::EVConnected});
transaction_handler.add_transaction_data(1, transaction_data());
auto res = transaction_handler.submit_event(1, TxEvent::EV_CONNECTED);
ASSERT_EQ(res, TxEventEffect::START_TRANSACTION);
transaction_handler.get_transaction_data(1)->started = true;
res = transaction_handler.submit_event(1, TxEvent::DEAUTHORIZED);
ASSERT_EQ(res, TxEventEffect::NONE);
res = transaction_handler.submit_event(1, TxEvent::EV_DISCONNECTED);
ASSERT_EQ(res, TxEventEffect::STOP_TRANSACTION);
}
TEST_F(TransactionHandlerTest, test_parking_bay_occupied) {
TransactionHandler transaction_handler(2, {TxStartStopPoint::ParkingBayOccupancy},
{TxStartStopPoint::ParkingBayOccupancy});
transaction_handler.add_transaction_data(1, transaction_data());
auto res = transaction_handler.submit_event(1, TxEvent::PARKING_BAY_OCCUPIED);
ASSERT_EQ(res, TxEventEffect::START_TRANSACTION);
transaction_handler.get_transaction_data(1)->started = true;
res = transaction_handler.submit_event(1, TxEvent::EV_DISCONNECTED);
ASSERT_EQ(res, TxEventEffect::NONE);
res = transaction_handler.submit_event(1, TxEvent::PARKING_BAY_UNOCCUPIED);
ASSERT_EQ(res, TxEventEffect::STOP_TRANSACTION);
}
TEST_F(TransactionHandlerTest, test_multiple) {
TransactionHandler transaction_handler(2, {TxStartStopPoint::EVConnected, TxStartStopPoint::Authorized},
{TxStartStopPoint::PowerPathClosed});
transaction_handler.add_transaction_data(1, transaction_data());
auto res = transaction_handler.submit_event(1, TxEvent::EV_CONNECTED);
ASSERT_EQ(res, TxEventEffect::START_TRANSACTION);
transaction_handler.get_transaction_data(1)->started = true;
res = transaction_handler.submit_event(1, TxEvent::DEAUTHORIZED);
ASSERT_EQ(res, TxEventEffect::STOP_TRANSACTION);
transaction_handler.reset_transaction_data(1);
transaction_handler.add_transaction_data(1, transaction_data());
res = transaction_handler.submit_event(1, TxEvent::AUTHORIZED);
ASSERT_EQ(res, TxEventEffect::START_TRANSACTION);
transaction_handler.get_transaction_data(1)->started = true;
res = transaction_handler.submit_event(1, TxEvent::SIGNED_START_DATA_RECEIVED);
ASSERT_EQ(res, TxEventEffect::NONE);
res = transaction_handler.submit_event(1, TxEvent::EV_DISCONNECTED);
ASSERT_EQ(res, TxEventEffect::STOP_TRANSACTION);
}
TEST_F(TransactionHandlerTest, test_invalid_params) {
TransactionHandler transaction_handler(2, {TxStartStopPoint::EVConnected, TxStartStopPoint::Authorized},
{TxStartStopPoint::PowerPathClosed});
ASSERT_THROW(transaction_handler.get_transaction_data(3), std::out_of_range);
ASSERT_THROW(transaction_handler.reset_transaction_data(3), std::out_of_range);
ASSERT_THROW(transaction_handler.add_transaction_data(-1, transaction_data()), std::out_of_range);
ASSERT_THROW(transaction_handler.add_transaction_data(3, transaction_data()), std::out_of_range);
}
} // namespace module