agile-proxy 0.1.21 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dca50b88e4dff710583bb65d8dfeea362efe0194
4
- data.tar.gz: ce452e942ba2a2b186b74d95e34048abb001098c
3
+ metadata.gz: cdc83345bdd428e0b53171381e809cd739281a32
4
+ data.tar.gz: 52dc13eeb368e9d19cb2f3cc1f2248d6320a573c
5
5
  SHA512:
6
- metadata.gz: 42012c6b32b17916cdd7b5b592f434e7db5eb50dd6fd2b9c8f2cf6715631d295f490e4dc73fb72e6b6ba59c238572833c9d9da8167dbe0451ddecbef2ae4d04e
7
- data.tar.gz: 3ed48c70d0599bb27c7956ccec8e7fa2c14e89feb9644f2375cf5703c793544c30c1a62252055b66fddf94888ef1827f5ea4500dad8148791f527ca9136000e2
6
+ metadata.gz: e10828a0c1eaf12ee379f4b4de473c5a64afd514722897561b21e2a4327a27f7d93836043ee26103eb282840bd9c1a92ff1a0532566c5c9423abe9956f4f29ca
7
+ data.tar.gz: f287eb594c2ba7d69e3b19d640bbde4a1beec400cecb40d5c4ee17b5d12532019e7cf32ba767cba245338aa5c41a1d9ad5bd10ec3ca3a2d8734fa07000e74eaa
data/.gitignore CHANGED
@@ -6,5 +6,4 @@ assets/ui/bower_components
6
6
  .yardoc
