From: Jérôme Benoit Date: Thu, 19 Mar 2026 17:41:30 +0000 (+0100) Subject: fix(ocpp2.0): reset transaction sequence number before new transaction per E01.FR.07 X-Git-Tag: ocpp-server@v3.2.0~26 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=3c431b0be843098d4478bbdfc11dc7b21dc5f535;p=e-mobility-charging-stations-simulator.git fix(ocpp2.0): reset transaction sequence number before new transaction per E01.FR.07 --- diff --git a/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts b/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts index 02fd5234..ea0fabce 100644 --- a/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts +++ b/src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts @@ -2468,6 +2468,8 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService { const transactionId = generateUUID() try { + // E01.FR.07 + E01.FR.16 + E03.FR.01: ensure clean transaction state for new transaction + OCPP20ServiceUtils.resetTransactionSequenceNumber(chargingStation, connectorId) logger.debug( `${chargingStation.logPrefix()} ${moduleName}.handleRequestStartTransaction: Setting transaction state for connector ${connectorId.toString()}, transaction ID: ${transactionId}` ) diff --git a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RequestStartTransaction.test.ts b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RequestStartTransaction.test.ts index 4a65d95b..60eb3de0 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RequestStartTransaction.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RequestStartTransaction.test.ts @@ -581,5 +581,40 @@ await describe('F01 & F02 - Remote Start Transaction', async () => { assert.strictEqual(transactionEventCallCount, 1) }) + + // E01.FR.07 + E01.FR.16 + E03.FR.01: Verify transaction sequence number reset + await it('should reset transaction sequence number before setting up new transaction state', async () => { + const connectorStatus = mockStation.getConnectorStatus(1) + if (connectorStatus == null) { + assert.fail('Expected connectorStatus to be defined') + } + + // Set stale transaction state values + connectorStatus.transactionSeqNo = 5 + connectorStatus.transactionEvseSent = true + connectorStatus.transactionIdTokenSent = true + + const validRequest: OCPP20RequestStartTransactionRequest = { + evseId: 1, + idToken: { + idToken: 'RESET_SEQ_TOKEN', + type: OCPP20IdTokenEnumType.ISO14443, + }, + remoteStartId: 1, + } + + const response = await testableService.handleRequestStartTransaction( + mockStation, + validRequest + ) + + assert.strictEqual(response.status, RequestStartStopStatusEnumType.Accepted) + assert.notStrictEqual(response.transactionId, undefined) + + // Verify transaction sequence number was reset + assert.strictEqual(connectorStatus.transactionSeqNo, undefined) + assert.strictEqual(connectorStatus.transactionEvseSent, undefined) + assert.strictEqual(connectorStatus.transactionIdTokenSent, undefined) + }) }) })