Skip to content

Commit

Permalink
smart_charging: Conform profiles in full validate profile method
Browse files Browse the repository at this point in the history
Reworks how we handle and test conforming the validity periods for
K01.FR.06.

Signed-off-by: Christopher Davis <[email protected]>
  • Loading branch information
christopher-davis-afs committed Apr 26, 2024
1 parent e383c62 commit 8f7f562
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 25 deletions.
6 changes: 4 additions & 2 deletions include/ocpp/v201/smart_charging.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,9 @@ class SmartChargingHandler {
explicit SmartChargingHandler(std::map<int32_t, std::unique_ptr<EvseInterface>>& evses);

///
/// \brief validates the given \p profile according to the specification
/// \brief validates the given \p profile according to the specification.
/// If a profile does not have validFrom or validTo set, we conform the values
/// to a representation that fits the spec.
///
ProfileValidationResultEnum validate_profile(ChargingProfile& profile, int32_t evse_id);

Expand Down Expand Up @@ -103,7 +105,7 @@ class SmartChargingHandler {
/// \brief Checks a given \p profile and associated \p evse_id validFrom and validTo range
/// This method assumes that the existing profile will have dates set for validFrom and validTo
///
bool is_overlapping_validity_period(int evse_id, ChargingProfile& profile) const;
bool is_overlapping_validity_period(int evse_id, const ChargingProfile& profile) const;

private:
std::vector<ChargingProfile> get_evse_specific_tx_default_profiles() const;
Expand Down
10 changes: 7 additions & 3 deletions lib/ocpp/v201/smart_charging.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ SmartChargingHandler::SmartChargingHandler(std::map<int32_t, std::unique_ptr<Evs
}

ProfileValidationResultEnum SmartChargingHandler::validate_profile(ChargingProfile& profile, int32_t evse_id) {
conform_validity_periods(profile);

auto result = ProfileValidationResultEnum::Valid;
if (evse_id != STATION_WIDE_ID) {
result = this->validate_evse_exists(evse_id);
Expand Down Expand Up @@ -128,6 +130,10 @@ ProfileValidationResultEnum SmartChargingHandler::validate_charging_station_max_
return ProfileValidationResultEnum::InvalidProfileType;
}

if (is_overlapping_validity_period(evse_id, profile)) {
return ProfileValidationResultEnum::DuplicateProfileValidityPeriod;
}

if (evse_id > 0) {
return ProfileValidationResultEnum::ChargingStationMaxProfileEvseIdGreaterThanZero;
}
Expand Down Expand Up @@ -307,9 +313,7 @@ std::vector<ChargingProfile> SmartChargingHandler::get_station_wide_tx_default_p
}

bool SmartChargingHandler::is_overlapping_validity_period(int candidate_evse_id,
ChargingProfile& candidate_profile) const {

conform_validity_periods(candidate_profile);
const ChargingProfile& candidate_profile) const {

if (candidate_profile.chargingProfilePurpose == ChargingProfilePurposeEnum::TxProfile) {
// This only applies to non TxProfile types.
Expand Down
48 changes: 28 additions & 20 deletions tests/lib/ocpp/v201/test_smart_charging_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -621,12 +621,14 @@ TEST_F(ChargepointTestFixtureV201, K01FR06_ExisitingProfileLastForever_RejectInc
install_profile_on_evse(DEFAULT_EVSE_ID, DEFAULT_PROFILE_ID, ocpp::DateTime(date::utc_clock::time_point::min()),
ocpp::DateTime(date::utc_clock::time_point::max()));

auto periods = create_charging_schedule_periods(0);
auto profile = create_charging_profile(
DEFAULT_PROFILE_ID + 1, ChargingProfilePurposeEnum::TxDefaultProfile,
create_charge_schedule(ChargingRateUnitEnum::A), uuid(), ChargingProfileKindEnum::Absolute, DEFAULT_STACK_LEVEL,
ocpp::DateTime("2024-01-02T13:00:00"), ocpp::DateTime("2024-03-01T13:00:00"));
create_charge_schedule(ChargingRateUnitEnum::A, periods, ocpp::DateTime("2024-01-17T17:00:00")), uuid(),
ChargingProfileKindEnum::Absolute, DEFAULT_STACK_LEVEL, ocpp::DateTime("2024-01-02T13:00:00"),
ocpp::DateTime("2024-03-01T13:00:00"));

auto sut = handler.validate_tx_default_profile(profile, DEFAULT_EVSE_ID);
auto sut = handler.validate_profile(profile, DEFAULT_EVSE_ID);

EXPECT_THAT(sut, testing::Eq(ProfileValidationResultEnum::DuplicateProfileValidityPeriod));
}
Expand All @@ -635,12 +637,13 @@ TEST_F(ChargepointTestFixtureV201, K01FR06_ExisitingProfileHasValidFromIncomingV
install_profile_on_evse(DEFAULT_EVSE_ID, DEFAULT_PROFILE_ID, ocpp::DateTime("2024-01-01T13:00:00"),
ocpp::DateTime(date::utc_clock::time_point::max()));

auto profile = create_charging_profile(DEFAULT_PROFILE_ID + 1, ChargingProfilePurposeEnum::TxDefaultProfile,
create_charge_schedule(ChargingRateUnitEnum::A), uuid(),
ChargingProfileKindEnum::Absolute, DEFAULT_STACK_LEVEL, {},
ocpp::DateTime("2024-01-01T13:00:00"));
auto periods = create_charging_schedule_periods(0);
auto profile = create_charging_profile(
DEFAULT_PROFILE_ID + 1, ChargingProfilePurposeEnum::TxDefaultProfile,
create_charge_schedule(ChargingRateUnitEnum::A, periods, ocpp::DateTime("2024-01-17T17:00:00")), uuid(),
ChargingProfileKindEnum::Absolute, DEFAULT_STACK_LEVEL, {}, ocpp::DateTime("2024-01-01T13:00:00"));

auto sut = handler.validate_tx_default_profile(profile, DEFAULT_EVSE_ID);
auto sut = handler.validate_profile(profile, DEFAULT_EVSE_ID);

EXPECT_THAT(sut, testing::Eq(ProfileValidationResultEnum::DuplicateProfileValidityPeriod));
}
Expand All @@ -649,12 +652,13 @@ TEST_F(ChargepointTestFixtureV201, K01FR06_ExisitingProfileHasValidToIncomingVal
install_profile_on_evse(DEFAULT_EVSE_ID, DEFAULT_PROFILE_ID, ocpp::DateTime("2024-02-01T13:00:00"),
ocpp::DateTime(date::utc_clock::time_point::max()));

auto profile = create_charging_profile(DEFAULT_PROFILE_ID + 1, ChargingProfilePurposeEnum::TxDefaultProfile,
create_charge_schedule(ChargingRateUnitEnum::A), uuid(),
ChargingProfileKindEnum::Absolute, DEFAULT_STACK_LEVEL,
ocpp::DateTime("2024-01-31T13:00:00"), {});
auto periods = create_charging_schedule_periods(0);
auto profile = create_charging_profile(
DEFAULT_PROFILE_ID + 1, ChargingProfilePurposeEnum::TxDefaultProfile,
create_charge_schedule(ChargingRateUnitEnum::A, periods, ocpp::DateTime("2024-01-17T17:00:00")), uuid(),
ChargingProfileKindEnum::Absolute, DEFAULT_STACK_LEVEL, ocpp::DateTime("2024-01-31T13:00:00"), {});

auto sut = handler.validate_tx_default_profile(profile, DEFAULT_EVSE_ID);
auto sut = handler.validate_profile(profile, DEFAULT_EVSE_ID);

EXPECT_THAT(sut, testing::Eq(ProfileValidationResultEnum::DuplicateProfileValidityPeriod));
}
Expand All @@ -664,11 +668,13 @@ TEST_F(ChargepointTestFixtureV201, K01FR06_ExisitingProfileHasValidPeriodIncomin
ocpp::DateTime(date::utc_clock::now() - std::chrono::hours(5 * 24)),
ocpp::DateTime(date::utc_clock::now() + std::chrono::hours(5 * 24)));

auto profile = create_charging_profile(DEFAULT_PROFILE_ID + 1, ChargingProfilePurposeEnum::TxDefaultProfile,
create_charge_schedule(ChargingRateUnitEnum::A), uuid(),
ChargingProfileKindEnum::Absolute, DEFAULT_STACK_LEVEL, {}, {});
auto periods = create_charging_schedule_periods(0);
auto profile = create_charging_profile(
DEFAULT_PROFILE_ID + 1, ChargingProfilePurposeEnum::TxDefaultProfile,
create_charge_schedule(ChargingRateUnitEnum::A, periods, ocpp::DateTime("2024-01-17T17:00:00")), uuid(),
ChargingProfileKindEnum::Absolute, DEFAULT_STACK_LEVEL, {}, {});

auto sut = handler.validate_tx_default_profile(profile, DEFAULT_EVSE_ID);
auto sut = handler.validate_profile(profile, DEFAULT_EVSE_ID);

EXPECT_THAT(sut, testing::Eq(ProfileValidationResultEnum::DuplicateProfileValidityPeriod));
}
Expand All @@ -677,12 +683,14 @@ TEST_F(ChargepointTestFixtureV201, K01FR06_ExisitingProfileHasValidPeriodIncomin
install_profile_on_evse(DEFAULT_EVSE_ID, DEFAULT_PROFILE_ID, ocpp::DateTime("2024-01-01T13:00:00"),
ocpp::DateTime("2024-02-01T13:00:00"));

auto periods = create_charging_schedule_periods(0);
auto profile = create_charging_profile(
DEFAULT_PROFILE_ID + 1, ChargingProfilePurposeEnum::TxDefaultProfile,
create_charge_schedule(ChargingRateUnitEnum::A, {}, {}), uuid(), ChargingProfileKindEnum::Absolute,
DEFAULT_STACK_LEVEL, ocpp::DateTime("2024-01-15T13:00:00"), ocpp::DateTime("2024-02-01T13:00:00"));
create_charge_schedule(ChargingRateUnitEnum::A, periods, ocpp::DateTime("2024-01-17T17:00:00")), uuid(),
ChargingProfileKindEnum::Absolute, DEFAULT_STACK_LEVEL, ocpp::DateTime("2024-01-15T13:00:00"),
ocpp::DateTime("2024-02-01T13:00:00"));

auto sut = handler.validate_tx_default_profile(profile, DEFAULT_EVSE_ID);
auto sut = handler.validate_profile(profile, DEFAULT_EVSE_ID);

EXPECT_THAT(sut, testing::Eq(ProfileValidationResultEnum::DuplicateProfileValidityPeriod));
}
Expand Down

0 comments on commit 8f7f562

Please sign in to comment.