PROFINET IO Controller Stack 1.0.0
Modern C++ implementation of a PROFINET IO Controller stack
Loading...
Searching...
No Matches
test_rpc.cpp File Reference

Unit tests for PROFINET DCE/RPC helpers and connection configuration. More...

#include <gtest/gtest.h>
#include <deque>
#include <optional>
#include <thread>
#include "mocks/mockRawEthernetSocket.h"
#include "profinet/rpc.h"
#include "profinet/rpcTypes.h"
+ Include dependency graph for test_rpc.cpp:

Go to the source code of this file.

Classes

class  profinet::rpc::RpcTests
 
class  profinet::rpc::RpcTests::TestRpcTransport
 Deterministic RPC transport used to test RPCCon without UDP. More...
 

Namespaces

namespace  profinet
 
namespace  profinet::rpc
 

Functions

 profinet::rpc::TEST_F (RpcTests, UuidBytesToStringStringToUuidBytesRoundtrip)
 
 profinet::rpc::TEST_F (RpcTests, StringToUuidBytesRejectsMalformedInput)
 
 profinet::rpc::TEST_F (RpcTests, EPMEndpointResolvesWellKnownProfinetInterfaceNames)
 
 profinet::rpc::TEST_F (RpcTests, EPMEndpointUnknownUuidIncludesUuid)
 
 profinet::rpc::TEST_F (RpcTests, EPMEndpointInterfaceNameIsCaseInsensitive)
 
 profinet::rpc::TEST_F (RpcTests, IOCRSetupCycleTimeCalculation)
 
 profinet::rpc::TEST_F (RpcTests, IOCRSetupValidateFlagsEmptySlotsAndLowWatchdog)
 
 profinet::rpc::TEST_F (RpcTests, IOCRSetupValidateEmptySlots)
 
 profinet::rpc::TEST_F (RpcTests, IOCRSetupValidateLowWatchdog)
 
 profinet::rpc::TEST_F (RpcTests, IOCRSetupValidateNormalConfiguration)
 
 profinet::rpc::TEST_F (RpcTests, CreateRpcBuildsExpectedHeader)
 
 profinet::rpc::TEST_F (RpcTests, PNRPCHeaderInterfaceUuidBytes)
 
 profinet::rpc::TEST_F (RpcTests, BuildIocrBlockUsesConfiguredSlots)
 
 profinet::rpc::TEST_F (RpcTests, GenerateNonZeroArUuid)
 
 profinet::rpc::TEST_F (RpcTests, GenerateDifferentArUuids)
 
 profinet::rpc::TEST_F (RpcTests, GenerateIndependentArAndActivityUuids)
 
 profinet::rpc::TEST_F (RpcTests, GenerateNonZeroSessionKey)
 
 profinet::rpc::TEST_F (RpcTests, GeneratedSessionKeysAreAlwaysNonZero)
 
 profinet::rpc::TEST_F (RpcTests, BuildsExpectedRemoteObjectUuid)
 
 profinet::rpc::TEST_F (RpcTests, BuildObjectUuidPreservesDeviceAndVendorBytes)
 
 profinet::rpc::TEST_F (RpcTests, BuildObjectUuidUsesFixedProfinetPrefixAndSuffix)
 
 profinet::rpc::TEST_F (RpcTests, RemoteObjectUuidHasExpectedLength)
 
 profinet::rpc::TEST_F (RpcTests, EPMEndpointInterfaceNamePnioDevice)
 
 profinet::rpc::TEST_F (RpcTests, EPMEndpointInterfaceNamePnioController)
 
 profinet::rpc::TEST_F (RpcTests, EPMEndpointInterfaceNamePnioSupervisor)
 
 profinet::rpc::TEST_F (RpcTests, EPMEndpointInterfaceNamePnioParameterServer)
 
 profinet::rpc::TEST_F (RpcTests, EPMEndpointInterfaceNameEpm)
 
 profinet::rpc::TEST_F (RpcTests, EPMEndpointInterfaceNameUnknown)
 
 profinet::rpc::TEST_F (RpcTests, EPMEndpointInterfaceNameIsCaseInsensitiveForAllKnownInterfaces)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerRejectsTooShortTower)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerStopsOnTruncatedFloorHeader)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerStopsOnTruncatedLhs)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerStopsOnTruncatedRhsLength)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerStopsOnTruncatedRhs)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerSkipsEmptyLhs)
 
 profinet::rpc::TEST_F (RpcTests, MakeInterfaceTowerLhsCreatesValidInterfaceBlock)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerParsesInterfaceFloor)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerSkipsEmptyFloor)
 
 profinet::rpc::TEST_F (RpcTests, MakeEpmTowerEncodesEmptyThenInterfaceFloor)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerParsesInterfaceUuidAndVersions)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerInterfaceFloorWithoutMinorVersion)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerRejectsShortInterfaceFloor)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerParsesUdpProtocol)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerParsesBigEndianPort)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerIgnoresShortPortRhs)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerParsesIpv4Address)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerIgnoresShortIpRhs)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerParsesCompleteEndpoint)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerOnlyUsesFirstInterfaceFloorForInterfaceData)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerIgnoresInterfaceDataFromLaterFloor)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerIgnoresUnknownProtocol)
 
 profinet::rpc::TEST_F (RpcTests, ParseEpmTowerContinuesAcrossAllFloors)
 Verifies that protocol, port and IP floors are parsed after the interface floor.
 
 profinet::rpc::TEST_F (RpcTests, EpmLookupReturnsParsedEndpoint)
 
 profinet::rpc::TEST_F (RpcTests, EpmLookupBuildsInterfaceFilteredRequest)
 
 profinet::rpc::TEST_F (RpcTests, EpmLookupReturnsEmptyForShortResponse)
 
 profinet::rpc::TEST_F (RpcTests, EpmLookupReturnsEmptyForFaultResponse)
 
 profinet::rpc::TEST_F (RpcTests, EpmLookupReturnsEmptyForUnexpectedResponseType)
 
 profinet::rpc::TEST_F (RpcTests, EpmLookupReturnsEmptyForShortBody)
 
 profinet::rpc::TEST_F (RpcTests, EpmLookupClampsBodyLengthToReceivedData)
 
 profinet::rpc::TEST_F (RpcTests, EpmLookupStopsOnTruncatedEntryUuid)
 
 profinet::rpc::TEST_F (RpcTests, EpmLookupStopsOnTruncatedTowerPointer)
 
 profinet::rpc::TEST_F (RpcTests, EpmLookupStopsOnTruncatedAnnotationLength)
 
 profinet::rpc::TEST_F (RpcTests, EpmLookupHandlesZeroLengthAnnotation)
 
 profinet::rpc::TEST_F (RpcTests, EpmLookupTrimsTrailingAnnotationZeros)
 
 profinet::rpc::TEST_F (RpcTests, EpmLookupIgnoresEntryWithInvalidTower)
 
 profinet::rpc::TEST_F (RpcTests, GetStationInfoReturnsFirstDirectResponse)
 
 profinet::rpc::TEST_F (RpcTests, GetStationInfoSendsStationNameRequest)
 
 profinet::rpc::TEST_F (RpcTests, GetStationInfoFallsBackToDiscovery)
 
 profinet::rpc::TEST_F (RpcTests, GetStationInfoDiscoveryMatchesStationNameCaseInsensitive)
 
 profinet::rpc::TEST_F (RpcTests, GetStationInfoDiscoverySkipsNonMatchingDevice)
 
 profinet::rpc::TEST_F (RpcTests, GetStationInfoThrowsWhenDiscoveryFindsNoMatchingDevice)
 
 profinet::rpc::TEST_F (RpcTests, GetStationInfoNotFoundExceptionContainsStationName)
 
 profinet::rpc::TEST_F (RpcTests, GetStationInfoThrowsWhenDiscoveryReturnsNoResponses)
 
 profinet::rpc::TEST_F (RpcTests, GetStationInfoDoesNotFilterNonEmptyDirectResponse)
 
 profinet::rpc::TEST_F (RpcTests, CreateNrdBuildsExpectedWrapper)
 
 profinet::rpc::TEST_F (RpcTests, CreateNrdHandlesEmptyPayload)
 
 profinet::rpc::TEST_F (RpcTests, CreateNrdRoundTripsThroughSerialization)
 
 profinet::rpc::TEST_F (RpcTests, BuildAlarmCrBlockUsesProfinetEtherTypeForTransportZero)
 
 profinet::rpc::TEST_F (RpcTests, BuildAlarmCrBlockUsesIpEtherTypeForNonZeroTransport)
 
 profinet::rpc::TEST_F (RpcTests, BuildAlarmCrBlockEncodesPriority)
 
 profinet::rpc::TEST_F (RpcTests, BuildAlarmCrBlockCombinesTransportAndPriority)
 
 profinet::rpc::TEST_F (RpcTests, BuildAlarmCrBlockCreatesExpectedBlockHeader)
 
 profinet::rpc::TEST_F (RpcTests, ParseAlarmCrResponseReturnsMinusOneForEmptyData)
 
 profinet::rpc::TEST_F (RpcTests, ParseAlarmCrResponseReturnsMinusOneForShortData)
 
 profinet::rpc::TEST_F (RpcTests, ParseAlarmCrResponseIgnoresUnrelatedBlock)
 
 profinet::rpc::TEST_F (RpcTests, ParseAlarmCrResponseReturnsLocalAlarmReference)
 
 profinet::rpc::TEST_F (RpcTests, ParseAlarmCrResponseContinuesAfterUnrelatedBlock)
 
 profinet::rpc::TEST_F (RpcTests, ParseAlarmCrResponseContinuesAfterMalformedAlarmBlock)
 
 profinet::rpc::TEST_F (RpcTests, ParseAlarmCrResponseIgnoresTruncatedAlarmBlock)
 
 profinet::rpc::TEST_F (RpcTests, ParseAlarmCrResponseContinuesAfterMalformedBlock)
 
 profinet::rpc::TEST_F (RpcTests, ParseAlarmCrResponseReturnsMinusOneAfterUnrelatedBlocks)
 
 profinet::rpc::TEST_F (RpcTests, IsConnectedReturnsFalseInitially)
 
 profinet::rpc::TEST_F (RpcTests, InfoReturnsDeviceDescription)
 
 profinet::rpc::TEST_F (RpcTests, ArUuidReturnsConnectionArUuid)
 
 profinet::rpc::TEST_F (RpcTests, SessionKeyReturnsInitialValue)
 
 profinet::rpc::TEST_F (RpcTests, LocalAlarmRefReturnsConfiguredValue)
 
 profinet::rpc::TEST_F (RpcTests, DeviceAlarmRefReturnsZeroInitially)
 
 profinet::rpc::TEST_F (RpcTests, HasAlarmCrReturnsFalseInitially)
 
 profinet::rpc::TEST_F (RpcTests, ParseIocrResponseReturnsZeroForEmptyData)
 
 profinet::rpc::TEST_F (RpcTests, ParseIocrResponseReturnsZeroForShortData)
 
 profinet::rpc::TEST_F (RpcTests, ParseIocrResponseIgnoresUnrelatedBlock)
 
 profinet::rpc::TEST_F (RpcTests, ParseIocrResponseIgnoresDifferentIocrType)
 
 profinet::rpc::TEST_F (RpcTests, ParseIocrResponseReturnsMatchingFrameId)
 
 profinet::rpc::TEST_F (RpcTests, ParseIocrResponseIgnoresMalformedIocrBlock)
 
 profinet::rpc::TEST_F (RpcTests, ParseIocrResponseFindsMatchingBlockAfterUnrelatedBlock)
 
 profinet::rpc::TEST_F (RpcTests, SendReceiveReturnsResponseAndMarksConnectionLive)
 
 profinet::rpc::TEST_F (RpcTests, SendReceiveRetriesAfterRequestPacket)
 
 profinet::rpc::TEST_F (RpcTests, SendReceiveThrowsForShortResponse)
 
 profinet::rpc::TEST_F (RpcTests, SendReceiveThrowsRpcFaultError)
 
 profinet::rpc::TEST_F (RpcTests, SendReceiveThrowsForRejectedResponse)
 
 profinet::rpc::TEST_F (RpcTests, SendReceiveThrowsForUnexpectedPacketType)
 
 profinet::rpc::TEST_F (RpcTests, CheckTimeoutDoesNothingWhenNotConnected)
 
 profinet::rpc::TEST_F (RpcTests, CheckTimeoutDoesNotReconnectBeforeTimeout)
 
 profinet::rpc::TEST_F (RpcTests, CheckTimeoutReconnectsAfterTimeout)
 
 profinet::rpc::TEST_F (RpcTests, ConnectRequiresSourceMacForInitialConnection)
 
 profinet::rpc::TEST_F (RpcTests, ConnectEstablishesBasicApplicationRelation)
 
 profinet::rpc::TEST_F (RpcTests, ConnectRequestsAlarmCr)
 
 profinet::rpc::TEST_F (RpcTests, ConnectLeavesAlarmCrDisabledWhenResponseHasNoAlarmCr)
 
 profinet::rpc::TEST_F (RpcTests, ConnectConvertsDevicePnioError)
 
 profinet::rpc::TEST_F (RpcTests, ConnectConvertsRpcError)
 
 profinet::rpc::TEST_F (RpcTests, ConnectReusesSourceMacDuringReconnect)
 
 profinet::rpc::TEST_F (RpcTests, ConnectReplacesSourceMacDuringReconnect)
 
 profinet::rpc::TEST_F (RpcTests, ConnectRejectsMissingSourceMacDuringReconnect)
 
 profinet::rpc::TEST_F (RpcTests, ConnectReturnsConnectResultForIocrSetup)
 
 profinet::rpc::TEST_F (RpcTests, ReadReturnsParsedIodResponse)
 
 profinet::rpc::TEST_F (RpcTests, ReadThrowsPnioErrorForDeviceError)
 
 profinet::rpc::TEST_F (RpcTests, ReadImplicitReturnsParsedIodResponse)
 
 profinet::rpc::TEST_F (RpcTests, ReadImplicitThrowsPnioErrorForDeviceError)
 
 profinet::rpc::TEST_F (RpcTests, WriteCompletesSuccessfully)
 
 profinet::rpc::TEST_F (RpcTests, WriteThrowsPnioErrorForDeviceError)
 
 profinet::rpc::TEST_F (RpcTests, ReadRawReturnsPayload)
 
 profinet::rpc::TEST_F (RpcTests, ReadImWrappersReadAllIndividualIndices)
 
 profinet::rpc::TEST_F (RpcTests, ReadAllImReturnsAllSuccessfulRecords)
 
 profinet::rpc::TEST_F (RpcTests, ReadAllImIgnoresRpcErrorForOptionalRecord)
 
 profinet::rpc::TEST_F (RpcTests, ReadAllImIgnoresStandardExceptionForOptionalRecord)
 
 profinet::rpc::TEST_F (RpcTests, ReadAllImPropagatesIm0Failure)
 
 profinet::rpc::TEST_F (RpcTests, WriteMultipleReturnsEmptyForNoWrites)
 
 profinet::rpc::TEST_F (RpcTests, WriteMultipleSendsMultipleWrites)
 
 profinet::rpc::TEST_F (RpcTests, WriteMultipleThrowsPnioErrorForDeviceError)
 
 profinet::rpc::TEST_F (RpcTests, ReadModuleDiffReturnsParsedModuleDifference)
 
 profinet::rpc::TEST_F (RpcTests, ReadDiagnosisUsesFullDiagnosisParser)
 
 profinet::rpc::TEST_F (RpcTests, ReadDiagnosisFallsBackToSimpleParser)
 
 profinet::rpc::TEST_F (RpcTests, ReadDiagnosisReturnsEmptyForShortDiagnosisPayload)
 
 profinet::rpc::TEST_F (RpcTests, ReadDiagnosisReturnsEmptyForRpcError)
 
 profinet::rpc::TEST_F (RpcTests, ReadAllDiagnosisReturnsNonEmptyDiagnosisResults)
 
 profinet::rpc::TEST_F (RpcTests, ReadAllDiagnosisContinuesAfterRpcError)
 
 profinet::rpc::TEST_F (RpcTests, ReadPdRealDataReturnsParsedData)
 
 profinet::rpc::TEST_F (RpcTests, ReadRealIdentificationDataReturnsParsedData)
 
 profinet::rpc::TEST_F (RpcTests, DiscoverSlotsReturnsRealIdentificationSlots)
 
 profinet::rpc::TEST_F (RpcTests, DiscoverTopologyReturnsBothTopologyRecords)
 
 profinet::rpc::TEST_F (RpcTests, EnumerateIndicesReportsAllProbeOutcomes)
 
 profinet::rpc::TEST_F (RpcTests, SendControlRejectsDisconnectedConnection)
 
 profinet::rpc::TEST_F (RpcTests, SendControlSendsWithoutWaiting)
 
 profinet::rpc::TEST_F (RpcTests, SendControlReturnsResponsePayload)
 
 profinet::rpc::TEST_F (RpcTests, SendControlThrowsPnioErrorForDeviceError)
 
 profinet::rpc::TEST_F (RpcTests, PrmBeginSendsExpectedControlCommand)
 
 profinet::rpc::TEST_F (RpcTests, PrmEndSendsExpectedControlCommand)
 
 profinet::rpc::TEST_F (RpcTests, ReadyForRtClass3SendsExpectedControlCommand)
 
 profinet::rpc::TEST_F (RpcTests, ParseRawRpcHeaderRejectsShortData)
 
 profinet::rpc::TEST_F (RpcTests, ParseRawRpcHeaderParsesBigEndian)
 
 profinet::rpc::TEST_F (RpcTests, ParseRawRpcHeaderParsesLittleEndian)
 
 profinet::rpc::TEST_F (RpcTests, ParseRawRpcHeaderPreservesSerialHigh)
 
 profinet::rpc::TEST_F (RpcTests, ParseRawRpcHeaderExtractsPayloadAfterFixedHeader)
 
 profinet::rpc::TEST_F (RpcTests, ApplicationReadyThrowsWhenNotConnected)
 
 profinet::rpc::TEST_F (RpcTests, ApplicationReadySkipsInvalidRawRpcPacket)
 
 profinet::rpc::TEST_F (RpcTests, ApplicationReadySkipsNonRequestPacket)
 
 profinet::rpc::TEST_F (RpcTests, ApplicationReadySkipsNonControlOperation)
 
 profinet::rpc::TEST_F (RpcTests, ApplicationReadySkipsShortNrdPayload)
 
 profinet::rpc::TEST_F (RpcTests, ApplicationReadySkipsShortNrdBody)
 
 profinet::rpc::TEST_F (RpcTests, ApplicationReadySkipsWrongControlBlockType)
 
 profinet::rpc::TEST_F (RpcTests, ApplicationReadyProcessesBigEndianRequest)
 
 profinet::rpc::TEST_F (RpcTests, ApplicationReadyProcessesLittleEndianRequest)
 
 profinet::rpc::TEST_F (RpcTests, ApplicationReadyAcceptsUnexpectedControlCommand)
 
 profinet::rpc::TEST_F (RpcTests, ApplicationReadyPropagatesReceiveException)
 
 profinet::rpc::TEST_F (RpcTests, DisconnectSendsReleaseRequestAndClearsLive)
 
 profinet::rpc::TEST_F (RpcTests, DisconnectBuildsCorrectReleaseBlock)
 
 profinet::rpc::TEST_F (RpcTests, DisconnectDoesNothingWhenNotLive)
 
 profinet::rpc::TEST_F (RpcTests, DisconnectSwallowsSendExceptionAndClearsLive)
 
 profinet::rpc::TEST_F (RpcTests, DisconnectAlwaysClearsLive)
 
 profinet::rpc::TEST_F (RpcTests, CloseDisconnectsAndClosesBothTransports)
 
 profinet::rpc::TEST_F (RpcTests, CloseClosesBothTransportsWhenNotLive)
 

Detailed Description

Unit tests for PROFINET DCE/RPC helpers and connection configuration.

Verifies UUID conversion, EPM endpoint identification, IOCR setup validation, RPC header construction, and IOCR block generation provided by rpc.h.

The tests cover:

  • Conversion between UUID byte arrays and canonical UUID strings.
  • Rejection of malformed UUID strings.
  • Recognition of well-known PROFINET EPM interface UUIDs.
  • Case-insensitive EPM interface UUID matching.
  • Formatting of unknown EPM interface UUIDs.
  • IOCR cycle-time calculation from send-clock factor and reduction ratio.
  • Validation warnings for missing I/O slots and insufficient watchdog factors.
  • Acceptance of a normal IOCR configuration.
  • Construction of PNRPCHeader requests with the expected DCE/RPC fields.
  • Verification of the PROFINET device interface UUID wire representation.
  • Construction of IOCR blocks from configured I/O slots.
  • Verification of IOCR type, data length, and API object counts.

The tests focus on deterministic protocol construction and configuration behavior without requiring a live PROFINET device or network connection.

Definition in file test_rpc.cpp.