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});