test-router-optimization.js
1 /** 2 * Test script for evaluating router optimization 3 */ 4 import { profileFunction } from '../profilers/profiler.js'; 5 import { getMultipleVideoSources } from '../app/services/video/router.js'; 6 import { createLogger } from '../profilers/logger.js'; 7 8 const logger = createLogger('RouterTest'); 9 10 /** 11 * Runs a performance test on the router with various scenarios 12 * @param {Array<Object>} testCases - Array of test cases with CIDs to test 13 */ 14 export function testRouterPerformance(testCases) { 15 if (!Array.isArray(testCases) || testCases.length === 0) { 16 logger.error('No test cases provided'); 17 return; 18 } 19 20 logger.info('Starting router performance test...'); 21 22 const results = {}; 23 24 // Test each case 25 for (const testCase of testCases) { 26 const { cid, altcid = '', maxSources = 0, description = '' } = testCase; 27 28 if (!cid) { 29 logger.warn('Skipping test case with no CID'); 30 continue; 31 } 32 33 logger.info(`Testing ${description || cid.slice(0, 8)}...`); 34 35 // Run the test multiple times for more reliable results 36 const profileResult = profileFunction( 37 () => getMultipleVideoSources(cid, maxSources, altcid), 38 [], 39 5, // Run 5 iterations 40 ); 41 42 // Store the results 43 results[cid] = { 44 description, 45 averageTimeMs: profileResult.stats.averageTimeMs, 46 minTimeMs: profileResult.stats.minTimeMs, 47 maxTimeMs: profileResult.stats.maxTimeMs, 48 sourcesCount: profileResult.results.length, 49 providers: profileResult.results.map(source => source.provider), 50 }; 51 52 // Log the results 53 logger.info(`Results for ${description || cid.slice(0, 8)}:`); 54 logger.info(` Average time: ${profileResult.stats.averageTimeMs.toFixed(2)}ms`); 55 logger.info(` Min time: ${profileResult.stats.minTimeMs.toFixed(2)}ms`); 56 logger.info(` Max time: ${profileResult.stats.maxTimeMs.toFixed(2)}ms`); 57 logger.info(` Sources: ${profileResult.results.length}`); 58 logger.info(` Providers: ${profileResult.results.map(source => source.provider).join(', ')}`); 59 } 60 61 // Calculate overall statistics 62 const totalTests = Object.keys(results).length; 63 const overallStats = { 64 totalTests, 65 averageTimeMs: 66 totalTests > 0 67 ? Object.values(results).reduce((sum, r) => sum + r.averageTimeMs, 0) / totalTests 68 : 0, 69 minTimeMs: totalTests > 0 ? Math.min(...Object.values(results).map(r => r.minTimeMs)) : 0, 70 maxTimeMs: totalTests > 0 ? Math.max(...Object.values(results).map(r => r.maxTimeMs)) : 0, 71 }; 72 73 // Log overall results 74 logger.info('Overall Results:'); 75 logger.info(` Total tests: ${overallStats.totalTests}`); 76 logger.info(` Average time across all tests: ${overallStats.averageTimeMs.toFixed(2)}ms`); 77 logger.info(` Min time across all tests: ${overallStats.minTimeMs.toFixed(2)}ms`); 78 logger.info(` Max time across all tests: ${overallStats.maxTimeMs.toFixed(2)}ms`); 79 80 return { 81 testResults: results, 82 overallStats, 83 }; 84 } 85 86 /** 87 * Example usage: 88 * 89 * import { testRouterPerformance } from '../tests/test-router-optimization.js'; 90 * 91 * // Define test cases 92 * const testCases = [ 93 * { cid: 'QmExample1', description: 'Popular video with CID data' }, 94 * { cid: 'QmExample2', description: 'New video without CID data' }, 95 * { cid: 'QmExample3', maxSources: 3, description: 'Limited sources' } 96 * ]; 97 * 98 * // Run the test 99 * testRouterPerformance(testCases); 100 */