Files
urbanadventurer-WhatWeb/test/output_optimization_test.rb
2025-10-20 02:12:11 +11:00

176 lines
5.3 KiB
Ruby

#!/usr/bin/env ruby
#
# Output optimization validation test
# Tests the new performance improvements
#
require 'benchmark'
require 'fileutils'
class OutputOptimizationTest
def initialize
@whatweb_path = File.expand_path('../whatweb', __dir__)
@test_dir = __dir__
@results_dir = File.join(@test_dir, 'optimization_results')
FileUtils.mkdir_p(@results_dir)
create_test_targets
end
def create_test_targets
# Create a small test target file
test_targets = File.join(@test_dir, 'optimization_targets.txt')
unless File.exist?(test_targets)
File.write(test_targets, [
'http://example.com',
'http://httpbin.org/html',
'http://httpbin.org/json'
].join("\n"))
end
end
def test_new_options
puts "=== Testing New Command Line Options ==="
target_file = File.join(@test_dir, 'optimization_targets.txt')
# Test --output-sync option
puts "Testing --output-sync option..."
cmd = "#{@whatweb_path} --output-sync -t 5 --log-brief=/dev/null -i #{target_file}"
success = system(cmd + " 2>/dev/null")
puts success ? "✓ --output-sync works" : "✗ --output-sync failed"
# Test --output-buffer-size option
puts "Testing --output-buffer-size option..."
cmd = "#{@whatweb_path} --output-buffer-size=10 -t 5 --log-brief=/dev/null -i #{target_file}"
success = system(cmd + " 2>/dev/null")
puts success ? "✓ --output-buffer-size works" : "✗ --output-buffer-size failed"
# Test help text includes new options
puts "Testing help text includes new options..."
help_output = `#{@whatweb_path} --help 2>&1`
has_sync = help_output.include?('--output-sync')
has_buffer = help_output.include?('--output-buffer-size')
puts has_sync && has_buffer ? "✓ Help text updated" : "✗ Help text missing new options"
end
def test_performance_comparison
puts "\n=== Performance Comparison Test ==="
target_file = File.join(@test_dir, 'optimization_targets.txt')
# Test with different thread counts to verify smart defaults
thread_counts = [1, 10, 25]
results = {}
thread_counts.each do |threads|
print "Testing #{threads} threads... "
start_time = Time.now
cmd = "#{@whatweb_path} -t #{threads} --log-brief=/dev/null -i #{target_file}"
success = system(cmd + " 2>/dev/null")
end_time = Time.now
if success
time = end_time - start_time
results[threads] = time
puts "#{time.round(2)}s"
else
puts "FAILED"
end
end
puts "\n=== Performance Results ==="
results.each do |threads, time|
puts "#{threads} threads: #{time.round(2)}s"
end
end
def test_mutex_functionality
puts "\n=== Mutex Functionality Test ==="
# Test that output is still correct with high thread count
target_file = File.join(@test_dir, 'optimization_targets.txt')
output_file = File.join(@results_dir, 'mutex_test_output.txt')
puts "Testing output consistency with 20 threads..."
cmd = "#{@whatweb_path} -t 20 --log-brief=#{output_file} -i #{target_file}"
success = system(cmd + " 2>/dev/null")
if success && File.exist?(output_file)
lines = File.readlines(output_file)
puts "✓ Generated #{lines.length} output lines"
# Check for any obvious corruption (partial lines, etc.)
corrupted_lines = lines.select { |line| line.strip.empty? || line.length < 10 }
if corrupted_lines.empty?
puts "✓ No obviously corrupted output lines"
else
puts "✗ Found #{corrupted_lines.length} potentially corrupted lines"
end
File.delete(output_file)
else
puts "✗ Mutex test failed"
end
end
def test_profiling_infrastructure
puts "\n=== Profiling Infrastructure Test ==="
target_file = File.join(@test_dir, 'optimization_targets.txt')
profile_file = File.join(@results_dir, 'test_profile.txt')
puts "Testing profiling with WHATWEB_PROFILE environment variable..."
env = {
'WHATWEB_PROFILE' => '1',
'WHATWEB_PROFILE_FILE' => profile_file
}
cmd = "#{@whatweb_path} -t 5 --log-brief=/dev/null -i #{target_file}"
success = system(env, cmd + " 2>/dev/null")
if success
if File.exist?(profile_file)
puts "✓ Profile file created"
profile_size = File.size(profile_file)
puts "✓ Profile file size: #{profile_size} bytes"
File.delete(profile_file) if profile_size > 0
else
puts "✗ Profile file not created (ruby-prof may not be installed)"
end
else
puts "✗ Profiling test failed"
end
end
def run_all_tests
puts "WhatWeb Output Optimization Test Suite"
puts "======================================"
puts "Timestamp: #{Time.now}"
puts
# Check if whatweb exists
unless File.exist?(@whatweb_path)
puts "ERROR: WhatWeb not found at #{@whatweb_path}"
exit 1
end
test_new_options
test_performance_comparison
test_mutex_functionality
test_profiling_infrastructure
puts "\n=== Test Summary ==="
puts "All optimization tests completed."
puts "Check output above for any failures marked with ✗"
end
end
# Run the tests if this script is executed directly
if __FILE__ == $0
test = OutputOptimizationTest.new
test.run_all_tests
end