Class: DerailSpecs::Server

Inherits:
Object
  • Object
show all
Defined in:
lib/derail_specs/server.rb,
lib/derail_specs/server/app.rb,
lib/derail_specs/server/puma.rb,
lib/derail_specs/server/timer.rb,
lib/derail_specs/server/checker.rb,
lib/derail_specs/server/middleware.rb

Defined Under Namespace

Modules: Puma Classes: Checker, Middleware, Timer

Constant Summary collapse

App =
Rack::Builder.new do
  map "/reset-transaction" do
    run lambda { |_env|
      Transaction.reset
      [202, { "Content-Type" => "text/plain" }, ["Accepted"]]
    }
  end
  map "/factory-bot/create" do
    run lambda { |env|
      body = Rack::Request.new(env).body.gets
      object = FactoryBot.create(*JSON.parse(body))

      [202, { "Content-Type" => "application/json" }, [object.to_json]]
    }
  end
  map "/factory-bot/create-list" do
    run lambda { |env|
      body = Rack::Request.new(env).body.gets
      object = FactoryBot.create_list(*JSON.parse(body))

      [202, { "Content-Type" => "application/json" }, [object.to_json]]
    }
  end
  map "/" do
    run Rails.application
  end
end

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(reportable_errors: [Exception], extra_middleware: []) ⇒ Server

Returns a new instance of Server.



24
25
26
27
28
29
30
31
32
33
34
# File 'lib/derail_specs/server.rb', line 24

def initialize(reportable_errors: [Exception], extra_middleware: [])
  @app = Server::App
  @extra_middleware = extra_middleware
  @server_thread = nil # suppress warnings
  @host = DerailSpecs.configuration.host
  @reportable_errors = reportable_errors
  @port = DerailSpecs.configuration.port
  @port ||= Server.ports[port_key]
  @port ||= find_available_port(host)
  @checker = Checker.new(@host, @port)
end

Instance Attribute Details

#appObject (readonly)

Returns the value of attribute app.



22
23
24
# File 'lib/derail_specs/server.rb', line 22

def app
  @app
end

#hostObject (readonly)

Returns the value of attribute host.



22
23
24
# File 'lib/derail_specs/server.rb', line 22

def host
  @host
end

#portObject (readonly)

Returns the value of attribute port.



22
23
24
# File 'lib/derail_specs/server.rb', line 22

def port
  @port
end

Class Method Details

.portsObject



17
18
19
# File 'lib/derail_specs/server.rb', line 17

def ports
  @ports ||= {}
end

Instance Method Details

#bootObject



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/derail_specs/server.rb', line 67

def boot
  unless responsive?
    Server.ports[port_key] = port

    @server_thread = Thread.new do
      Puma.create(middleware, port, host)
    end

    timer = Timer.new(60)
    until responsive?
      raise "Rack application timed out during boot" if timer.expired?

      @server_thread.join(0.1)
    end
  end

  self
end

#errorObject



40
41
42
# File 'lib/derail_specs/server.rb', line 40

def error
  middleware.error
end

#reset_error!Object



36
37
38
# File 'lib/derail_specs/server.rb', line 36

def reset_error!
  middleware.clear_error
end

#responsive?Boolean

Returns:

  • (Boolean)


48
49
50
51
52
53
54
55
56
# File 'lib/derail_specs/server.rb', line 48

def responsive?
  return false if @server_thread&.join(0)

  res = @checker.request { |http| http.get("/__identify__") }

  return res.body == app.object_id.to_s if res.is_a?(Net::HTTPSuccess) || res.is_a?(Net::HTTPRedirection)
rescue SystemCallError, Net::ReadTimeout, OpenSSL::SSL::SSLError
  false
end

#using_ssl?Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/derail_specs/server.rb', line 44

def using_ssl?
  @checker.ssl?
end

#wait_for_pending_requestsObject



58
59
60
61
62
63
64
65
# File 'lib/derail_specs/server.rb', line 58

def wait_for_pending_requests
  timer = Timer.new(60)
  while pending_requests?
    raise "Requests did not finish in 60 seconds: #{middleware.pending_requests}" if timer.expired?

    sleep 0.01
  end
end