93 lines
2.9 KiB
TypeScript
93 lines
2.9 KiB
TypeScript
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
|
import { SmartProxy } from '../ts/index.js';
|
|
|
|
tap.test('cleanup queue bug - verify queue processing handles more than batch size', async (tools) => {
|
|
console.log('\n=== Cleanup Queue Bug Test ===');
|
|
console.log('Purpose: Verify that the cleanup queue correctly processes all connections');
|
|
console.log('even when there are more than the batch size (100)');
|
|
|
|
// Create proxy
|
|
const proxy = new SmartProxy({
|
|
routes: [{
|
|
name: 'test-route',
|
|
match: { ports: 8588 },
|
|
action: {
|
|
type: 'forward',
|
|
target: { host: 'localhost', port: 9996 }
|
|
}
|
|
}],
|
|
enableDetailedLogging: false,
|
|
});
|
|
|
|
await proxy.start();
|
|
console.log('✓ Proxy started on port 8588');
|
|
|
|
// Access connection manager
|
|
const cm = (proxy as any).connectionManager;
|
|
|
|
// Create mock connection records
|
|
console.log('\n--- Creating 150 mock connections ---');
|
|
const mockConnections: any[] = [];
|
|
|
|
for (let i = 0; i < 150; i++) {
|
|
const mockRecord = {
|
|
id: `mock-${i}`,
|
|
incoming: { destroyed: true, remoteAddress: '127.0.0.1' },
|
|
outgoing: { destroyed: true },
|
|
connectionClosed: false,
|
|
incomingStartTime: Date.now(),
|
|
lastActivity: Date.now(),
|
|
remoteIP: '127.0.0.1',
|
|
remotePort: 10000 + i,
|
|
localPort: 8588,
|
|
bytesReceived: 100,
|
|
bytesSent: 100,
|
|
incomingTerminationReason: null,
|
|
cleanupTimer: null
|
|
};
|
|
|
|
// Add to connection records
|
|
cm.connectionRecords.set(mockRecord.id, mockRecord);
|
|
mockConnections.push(mockRecord);
|
|
}
|
|
|
|
console.log(`Created ${cm.getConnectionCount()} mock connections`);
|
|
expect(cm.getConnectionCount()).toEqual(150);
|
|
|
|
// Queue all connections for cleanup
|
|
console.log('\n--- Queueing all connections for cleanup ---');
|
|
for (const conn of mockConnections) {
|
|
cm.initiateCleanupOnce(conn, 'test_cleanup');
|
|
}
|
|
|
|
console.log(`Cleanup queue size: ${cm.cleanupQueue.size}`);
|
|
expect(cm.cleanupQueue.size).toEqual(150);
|
|
|
|
// Wait for cleanup to complete
|
|
console.log('\n--- Waiting for cleanup batches to process ---');
|
|
|
|
// The first batch should process immediately (100 connections)
|
|
// Then additional batches should be scheduled
|
|
await new Promise(resolve => setTimeout(resolve, 500));
|
|
|
|
// Check final state
|
|
const finalCount = cm.getConnectionCount();
|
|
console.log(`\nFinal connection count: ${finalCount}`);
|
|
console.log(`Cleanup queue size: ${cm.cleanupQueue.size}`);
|
|
|
|
// All connections should be cleaned up
|
|
expect(finalCount).toEqual(0);
|
|
expect(cm.cleanupQueue.size).toEqual(0);
|
|
|
|
// Verify termination stats
|
|
const stats = cm.getTerminationStats();
|
|
console.log('Termination stats:', stats);
|
|
expect(stats.incoming.test_cleanup).toEqual(150);
|
|
|
|
// Cleanup
|
|
await proxy.stop();
|
|
|
|
console.log('\n✓ Test complete: Cleanup queue now correctly processes all connections');
|
|
});
|
|
|
|
tap.start(); |