#!/usr/contrib/newest/bin/tclsh8.0


if [catch {package require http}] {
} else {
	proc http_get args {
		return [eval ::http::geturl $args]
	}
}


namespace eval CommandLine {
	global argv

	set count_limit 200
	variable URL [lindex $argv 0]
	variable count [lindex $argv 1]
	if {$count > $count_limit} {
		set count $count_limit
		puts "From politeness, we limit this test to $count connections."
	}
}


namespace eval Timing {
	variable beginning_of_burst
	variable sum 0
	variable started 0
	variable completed 0
	variable clicks
	variable end_of_burst
}


set clicks_per_second 1000000.


proc start_test {} {
	set bad_limit 1000
# puts "Starting ..."
	for {set bad_count 0} \
		[catch {http_get $CommandLine::URL -command finish_test} \
							handle] \
		{incr bad_count} {
		incr Timing::failed_connections
# puts "Bad_count is $bad_count."
		if {$bad_count >= $bad_limit} {
			puts \
			"$bad_limit consecutive attempts to connect have failed."
			puts "This test is aborted."
			report
		}
		switch -glob $handle {
			{couldn't open socket: host is unreachable} {
# puts "Idling ..."
				update
				continue
			}
			{Unsupported URL*} {
				puts $handle
				puts "Remember, 'http://webserver.cpg.com/' is supported, but 'http://webserver.cpg.com' and 'webserver.cpg.com' are not."
				report
			}
			default {
				puts "Bad return is '$handle'."
				report
			}
		}
	}
	incr Timing::started
	set Timing::clicks($handle) [clock clicks]
}



proc finish_test token {
	global clicks_per_second
	upvar #0 $token state
# puts "$token received."
# puts [parray state]
	set success $state(http)
	switch -glob $success {
		*Found -
		*OK* {
		}
		default {
			puts "Problem in reception:  '$success'."
			report
		}
	}

	set new_clicks [clock clicks]
	set new_seconds [clock seconds]
# Test for zero.
	set elapsed \
		[expr double($new_clicks - $::Timing::clicks($token)) \
							/ $clicks_per_second]
	set Timing::sum [expr $Timing::sum + $elapsed]
	# puts "Elapsed time for $token:  $elapsed."
	# puts $token
	incr Timing::completed
	if {$Timing::completed >= $CommandLine::count} {
puts "This should be successful."
		report
	}
}


proc report {} {
	global clicks_per_second

	if {![info exists Timing::end_of_burst]} {
		set Timing::end_of_burst [clock clicks]
	}
	if {0 == $Timing::completed} {
		puts "No pages were successfully retrieved.  Test aborted."
		exit 1
	}
	set rate [expr $CommandLine::count * $clicks_per_second / \
		($Timing::end_of_burst - $Timing::beginning_of_burst)]
        puts "For a burst of $CommandLine::count successful connections to $CommandLine::URL:"
	puts "     failed connections:  $Timing::failed_connections."
	puts "     average rate of successful connection:  $rate per second."
	puts "     average time for $Timing::completed successful retrievals:  [expr $Timing::sum / $Timing::completed] seconds."
	exit 0
}


set Timing::beginning_of_burst [clock clicks]
set Timing::failed_connections 0

for {set i 0} {$i < $CommandLine::count} {incr i} {
	start_test
	update
}
set Timing::end_of_burst [clock clicks]


vwait xxx