7
7
  db/*.db
8
8
  coverage/
9
- Gemfile.lock
10
- vendor/gems
9
+ Gemfile.lock
data/README.md CHANGED
@@ -123,4 +123,5 @@ v0.1.19 - Recordings now record the request spec id.
123
123
  Recordings can now be accessed via /request_specs/:request_spec_id/recordings to provide recordings specific to the request spec
124
124
  v0.1.20 - An individual request spec can now be set to 'record_requests' rather than requiring the whole application to be in record mode which slows down every request
125
125
  v0.1.21 - Switched to goliath instead of thin. The gem now installs under jruby as well as other platforms.
126
+ v0.1.22 - Reverted 0.1.21 - Integration tests worked fine, but failed in real world scenario - never ending responses from stubs
126
127
 
@@ -21,9 +21,11 @@ Gem::Specification.new do |gem|
21
21
  gem.add_development_dependency 'faraday', '~> 0.9', '>= 0.9.0'
22
22
  gem.add_development_dependency 'poltergeist', '~> 1.5', '>= 1.5.1'
23
23
  gem.add_development_dependency 'selenium-webdriver', '~> 2.43', '>= 2.43.0'
24
+ gem.add_development_dependency 'rack', '~> 1.6', '>= 1.6.0'
24
25
  gem.add_development_dependency 'guard', '~> 2.6', '>= 2.6.1'
25
26
  gem.add_development_dependency 'rb-inotify', '~> 0.9', '>= 0.9.5'
26
27
  gem.add_development_dependency 'cucumber', '~> 1.3', '>= 1.3.17'
28
+ gem.add_development_dependency 'airborne', '~> 0.1', '>= 0.1.10'
27
29
  gem.add_development_dependency 'rest-client', '~> 1.7', '>= 1.7.2'
28
30
  gem.add_development_dependency 'require_all', '~> 1.3', '>= 1.3.2'
29
31
  gem.add_development_dependency 'faker', '~> 1.2', '>= 1.2.0'
@@ -33,24 +35,16 @@ Gem::Specification.new do |gem|
33
35
  gem.add_runtime_dependency 'eventmachine', '~> 1.0', '>= 1.0.3'
34
36
  gem.add_runtime_dependency 'em-synchrony', '~> 1.0', '>= 1.0.3'
35
37
  gem.add_runtime_dependency 'em-http-request', '~> 1.1', '>= 1.1.2'
38
+ gem.add_runtime_dependency 'eventmachine_httpserver', '~> 0.2', '>= 0.2.1'
39
+ gem.add_runtime_dependency 'http_parser.rb', '~> 0.6', '>= 0.6.0'
40
+ gem.add_runtime_dependency 'multi_json', '~> 1.10', '>= 1.10.1'
41
+ gem.add_runtime_dependency 'thin', '~> 1.6', '>= 1.6.2'
36
42
  gem.add_runtime_dependency 'grape', '~> 0.10', '>= 0.10.1'
37
43
  gem.add_runtime_dependency 'activerecord', '~> 4.2', '>= 4.2.0'
38
- if RUBY_PLATFORM =~ /java/
39
- #JVM Only
40
- gem.add_runtime_dependency 'activerecord-jdbc-adapter'
41
- gem.add_runtime_dependency 'activerecord-jdbcsqlite3-adapter'
42
- else
43
- #Non JVM
44
- gem.add_runtime_dependency 'sqlite3', '~> 1.3', '>= 1.3.10'
45
- end
46
-
47
-
48
-
44
+ gem.add_runtime_dependency 'sqlite3', '~> 1.3', '>= 1.3.10'
49
45
  gem.add_runtime_dependency 'grape-kaminari', '~> 0.1', '>= 0.1.7'
50
46
  gem.add_runtime_dependency 'shoulda-matchers', '2.8.0.rc2'
51
47
  gem.add_runtime_dependency 'flavour_saver', '~> 0.3', '>= 0.3.4'
52
48
  gem.add_runtime_dependency 'thor', '~> 0.19', '>= 0.19.1'
53
- gem.add_runtime_dependency 'goliath', '~> 1.0', '>= 1.0.4'
54
- gem.add_runtime_dependency 'goliath-proxy', '~> 0.0', '>= 0.0.1'
55
-
49
+ gem.add_runtime_dependency 'rack-parser', '~> 0.6', '>= 0.6.1'
56
50
  end
@@ -36,9 +36,8 @@ module AgileProxy
36
36
  ]
37
37
  end
38
38
  request_spec = env['agile_proxy.request_spec']
39
- exclude_headers = ['@env', 'rack.errors', 'rack.logger']
40
39
  if application.record_requests || (request_spec && request_spec.record_requests)
41
- application.recordings.create request_headers: request.headers.reject {|key, value| exclude_headers.include?(key)},
40
+ application.recordings.create request_headers: request.headers,
42
41
  request_body: body,
43
42
  request_url: request.url,
44
43
  request_method: request.request_method,
@@ -2,6 +2,7 @@ require 'agile_proxy/handlers/handler'
2
2
  require 'agile_proxy/model/request_spec'
3
3
  require 'agile_proxy/router'
4
4
  require 'agile_proxy/model/application'
5
+ require 'rack/parser'
5
6
  require 'action_dispatch'
6
7
  require 'base64'
7
8
  module AgileProxy
@@ -1,5 +1,4 @@
1
1
  require_relative 'application'
2
- require 'active_record'
3
2
  module AgileProxy
4
3
  #
5
4
  # = The recording model
@@ -1,27 +1,24 @@
1
1
  require 'uri'
2
2
  require 'eventmachine'
3
+ require 'http/parser'
4
+ require 'em-http'
5
+ require 'evma_httpserver'
6
+ require 'em-synchrony'
3
7
  require 'stringio'
4
8
  require 'rack'
5
- require 'goliath/request'
6
- require 'goliath/env'
7
9
 
8
10
  module AgileProxy
9
11
  #
10
12
  # = The Proxy Connection
11
13
  #
12
14
  # This class is the event machine connection used by the proxy. Every request creates a new instance of this
13
- class ProxyConnection < Goliath::Connection
14
- def logger
15
- ::AgileProxy.config.logger
16
- end
15
+ class ProxyConnection < EventMachine::Connection
16
+ attr_accessor :handler
17
17
  def post_init
18
- super
19
- #@proxy_parser = Http::Parser.new(self)
20
- @proxy_parser = Http::Parser.new
18
+ @parser = Http::Parser.new(self)
21
19
  end
22
20
 
23
21
  def receive_data(data)
24
- #@proxy_parser << data
25
22
  @parser << data
26
23
  end
27
24
 
@@ -39,25 +36,24 @@ module AgileProxy
39
36
  end
40
37
 
41
38
  def on_message_complete
42
- if @proxy_parser.http_method == 'CONNECT'
43
- restart_with_ssl(@proxy_parser.request_url)
39
+ if @parser.http_method == 'CONNECT'
40
+ restart_with_ssl(@parser.request_url)
44
41
  else
45
42
  if @ssl
46
- uri = URI.parse(@proxy_parser.request_url)
43
+ uri = URI.parse(@parser.request_url)
47
44
  @url = "https://#{@ssl}#{[uri.path, uri.query].compact.join('?')}"
48
45
  else
49
- @url = @proxy_parser.request_url
46
+ @url = @parser.request_url
50
47
  end
51
48
  handle_request
52
49
  end
53
50
  end
54
51
 
55
-
56
52
  protected
57
53
 
58
54
  def restart_with_ssl(url)
59
55
  @ssl = url
60
- @proxy_parser = Http::Parser.new(self)
56
+ @parser = Http::Parser.new(self)
61
57
  @original_headers = @headers.clone
62
58
  send_data("HTTP/1.0 200 Connection established\r\nProxy-agent: Http-Flexible-Proxy/0.0.0\r\n\r\n")
63
59
  start_tls(
@@ -68,9 +64,11 @@ module AgileProxy
68
64
 
69
65
  def handle_request
70
66
  EM.synchrony do
71
- request = ::Goliath::Request.new(handler, self, env)
72
- request.set_deferred_status :succeeded
73
- request.process
67
+ request = ActionDispatch::Request.new(env)
68
+ request.params # This will populate action_dispatch.request.parameters
69
+ handler.call(env).tap do |response|
70
+ send_response(response)
71
+ end
74
72
  end
75
73
  end
76
74
 
@@ -81,11 +79,10 @@ module AgileProxy
81
79
  fake_input_buffer = StringIO.new(@body)
82
80
  fake_error_buffer = StringIO.new
83
81
  url_parsed = URI.parse(@url)
84
- @__env = ::Goliath::Env.new
85
- @__env.merge!({
82
+ @__env = {
86
83
  'rack.input' => Rack::Lint::InputWrapper.new(fake_input_buffer),
87
84
  'rack.errors' => Rack::Lint::ErrorWrapper.new(fake_error_buffer),
88
- 'REQUEST_METHOD' => @proxy_parser.http_method,
85
+ 'REQUEST_METHOD' => @parser.http_method,
89
86
  'REQUEST_PATH' => url_parsed.path,
90
87
  'PATH_INFO' => url_parsed.path,
91
88
  'QUERY_STRING' => url_parsed.query || '',
@@ -93,11 +90,9 @@ module AgileProxy
93
90
  'rack.url_scheme' => url_parsed.scheme,
94
91
  'CONTENT_LENGTH' => @body.length,
95
92
  'SERVER_NAME' => url_parsed.host,
96
- 'SERVER_PORT' => url_parsed.port,
97
- 'rack.logger' => logger
93
+ 'SERVER_PORT' => url_parsed.port
98
94
 
99
-
100
- })
95
+ }
101
96
  @headers.merge(@original_headers || {}).each do |name, value|
102
97
  converted_name = "HTTP_#{name.gsub(/-/, '_').upcase}"
103
98
  @__env[converted_name] = value
@@ -107,6 +102,12 @@ module AgileProxy
107
102
  @__env
108
103
  end
109
104
 
110
-
105
+ def send_response(response)
106
+ res = EM::DelegatedHttpResponse.new(self)
107
+ res.status = response[0]
108
+ res.headers = response[1]
109
+ res.content = response[2]
110
+ res.send_response
111
+ end
111
112
  end
112
113
  end
@@ -3,27 +3,13 @@ require 'yaml'
3
3
  require 'cgi'
4
4
  require 'uri'
5
5
  require 'eventmachine'
6
+ require 'thin'
6
7
  require 'grape'
7
8
  require 'agile_proxy/api/root'
8
9
  require 'agile_proxy/servers/api'
9
10
  require 'agile_proxy/servers/request_spec'
10
11
  require 'agile_proxy/servers/request_spec_direct'
11
12
  require 'forwardable'
12
-
13
- require 'goliath/api'
14
- require 'goliath/runner'
15
-
16
- # Example demonstrating how to use a custom Goliath runner
17
- #
18
-
19
- class Custom < Goliath::API
20
- def response(env)
21
- [200, {}, "hello!"]
22
- end
23
- end
24
-
25
-
26
-
27
13
  module AgileProxy
28
14
  #
29
15
  # This class is responsible for controlling the underlying proxy and web servers
@@ -1,7 +1,6 @@
1
1
  require 'rack'
2
+ require 'thin'
2
3
  require 'grape'
3
- require 'goliath/api'
4
- require 'goliath/runner'
5
4
  require 'agile_proxy/api/root'
6
5
 
7
6
  module AgileProxy
@@ -20,19 +19,21 @@ module AgileProxy
20
19
  # @param webserver_host [String] The host for the server to run on
21
20
  # @param webserver_port [Integer] The port for the server to run on
22
21
  def start(webserver_host, webserver_port)
23
- #
24
- # The API runner
25
- runner = ::Goliath::Runner.new([], nil)
26
- runner.address = webserver_host
27
- runner.port = webserver_port
28
- runner.app = ::Goliath::Rack::Builder.app do
22
+ # The sinatra web server
23
+ dispatch = Rack::Builder.app do
29
24
  use Rack::Static, root: File.join(ROOT, 'assets'), urls: ['/ui'], index: 'index.html'
30
25
  map '/api' do
31
26
  run ::AgileProxy::Api::Root.new
32
27
  end
33
28
  end
34
- runner.run
35
-
29
+ # Start the web server.
30
+ ::Rack::Server.start(
31
+ app: dispatch,
32
+ server: 'thin',
33
+ Host: webserver_host,
34
+ Port: webserver_port,
35
+ signals: false
36
+ )
36
37
  end
37
38
  end
38
39
  end
@@ -1,6 +1,4 @@
1
1
  require 'eventmachine'
2
- require 'goliath/api'
3
- require 'goliath/proxy'
4
2
  module AgileProxy
5
3
  module Servers
6
4
  #
@@ -8,7 +6,6 @@ module AgileProxy
8
6
  # This server is responsible for handling or passing through a request, depending
9
7
  # on if it has a matching 'Request Specification'
10
8
  class RequestSpec
11
-
12
9
  # Starts the server
13
10
  def self.start
14
11
  new.start
@@ -18,23 +15,16 @@ module AgileProxy
18
15
  end
19
16
  # Starts the server
20
17
  def start
21
- #
22
- # The API runner
23
- runner = ::Goliath::Proxy::Runner.new([], nil)
24
- runner.address = '127.0.0.1'
25
- runner.port = AgileProxy.config.proxy_port
26
- app = @request_handler
27
- runner.app = app
28
- runner.run
18
+ @signature = EM.start_server('127.0.0.1', AgileProxy.config.proxy_port, ProxyConnection) do |p|
19
+ p.handler = @request_handler
20
+ end
29
21
  self
30
-
31
22
  end
32
23
  # The port the server is running on
33
24
  # @return [Integer] The port the server is running on
34
25
  def port
35
- return AgileProxy.config.proxy_port
26
+ Socket.unpack_sockaddr_in(EM.get_sockname(@signature)).first
36
27
  end
37
- private
38
28
  end
39
29
  end
40
30
  end
@@ -1,6 +1,6 @@
1
1
  require 'rack'
2
- require 'goliath/api'
3
- require 'goliath/runner'
2
+ require 'thin'
3
+
4
4
  module AgileProxy
5
5
  module Servers
6
6
  #
@@ -17,17 +17,21 @@ module AgileProxy
17
17
  # @param server_host [String] The host for the server to run on
18
18
  # @param server_port [Integer] The port for the server to run on
19
19
  def start(server_host, server_port, static_dirs = [])
20
-
21
- runner = ::Goliath::Runner.new([], nil)
22
- runner.address = server_host
23
- runner.port = server_port
24
- runner.app = ::Goliath::Rack::Builder.app do
20
+ # The sinatra web server
21
+ dispatch = Rack::Builder.app do
25
22
  use Rack::Static, root: File.join(ROOT, 'assets'), urls: static_dirs, index: 'index.html' unless static_dirs.empty?
26
23
  map '/' do
27
24
  run ::AgileProxy::StubHandler.new
28
25
  end
29
26
  end
30
- runner.run
27
+ # Start the web server.
28
+ ::Rack::Server.start(
29
+ app: dispatch,
30
+ server: 'thin',
31
+ Host: server_host,
32
+ Port: server_port,
33
+ signals: false
34
+ )
31
35
  end
32
36
  end
33
37
  end
@@ -2,5 +2,5 @@
2
2
  #
3
3
  # The Agile Proxy module is a common namespace for all classes / sub modules.
4
4
  module AgileProxy
5
- VERSION = '0.1.21'
5
+ VERSION = '0.1.22'
6
6
  end
@@ -10,7 +10,6 @@ RSpec.configure do |config|
10
10
  config.before :all, :type => :integration do
11
11
  start_test_servers
12
12
  start_proxy_server
13
- debug_me = true
14
13
  end
15
14
 
16
15
  end
@@ -1,80 +1,23 @@
1
+ require 'eventmachine'
2
+ require 'thin'
1
3
  require 'faraday'
2
4
  require 'agile_proxy/cli'
3
- require 'socket'
4
5
 
5
-
6
-
7
-
8
- module AgileProxy
9
- module TestServer
10
- class DummyApi
11
- def response(env)
12
- [200, {}, "hello!"]
6
+ module Thin
7
+ module Backends
8
+ class TcpServer
9
+ def get_port
10
+ # seriously, eventmachine, how hard does getting a port have to be?
11
+ Socket.unpack_sockaddr_in(EM.get_sockname(@signature)).first
13
12
  end
14
13
  end
15
- class Server
16
- attr_accessor :server_port
17
- def initialize(world)
18
- @world = world
19
- at_exit do
20
- cleanup
21
- end
22
- #Thin::Logging.silent = true
23
- end
24
- def pids
25
- @pids ||= []
26
- end
27
- def cleanup
28
- until pids.empty?
29
- begin
30
- Process.kill('INT', pids.pop);
31
- rescue Errno::ESRCH
32
- #Do nothing
33
- end
34
- end
35
- end
36
- def available_port(qty = 1)
37
- # use Addrinfo
38
- results = []
39
- sockets_opened = []
40
- while results.length < qty
41
- socket = Socket.new(:INET, :STREAM, 0)
42
- socket.bind(Addrinfo.tcp("127.0.0.1", 0))
43
- port = socket.local_address.ip_port
44
- results.push port unless results.include? port
45
- sockets_opened.push socket
46
- end
47
- sockets_opened.each do |socket|
48
- socket.close
49
- end
50
- results
51
- end
52
-
53
- def ruby
54
- RbConfig.ruby
55
- end
56
- def start_test_servers
57
- ports = available_port(3)
58
- puts "Starting test server on #{ports[0]}"
59
- pids.push spawn(ruby, "echo_server.rb", '--address', 'localhost', '--port', "#{ports[0]}")
60
- puts "Starting test server on #{ports[1]}"
61
- pids.push spawn(ruby, "echo_server.rb", '--address', 'localhost', '--port', "#{ports[1]}", '--ssl')
62
- puts "Starting test server on #{ports[2]}"
63
- pids.push spawn({'STATUS_CODE' => '500'}, ruby, "echo_server.rb", '--address', 'localhost', '--port', "#{ports[2]}")
64
- @world.instance_eval do
65
- @http_url = "http://localhost:#{ports.shift}"
66
- @https_url = "https://localhost:#{ports.shift}"
67
- @error_url = "http://localhost:#{ports.shift}"
68
- @http_url_no_proxy = "http://localhost:#{server_port}"
69
- @https_url_no_proxy = "https://localhost:#{server_port}"
70
- end
71
- end
72
-
73
-
74
- end
14
+ end
15
+ end
75
16
 
17
+ module AgileProxy
18
+ module TestServer
76
19
  def initialize(rspecParams=nil)
77
-
20
+ Thin::Logging.silent = true
78
21
  end
79
22
  def proxy_port
80
23
  3101
@@ -86,20 +29,66 @@ module AgileProxy
86
29
  3022
87
30
  end
88
31
 
89
-
90
32
  def start_test_servers
91
- @test_servers = Server.new(self)
92
- @test_servers.server_port = server_port
93
- @test_servers.start_test_servers
33
+ q = Queue.new
34
+ Thread.new do
35
+ EM.run do
36
+ echo = echo_app_setup
37
+
38
+ http_server = start_server(echo)
39
+ q.push http_server.backend.get_port
40
+
41
+ https_server = start_server(echo, true)
42
+ q.push https_server.backend.get_port
43
+
44
+ echo_error = echo_app_setup(500)
45
+ error_server = start_server(echo_error)
46
+ q.push error_server.backend.get_port
47
+ end
48
+ end
49
+
50
+ @http_url = "http://localhost:#{q.pop}"
51
+ @https_url = "https://localhost:#{q.pop}"
52
+ @error_url = "http://localhost:#{q.pop}"
53
+ @http_url_no_proxy = "http://localhost:#{server_port}"
54
+ @https_url_no_proxy = "https://localhost:#{server_port}"
94
55
  end
95
56
 
96
57
  def start_proxy_server
97
58
  Thread.new do
98
59
  cli = Cli.start(['start', proxy_port.to_s, server_port.to_s, api_port.to_s, '--env', 'test'])
99
60
  end
100
- sleep 10
61
+ sleep 1
101
62
  end
102
63
 
64
+ def echo_app_setup(response_code = 200)
65
+ counter = 0
66
+ proc do |env|
67
+ req_body = env['rack.input'].read
68
+ request_info = "#{env['REQUEST_METHOD']} #{env['PATH_INFO']}"
69
+ res_body = request_info
70
+ res_body += "\n#{req_body}" unless req_body.empty?
71
+ counter += 1
72
+ [
73
+ response_code,
74
+ { 'HTTP-X-EchoServer' => request_info,
75
+ 'HTTP-X-EchoCount' => "#{counter}" },
76
+ [res_body]
77
+ ]
78
+ end
79
+ end
103
80
 
81
+ def start_server(echo, ssl = false)
82
+ http_server = Thin::Server.new '127.0.0.1', 0, echo
83
+ if ssl
84
+ http_server.ssl = true
85
+ http_server.ssl_options = {
86
+ private_key_file: File.expand_path('../../fixtures/test-server.key', __FILE__),
87
+ cert_chain_file: File.expand_path('../../fixtures/test-server.crt', __FILE__)
88
+ }
89
+ end
90
+ http_server.start
91
+ http_server
92
+ end
104
93
  end
105
94
  end
@@ -2,16 +2,16 @@ require 'spec_helper'
2
2
  describe AgileProxy::Servers::Api do
3
3
  let(:subject) { AgileProxy::Servers::Api }
4
4
  let(:rack_builder_class) { Class.new }
5
- let(:goliath_runner_class) { Class.new }
5
+ let(:rack_server_class) { Class.new }
6
6
  let(:rack_static_class) { Class.new }
7
7
  let(:api_root_class) { Class.new }
8
8
  before :each do
9
- stub_const('Goliath::Rack::Builder', rack_builder_class)
9
+ stub_const('Rack::Builder', rack_builder_class)
10
10
  stub_const('Rack::Static', rack_static_class)
11
- stub_const('Goliath::Runner', goliath_runner_class)
11
+ stub_const('Rack::Server', rack_server_class)
12
12
  stub_const('AgileProxy::Api::Root', api_root_class)
13
13
  end
14
- it 'Should start a goliath server when the start method is called' do
14
+ it 'Should start a rack server when the start method is called' do
15
15
  builder_block = nil
16
16
  expect(rack_builder_class).to receive(:app) do |&blk|
17
17
  builder_block = blk
@@ -24,11 +24,7 @@ describe AgileProxy::Servers::Api do
24
24
  rack_builder_class.new.instance_eval(&blk)
25
25
 
26
26
  end
27
- expect_any_instance_of(goliath_runner_class).to receive(:run)
28
- expect_any_instance_of(goliath_runner_class).to receive(:initialize).with([], nil)
29
- expect_any_instance_of(goliath_runner_class).to receive(:address=).with('localhost')
30
- expect_any_instance_of(goliath_runner_class).to receive(:port=).with('3020')
31
- expect_any_instance_of(goliath_runner_class).to receive(:app=)
27
+ expect(rack_server_class).to receive(:start)
32
28
  subject.start('localhost', '3020')
33
29
 
34
30
  end
@@ -2,13 +2,13 @@ require 'spec_helper'
2
2
  describe AgileProxy::Servers::RequestSpecDirect do
3
3
  let(:subject) { AgileProxy::Servers::RequestSpecDirect }
4
4
  let(:rack_builder_class) { Class.new }
5
- let(:goliath_runner_class) { Class.new }
5
+ let(:rack_server_class) { Class.new }
6
6
  let(:rack_static_class) { Class.new }
7
7
  let(:stub_handler_class) { Class.new }
8
8
  before :each do
9
- stub_const('Goliath::Rack::Builder', rack_builder_class)
9
+ stub_const('Rack::Builder', rack_builder_class)
10
10
  stub_const('Rack::Static', rack_static_class)
11
- stub_const('Goliath::Runner', goliath_runner_class)
11
+ stub_const('Rack::Server', rack_server_class)
12
12
  stub_const('AgileProxy::StubHandler', stub_handler_class)
13
13
  end
14
14
  it 'Should start a rack server with a static handler when the start method is called' do
@@ -24,11 +24,7 @@ describe AgileProxy::Servers::RequestSpecDirect do
24
24
  rack_builder_class.new.instance_eval(&blk)
25
25
 
26
26
  end
27
- expect_any_instance_of(goliath_runner_class).to receive(:run)
28
- expect_any_instance_of(goliath_runner_class).to receive(:initialize).with([], nil)
29
- expect_any_instance_of(goliath_runner_class).to receive(:address=).with('localhost')
30
- expect_any_instance_of(goliath_runner_class).to receive(:port=).with('3030')
31
- expect_any_instance_of(goliath_runner_class).to receive(:app=)
27
+ expect(rack_server_class).to receive(:start)
32
28
  subject.start('localhost', '3030', ['/ui', '/images'])
33
29
 
34
30
  end
@@ -44,11 +40,7 @@ describe AgileProxy::Servers::RequestSpecDirect do
44
40
  expect_any_instance_of(rack_builder_class).to receive(:run).with(kind_of(stub_handler_class))
45
41
  rack_builder_class.new.instance_eval(&blk)
46
42
  end
47
- expect_any_instance_of(goliath_runner_class).to receive(:run)
48
- expect_any_instance_of(goliath_runner_class).to receive(:initialize).with([], nil)
49
- expect_any_instance_of(goliath_runner_class).to receive(:address=).with('localhost')
50
- expect_any_instance_of(goliath_runner_class).to receive(:port=).with('3030')
51
- expect_any_instance_of(goliath_runner_class).to receive(:app=)
43
+ expect(rack_server_class).to receive(:start)
52
44
  subject.start('localhost', '3030')
53
45
 
54
46
  end
@@ -1,33 +1,30 @@
1
1
  require 'spec_helper'
2
2
  describe AgileProxy::Servers::RequestSpec do
3
3
  let(:subject) { AgileProxy::Servers::RequestSpec }
4
- let(:rack_builder_class) { Class.new }
5
- let(:goliath_runner_class) { Class.new }
6
- let(:rack_static_class) { Class.new }
4
+ let(:event_machine_class) { Class.new }
5
+ let(:socket_class) { Class.new }
6
+ let(:proxy_connection_class) { Class.new }
7
7
  let(:request_handler_class) { Class.new }
8
- let(:config_class) {Class.new}
9
8
  before :each do
10
- stub_const('Goliath::Rack::Builder', rack_builder_class)
11
- stub_const('Rack::Static', rack_static_class)
12
- stub_const('Goliath::Proxy::Runner', goliath_runner_class)
9
+ stub_const('EM', event_machine_class)
10
+ stub_const('Socket', socket_class)
11
+ stub_const('AgileProxy::ProxyConnection', proxy_connection_class)
13
12
  stub_const('AgileProxy::RequestHandler', request_handler_class)
14
- stub_const('AgileProxy::Config', config_class)
15
13
  end
16
14
  context 'With started server' do
17
15
  before :each do
18
- expect_any_instance_of(goliath_runner_class).to receive(:run)
19
- expect_any_instance_of(goliath_runner_class).to receive(:initialize).with([], nil)
20
- expect_any_instance_of(goliath_runner_class).to receive(:address=).with('127.0.0.1')
21
- expect_any_instance_of(goliath_runner_class).to receive(:port=).with('3100')
22
- expect_any_instance_of(goliath_runner_class).to receive(:app=).with(instance_of(request_handler_class))
23
- expect(AgileProxy).to receive(:config).at_least(:once).and_return config_class.new
24
- expect_any_instance_of(config_class).to receive(:proxy_port).at_least(:once).and_return '3100'
25
- allow_any_instance_of(config_class).to receive(:reset)
16
+ expect(event_machine_class).to receive(:start_server).with('127.0.0.1', AgileProxy.config.proxy_port, proxy_connection_class) do |_host, _port, _connection_class, &blk|
17
+ connection_instance = proxy_connection_class.new
18
+ expect(connection_instance).to receive(:handler=).with(kind_of(request_handler_class))
19
+ blk.call(connection_instance)
20
+ end.and_return 'signature'
26
21
  end
27
22
  it 'Should start the server and return the instance' do
28
23
  expect(subject.start).to be_a_kind_of(subject)
29
24
  end
30
25
  it 'Should return the port it is running on' do
26
+ expect(event_machine_class).to receive(:get_sockname).with('signature').and_return 'sockname'
27
+ expect(socket_class).to receive(:unpack_sockaddr_in).with('sockname').and_return ['3100']
31
28
  expect(subject.start.port).to eql '3100'
32
29
 
33
30
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: agile-proxy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.21
4
+ version: 0.1.22
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gary Taylor
@@ -124,6 +124,26 @@ dependencies:
124
124
  - - ">="
125
125
  - !ruby/object:Gem::Version
126
126
  version: 2.43.0
127
+ - !ruby/object:Gem::Dependency
128
+ name: rack
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '1.6'
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: 1.6.0
137
+ type: :development
138
+ prerelease: false
139
+ version_requirements: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - "~>"
142
+ - !ruby/object:Gem::Version
143
+ version: '1.6'
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: 1.6.0
127
147
  - !ruby/object:Gem::Dependency
128
148
  name: guard
129
149
  requirement: !ruby/object:Gem::Requirement
@@ -184,6 +204,26 @@ dependencies:
184
204
  - - ">="
185
205
  - !ruby/object:Gem::Version
186
206
  version: 1.3.17
207
+ - !ruby/object:Gem::Dependency
208
+ name: airborne
209
+ requirement: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - "~>"
212
+ - !ruby/object:Gem::Version
213
+ version: '0.1'
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: 0.1.10
217
+ type: :development
218
+ prerelease: false
219
+ version_requirements: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - "~>"
222
+ - !ruby/object:Gem::Version
223
+ version: '0.1'
224
+ - - ">="
225
+ - !ruby/object:Gem::Version
226
+ version: 0.1.10
187
227
  - !ruby/object:Gem::Dependency
188
228
  name: rest-client
189
229
  requirement: !ruby/object:Gem::Requirement
@@ -364,6 +404,86 @@ dependencies:
364
404
  - - ">="
365
405
  - !ruby/object:Gem::Version
366
406
  version: 1.1.2
407
+ - !ruby/object:Gem::Dependency
408
+ name: eventmachine_httpserver
409
+ requirement: !ruby/object:Gem::Requirement
410
+ requirements:
411
+ - - "~>"
412
+ - !ruby/object:Gem::Version
413
+ version: '0.2'
414
+ - - ">="
415
+ - !ruby/object:Gem::Version
416
+ version: 0.2.1
417
+ type: :runtime
418
+ prerelease: false
419
+ version_requirements: !ruby/object:Gem::Requirement
420
+ requirements:
421
+ - - "~>"
422
+ - !ruby/object:Gem::Version
423
+ version: '0.2'
424
+ - - ">="
425
+ - !ruby/object:Gem::Version
426
+ version: 0.2.1
427
+ - !ruby/object:Gem::Dependency
428
+ name: http_parser.rb
429
+ requirement: !ruby/object:Gem::Requirement
430
+ requirements:
431
+ - - "~>"
432
+ - !ruby/object:Gem::Version
433
+ version: '0.6'
434
+ - - ">="
435
+ - !ruby/object:Gem::Version
436
+ version: 0.6.0
437
+ type: :runtime
438
+ prerelease: false
439
+ version_requirements: !ruby/object:Gem::Requirement
440
+ requirements:
441
+ - - "~>"
442
+ - !ruby/object:Gem::Version
443
+ version: '0.6'
444
+ - - ">="
445
+ - !ruby/object:Gem::Version
446
+ version: 0.6.0
447
+ - !ruby/object:Gem::Dependency
448
+ name: multi_json
449
+ requirement: !ruby/object:Gem::Requirement
450
+ requirements:
451
+ - - "~>"
452
+ - !ruby/object:Gem::Version
453
+ version: '1.10'
454
+ - - ">="
455
+ - !ruby/object:Gem::Version
456
+ version: 1.10.1
457
+ type: :runtime
458
+ prerelease: false
459
+ version_requirements: !ruby/object:Gem::Requirement
460
+ requirements:
461
+ - - "~>"
462
+ - !ruby/object:Gem::Version
463
+ version: '1.10'
464
+ - - ">="
465
+ - !ruby/object:Gem::Version
466
+ version: 1.10.1
467
+ - !ruby/object:Gem::Dependency
468
+ name: thin
469
+ requirement: !ruby/object:Gem::Requirement
470
+ requirements:
471
+ - - "~>"
472
+ - !ruby/object:Gem::Version
473
+ version: '1.6'
474
+ - - ">="
475
+ - !ruby/object:Gem::Version
476
+ version: 1.6.2
477
+ type: :runtime
478
+ prerelease: false
479
+ version_requirements: !ruby/object:Gem::Requirement
480
+ requirements:
481
+ - - "~>"
482
+ - !ruby/object:Gem::Version
483
+ version: '1.6'
484
+ - - ">="
485
+ - !ruby/object:Gem::Version
486
+ version: 1.6.2
367
487
  - !ruby/object:Gem::Dependency
368
488
  name: grape
369
489
  requirement: !ruby/object:Gem::Requirement
@@ -499,45 +619,25 @@ dependencies:
499
619
  - !ruby/object:Gem::Version
500
620
  version: 0.19.1
501
621
  - !ruby/object:Gem::Dependency
502
- name: goliath
503
- requirement: !ruby/object:Gem::Requirement
504
- requirements:
505
- - - "~>"
506
- - !ruby/object:Gem::Version
507
- version: '1.0'
508
- - - ">="
509
- - !ruby/object:Gem::Version
510
- version: 1.0.4
511
- type: :runtime
512
- prerelease: false
513
- version_requirements: !ruby/object:Gem::Requirement
514
- requirements:
515
- - - "~>"
516
- - !ruby/object:Gem::Version
517
- version: '1.0'
518
- - - ">="
519
- - !ruby/object:Gem::Version
520
- version: 1.0.4
521
- - !ruby/object:Gem::Dependency
522
- name: goliath-proxy
622
+ name: rack-parser
523
623
  requirement: !ruby/object:Gem::Requirement
524
624
  requirements:
525
625
  - - "~>"
526
626
  - !ruby/object:Gem::Version
527
- version: '0.0'
627
+ version: '0.6'
528
628
  - - ">="
529
629
  - !ruby/object:Gem::Version
530
- version: 0.0.1
630
+ version: 0.6.1
531
631
  type: :runtime
532
632
  prerelease: false
533
633
  version_requirements: !ruby/object:Gem::Requirement
534
634
  requirements:
535
635
  - - "~>"
536
636
  - !ruby/object:Gem::Version
537
- version: '0.0'
637
+ version: '0.6'
538
638
  - - ">="
539
639
  - !ruby/object:Gem::Version
540
- version: 0.0.1
640
+ version: 0.6.1
541
641
  description: An agile, programmable, controllable proxy server for use standalone
542
642
  or as part of an integration test suite with clients for many languages
543
643
  email:
@@ -2204,7 +2304,6 @@ files:
2204
2304
  - db/migrations/20150221152500_add_record_requests_to_request_specs.rb
2205
2305
  - db/schema.rb
2206
2306
  - db/seed.rb
2207
- - echo_server.rb
2208
2307
  - examples/README.md
2209
2308
  - examples/facebook_api.html
2210
2309
  - examples/tumblr_api.html
@@ -1,19 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'goliath'
4
- require 'active_support/core_ext/class/attribute_accessors'
5
- class Echo < Goliath::API
6
- cattr_accessor :counter
7
- def response_code
8
- ENV['STATUS_CODE'] || 200
9
- end
10
- def response(env)
11
- self.counter = counter || 0
12
- req_body = env['rack.input'].read
13
- request_info = "#{env['REQUEST_METHOD']} #{env['PATH_INFO']}"
14
- res_body = request_info
15
- res_body += "\n#{req_body}" unless req_body.empty?
16
- self.counter += 1
17
- [response_code, { 'HTTP-X-EchoServer' => request_info, 'HTTP-X-EchoCount' => "#{counter}" }, res_body]
18
- end
19
- end