def checkup
base_uri = Stella.canonical_uri(@argv.first)
run_opts = {
:repetitions => @option.repetitions || 1,
:concurrency => @option.concurrency || 1,
:timeout => @option.timeout || 30,
:wait => @option.wait || 1
}
if @global.format || !@global.testplan
Stella.noise = 0
end
@global.remote ||= @global.account || @global.key
if @global.remote
raise "Running a testplan remotely isn't supported yet (soon!)" if @global.testplan
@api = Stella::API.new @global.account, @global.key
ret = @api.post :checkup, :uri => base_uri
if ret && ret[:runid]
shortid = ret[:runid].slice 0, 19
@more_info = @api.site_uri "/checkup/#{shortid}"
end
pp @api.response if Stella.debug
if @api.response.code >= 400
raise Stella::API::Unauthorized if @api.response.code == 401
STDERR.puts ret[:msg]
@exit_code = 1 and return
end
count = 0
begin
run_hash = @api.get "/checkup/#{ret[:runid]}"
@run = Stella::Testrun.from_hash run_hash if run_hash
STDERR.print '.' if @global.verbose > 0
sleep 1 if @run && !@run.done?
count += 1
end while @run && !@run.done? && count < 35
raise "Sorry, that took too long" if count >= 35
else
if @global.testplan
unless File.owned?(@global.testplan)
raise ArgumentError, "File not found #{@global.testplan}"
end
Stella.ld "Load #{@global.testplan}"
load @global.testplan
filter = @global.usecase
planname = Stella::Testplan.plans.keys.first
@plan = Stella::Testplan.plan(planname)
if filter
@plan.usecases.reject! { |uc|
ret = !uc.desc.to_s.downcase.match(filter.downcase)
Stella.ld " rejecting #{uc.desc}" if ret
ret
}
end
Stella.ld "Running #{@plan.usecases.size} usecases"
else
@plan = Stella::Testplan.new base_uri
end
@run = @plan.checkup base_uri, run_opts
end
@report = @run.report
@exit_code = @report.error_count if Stella.quiet?
unless @global.testplan
case @global.format
when 'csv'
metrics = @report.metrics_pack
puts metrics.dump(@global.format)
when 'json', 'yaml'
puts @run.dump(@global.format)
else
if @global.verbose > 0 || @report.errors?
test_uri = @report.log.first ? @report.log.first.uri : '[unknown]'
Stella.li 'Checkup for %s' % [test_uri]
if !@report.timeouts? && !@report.fubars?
Stella.li
Stella.li ' %s' % [@report.headers.request_headers.split(/\n/).join("\n ")]
Stella.li
Stella.li ' %s' % [@report.headers.response_headers.split(/\n/).join("\n ")]
Stella.li ''
end
end
metrics = @report.metrics
if @report.fubars?
Stella.li "You found a Stella bug!"
Stella.li "Let Tucker know: https://www.blamestella.com/feedback"
else
args = [
@report.timeouts? ? 'timeout' : @report.statuses.values.first,
metrics.response_time.mean*1000,
metrics.socket_connect.mean*1000,
metrics.first_byte.mean*1000,
metrics.last_byte.mean*1000,
@more_info]
Stella.li "[%3s] %7.2fms (%5.2fms + %6.2fms + %6.2fms) %s" % args
end
end
end
rescue Stella::API::Unauthorized => ex
accnt = @api.account || 'youraccount'
key = @api.key || 'yourapikey'
STDERR.puts "Specify your credentials"
STDERR.puts " export STELLA_ACCOUNT=#{accnt}"
STDERR.puts " export STELLA_KEY=#{key}"
STDERR.puts " OR "
STDERR.puts " stella -A #{accnt} -K #{key} checkup #{@argv.first}"
STDERR.puts
STDERR.puts "Create an account, at no charge!"
STDERR.puts "https://www.blamestella.com/signup/free"
end