From: Jérôme Benoit Date: Thu, 26 Feb 2026 06:57:11 +0000 (+0100) Subject: test(ocpp2): skip only SetVariables on Windows (identified via CI logs) X-Git-Tag: ocpp-server@v3.0.0~145 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=2f8841dba0668b11df7d278f7b9143bd61bd4da8;p=e-mobility-charging-stations-simulator.git test(ocpp2): skip only SetVariables on Windows (identified via CI logs) --- diff --git a/tests/charging-station/ocpp/2.0/OCPP20CertificateManager.test.ts b/tests/charging-station/ocpp/2.0/OCPP20CertificateManager.test.ts index 793ea841..2174c300 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20CertificateManager.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20CertificateManager.test.ts @@ -44,8 +44,7 @@ const _EXPECTED_HASH_DATA: CertificateHashDataType = { serialNumber: expect.any(String), } -// FIXME: tests hang on Windows since certificate management merge -await describe('OCPP20CertificateManager', { skip: process.platform === 'win32' }, async () => { +await describe('OCPP20CertificateManager', async () => { afterEach(async () => { await rm(`dist/assets/configurations/${TEST_STATION_HASH_ID}`, { force: true, diff --git a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-SetVariables.test.ts b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-SetVariables.test.ts index 0f0c8bba..3cc0a8c7 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-SetVariables.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-SetVariables.test.ts @@ -50,7 +50,8 @@ interface OCPP20GetVariablesRequest { getVariableData: OCPP20GetVariableDataType[] } -await describe('B05 - Set Variables', async () => { +// FIXME: tests hang on Windows - root cause unknown +await describe('B05 - Set Variables', { skip: process.platform === 'win32' }, async () => { const mockChargingStation = createChargingStation({ baseName: TEST_CHARGING_STATION_BASE_NAME, connectorsCount: 3, diff --git a/tests/charging-station/ocpp/2.0/OCPP20RequestService-SignCertificate.test.ts b/tests/charging-station/ocpp/2.0/OCPP20RequestService-SignCertificate.test.ts index f74386ea..bda7d1ef 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20RequestService-SignCertificate.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20RequestService-SignCertificate.test.ts @@ -38,241 +38,229 @@ const createMockRequestService = (responseOverride?: Partial { - const mockChargingStation = createChargingStation({ - baseName: TEST_CHARGING_STATION_BASE_NAME, - connectorsCount: 3, - evseConfiguration: { evsesCount: 3 }, - heartbeatInterval: Constants.DEFAULT_HEARTBEAT_INTERVAL, - stationInfo: { - ocppStrictCompliance: false, - ocppVersion: OCPPVersion.VERSION_201, - }, - websocketPingInterval: Constants.DEFAULT_WEBSOCKET_PING_INTERVAL, - }) - - // Set up configuration with OrganizationName - mockChargingStation.ocppConfiguration = { - configurationKey: [{ key: 'SecurityCtrlr.OrganizationName', value: MOCK_ORGANIZATION_NAME }], - } +await describe('I02 - SignCertificate Request', async () => { + const mockChargingStation = createChargingStation({ + baseName: TEST_CHARGING_STATION_BASE_NAME, + connectorsCount: 3, + evseConfiguration: { evsesCount: 3 }, + heartbeatInterval: Constants.DEFAULT_HEARTBEAT_INTERVAL, + stationInfo: { + ocppStrictCompliance: false, + ocppVersion: OCPPVersion.VERSION_201, + }, + websocketPingInterval: Constants.DEFAULT_WEBSOCKET_PING_INTERVAL, + }) + + // Set up configuration with OrganizationName + mockChargingStation.ocppConfiguration = { + configurationKey: [{ key: 'SecurityCtrlr.OrganizationName', value: MOCK_ORGANIZATION_NAME }], + } - await describe('CSR Generation', async () => { - await it('Should generate CSR with PKCS#10 PEM format', async () => { - const requestService = createMockRequestService() + await describe('CSR Generation', async () => { + await it('Should generate CSR with PKCS#10 PEM format', async () => { + const requestService = createMockRequestService() - const response = await (requestService as any).requestSignCertificate( - mockChargingStation, - CertificateSigningUseEnumType.ChargingStationCertificate - ) + const response = await (requestService as any).requestSignCertificate( + mockChargingStation, + CertificateSigningUseEnumType.ChargingStationCertificate + ) - expect(response).toBeDefined() - expect(response.status).toBe(GenericStatus.Accepted) + expect(response).toBeDefined() + expect(response.status).toBe(GenericStatus.Accepted) - const sendMessageMock = (requestService as any).sendMessage - expect(sendMessageMock.mock.calls.length).toBeGreaterThan(0) + const sendMessageMock = (requestService as any).sendMessage + expect(sendMessageMock.mock.calls.length).toBeGreaterThan(0) - const sentPayload = sendMessageMock.mock.calls[0] - .arguments[2] as OCPP20SignCertificateRequest - expect(sentPayload.csr).toBeDefined() - expect(sentPayload.csr).toContain('-----BEGIN CERTIFICATE REQUEST-----') - expect(sentPayload.csr).toContain('-----END CERTIFICATE REQUEST-----') - }) + const sentPayload = sendMessageMock.mock.calls[0].arguments[2] as OCPP20SignCertificateRequest + expect(sentPayload.csr).toBeDefined() + expect(sentPayload.csr).toContain('-----BEGIN CERTIFICATE REQUEST-----') + expect(sentPayload.csr).toContain('-----END CERTIFICATE REQUEST-----') + }) - await it('Should include OrganizationName from SecurityCtrlr config in CSR', async () => { - const requestService = createMockRequestService() - - await (requestService as any).requestSignCertificate( - mockChargingStation, - CertificateSigningUseEnumType.ChargingStationCertificate - ) - - const sendMessageMock = (requestService as any).sendMessage - const sentPayload = sendMessageMock.mock.calls[0] - .arguments[2] as OCPP20SignCertificateRequest - expect(sentPayload.csr).toBeDefined() - expect(sentPayload.csr).toContain('-----BEGIN CERTIFICATE REQUEST-----') - - const csrRegex = - /-----BEGIN CERTIFICATE REQUEST-----\n(.+?)\n-----END CERTIFICATE REQUEST-----/ - const csrExecResult = csrRegex.exec(sentPayload.csr) - expect(csrExecResult).toBeDefined() - const csrData = csrExecResult?.[1] - const decodedCsr = Buffer.from(csrData ?? '', 'base64').toString('utf-8') - expect(decodedCsr).toContain('O=Test Organization Inc.') - }) + await it('Should include OrganizationName from SecurityCtrlr config in CSR', async () => { + const requestService = createMockRequestService() + + await (requestService as any).requestSignCertificate( + mockChargingStation, + CertificateSigningUseEnumType.ChargingStationCertificate + ) + + const sendMessageMock = (requestService as any).sendMessage + const sentPayload = sendMessageMock.mock.calls[0].arguments[2] as OCPP20SignCertificateRequest + expect(sentPayload.csr).toBeDefined() + expect(sentPayload.csr).toContain('-----BEGIN CERTIFICATE REQUEST-----') + + const csrRegex = + /-----BEGIN CERTIFICATE REQUEST-----\n(.+?)\n-----END CERTIFICATE REQUEST-----/ + const csrExecResult = csrRegex.exec(sentPayload.csr) + expect(csrExecResult).toBeDefined() + const csrData = csrExecResult?.[1] + const decodedCsr = Buffer.from(csrData ?? '', 'base64').toString('utf-8') + expect(decodedCsr).toContain('O=Test Organization Inc.') }) + }) - await describe('ChargingStationCertificate Type', async () => { - await it('Should send SignCertificateRequest with ChargingStationCertificate type', async () => { - const requestService = createMockRequestService() + await describe('ChargingStationCertificate Type', async () => { + await it('Should send SignCertificateRequest with ChargingStationCertificate type', async () => { + const requestService = createMockRequestService() - await (requestService as any).requestSignCertificate( - mockChargingStation, - CertificateSigningUseEnumType.ChargingStationCertificate - ) + await (requestService as any).requestSignCertificate( + mockChargingStation, + CertificateSigningUseEnumType.ChargingStationCertificate + ) - const sendMessageMock = (requestService as any).sendMessage - const sentPayload = sendMessageMock.mock.calls[0] - .arguments[2] as OCPP20SignCertificateRequest + const sendMessageMock = (requestService as any).sendMessage + const sentPayload = sendMessageMock.mock.calls[0].arguments[2] as OCPP20SignCertificateRequest - expect(sentPayload.certificateType).toBe( - CertificateSigningUseEnumType.ChargingStationCertificate - ) - }) + expect(sentPayload.certificateType).toBe( + CertificateSigningUseEnumType.ChargingStationCertificate + ) }) + }) - await describe('V2GCertificate Type', async () => { - await it('Should send SignCertificateRequest with V2GCertificate type', async () => { - const requestService = createMockRequestService() + await describe('V2GCertificate Type', async () => { + await it('Should send SignCertificateRequest with V2GCertificate type', async () => { + const requestService = createMockRequestService() - await (requestService as any).requestSignCertificate( - mockChargingStation, - CertificateSigningUseEnumType.V2GCertificate - ) + await (requestService as any).requestSignCertificate( + mockChargingStation, + CertificateSigningUseEnumType.V2GCertificate + ) - const sendMessageMock = (requestService as any).sendMessage - const sentPayload = sendMessageMock.mock.calls[0] - .arguments[2] as OCPP20SignCertificateRequest + const sendMessageMock = (requestService as any).sendMessage + const sentPayload = sendMessageMock.mock.calls[0].arguments[2] as OCPP20SignCertificateRequest - expect(sentPayload.certificateType).toBe(CertificateSigningUseEnumType.V2GCertificate) - }) + expect(sentPayload.certificateType).toBe(CertificateSigningUseEnumType.V2GCertificate) }) + }) - await describe('CSMS Response Handling', async () => { - await it('Should return Accepted response from CSMS', async () => { - const requestService = createMockRequestService({ - status: GenericStatus.Accepted, - }) - - const response: OCPP20SignCertificateResponse = await ( - requestService as any - ).requestSignCertificate( - mockChargingStation, - CertificateSigningUseEnumType.ChargingStationCertificate - ) - - expect(response).toBeDefined() - expect(response.status).toBe(GenericStatus.Accepted) + await describe('CSMS Response Handling', async () => { + await it('Should return Accepted response from CSMS', async () => { + const requestService = createMockRequestService({ + status: GenericStatus.Accepted, }) - await it('Should return Rejected response from CSMS', async () => { - const requestService = createMockRequestService({ - status: GenericStatus.Rejected, - statusInfo: { - reasonCode: 'InvalidCSR', - }, - }) - - const response: OCPP20SignCertificateResponse = await ( - requestService as any - ).requestSignCertificate( - mockChargingStation, - CertificateSigningUseEnumType.ChargingStationCertificate - ) - - expect(response).toBeDefined() - expect(response.status).toBe(GenericStatus.Rejected) - expect(response.statusInfo).toBeDefined() - expect(response.statusInfo?.reasonCode).toBe('InvalidCSR') + const response: OCPP20SignCertificateResponse = await ( + requestService as any + ).requestSignCertificate( + mockChargingStation, + CertificateSigningUseEnumType.ChargingStationCertificate + ) + + expect(response).toBeDefined() + expect(response.status).toBe(GenericStatus.Accepted) + }) + + await it('Should return Rejected response from CSMS', async () => { + const requestService = createMockRequestService({ + status: GenericStatus.Rejected, + statusInfo: { + reasonCode: 'InvalidCSR', + }, }) + + const response: OCPP20SignCertificateResponse = await ( + requestService as any + ).requestSignCertificate( + mockChargingStation, + CertificateSigningUseEnumType.ChargingStationCertificate + ) + + expect(response).toBeDefined() + expect(response.status).toBe(GenericStatus.Rejected) + expect(response.statusInfo).toBeDefined() + expect(response.statusInfo?.reasonCode).toBe('InvalidCSR') }) + }) - await describe('Optional Certificate Type', async () => { - await it('Should send SignCertificateRequest without certificateType when omitted', async () => { - const requestService = createMockRequestService() + await describe('Optional Certificate Type', async () => { + await it('Should send SignCertificateRequest without certificateType when omitted', async () => { + const requestService = createMockRequestService() - await (requestService as any).requestSignCertificate(mockChargingStation) + await (requestService as any).requestSignCertificate(mockChargingStation) - const sendMessageMock = (requestService as any).sendMessage - const sentPayload = sendMessageMock.mock.calls[0] - .arguments[2] as OCPP20SignCertificateRequest + const sendMessageMock = (requestService as any).sendMessage + const sentPayload = sendMessageMock.mock.calls[0].arguments[2] as OCPP20SignCertificateRequest - expect(sentPayload.csr).toBeDefined() - // certificateType should be undefined when not specified - expect(sentPayload.certificateType).toBeUndefined() - }) + expect(sentPayload.csr).toBeDefined() + // certificateType should be undefined when not specified + expect(sentPayload.certificateType).toBeUndefined() }) + }) - await describe('Request Payload Validation', async () => { - await it('Should build valid OCPP20SignCertificateRequest payload', async () => { - const requestService = createMockRequestService() + await describe('Request Payload Validation', async () => { + await it('Should build valid OCPP20SignCertificateRequest payload', async () => { + const requestService = createMockRequestService() - await (requestService as any).requestSignCertificate( - mockChargingStation, - CertificateSigningUseEnumType.ChargingStationCertificate - ) + await (requestService as any).requestSignCertificate( + mockChargingStation, + CertificateSigningUseEnumType.ChargingStationCertificate + ) - const sendMessageMock = (requestService as any).sendMessage - expect(sendMessageMock.mock.calls.length).toBe(1) + const sendMessageMock = (requestService as any).sendMessage + expect(sendMessageMock.mock.calls.length).toBe(1) - const sentPayload = sendMessageMock.mock.calls[0] - .arguments[2] as OCPP20SignCertificateRequest + const sentPayload = sendMessageMock.mock.calls[0].arguments[2] as OCPP20SignCertificateRequest - // Validate payload structure - expect(typeof sentPayload).toBe('object') - expect(sentPayload.csr).toBeDefined() - expect(typeof sentPayload.csr).toBe('string') - expect(sentPayload.csr.length).toBeGreaterThan(0) - expect(sentPayload.csr.length).toBeLessThanOrEqual(5500) // Max length per schema - }) + // Validate payload structure + expect(typeof sentPayload).toBe('object') + expect(sentPayload.csr).toBeDefined() + expect(typeof sentPayload.csr).toBe('string') + expect(sentPayload.csr.length).toBeGreaterThan(0) + expect(sentPayload.csr.length).toBeLessThanOrEqual(5500) // Max length per schema + }) - await it('Should send SIGN_CERTIFICATE command name', async () => { - const requestService = createMockRequestService() + await it('Should send SIGN_CERTIFICATE command name', async () => { + const requestService = createMockRequestService() - await (requestService as any).requestSignCertificate( - mockChargingStation, - CertificateSigningUseEnumType.ChargingStationCertificate - ) + await (requestService as any).requestSignCertificate( + mockChargingStation, + CertificateSigningUseEnumType.ChargingStationCertificate + ) - const sendMessageMock = (requestService as any).sendMessage - const commandName = sendMessageMock.mock.calls[0].arguments[3] + const sendMessageMock = (requestService as any).sendMessage + const commandName = sendMessageMock.mock.calls[0].arguments[3] - expect(commandName).toBe(OCPP20RequestCommand.SIGN_CERTIFICATE) - }) + expect(commandName).toBe(OCPP20RequestCommand.SIGN_CERTIFICATE) }) - - await describe('Error Handling', async () => { - await it('Should generate CSR without certificate manager dependency', async () => { - const stationWithoutCertManager = createChargingStation({ - baseName: TEST_CHARGING_STATION_BASE_NAME, - connectorsCount: 1, - evseConfiguration: { evsesCount: 1 }, - heartbeatInterval: Constants.DEFAULT_HEARTBEAT_INTERVAL, - stationInfo: { - ocppStrictCompliance: false, - ocppVersion: OCPPVersion.VERSION_201, - }, - websocketPingInterval: Constants.DEFAULT_WEBSOCKET_PING_INTERVAL, - }) - - stationWithoutCertManager.ocppConfiguration = { - configurationKey: [ - { key: 'SecurityCtrlr.OrganizationName', value: MOCK_ORGANIZATION_NAME }, - ], - } - - delete (stationWithoutCertManager as any).certificateManager - - const requestService = createMockRequestService() - - const response = await (requestService as any).requestSignCertificate( - stationWithoutCertManager, - CertificateSigningUseEnumType.ChargingStationCertificate - ) - - expect(response).toBeDefined() - expect(response.status).toBe(GenericStatus.Accepted) - - const sendMessageMock = (requestService as any).sendMessage - const sentPayload = sendMessageMock.mock.calls[0] - .arguments[2] as OCPP20SignCertificateRequest - expect(sentPayload.csr).toBeDefined() - expect(sentPayload.csr).toContain('-----BEGIN CERTIFICATE REQUEST-----') + }) + + await describe('Error Handling', async () => { + await it('Should generate CSR without certificate manager dependency', async () => { + const stationWithoutCertManager = createChargingStation({ + baseName: TEST_CHARGING_STATION_BASE_NAME, + connectorsCount: 1, + evseConfiguration: { evsesCount: 1 }, + heartbeatInterval: Constants.DEFAULT_HEARTBEAT_INTERVAL, + stationInfo: { + ocppStrictCompliance: false, + ocppVersion: OCPPVersion.VERSION_201, + }, + websocketPingInterval: Constants.DEFAULT_WEBSOCKET_PING_INTERVAL, }) + + stationWithoutCertManager.ocppConfiguration = { + configurationKey: [ + { key: 'SecurityCtrlr.OrganizationName', value: MOCK_ORGANIZATION_NAME }, + ], + } + + delete (stationWithoutCertManager as any).certificateManager + + const requestService = createMockRequestService() + + const response = await (requestService as any).requestSignCertificate( + stationWithoutCertManager, + CertificateSigningUseEnumType.ChargingStationCertificate + ) + + expect(response).toBeDefined() + expect(response.status).toBe(GenericStatus.Accepted) + + const sendMessageMock = (requestService as any).sendMessage + const sentPayload = sendMessageMock.mock.calls[0].arguments[2] as OCPP20SignCertificateRequest + expect(sentPayload.csr).toBeDefined() + expect(sentPayload.csr).toContain('-----BEGIN CERTIFICATE REQUEST-----') }) - } -) + }) +})