Skip to content
Snippets Groups Projects
Commit ca0dc7bd authored by Elnagdy Elnagdy's avatar Elnagdy Elnagdy
Browse files

Merge branch 'fix_speedaction_segfault' into 'main'

Add input validation to TransitionDynamics conversion

See merge request !241
parents 33308968 f312a823
No related branches found
No related tags found
1 merge request!241Add input validation to TransitionDynamics conversion
/********************************************************************************
* Copyright (c) 2021-2024 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
* Copyright (c) 2021-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
* Copyright (c) 2025, Ansys, Inc.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
......@@ -11,9 +11,14 @@
#include "Conversion/OscToMantle/ConvertScenarioTransitionDynamics.h"
#include <ApiClassInterfacesV1_3.h>
#include <EnumerationsV1_3.h>
#include <MantleAPI/Traffic/control_strategy.h>
#include <MantleAPI/Traffic/entity_helper.h>
#include <memory>
#include <optional>
#include <stdexcept>
#include "Conversion/OscToMantle/ConvertScenarioShape.h"
......@@ -61,13 +66,23 @@ mantle_api::Dimension ConvertToMantleApi(const NET_ASAM_OPENSCENARIO::v1_3::Dyna
TransitionDynamics ConvertScenarioTransitionDynamics(
const std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::ITransitionDynamics>& transitionDynamics)
{
return {
{/*.dimension = */ detail::ConvertToMantleApi(transitionDynamics->GetDynamicsDimension()),
/*.shape = */ ConvertScenarioShape(transitionDynamics->GetDynamicsShape()),
/*.value = */ transitionDynamics->GetValue()},
const auto kShape = ConvertScenarioShape(transitionDynamics->GetDynamicsShape());
const auto kValue = transitionDynamics->GetValue();
if (kShape != mantle_api::Shape::kStep && kValue <= 0.0)
{
throw std::invalid_argument(
"ConvertScenarioTransitionDynamics: 'value' must be greater than zero "
"if 'dynamicsShape' is not 'step'. Please adjust the scenario.");
}
const std::optional<FollowingMode> kFollowingMode =
transitionDynamics->IsSetFollowingMode()
? std::make_optional(detail::ConvertToOse(transitionDynamics->GetFollowingMode()))
: std::nullopt};
? std::make_optional<FollowingMode>(detail::ConvertToOse(transitionDynamics->GetFollowingMode()))
: std::nullopt;
const auto kDimension = detail::ConvertToMantleApi(transitionDynamics->GetDynamicsDimension());
return {{kDimension, kShape, kValue}, kFollowingMode};
}
} // namespace OpenScenarioEngine::v1_3
\ No newline at end of file
} // namespace OpenScenarioEngine::v1_3
......@@ -11,12 +11,11 @@
#pragma once
#include <ApiClassInterfacesV1_3.h>
#include <MantleAPI/Traffic/control_strategy.h>
#include <openScenarioLib/generated/v1_3/api/ApiClassInterfacesV1_3.h>
#include <memory>
#include <optional>
#include <string>
namespace OpenScenarioEngine::v1_3
{
......@@ -35,4 +34,4 @@ struct TransitionDynamics
TransitionDynamics ConvertScenarioTransitionDynamics(
const std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::ITransitionDynamics>& transitionDynamics);
} // namespace OpenScenarioEngine::v1_3
\ No newline at end of file
} // namespace OpenScenarioEngine::v1_3
/********************************************************************************
* Copyright (c) 2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
********************************************************************************/
#include <ApiClassImplV1_3.h>
#include <EnumerationsV1_3.h>
#include <gtest/gtest.h>
#include <memory>
#include <stdexcept>
#include "Conversion/OscToMantle/ConvertScenarioTransitionDynamics.h"
class TransitionDynamicsTestFixture : public testing::Test
{
protected:
static std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::TransitionDynamicsImpl> CreateTransitionDynamics(
const NET_ASAM_OPENSCENARIO::v1_3::DynamicsDimension& dimension,
const NET_ASAM_OPENSCENARIO::v1_3::DynamicsShape& shape,
const double& value)
{
std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::TransitionDynamicsImpl> transistion_dynamics{
std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::TransitionDynamicsImpl>()};
transistion_dynamics->SetDynamicsDimension(dimension);
transistion_dynamics->SetDynamicsShape(shape);
transistion_dynamics->SetValue(value);
return transistion_dynamics;
}
const NET_ASAM_OPENSCENARIO::v1_3::DynamicsDimension kDimensionTime{
NET_ASAM_OPENSCENARIO::v1_3::DynamicsDimension::TIME};
const NET_ASAM_OPENSCENARIO::v1_3::DynamicsShape kShapeLinear{NET_ASAM_OPENSCENARIO::v1_3::DynamicsShape::LINEAR};
};
class TransitionDynamicsTestFixtureP : public TransitionDynamicsTestFixture, public testing::WithParamInterface<double>
{
};
INSTANTIATE_TEST_SUITE_P(TransitionDynamicsTestFixture, TransitionDynamicsTestFixtureP, testing::Values(0.0, -1.0));
TEST_P(TransitionDynamicsTestFixtureP, GivenShapeWithInvalidInput_WhenConvert_ThenThrowExecption)
{
const double kInvalidValue{GetParam()};
std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::TransitionDynamicsImpl> transistion_dynamics{
CreateTransitionDynamics(kDimensionTime, kShapeLinear, kInvalidValue)};
EXPECT_THROW(OpenScenarioEngine::v1_3::ConvertScenarioTransitionDynamics(transistion_dynamics),
std::invalid_argument);
}
TEST_F(TransitionDynamicsTestFixture, GivenShapeWithValidInput_WhenConvert_ThenNoExecption)
{
const double kValidValue{1.0};
std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::TransitionDynamicsImpl> transistion_dynamics{
CreateTransitionDynamics(kDimensionTime, kShapeLinear, kValidValue)};
EXPECT_NO_THROW(OpenScenarioEngine::v1_3::ConvertScenarioTransitionDynamics(transistion_dynamics));
}
/*******************************************************************************
* Copyright (c) 2021-2024, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
* Copyright (c) 2021-2025, Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
* Copyright (c) 2022-2025 Ansys, Inc.
*
* This program and the accompanying materials are made
......@@ -257,6 +257,9 @@ std::shared_ptr<NET_ASAM_OPENSCENARIO::v1_3::IRelativeTargetSpeedWriter> FakeRel
FakeTransitionDynamicsBuilder::FakeTransitionDynamicsBuilder()
: transition_dynamics_(std::make_shared<NET_ASAM_OPENSCENARIO::v1_3::TransitionDynamicsImpl>())
{
transition_dynamics_->SetDynamicsShape(NET_ASAM_OPENSCENARIO::v1_3::DynamicsShape::STEP);
transition_dynamics_->SetDynamicsDimension(NET_ASAM_OPENSCENARIO::v1_3::DynamicsDimension::TIME);
transition_dynamics_->SetValue(0.0);
}
FakeTransitionDynamicsBuilder::FakeTransitionDynamicsBuilder(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment