diff --git a/test/load/NOTES b/test/load/NOTES --- a/test/load/NOTES +++ b/test/load/NOTES @@ -3,5 +3,5 @@ Load test for front page: - ruby runner.rb common_visitors.rb FirstPageViewer 10 -t 10 + ruby runner.rb common_visitors.rb FirstPageViewer 20 -t 10 --site_url=http://localhost/cafe diff --git a/test/load/common_visitors.rb b/test/load/common_visitors.rb --- a/test/load/common_visitors.rb +++ b/test/load/common_visitors.rb @@ -1,7 +1,8 @@ -visitor "FirstPageViewer" do - stores_cookies +if !defined? VISITOR_OPTION_LIST + VISITOR_OPTION_LIST = {} +end - site_url "http://localhost:3000" - +visitor "FirstPageViewer", VISITOR_OPTION_LIST do + stores_cookies get "/" end diff --git a/test/load/runner.rb b/test/load/runner.rb --- a/test/load/runner.rb +++ b/test/load/runner.rb @@ -130,13 +130,13 @@ end visitor_file = ARGV.shift -require visitor_file load_time = 60 dry_run = false -#build visitor list +#build visitor/option list visitor_list = {} +visitor_option_list = {} while ARGV.length>0 key = ARGV.shift @@ -147,11 +147,21 @@ num = ARGV.shift.to_i load_time = num else - num = ARGV.shift.to_i - visitor_list[key] = num + if key =~ /--(\w+)=(.*)/ + # options + lm = Regexp.last_match + visitor_option_list[lm[1]] = lm[2] + else + # new visitor + num = ARGV.shift.to_i + visitor_list[key] = num + end end end +VISITOR_OPTION_LIST = visitor_option_list +require visitor_file + initialize_temp_dir runner visitor_list, load_time, {:dry_run => dry_run} diff --git a/test/load/visitor.rb b/test/load/visitor.rb deleted file mode 100644 --- a/test/load/visitor.rb +++ /dev/null @@ -1,172 +0,0 @@ -require 'rubygems' -require 'curb' - -class Visitor - - attr_accessor :talkative - - class << self - attr_accessor :commands - attr_accessor :base_url - attr_accessor :cookies_stored - end - - def initialize(id=0) - # initialize nil class variable - puts self.class.base_url - self.class.base_url = "" if (self.class.base_url) == nil - self.class.cookies_stored = false if self.class.cookies_stored == nil - - @id = id - @curl = Curl::Easy.new - @curl.enable_cookies = self.class.cookies_stored - @curl.cookiejar = "mycookies" - @statistics = Array.new - @talkative = false - end - - def self.site_url(url) - self.base_url = url - end - - def self.stores_cookies - self.cookies_stored = true - end - - def self.preprocess_param_hash(params) - return {} if params==nil - plist = {} - params.each do |key,val| - if key.is_a? Symbol - key_s = key.to_s - else - key_s = key - end - plist[key_s] = val - end - plist - end - - def self.get(url,params=nil) - self.commands = [] if self.commands==nil - self.commands << { - :command => :get, - :url => url, - :params => Visitor.preprocess_param_hash(params) } - end - - def self.post(url,params=nil,options=nil) - self.commands = [] if self.commands==nil - self.commands << { :command => :post, - :url => url, - :params => Visitor.preprocess_param_hash(params), - :options => options } - end - - def get(url,params) - #build url - full_url = "#{self.class.base_url}#{url}" - if params!=nil and params.length!=0 - full_url += '?' - params.each do |key,val| - if full_url.slice(-1..-1)!='?' - full_url += '&' - end - full_url += @curl.escape(key) + '=' + @curl.escape(val) - end - end - @curl.url = full_url - @curl.http_get - end - - def post(url,params,options) - @curl.url = "#{self.class.base_url}#{url}" - if options!=nil and options[:multipart]==true - @curl.multipart_form_post = true - end - #build post fields - fields = [] - params.each do |key,val| - if val.is_a? Hash - case val[:type] - when :file - fields << Curl::PostField.file(key,val[:data]) - end - else - fields << Curl::PostField.content(key,val.to_s) - end - end - @curl.http_post *fields - end - - def run(option=nil) - - if (option==nil) or (option==:once) - times = 1 - elsif (option==:forever) - times = -1 - else - times = option - end - - while times!=0 - self.class.commands.each do |cmd| - puts "#{@id}: #{cmd[:command]} #{cmd[:url]}" if @talkative - - start_time = Time.new - - case cmd[:command] - when :get - get cmd[:url], cmd[:params] - when :post - post cmd[:url], cmd[:params], cmd[:options] - end - - finish_time = Time.new - - @statistics << { - :url => "#{cmd[:command]}:#{cmd[:url]}", - :time => finish_time - start_time } - end - - if times!=-1 # infinity times - times -= 1 - end - end - end - - def show_raw_stat - @statistics.each do |stat| - puts "#{stat[:url]} => #{stat[:time]}" - end - end - - def statistics - num_requested = @statistics.length - totaltime = 0.0 - @statistics.each { |stat| totaltime += stat[:time] } - - if num_requested>0 - average_request_time = totaltime / num_requested - else - average_request_time = 0 - end - - sq_sum = 0.0 - @statistics.each do |stat| - sq_sum += (stat[:time]-average_request_time) ** 2 - end - if num_requested>1 - sd = Math.sqrt(sq_sum/(num_requested-1)) - else - sd = 0 - end - - return { - :num_requested => num_requested, - :avg_request_time => average_request_time, - :std_dev => sd - } - end -end - diff --git a/test/load/visitor_curl_cli.rb b/test/load/visitor_curl_cli.rb --- a/test/load/visitor_curl_cli.rb +++ b/test/load/visitor_curl_cli.rb @@ -120,6 +120,12 @@ :options => options } end + def self.process_options(options) + if options.has_key? "site_url" + self.base_url = options["site_url"] + end + end + def substitute_id(st) return st if !(st.is_a? String) st.gsub(/(()|(\$))\$\{id\}/) do |s| @@ -270,7 +276,7 @@ end end -def visitor(cname,&blk) +def visitor(cname,options={},&blk) c = Class.new(Visitor) begin Object.const_set(cname,c) @@ -281,5 +287,6 @@ ERROR exit(0) end + c.process_options(options) c.instance_eval(&blk) end