This commit is contained in:
2025-05-23 19:49:25 +00:00
parent e0f6e3237b
commit a7438a7cd6
40 changed files with 189 additions and 178 deletions

View File

@@ -1,19 +1,16 @@
import { tap, expect } from '@git.zone/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js'; import { startTestServer, stopTestServer } from '../server.loader.js';
import type { ITestServer } from '../../helpers/server.loader.js'; import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
const TEST_PORT = 30029; const TEST_PORT = 2525;
const TEST_TIMEOUT = 30000; const TEST_TIMEOUT = 30000;
let testServer: ITestServer; let testServer: SmtpServer;
tap.test('setup - start SMTP server for abrupt disconnection tests', async () => { tap.test('setup - start SMTP server for abrupt disconnection tests', async () => {
testServer = await startTestServer({ testServer = await startTestServer();
port: TEST_PORT, await new Promise(resolve => setTimeout(resolve, 1000));
hostname: 'localhost'
});
expect(testServer).toBeInstanceOf(Object);
}); });
tap.test('Abrupt Disconnection - should handle socket destruction without QUIT', async (tools) => { tap.test('Abrupt Disconnection - should handle socket destruction without QUIT', async (tools) => {
@@ -318,7 +315,7 @@ tap.test('Abrupt Disconnection - should timeout idle connections', async (tools)
}); });
tap.test('cleanup - stop SMTP server', async () => { tap.test('cleanup - stop SMTP server', async () => {
await stopTestServer(testServer); await stopTestServer();
expect(true).toBeTrue(); expect(true).toBeTrue();
}); });

View File

@@ -1,25 +1,19 @@
import { tap, expect } from '@git.zone/tstest/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import * as path from 'path'; import { startTestServer, stopTestServer } from '../server.loader.js';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js'; import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
import type { ITestServer } from '../../helpers/server.loader.js';
// Test configuration // Test configuration
const TEST_PORT = 2525; const TEST_PORT = 2525;
const TEST_TIMEOUT = 5000; const TEST_TIMEOUT = 5000;
let testServer: ITestServer; let testServer: SmtpServer;
// Setup // Setup
tap.test('setup - start SMTP server', async () => { tap.test('setup - start SMTP server', async () => {
testServer = await startTestServer({ testServer = await startTestServer();
port: TEST_PORT, await new Promise(resolve => setTimeout(resolve, 1000));
tlsEnabled: false,
hostname: 'localhost'
});
expect(testServer).toBeTypeofObject();
expect(testServer.port).toEqual(TEST_PORT);
}); });
// Test: Basic connection limit enforcement // Test: Basic connection limit enforcement
@@ -374,9 +368,7 @@ tap.test('Connection Limits - should provide meaningful error when limit reached
// Teardown // Teardown
tap.test('teardown - stop SMTP server', async () => { tap.test('teardown - stop SMTP server', async () => {
if (testServer) { await stopTestServer();
await stopTestServer(testServer);
}
}); });
// Start the test // Start the test

View File

@@ -1,19 +1,16 @@
import { tap, expect } from '@git.zone/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js'; import { startTestServer, stopTestServer } from '../server.loader.js';
import type { ITestServer } from '../../helpers/server.loader.js'; import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
const TEST_PORT = 30027; const TEST_PORT = 2525;
const TEST_TIMEOUT = 30000; const TEST_TIMEOUT = 30000;
let testServer: ITestServer; let testServer: SmtpServer;
tap.test('setup - start SMTP server for connection rejection tests', async () => { tap.test('setup - start SMTP server for connection rejection tests', async () => {
testServer = await startTestServer({ testServer = await startTestServer();
port: TEST_PORT, await new Promise(resolve => setTimeout(resolve, 1000));
hostname: 'localhost'
});
expect(testServer).toBeInstanceOf(Object);
}); });
tap.test('Connection Rejection - should handle suspicious domains', async (tools) => { tap.test('Connection Rejection - should handle suspicious domains', async (tools) => {
@@ -293,7 +290,7 @@ tap.test('Connection Rejection - should handle invalid commands gracefully', asy
}); });
tap.test('cleanup - stop SMTP server', async () => { tap.test('cleanup - stop SMTP server', async () => {
await stopTestServer(testServer); await stopTestServer();
expect(true).toBeTrue(); expect(true).toBeTrue();
}); });

View File

@@ -2,15 +2,12 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import { startTestServer, stopTestServer, type ITestServer } from './helpers/server.loader.js'; import { startTestServer, stopTestServer, type ITestServer } from './helpers/server.loader.js';
import * as plugins from '../ts/plugins.js'; import * as plugins from '../ts/plugins.js';
let testServer: ITestServer; let testServer: SmtpServer;
tap.test('setup - start SMTP server with short timeout', async () => { tap.test('setup - start SMTP server with short timeout', async () => {
testServer = await startTestServer({ testServer = await startTestServer();
port: 2533,
hostname: 'localhost', await new Promise(resolve => setTimeout(resolve, 1000));
timeout: 5000 // 5 second timeout for testing
});
expect(testServer).toBeInstanceOf(Object);
}); });
tap.test('CM-03: Connection Timeout - idle connections are closed after timeout', async (tools) => { tap.test('CM-03: Connection Timeout - idle connections are closed after timeout', async (tools) => {
@@ -127,7 +124,7 @@ tap.test('CM-03: Active connection should not timeout', async () => {
}); });
tap.test('cleanup - stop SMTP server', async () => { tap.test('cleanup - stop SMTP server', async () => {
await stopTestServer(testServer); await stopTestServer();
}); });
tap.start(); tap.start();

View File

@@ -1,17 +1,18 @@
import { tap, expect } from '@git.zone/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js'; import { startTestServer, stopTestServer, type ITestServer } from '../server.loader.js';
const TEST_PORT = 30033; const TEST_PORT = 2525;
const TEST_TIMEOUT = 60000; // Longer timeout for keepalive tests const TEST_TIMEOUT = 60000; // Longer timeout for keepalive tests
tap.test('Keepalive - should maintain TCP keepalive', async (tools) => { tap.test('Keepalive - should maintain TCP keepalive', async (tools) => {
const done = tools.defer(); const done = tools.defer();
// Start test server // Start test server
const testServer = await startTestServer({ port: TEST_PORT }); const testServer = await startTestServer();
try {
await new Promise(resolve => setTimeout(resolve, 1000));try {
const socket = net.createConnection({ const socket = net.createConnection({
host: 'localhost', host: 'localhost',
port: TEST_PORT, port: TEST_PORT,
@@ -71,7 +72,7 @@ tap.test('Keepalive - should maintain TCP keepalive', async (tools) => {
socket.end(); socket.end();
} finally { } finally {
await stopTestServer(testServer); await stopTestServer();
done.resolve(); done.resolve();
} }
}); });
@@ -80,9 +81,10 @@ tap.test('Keepalive - should maintain idle connection for extended period', asyn
const done = tools.defer(); const done = tools.defer();
// Start test server // Start test server
const testServer = await startTestServer({ port: TEST_PORT }); const testServer = await startTestServer();
try {
await new Promise(resolve => setTimeout(resolve, 1000));try {
const socket = net.createConnection({ const socket = net.createConnection({
host: 'localhost', host: 'localhost',
port: TEST_PORT, port: TEST_PORT,
@@ -142,7 +144,7 @@ tap.test('Keepalive - should maintain idle connection for extended period', asyn
socket.end(); socket.end();
} finally { } finally {
await stopTestServer(testServer); await stopTestServer();
done.resolve(); done.resolve();
} }
}); });
@@ -151,9 +153,10 @@ tap.test('Keepalive - should detect connection loss', async (tools) => {
const done = tools.defer(); const done = tools.defer();
// Start test server // Start test server
const testServer = await startTestServer({ port: TEST_PORT }); const testServer = await startTestServer();
try {
await new Promise(resolve => setTimeout(resolve, 1000));try {
const socket = net.createConnection({ const socket = net.createConnection({
host: 'localhost', host: 'localhost',
port: TEST_PORT, port: TEST_PORT,
@@ -202,7 +205,7 @@ tap.test('Keepalive - should detect connection loss', async (tools) => {
console.log('Connection established, now simulating server shutdown...'); console.log('Connection established, now simulating server shutdown...');
// Shutdown server to simulate connection loss // Shutdown server to simulate connection loss
await stopTestServer(testServer); await stopTestServer();
// Wait for keepalive to detect connection loss // Wait for keepalive to detect connection loss
await new Promise(resolve => setTimeout(resolve, 10000)); await new Promise(resolve => setTimeout(resolve, 10000));
@@ -221,9 +224,10 @@ tap.test('Keepalive - should handle long-running SMTP session', async (tools) =>
const done = tools.defer(); const done = tools.defer();
// Start test server // Start test server
const testServer = await startTestServer({ port: TEST_PORT }); const testServer = await startTestServer();
try {
await new Promise(resolve => setTimeout(resolve, 1000));try {
const socket = net.createConnection({ const socket = net.createConnection({
host: 'localhost', host: 'localhost',
port: TEST_PORT, port: TEST_PORT,
@@ -294,7 +298,7 @@ tap.test('Keepalive - should handle long-running SMTP session', async (tools) =>
socket.end(); socket.end();
} finally { } finally {
await stopTestServer(testServer); await stopTestServer();
done.resolve(); done.resolve();
} }
}); });
@@ -303,9 +307,10 @@ tap.test('Keepalive - should handle NOOP as keepalive mechanism', async (tools)
const done = tools.defer(); const done = tools.defer();
// Start test server // Start test server
const testServer = await startTestServer({ port: TEST_PORT }); const testServer = await startTestServer();
try {
await new Promise(resolve => setTimeout(resolve, 1000));try {
const socket = net.createConnection({ const socket = net.createConnection({
host: 'localhost', host: 'localhost',
port: TEST_PORT, port: TEST_PORT,
@@ -362,7 +367,7 @@ tap.test('Keepalive - should handle NOOP as keepalive mechanism', async (tools)
socket.end(); socket.end();
} finally { } finally {
await stopTestServer(testServer); await stopTestServer();
done.resolve(); done.resolve();
} }
}); });

View File

@@ -1,16 +1,15 @@
import { tap, expect } from '@git.zone/tstest/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js'; import { startTestServer, stopTestServer, type ITestServer } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
import { createConcurrentConnections, performSmtpHandshake, closeSmtpConnection } from '../../helpers/test.utils.js'; import { createConcurrentConnections, performSmtpHandshake, closeSmtpConnection } from '../../helpers/test.utils.js';
let testServer: ITestServer; let testServer: SmtpServer;
const CONCURRENT_COUNT = 10; const CONCURRENT_COUNT = 10;
tap.test('setup - start SMTP server', async () => { tap.test('setup - start SMTP server', async () => {
testServer = await startTestServer({ testServer = await startTestServer();
port: 2526,
maxConnections: 100 await new Promise(resolve => setTimeout(resolve, 1000));
});
expect(testServer).toBeInstanceOf(Object);
expect(testServer.port).toEqual(2526); expect(testServer.port).toEqual(2526);
}); });
@@ -69,12 +68,10 @@ tap.test('CM-02: Connection limit enforcement - verify max connections', async (
const maxConnections = 5; const maxConnections = 5;
// Start a new server with lower connection limit // Start a new server with lower connection limit
const limitedServer = await startTestServer({ const limitedServer = await startTestServer();
port: 2527,
maxConnections: maxConnections
});
try {
await new Promise(resolve => setTimeout(resolve, 1000));try {
// Try to create more connections than allowed // Try to create more connections than allowed
const attemptCount = maxConnections + 5; const attemptCount = maxConnections + 5;
console.log(`🔄 Attempting ${attemptCount} connections (limit: ${maxConnections})...`); console.log(`🔄 Attempting ${attemptCount} connections (limit: ${maxConnections})...`);
@@ -104,7 +101,7 @@ tap.test('CM-02: Connection limit enforcement - verify max connections', async (
}); });
tap.test('cleanup - stop SMTP server', async () => { tap.test('cleanup - stop SMTP server', async () => {
await stopTestServer(testServer); await stopTestServer();
console.log('✅ Test server stopped'); console.log('✅ Test server stopped');
}); });

View File

@@ -1,17 +1,18 @@
import { tap, expect } from '@git.zone/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js'; import { startTestServer, stopTestServer, type ITestServer } from '../server.loader.js';
const TEST_PORT = 30032; const TEST_PORT = 2525;
const TEST_TIMEOUT = 30000; const TEST_TIMEOUT = 30000;
tap.test('Plain Connection - should establish basic TCP connection', async (tools) => { tap.test('Plain Connection - should establish basic TCP connection', async (tools) => {
const done = tools.defer(); const done = tools.defer();
// Start test server // Start test server
const testServer = await startTestServer({ port: TEST_PORT }); const testServer = await startTestServer();
try {
await new Promise(resolve => setTimeout(resolve, 1000));try {
const socket = net.createConnection({ const socket = net.createConnection({
host: 'localhost', host: 'localhost',
port: TEST_PORT, port: TEST_PORT,
@@ -36,7 +37,7 @@ tap.test('Plain Connection - should establish basic TCP connection', async (tool
} }
} finally { } finally {
await stopTestServer(testServer); await stopTestServer();
done.resolve(); done.resolve();
} }
}); });
@@ -45,9 +46,10 @@ tap.test('Plain Connection - should receive SMTP banner on plain connection', as
const done = tools.defer(); const done = tools.defer();
// Start test server // Start test server
const testServer = await startTestServer({ port: TEST_PORT }); const testServer = await startTestServer();
try {
await new Promise(resolve => setTimeout(resolve, 1000));try {
const socket = net.createConnection({ const socket = net.createConnection({
host: 'localhost', host: 'localhost',
port: TEST_PORT, port: TEST_PORT,
@@ -74,7 +76,7 @@ tap.test('Plain Connection - should receive SMTP banner on plain connection', as
socket.end(); socket.end();
} finally { } finally {
await stopTestServer(testServer); await stopTestServer();
done.resolve(); done.resolve();
} }
}); });
@@ -83,9 +85,10 @@ tap.test('Plain Connection - should complete full SMTP transaction on plain conn
const done = tools.defer(); const done = tools.defer();
// Start test server // Start test server
const testServer = await startTestServer({ port: TEST_PORT }); const testServer = await startTestServer();
try {
await new Promise(resolve => setTimeout(resolve, 1000));try {
const socket = net.createConnection({ const socket = net.createConnection({
host: 'localhost', host: 'localhost',
port: TEST_PORT, port: TEST_PORT,
@@ -176,7 +179,7 @@ tap.test('Plain Connection - should complete full SMTP transaction on plain conn
socket.end(); socket.end();
} finally { } finally {
await stopTestServer(testServer); await stopTestServer();
done.resolve(); done.resolve();
} }
}); });
@@ -185,9 +188,10 @@ tap.test('Plain Connection - should handle multiple plain connections', async (t
const done = tools.defer(); const done = tools.defer();
// Start test server // Start test server
const testServer = await startTestServer({ port: TEST_PORT }); const testServer = await startTestServer();
try {
await new Promise(resolve => setTimeout(resolve, 1000));try {
const connectionCount = 3; const connectionCount = 3;
const connections: net.Socket[] = []; const connections: net.Socket[] = [];
@@ -226,7 +230,7 @@ tap.test('Plain Connection - should handle multiple plain connections', async (t
} }
} finally { } finally {
await stopTestServer(testServer); await stopTestServer();
done.resolve(); done.resolve();
} }
}); });

View File

@@ -2,25 +2,20 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import * as tls from 'tls'; import * as tls from 'tls';
import * as path from 'path'; import * as path from 'path';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js'; import { startTestServer, stopTestServer } from '../server.loader.js';
import type { ITestServer } from '../../helpers/server.loader.js'; import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
// Test configuration // Test configuration
const TEST_PORT = 2525; const TEST_PORT = 2525;
const TEST_TIMEOUT = 30000; // Increased timeout for TLS handshake const TEST_TIMEOUT = 30000; // Increased timeout for TLS handshake
let testServer: ITestServer; let testServer: SmtpServer;
// Setup // Setup
tap.test('setup - start SMTP server with STARTTLS support', async () => { tap.test('setup - start SMTP server with STARTTLS support', async () => {
testServer = await startTestServer({ testServer = await startTestServer();
port: TEST_PORT,
tlsEnabled: false, // Start with plain connection, upgrade via STARTTLS
hostname: 'localhost',
allowStartTLS: true
});
expect(testServer).toBeTypeofObject();
await new Promise(resolve => setTimeout(resolve, 1000));
expect(testServer.port).toEqual(TEST_PORT); expect(testServer.port).toEqual(TEST_PORT);
}); });
@@ -446,7 +441,7 @@ tap.test('STARTTLS - should use secure TLS version and ciphers', async (tools) =
// Teardown // Teardown
tap.test('teardown - stop SMTP server', async () => { tap.test('teardown - stop SMTP server', async () => {
if (testServer) { if (testServer) {
await stopTestServer(testServer); await stopTestServer();
} }
}); });

View File

@@ -1,9 +1,9 @@
import { tap, expect } from '@git.zone/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import * as tls from 'tls'; import * as tls from 'tls';
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js'; import { startTestServer, stopTestServer, type ITestServer } from '../server.loader.js';
const TEST_PORT = 30031; const TEST_PORT = 2525;
const TEST_PORT_TLS = 30466; const TEST_PORT_TLS = 30466;
const TEST_TIMEOUT = 30000; const TEST_TIMEOUT = 30000;
@@ -11,9 +11,10 @@ tap.test('TLS Ciphers - should advertise STARTTLS for cipher negotiation', async
const done = tools.defer(); const done = tools.defer();
// Start test server // Start test server
const testServer = await startTestServer({ port: TEST_PORT }); const testServer = await startTestServer();
try {
await new Promise(resolve => setTimeout(resolve, 1000));try {
const socket = net.createConnection({ const socket = net.createConnection({
host: 'localhost', host: 'localhost',
port: TEST_PORT, port: TEST_PORT,
@@ -63,7 +64,7 @@ tap.test('TLS Ciphers - should advertise STARTTLS for cipher negotiation', async
expect(true).toBeTrue(); expect(true).toBeTrue();
} finally { } finally {
await stopTestServer(testServer); await stopTestServer();
done.resolve(); done.resolve();
} }
}); });
@@ -72,9 +73,10 @@ tap.test('TLS Ciphers - should negotiate secure cipher suites', async (tools) =>
const done = tools.defer(); const done = tools.defer();
// Start test server on TLS port // Start test server on TLS port
const testServer = await startTestServer({ port: TEST_PORT_TLS, tlsEnabled: true }); const testServer = await startTestServer();
try {
await new Promise(resolve => setTimeout(resolve, 1000));try {
const tlsOptions = { const tlsOptions = {
host: 'localhost', host: 'localhost',
port: TEST_PORT_TLS, port: TEST_PORT_TLS,
@@ -118,7 +120,7 @@ tap.test('TLS Ciphers - should negotiate secure cipher suites', async (tools) =>
socket.end(); socket.end();
} finally { } finally {
await stopTestServer(testServer); await stopTestServer();
done.resolve(); done.resolve();
} }
}); });
@@ -127,9 +129,10 @@ tap.test('TLS Ciphers - should reject weak cipher suites', async (tools) => {
const done = tools.defer(); const done = tools.defer();
// Start test server on TLS port // Start test server on TLS port
const testServer = await startTestServer({ port: TEST_PORT_TLS, tlsEnabled: true }); const testServer = await startTestServer();
try {
await new Promise(resolve => setTimeout(resolve, 1000));try {
// Try to connect with weak ciphers only // Try to connect with weak ciphers only
const weakCiphers = [ const weakCiphers = [
'DES-CBC3-SHA', 'DES-CBC3-SHA',
@@ -187,7 +190,7 @@ tap.test('TLS Ciphers - should reject weak cipher suites', async (tools) => {
expect(true).toBeTrue(); expect(true).toBeTrue();
} finally { } finally {
await stopTestServer(testServer); await stopTestServer();
done.resolve(); done.resolve();
} }
}); });
@@ -196,9 +199,10 @@ tap.test('TLS Ciphers - should support forward secrecy', async (tools) => {
const done = tools.defer(); const done = tools.defer();
// Start test server on TLS port // Start test server on TLS port
const testServer = await startTestServer({ port: TEST_PORT_TLS, tlsEnabled: true }); const testServer = await startTestServer();
try {
await new Promise(resolve => setTimeout(resolve, 1000));try {
// Prefer ciphers with forward secrecy (ECDHE, DHE) // Prefer ciphers with forward secrecy (ECDHE, DHE)
const forwardSecrecyCiphers = [ const forwardSecrecyCiphers = [
'ECDHE-RSA-AES128-GCM-SHA256', 'ECDHE-RSA-AES128-GCM-SHA256',
@@ -248,7 +252,7 @@ tap.test('TLS Ciphers - should support forward secrecy', async (tools) => {
expect(true).toBeTrue(); expect(true).toBeTrue();
} finally { } finally {
await stopTestServer(testServer); await stopTestServer();
done.resolve(); done.resolve();
} }
}); });
@@ -257,9 +261,10 @@ tap.test('TLS Ciphers - should list all supported ciphers', async (tools) => {
const done = tools.defer(); const done = tools.defer();
// Start test server on TLS port // Start test server on TLS port
const testServer = await startTestServer({ port: TEST_PORT_TLS, tlsEnabled: true }); const testServer = await startTestServer();
try {
await new Promise(resolve => setTimeout(resolve, 1000));try {
// Get list of ciphers supported by Node.js // Get list of ciphers supported by Node.js
const supportedCiphers = tls.getCiphers(); const supportedCiphers = tls.getCiphers();
console.log(`Node.js supports ${supportedCiphers.length} cipher suites`); console.log(`Node.js supports ${supportedCiphers.length} cipher suites`);
@@ -303,7 +308,7 @@ tap.test('TLS Ciphers - should list all supported ciphers', async (tools) => {
expect(negotiatedCipher.name).toBeDefined(); expect(negotiatedCipher.name).toBeDefined();
} finally { } finally {
await stopTestServer(testServer); await stopTestServer();
done.resolve(); done.resolve();
} }
}); });

View File

@@ -1,16 +1,14 @@
import { tap, expect } from '@git.zone/tstest/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import { startTestServer, stopTestServer, type ITestServer } from '../../helpers/server.loader.js'; import { startTestServer, stopTestServer, type ITestServer } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
import { connectToSmtp, performSmtpHandshake, closeSmtpConnection } from '../../helpers/test.utils.js'; import { connectToSmtp, performSmtpHandshake, closeSmtpConnection } from '../../helpers/test.utils.js';
let testServer: ITestServer; let testServer: SmtpServer;
tap.test('setup - start SMTP server with TLS support', async () => { tap.test('setup - start SMTP server with TLS support', async () => {
testServer = await startTestServer({ testServer = await startTestServer();
port: 2525,
tlsEnabled: true, await new Promise(resolve => setTimeout(resolve, 1000));
hostname: 'localhost'
});
expect(testServer).toBeInstanceOf(Object);
expect(testServer.port).toEqual(2525); expect(testServer.port).toEqual(2525);
}); });
@@ -54,7 +52,7 @@ tap.test('CM-01: TLS Connection Test - verify TLS certificate configuration', as
}); });
tap.test('cleanup - stop SMTP server', async () => { tap.test('cleanup - stop SMTP server', async () => {
await stopTestServer(testServer); await stopTestServer();
console.log('✅ Test server stopped'); console.log('✅ Test server stopped');
}); });

View File

@@ -1,29 +1,23 @@
import { tap, expect } from '@git.zone/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import * as tls from 'tls'; import * as tls from 'tls';
import { startTestServer, stopTestServer } from '../../helpers/server.loader.js'; import { startTestServer, stopTestServer } from '../server.loader.js';
import type { ITestServer } from '../../helpers/server.loader.js'; import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
const TEST_PORT = 2525;
const TEST_PORT = 30030;
const TEST_PORT_TLS = 30465; const TEST_PORT_TLS = 30465;
const TEST_TIMEOUT = 30000; const TEST_TIMEOUT = 30000;
let testServer: ITestServer; let testServer: SmtpServer;
let testServerTls: ITestServer; let testServerTls: ITestServer;
tap.test('setup - start SMTP servers for TLS version tests', async () => { tap.test('setup - start SMTP servers for TLS version tests', async () => {
testServer = await startTestServer({ testServer = await startTestServer();
port: TEST_PORT,
hostname: 'localhost'
});
testServerTls = await startTestServer({
port: TEST_PORT_TLS,
hostname: 'localhost',
tlsEnabled: true
});
expect(testServer).toBeInstanceOf(Object); await new Promise(resolve => setTimeout(resolve, 1000));testServerTls = await startTestServer();
await new Promise(resolve => setTimeout(resolve, 1000));
expect(testServerTls).toBeInstanceOf(Object); expect(testServerTls).toBeInstanceOf(Object);
}); });
@@ -265,7 +259,7 @@ async function testTlsVersion(version: string, port: number): Promise<{success:
} }
tap.test('cleanup - stop SMTP servers', async () => { tap.test('cleanup - stop SMTP servers', async () => {
await stopTestServer(testServer); await stopTestServer();
await stopTestServer(testServerTls); await stopTestServer(testServerTls);
expect(true).toBeTrue(); expect(true).toBeTrue();
}); });

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -1,10 +1,11 @@
import { tap, expect } from '@git.zone/tstest/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js'; import { startTestServer, stopTestServer } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
const TEST_PORT = 2525; const TEST_PORT = 2525;
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -1,12 +1,13 @@
import { tap, expect } from '@git.zone/tstest/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js'; import { startTestServer, stopTestServer } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
// Test configuration // Test configuration
const TEST_PORT = 2525; const TEST_PORT = 2525;
const TEST_TIMEOUT = 15000; const TEST_TIMEOUT = 15000;
let testServer: any; let testServer: SmtpServer;
// Setup // Setup
tap.test('setup - start SMTP server', async () => { tap.test('setup - start SMTP server', async () => {

View File

@@ -1,10 +1,11 @@
import { tap, expect } from '@git.zone/tstest/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js'; import { startTestServer, stopTestServer } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
const TEST_PORT = 2525; const TEST_PORT = 2525;
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -1,10 +1,11 @@
import { tap, expect } from '@git.zone/tstest/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js'; import { startTestServer, stopTestServer } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
const TEST_PORT = 2525; const TEST_PORT = 2525;
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -1,12 +1,13 @@
import { tap, expect } from '@git.zone/tstest/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer } from '../server.loader.js'; import { startTestServer, stopTestServer } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
// Test configuration // Test configuration
const TEST_PORT = 2525; const TEST_PORT = 2525;
const TEST_TIMEOUT = 20000; const TEST_TIMEOUT = 20000;
let testServer: any; let testServer: SmtpServer;
// Setup // Setup
tap.test('setup - start SMTP server', async () => { tap.test('setup - start SMTP server', async () => {

View File

@@ -2,12 +2,13 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import * as path from 'path'; import * as path from 'path';
import { startTestServer, stopTestServer } from '../server.loader.js'; import { startTestServer, stopTestServer } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
// Test configuration // Test configuration
const TEST_PORT = 2525; const TEST_PORT = 2525;
const TEST_TIMEOUT = 60000; // Increased for large email handling const TEST_TIMEOUT = 60000; // Increased for large email handling
let testServer: any; let testServer: SmtpServer;
// Setup // Setup
tap.test('setup - start SMTP server', async () => { tap.test('setup - start SMTP server', async () => {

View File

@@ -1,8 +1,9 @@
import { tap, expect } from '@git.zone/tstest/tapbundle'; import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,12 +2,13 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as net from 'net'; import * as net from 'net';
import * as path from 'path'; import * as path from 'path';
import { startTestServer, stopTestServer } from '../server.loader.js'; import { startTestServer, stopTestServer } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
// Test configuration // Test configuration
const TEST_PORT = 2525; const TEST_PORT = 2525;
const TEST_TIMEOUT = 15000; const TEST_TIMEOUT = 15000;
let testServer: any; let testServer: SmtpServer;
// Setup // Setup
tap.test('setup - start SMTP server', async () => { tap.test('setup - start SMTP server', async () => {

View File

@@ -18,7 +18,7 @@ tap.test('setup - start SMTP server', async () => {
hostname: 'localhost' hostname: 'localhost'
}); });
expect(testServer).toBeTypeofObject(); expect(testServer).toBeTypeOf('object');
expect(testServer.port).toEqual(TEST_PORT); expect(testServer.port).toEqual(TEST_PORT);
}); });

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -3,8 +3,9 @@ import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import * as tls from 'tls'; import * as tls from 'tls';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -2,8 +2,9 @@ import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as plugins from '../plugins.js'; import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -3,8 +3,9 @@ import * as plugins from '../plugins.js';
import * as net from 'net'; import * as net from 'net';
import * as tls from 'tls'; import * as tls from 'tls';
import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js'; import { startTestServer, stopTestServer, TEST_PORT, sendEmailWithRawSocket } from '../server.loader.js';
import type { SmtpServer } from '../../../ts/mail/delivery/smtpserver/index.js';
let testServer: any; let testServer: SmtpServer;
tap.test('setup - start test server', async () => { tap.test('setup - start test server', async () => {
testServer = await startTestServer(); testServer = await startTestServer();

View File

@@ -27,11 +27,11 @@ async function startTestServer(port = 2525) {
try { try {
// Create a minimal email server for testing // Create a minimal email server for testing
const mockEmailServer = { const mockEmailServer = {
processEmailByMode: async (emailData) => { processEmailByMode: async (emailData: any) => {
console.log('📧 Processed test email:', emailData.subject || 'No subject'); console.log('📧 Processed test email:', emailData.subject || 'No subject');
return emailData; return emailData;
} }
}; } as any; // Type assertion for test purposes
// Load test certificates if available // Load test certificates if available
let key = ''; let key = '';
@@ -56,7 +56,10 @@ async function startTestServer(port = 2525) {
socketTimeout: 30000, socketTimeout: 30000,
connectionTimeout: 60000, connectionTimeout: 60000,
cleanupInterval: 300000, cleanupInterval: 300000,
auth: false auth: {
required: false,
methods: [] as ('PLAIN' | 'LOGIN' | 'OAUTH2')[]
}
}; };
// Create and start SMTP server // Create and start SMTP server
@@ -137,7 +140,7 @@ async function waitForServerReady(hostname, port, timeout) {
socket.on('connect', () => { socket.on('connect', () => {
socket.end(); socket.end();
resolve(); resolve(undefined);
}); });
socket.on('error', (error) => { socket.on('error', (error) => {