test-server.cjs

 1#!/usr/bin/env node
 2
 3// Test server script for Playwright tests
 4const { spawn } = require('child_process');
 5const fs = require('fs');
 6const path = require('path');
 7const { mkdtempSync } = require('fs');
 8const { tmpdir } = require('os');
 9const net = require('net');
10
11// Function to find an available port starting from a base port
12function getAvailablePort(startPort = 9001) {
13  return new Promise((resolve, reject) => {
14    const server = net.createServer();
15    server.unref();
16    server.on('error', () => {
17      // Try next port
18      resolve(getAvailablePort(startPort + 1));
19    });
20    server.listen(startPort, () => {
21      const port = server.address().port;
22      server.close(() => {
23        resolve(port);
24      });
25    });
26  });
27}
28
29// Create a temporary directory for this test run
30const tempDir = mkdtempSync(path.join(tmpdir(), 'shelley-e2e-'));
31const testDb = path.join(tempDir, 'test.db');
32const testDbShm = testDb + '-shm';
33const testDbWal = testDb + '-wal';
34
35console.log(`Using temporary database: ${testDb}`);
36
37// Get an available port and start the server
38getAvailablePort().then(port => {
39  console.log(`Starting test server on port ${port}`);
40  
41  // Start Shelley server with test configuration
42  const serverProcess = spawn('go', [
43    'run', './cmd/shelley',
44    '--model', 'predictable',
45    '--predictable-only',
46    '--db', testDb,
47    'serve',
48    '--port', port.toString()
49  ], {
50    cwd: path.join(__dirname, '../..'),
51    stdio: 'inherit',
52    env: {
53      ...process.env,
54      PREDICTABLE_DELAY_MS: process.env.PREDICTABLE_DELAY_MS || '400'
55    }
56  });
57
58  // Cleanup function for temporary directory and database files
59  const cleanup = () => {
60    try {
61      // Remove the entire temporary directory and all its contents
62      fs.rmSync(tempDir, { recursive: true, force: true });
63      console.log(`Cleaned up temporary directory: ${tempDir}`);
64    } catch (error) {
65      console.warn(`Failed to clean up temporary directory: ${error.message}`);
66    }
67  };
68
69  // Handle cleanup on exit
70  process.on('SIGINT', () => {
71    console.log('\nShutting down test server...');
72    serverProcess.kill('SIGTERM');
73    cleanup();
74    process.exit(0);
75  });
76
77  process.on('SIGTERM', () => {
78    serverProcess.kill('SIGTERM');
79    cleanup();
80    process.exit(0);
81  });
82
83  serverProcess.on('close', (code) => {
84    console.log(`Test server exited with code ${code}`);
85    cleanup();
86    process.exit(code);
87  });
88}).catch(error => {
89  console.error('Failed to get available port:', error);
90  process.exit(1);
91});