]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
test(ocpp2): skip only SetVariables on Windows (identified via CI logs)
authorJérôme Benoit <jerome.benoit@sap.com>
Thu, 26 Feb 2026 06:57:11 +0000 (07:57 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Thu, 26 Feb 2026 06:57:11 +0000 (07:57 +0100)
tests/charging-station/ocpp/2.0/OCPP20CertificateManager.test.ts
tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-SetVariables.test.ts
tests/charging-station/ocpp/2.0/OCPP20RequestService-SignCertificate.test.ts

index 793ea841a375af4522953da49fa8e34c7352fa22..2174c3003eecbefb8b4357840c35b7ac034863bf 100644 (file)
@@ -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,
index 0f0c8bbaf6a1547e061fe85a09a61fa0c5352e3b..3cc0a8c74f6168eee0aa9eb7e4804265b12bde98 100644 (file)
@@ -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,
index f74386eaea5956bbf672ff57aa703b7f732d1b94..bda7d1ef1534be33b0672ae170209df3eb627ece 100644 (file)
@@ -38,241 +38,229 @@ const createMockRequestService = (responseOverride?: Partial<OCPP20SignCertifica
   return requestService
 }
 
-// FIXME: tests hang on Windows due to generateKeyPairSync in requestSignCertificate
-await describe(
-  'I02 - SignCertificate Request',
-  { skip: process.platform === 'win32' },
-  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('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-----')
     })
-  }
-)
+  })
+})