mirror of
https://github.com/urbanadventurer/WhatWeb
synced 2026-06-21 14:12:19 +00:00
176 lines
5.3 KiB
Ruby
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
|