Class: Sinatra::Runner

Inherits:
Object
  • Object
show all
Defined in:
lib/sinatra/runner.rb

Overview

NOTE: This feature is experimental, and missing tests!

Helps you spinning up and shutting down your own sinatra app. This is especially helpful for running real network tests against a sinatra backend.

The backend server could look like the following (in test/server.rb).

require "sinatra"

get "/" do
  "Cheers from test server"
end

get "/ping" do
  "1"
end

Note that you need to implement a ping action for internal use.

Next, you need to write your runner.

require 'sinatra/runner'

class Runner < Sinatra::Runner
  def app_file
    File.expand_path("../server.rb", __FILE__)
  end
end

Override Runner#app_file, #command, #port, #protocol and #ping_path for customization.

**Don’t forget to override #app_file specific to your application!**

Wherever you need this test backend, here’s how you manage it. The following example assumes you have a test in your app that needs to be run against your test backend.

runner = ServerRunner.new
runner.run

# ..tests against localhost:4567 here..

runner.kill

For an example, check github.com/apotonick/roar/blob/master/test/integration/runner.rb

Instance Method Summary collapse

Instance Method Details

#app_fileObject



51
52
53
# File 'lib/sinatra/runner.rb', line 51

def app_file
  File.expand_path("../server.rb", __FILE__)
end

#get(url) ⇒ Object



69
70
71
# File 'lib/sinatra/runner.rb', line 69

def get(url)
  Timeout.timeout(1) { get_url("#{protocol}://127.0.0.1:#{port}#{url}") }
end

#get_response(url) ⇒ Object



82
83
84
85
86
87
88
89
# File 'lib/sinatra/runner.rb', line 82

def get_response(url)
  Net::HTTP.start '127.0.0.1', port do |http|
    request = Net::HTTP::Get.new url
    http.request request do |response|
      response
    end
  end
end

#get_stream(url = "/stream", &block) ⇒ Object



73
74
75
76
77
78
79
80
# File 'lib/sinatra/runner.rb', line 73

def get_stream(url = "/stream", &block)
  Net::HTTP.start '127.0.0.1', port do |http|
    request = Net::HTTP::Get.new url
    http.request request do |response|
      response.read_body(&block)
    end
  end
end

#killObject



61
62
63
64
65
66
67
# File 'lib/sinatra/runner.rb', line 61

def kill
  return unless pipe
  Process.kill("KILL", pipe.pid)
rescue NotImplementedError
  system "kill -9 #{pipe.pid}"
rescue Errno::ESRCH
end

#logObject



91
92
93
94
95
96
# File 'lib/sinatra/runner.rb', line 91

def log
  @log ||= ""
  loop { @log <<  pipe.read_nonblock(1) }
rescue Exception
  @log
end

#runObject



55
56
57
58
59
# File 'lib/sinatra/runner.rb', line 55

def run
  @pipe     = start
  @started  = Time.now
  warn "#{server} up and running on port #{port}" if ping
end