Skip to content

Commit 8b1b2e3

Browse files
committed
init sync points, testing using DataMessageEvents
case insensitivity sucks WIP NetSim Test has zero timesteps merge fixups, build on linux Add review feedback Signed-off-by: Marius Börschig <Marius.Boerschig@vector.com>
1 parent 739965d commit 8b1b2e3

17 files changed

+158
-17
lines changed

SilKit/IntegrationTests/ITest_MessageAggregation.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ TEST_F(ITest_MessageAggregation, timeout_in_case_of_deadlock_when_using_async_si
8383
SilKit::Services::PubSub::PubSubSpec dataSpecPing{"ping", {}};
8484
SilKit::Services::PubSub::PubSubSpec dataSpecPong{"pong", {}};
8585

86-
bool msgReceived{false};
86+
std::atomic_bool msgReceived{false};
8787

8888
// participant with async simulation step handler & enabled message aggregation
8989
{
@@ -105,8 +105,8 @@ TEST_F(ITest_MessageAggregation, timeout_in_case_of_deadlock_when_using_async_si
105105
});
106106

107107
timeSyncService->SetSimulationStepHandlerAsync(
108-
[dataPublisher, lifecycleService, &msgReceived](std::chrono::nanoseconds /*now*/,
109-
std::chrono::nanoseconds /*duration*/) {
108+
[dataPublisher, lifecycleService, &msgReceived](std::chrono::nanoseconds,
109+
std::chrono::nanoseconds) {
110110
// send ping
111111
std::vector<uint8_t> ping(1, '?');
112112
dataPublisher->Publish(std::move(ping));
@@ -135,7 +135,7 @@ TEST_F(ITest_MessageAggregation, timeout_in_case_of_deadlock_when_using_async_si
135135
});
136136

137137
timeSyncService->SetSimulationStepHandlerAsync(
138-
[timeSyncService](std::chrono::nanoseconds /*now*/, std::chrono::nanoseconds /*duration*/) {
138+
[timeSyncService](std::chrono::nanoseconds, std::chrono::nanoseconds) {
139139
timeSyncService->CompleteSimulationStep();
140140
}, 1s);
141141
}

SilKit/IntegrationTests/ITest_NetSimFlexRay.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// SPDX-License-Identifier: MIT
44

55
#include "ITest_NetSim.hpp"
6+
#include "ITestThreadSafeLogger.hpp"
67
#include "silkit/services/flexray/all.hpp"
78

89
namespace {
@@ -23,8 +24,9 @@ struct ITest_NetSimFlexray : ITest_NetSim
2324
CallCountsSilKitHandlersFlexray& callCountsSilKitHandlersFlexray)
2425
{
2526
controller->AddCycleStartHandler(
26-
[&callCountsSilKitHandlersFlexray](IFlexrayController*, const FlexrayCycleStartEvent& /*msg*/) {
27+
[&callCountsSilKitHandlersFlexray](IFlexrayController*, const FlexrayCycleStartEvent& msg) {
2728
callCountsSilKitHandlersFlexray.CycleStartHandler++;
29+
Log() << "Cycle Start: " << (int)msg.cycleCounter;
2830
});
2931
controller->AddFrameHandler(
3032
[&callCountsSilKitHandlersFlexray](IFlexrayController*, const FlexrayFrameEvent& /*msg*/) {
@@ -273,13 +275,14 @@ void MySimulatedFlexrayController::OnTxBufferUpdate(
273275

274276
TEST_F(ITest_NetSimFlexray, basic_networksimulation_flexray)
275277
{
278+
const auto configSynchronizationPoints = "EnableSynchronizationPoints: true";
276279
{
277280
// ----------------------------
278281
// NetworkSimulator
279282
// ----------------------------
280283

281284
//auto configWithLogging = MakeParticipantConfigurationStringWithLogging(SilKit::Services::Logging::Level::Info);
282-
auto&& simParticipant = _simTestHarness->GetParticipant(_participantNameNetSim);
285+
auto&& simParticipant = _simTestHarness->GetParticipant(_participantNameNetSim, configSynchronizationPoints);
283286
auto&& lifecycleService = simParticipant->GetOrCreateLifecycleService();
284287
auto&& timeSyncService = simParticipant->GetOrCreateTimeSyncService();
285288
auto&& networkSimulator = simParticipant->GetOrCreateNetworkSimulator();
@@ -307,7 +310,8 @@ TEST_F(ITest_NetSimFlexray, basic_networksimulation_flexray)
307310

308311
timeSyncService->SetSimulationStepHandler(
309312
[this, simulatedNetworkPtr, lifecycleService, flexrayController](
310-
auto now, const std::chrono::nanoseconds /*duration*/) {
313+
auto now, const std::chrono::nanoseconds duration) {
314+
(void)duration;
311315
if (now == _stopAtMs)
312316
{
313317
lifecycleService->Stop("stopping the simulation");
@@ -328,7 +332,7 @@ TEST_F(ITest_NetSimFlexray, basic_networksimulation_flexray)
328332

329333
for (const auto& participantName : _participantNamesSimulated)
330334
{
331-
auto&& simParticipant = _simTestHarness->GetParticipant(participantName);
335+
auto&& simParticipant = _simTestHarness->GetParticipant(participantName, configSynchronizationPoints);
332336
auto&& lifecycleService = simParticipant->GetOrCreateLifecycleService();
333337
auto&& timeSyncService = simParticipant->GetOrCreateTimeSyncService();
334338

@@ -337,8 +341,9 @@ TEST_F(ITest_NetSimFlexray, basic_networksimulation_flexray)
337341
SetupFlexrayController(lifecycleService, flexrayController, callCounts.silKitHandlersFlexray);
338342

339343
timeSyncService->SetSimulationStepHandler(
340-
[this, flexrayController](auto now, const std::chrono::nanoseconds /*duration*/) {
344+
[this, flexrayController](auto now, const std::chrono::nanoseconds duration) {
341345
OnetimeActions(now, flexrayController);
346+
Log() << "Simulation step: " << now.count() << " : " << duration.count();
342347
}, _stepSize);
343348
}
344349
}

SilKit/source/config/ParticipantConfiguration.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,8 @@ struct ParticipantConfiguration : public IParticipantConfiguration
379379
Includes includes;
380380
Middleware middleware;
381381
Experimental experimental;
382+
// experimental synchronization points
383+
bool enableSynchronizationPoints{false};
382384
};
383385

384386
bool operator==(const CanController& lhs, const CanController& rhs);

SilKit/source/config/ParticipantConfigurationFromXImpl.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ struct ConfigIncludeData
9696
std::map<std::string, SilKit::Config::RpcClient> rpcClientCache;
9797
std::map<std::string, SilKit::Config::TraceSink> traceSinkCache;
9898
std::map<std::string, SilKit::Config::TraceSource> traceSourceCache;
99+
bool enableSynchronizationPoints;
99100
};
100101

101102

@@ -550,6 +551,8 @@ void MergeExperimentalCache(const ExperimentalCache& cache, Experimental& experi
550551
auto MergeConfigs(ConfigIncludeData& configIncludeData) -> SilKit::Config::ParticipantConfiguration
551552
{
552553
SilKit::Config::ParticipantConfiguration config;
554+
config.enableSynchronizationPoints = configIncludeData.enableSynchronizationPoints;
555+
553556
for (const auto& include : configIncludeData.configBuffer)
554557
{
555558
// Merge all vectors first!
@@ -666,6 +669,8 @@ auto PaticipantConfigurationWithIncludes(const std::string& text, struct ConfigI
666669
throw SilKit::ConfigurationError{fmt::format("Unknown schema version '{}' found in participant configuration!",
667670
configuration.schemaVersion)};
668671
}
672+
configData.enableSynchronizationPoints = configuration.enableSynchronizationPoints;
673+
669674
configData.configBuffer.push_back(ConfigInclude("root", configuration));
670675

671676
AppendToSearchPaths(configuration, configData);

SilKit/source/config/YamlReader.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,9 @@ void YamlReader::Read(SilKit::Config::ParticipantConfiguration& obj)
484484
OptionalRead(obj.middleware, "Middleware");
485485
OptionalRead(obj.includes, "Includes");
486486
OptionalRead(obj.experimental, "Experimental");
487+
488+
// design proposal
489+
OptionalRead(obj.enableSynchronizationPoints, "EnableSynchronizationPoints");
487490
}
488491

489492
void YamlReader::Read(SilKit::Config::HealthCheck& obj)

SilKit/source/config/YamlWriter.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,9 @@ void YamlWriter::Write(const SilKit::Config::ParticipantConfiguration& obj)
600600
NonDefaultWrite(obj.middleware, "Middleware", defaultObj.middleware);
601601
NonDefaultWrite(obj.includes, "Includes", defaultObj.includes);
602602
NonDefaultWrite(obj.experimental, "Experimental", defaultObj.experimental);
603+
604+
//design proposal
605+
NonDefaultWrite(obj.enableSynchronizationPoints, "EnableSynchronizationPoints", defaultObj.enableSynchronizationPoints);
603606
}
604607

605608
void YamlWriter::Write(const SilKit::Config::HealthCheck& obj)

SilKit/source/core/internal/IParticipantInternal.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,8 @@ class IParticipantInternal : public IParticipant
330330

331331
virtual auto GetMetricsProcessor() -> IMetricsProcessor* = 0;
332332
virtual auto GetMetricsSender() -> IMetricsSender* = 0;
333+
334+
virtual auto GetConfiguration() -> const Config::ParticipantConfiguration& = 0;
333335
};
334336

335337
} // namespace Core

SilKit/source/core/internal/OrchestrationDatatypes.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ struct NextSimTask
2121
std::chrono::nanoseconds duration{0};
2222
};
2323

24+
static constexpr NextSimTask ZeroSimTask{std::chrono::nanoseconds{0}, std::chrono::nanoseconds{0}};
25+
inline auto operator==(const NextSimTask& lhs, const NextSimTask& rhs)
26+
{
27+
return lhs.duration == rhs.duration && lhs.timePoint == rhs.timePoint;
28+
}
29+
2430
//! System-wide command for the simulation flow.
2531
struct SystemCommand
2632
{

SilKit/source/core/internal/traits/SilKitMsgTraits.hpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ namespace Core {
1414
// ==================================================================
1515
// Trait which checks that '.timestamp' works
1616
// ==================================================================
17+
template<class T>
18+
using RemoveCvRef = std::remove_cv_t<std::remove_reference_t<T>>;
1719

1820
template <typename T, typename = void>
1921
struct HasTimestamp : std::false_type
@@ -58,6 +60,15 @@ struct SilKitMsgTraitForbidSelfDelivery
5860
}
5961
};
6062

63+
template <class MsgT>
64+
struct SilKitMsgTraitIsSynchronizationPoint
65+
{
66+
static constexpr bool IsSynchronizationPoint()
67+
{
68+
return false;
69+
}
70+
};
71+
6172
// The final message traits
6273
template <class MsgT>
6374
struct SilKitMsgTraits
@@ -67,6 +78,7 @@ struct SilKitMsgTraits
6778
, SilKitMsgTraitVersion<MsgT>
6879
, SilKitMsgTraitSerdesName<MsgT>
6980
, SilKitMsgTraitForbidSelfDelivery<MsgT>
81+
, SilKitMsgTraitIsSynchronizationPoint<MsgT>
7082
{
7183
};
7284

@@ -110,6 +122,16 @@ struct SilKitMsgTraits
110122
} \
111123
}
112124

125+
#define DefineSilKitMsgTrait_IsSynchronizationPoint(Namespace, MsgName) \
126+
template <> \
127+
struct SilKitMsgTraitIsSynchronizationPoint<Namespace::MsgName> \
128+
{ \
129+
static constexpr bool IsSynchronizationPoint() \
130+
{ \
131+
return true; \
132+
} \
133+
}
134+
113135
DefineSilKitMsgTrait_TypeName(SilKit::Services::Logging, LogMsg);
114136
DefineSilKitMsgTrait_TypeName(VSilKit, MetricsUpdate);
115137
DefineSilKitMsgTrait_TypeName(SilKit::Services::Orchestration, SystemCommand);
@@ -164,5 +186,9 @@ DefineSilKitMsgTrait_EnforceSelfDelivery(SilKit::Services::Lin, LinSendFrameHead
164186
// Messages with forbidden self delivery
165187
DefineSilKitMsgTrait_ForbidSelfDelivery(SilKit::Services::Orchestration, SystemCommand);
166188

189+
// Messages which are Synchronization Points
190+
DefineSilKitMsgTrait_IsSynchronizationPoint(SilKit::Services::Flexray, FlexrayCycleStartEvent);
191+
DefineSilKitMsgTrait_IsSynchronizationPoint(SilKit::Services::PubSub, WireDataMessageEvent); //for testing
192+
167193
} // namespace Core
168194
} // namespace SilKit

SilKit/source/core/mock/participant/MockParticipant.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,14 +242,15 @@ class DummyMetricsManager : public IMetricsManager
242242
std::unordered_map<std::string, DummyAttributeMetric> _attributes;
243243
};
244244

245-
class DummyParticipant : public IParticipantInternal
245+
class DummyParticipant: public IParticipantInternal
246246
{
247247
public:
248248
DummyParticipant()
249249
{
250250
ON_CALL(mockLifecycleService, GetTimeSyncService).WillByDefault(testing::Return(&mockTimeSyncService));
251251
ON_CALL(mockLifecycleService, CreateTimeSyncService).WillByDefault(testing::Return(&mockTimeSyncService));
252252
ON_CALL(logger, GetLogLevel()).WillByDefault(testing::Return(Services::Logging::Level::Debug));
253+
ON_CALL(*this, GetConfiguration()).WillByDefault(testing::ReturnRef(_participantConfiguration));
253254
}
254255

255256
auto CreateCanController(const std::string& /*canonicalName*/,
@@ -720,6 +721,8 @@ class DummyParticipant : public IParticipantInternal
720721
return nullptr;
721722
}
722723

724+
MOCK_METHOD(const Config::ParticipantConfiguration&, GetConfiguration, (), (override));
725+
723726
const std::string _name = "MockParticipant";
724727
const std::string _registryUri = "silkit://mock.participant.silkit:0";
725728
testing::NiceMock<MockLogger> logger;
@@ -733,6 +736,8 @@ class DummyParticipant : public IParticipantInternal
733736
MockParticipantReplies mockParticipantReplies;
734737
DummyNetworkSimulator mockNetworkSimulator;
735738
DummyMetricsManager mockMetricsManager;
739+
Config::ParticipantConfiguration _participantConfiguration;
740+
736741
};
737742

738743
// ================================================================================

0 commit comments

Comments
 (0)