fix(clamav.manager): Improve log handling and add timeout for log reception in ClamAV manager tests

This commit is contained in:
2025-02-03 13:55:15 +01:00
parent e31e7cca44
commit 4446f265cb
7 changed files with 175 additions and 29 deletions

View File

@ -1,7 +1,9 @@
import { expect, tap } from '../ts/plugins.js';
import { type ClamAVLogEvent, ClamAVManager } from '../ts/classes.clamav.manager.js';
import type { ClamAVLogEvent } from '../ts/classes.clamav.manager.js';
import { setupClamAV, cleanupClamAV, getManager } from './helpers/clamav.helper.js';
type ClamAVManager = Awaited<ReturnType<typeof setupClamAV>>;
let manager: ClamAVManager;
tap.test('setup', async () => {
@ -10,31 +12,47 @@ tap.test('setup', async () => {
});
tap.test('should have initialized container and receive logs', async () => {
let logReceived = false;
// Add event listener for logs
manager.on('log', (event: ClamAVLogEvent) => {
console.log(`[Test] Received log event: ${event.type} - ${event.message}`);
logReceived = true;
// Create a promise that resolves when we receive a log
const logPromise = new Promise<void>((resolve) => {
// First check if we already have logs
const existingLogs = manager.getLogs();
if (existingLogs.length > 0) {
console.log('[Test] Found existing logs:', existingLogs.map(log => `${log.type}: ${log.message}`).join('\n'));
resolve();
return;
}
// If no existing logs, wait for new ones
const handler = (event: ClamAVLogEvent) => {
console.log(`[Test] Received log event: ${event.type} - ${event.message}`);
manager.removeListener('log', handler);
resolve();
};
manager.on('log', handler);
});
// Wait for logs
const maxWaitTime = 5000;
const startTime = Date.now();
while (!logReceived && Date.now() - startTime < maxWaitTime) {
await new Promise(resolve => setTimeout(resolve, 100));
// Wait for logs with timeout
const timeoutPromise = new Promise<void>((_, reject) => {
setTimeout(() => reject(new Error('Timeout waiting for logs')), 30000);
});
try {
await Promise.race([logPromise, timeoutPromise]);
} catch (error) {
console.error('Error waiting for logs:', error);
throw error;
}
expect(logReceived).toBeTruthy('No logs received within timeout period');
console.log('Log received check passed');
// Verify container is running by checking if we can get database info
try {
const dbInfo = await manager.getDatabaseInfo();
expect(dbInfo).toBeTruthy('Container should be running and able to get database info');
expect(dbInfo).toBeTruthy();
console.log('Database info check passed');
} catch (error) {
console.error('Error getting database info:', error);
expect.fail('Failed to get database info - container may not be fully initialized');
throw new Error('Failed to get database info - container may not be fully initialized');
}
});