module Stella::Engine::Checkup

Public Instance Methods

run(testrun, opts={}) click to toggle source
# File lib/stella/engine.rb, line 40
def run testrun, opts={}
  opts = parse_opts testrun.options, opts
  Stella.ld "testrun opts: #{opts.inspect}"
  threads = []
  testrun.stime = Stella.now
  testrun.running!
  opts[:concurrency].times do 
    threads << Thread.new do
      client = Stella::Client.new opts
      Benelux.current_track "client_#{client.clientid.shorten}"
      begin
        opts[:repetitions].times do |idx|
          Stella.li '%-61s %s' % [testrun.plan.desc, testrun.plan.planid.shorten(12)] if Stella.noise >= 2 && !Stella.quiet?
          testrun.plan.usecases.each_with_index do |uc,i|
            if opts[:usecases].nil? || opts[:usecases].member?(uc.class)
              Benelux.current_track.add_tags :usecase => uc.id
              Stella.rescue { 
                Stella.li ' %-60s %s' % [uc.desc, uc.ucid.shorten(12)] if Stella.noise >= 1 && !Stella.quiet?
                client.execute uc do |session|
                  Stella.li '  %3d %-4s %-76s' % [session.status, session.http_method.upcase, session.uri] if Stella.noise >= 1 && !Stella.quiet?
                  if Stella.noise >= 2 && !Stella.quiet?
                    Stella.li '   %s' % [session.req.header.dump.split(/\n/).join("\n   ")]
                    Stella.li
                    Stella.li '   %s' % [session.res.header.dump.split(/\n/).join("\n   ")]
                    Stella.li ''
                  end
                end
              }
              if client.exception
                if Stella.noise >= 1
                  Stella.li '  %4s %s (%s)' % ['', client.exception.message, client.exception.class]
                end
                # TODO: use a throw. This won't stop the next repetition.
                break if Stella::TestplanQuit === client.exception
              end
            else
              #Stella.li ' %-60s %s' % ["#{uc.desc} (skipped)", uc.ucid.shorten(12)] if Stella.noise >= 2
            end
            Benelux.current_track.remove_tags :usecase
          end
        end
      rescue Interrupt
        Stella.li "Skipping..." 
        testrun.etime = Stella.now
        testrun.fubar!
        exit 1
      rescue => ex
        Stella.li ex.message
        Stella.li ex.backtrace if Stella.debug?
      end
    end
  end
  
  begin
    threads.each { |thread| thread.join }
    timeline = Benelux.merge_tracks
  rescue Interrupt
    Stella.li "Skipping..."
    testrun.etime = Stella.now
    testrun.fubar!
    exit 1
  end
  
  begin
    testrun.etime = Stella.now
    testrun.report = Stella::Report.new timeline, testrun.runid
    testrun.report.process 
    testrun.report.fubars? ? testrun.fubar! : testrun.done! 
  rescue Interrupt
    Stella.li "Exiting..."
    testrun.etime = Stella.now
    testrun.fubar!
    exit 1
  rescue => ex
    Stella.li ex.message
    Stella.li ex.backtrace if Stella.debug?
    testrun.etime = Stella.now
    testrun.fubar!
  end
  Benelux.reset # If we run again, the old stats still remain
  testrun
end

Private Instance Methods

parse_opts(runopts, opts) click to toggle source
# File lib/stella/engine.rb, line 124
def parse_opts(runopts, opts)
  runopts.keys.each do |key|
    runopts[key.to_sym] = runopts.delete(key) if String === key
  end
  opts.keys.each do |key|
    opts[key.to_sym] = opts.delete(key) if String === key
  end
  runopts[:repetitions] ||= 1
  runopts[:concurrency] ||= 1
  runopts[:wait] ||= 1
  runopts.merge opts
end