/ tests / test-router-optimization.js
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   */