class GasLoadTester::Test

Constants

DEFAULT

Attributes

client[RW]
results[RW]
time[RW]

Public Class Methods

new(args = {}) click to toggle source
# File lib/gas_load_tester/test.rb, line 13
def initialize(args = {})
  args ||= {}
  args[:client] ||= args['client']
  args[:time] ||= args['time']
  args.reject!{|key, value| value.nil? }
  args = DEFAULT.merge(args)

  self.client = args[:client]
  self.time = args[:time]
  self.results = {}
  @run = false
end

Public Instance Methods

export_file(args = {}) click to toggle source
# File lib/gas_load_tester/test.rb, line 57
def export_file(args = {})
  args ||= {}
  file = args[:file_name] || ''
  chart_builder = GasLoadTester::ChartBuilder.new(file_name: file, header: args[:header], description: args[:description])
  chart_builder.build_body(self)
  chart_builder.save
end
is_run?() click to toggle source
# File lib/gas_load_tester/test.rb, line 49
def is_run?
  @run
end
request_per_second() click to toggle source
# File lib/gas_load_tester/test.rb, line 53
def request_per_second
  self.client/self.time.to_f
end
run(args = {}, &block) click to toggle source
# File lib/gas_load_tester/test.rb, line 26
def run(args = {}, &block)
  args ||= {}
  args[:output] ||= args['output']
  args[:file_name] ||= args['file_name']
  args[:header] ||= args['header']
  args[:description] ||= args['description']
  puts "Running test (client: #{self.client}, time: #{self.time})"
  @progressbar = ProgressBar.create(
    :title => "Load test",
    :starting_at => 0,
    :total => self.time+10,
    :format => "%a %b\u{15E7}%i %p%% %t",
    :progress_mark  => ' ',
    :remainder_mark => "\u{FF65}"
  )
  load_test(block)
  if args[:output]
    export_file({file_name: args[:file_name], header: args[:header], description: args[:description]})
  end
ensure
  @run = true
end
summary_avg_time() click to toggle source
# File lib/gas_load_tester/test.rb, line 73
def summary_avg_time
  all_result_time.sum.fdiv(all_result_time.size)*1000
end
summary_error() click to toggle source
# File lib/gas_load_tester/test.rb, line 81
def summary_error
  self.results.collect{|key, values| values.select{|val| !val.pass }.count }.flatten.sum
end
summary_max_time() click to toggle source
# File lib/gas_load_tester/test.rb, line 69
def summary_max_time
  all_result_time.sort.last*1000
end
summary_min_time() click to toggle source
# File lib/gas_load_tester/test.rb, line 65
def summary_min_time
  all_result_time.sort.first*1000
end
summary_success() click to toggle source
# File lib/gas_load_tester/test.rb, line 77
def summary_success
  self.results.collect{|key, values| values.select{|val| val.pass }.count }.flatten.sum
end

Private Instance Methods

all_result_time() click to toggle source
# File lib/gas_load_tester/test.rb, line 87
def all_result_time
  self.results.collect{|key, values| values.collect(&:time) }.flatten
end
build_result(args) click to toggle source
# File lib/gas_load_tester/test.rb, line 131
def build_result(args)
  Result.new(args)
end
load_test(block) click to toggle source
# File lib/gas_load_tester/test.rb, line 91
def load_test(block)
  threads = []
  rps = request_per_second
  rps_decimal = rps.modulo(1)
  full_rps = (rps - rps_decimal).to_i
  stacking_decimal = 0.0
  counter = 0
  self.time.times do |index|
    self.results[index] = []
    start_index_time = Time.now
    stacking_decimal += rps_decimal
    additional_client = 0
    if stacking_decimal > 1
      additional_client = 1
      stacking_decimal -= 1
    end
    if (index+1) == self.time && (counter + (full_rps + additional_client)) < self.client
      additional_client += (self.client - (counter + (full_rps + additional_client)))
    end
    (full_rps + additional_client).times do
      counter += 1
      threads << Thread.new do
        begin
          start_time = Time.now
          block.call
          self.results[index] << build_result({pass: true, time: Time.now-start_time})
        rescue => error
          self.results[index] << build_result({pass: false, error: error, time: Time.now-start_time})
        end
      end
    end
    cal_sleep = 1-(Time.now-start_index_time)
    cal_sleep = 0 if cal_sleep < 0
    sleep(cal_sleep)
    @progressbar.increment
  end
  ThreadsWait.all_waits(*threads)
  @progressbar.progress += 10
end