jubilee 1.1.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.ruby-version +1 -0
- data/.travis.yml +5 -0
- data/CHANGELOG +32 -0
- data/Gemfile +35 -0
- data/Gemfile.lock +244 -0
- data/Guardfile +24 -0
- data/KNOWN_ISSUES +6 -0
- data/LICENSE.txt +20 -0
- data/README.md +147 -0
- data/ROADMAP +5 -0
- data/Rakefile +98 -0
- data/bin/jubilee +6 -0
- data/bin/jubilee_d +13 -0
- data/examples/chatapp/Gemfile +5 -0
- data/examples/chatapp/Gemfile.lock +27 -0
- data/examples/chatapp/README.md +17 -0
- data/examples/chatapp/app.rb +57 -0
- data/examples/chatapp/config.ru +3 -0
- data/examples/chatapp/public/assets/javascripts/application.js +67 -0
- data/examples/chatapp/public/assets/javascripts/jquery.js +5 -0
- data/examples/chatapp/public/assets/javascripts/sockjs-0.3.4.min.js +27 -0
- data/examples/chatapp/public/assets/javascripts/vertxbus.js +216 -0
- data/examples/chatapp/public/assets/stylesheets/application.css +29 -0
- data/examples/client/sockjs-0.3.4.min.js +27 -0
- data/examples/client/vertxbus.js +216 -0
- data/examples/jubilee.conf.rb +12 -0
- data/examples/jubilee/keystore.jks +0 -0
- data/examples/jubilee/server-keystore.jks +0 -0
- data/jars/hazelcast-2.6.3.jar +0 -0
- data/jars/jackson-annotations-2.2.2.jar +0 -0
- data/jars/jackson-core-2.2.2.jar +0 -0
- data/jars/jackson-databind-2.2.2.jar +0 -0
- data/jars/netty-all-4.0.13.Final.jar +0 -0
- data/jars/vertx-core-2.1M3-SNAPSHOT.jar +0 -0
- data/jars/vertx-hazelcast-2.1M3-SNAPSHOT.jar +0 -0
- data/java/src/jubilee/JubileeService.java +20 -0
- data/java/src/org/jruby/jubilee/Const.java +32 -0
- data/java/src/org/jruby/jubilee/RackApplication.java +103 -0
- data/java/src/org/jruby/jubilee/RackEnvironment.java +150 -0
- data/java/src/org/jruby/jubilee/RackEnvironmentHash.java +449 -0
- data/java/src/org/jruby/jubilee/RackInput.java +62 -0
- data/java/src/org/jruby/jubilee/RackResponse.java +11 -0
- data/java/src/org/jruby/jubilee/RubyHttpServerResponse.java +88 -0
- data/java/src/org/jruby/jubilee/RubyServer.java +171 -0
- data/java/src/org/jruby/jubilee/deploy/Starter.java +26 -0
- data/java/src/org/jruby/jubilee/impl/RubyIORackInput.java +201 -0
- data/java/src/org/jruby/jubilee/impl/RubyNullIO.java +107 -0
- data/java/src/org/jruby/jubilee/utils/RubyHelper.java +37 -0
- data/java/src/org/jruby/jubilee/vertx/JubileeVertx.java +38 -0
- data/jubilee.gemspec +201 -0
- data/lib/jubilee.rb +17 -0
- data/lib/jubilee/application.rb +13 -0
- data/lib/jubilee/cli.rb +127 -0
- data/lib/jubilee/configuration.rb +177 -0
- data/lib/jubilee/const.rb +40 -0
- data/lib/jubilee/jubilee.jar +0 -0
- data/lib/jubilee/response.rb +69 -0
- data/lib/jubilee/server.rb +12 -0
- data/lib/jubilee/version.rb +10 -0
- data/lib/rack/chunked.rb +38 -0
- data/lib/rack/handler/jubilee.rb +44 -0
- data/lib/vertx.rb +26 -0
- data/lib/vertx/README.md +7 -0
- data/lib/vertx/buffer.rb +251 -0
- data/lib/vertx/event_bus.rb +206 -0
- data/lib/vertx/shared_data.rb +214 -0
- data/spec/apps/rack/basic/config.ru +50 -0
- data/spec/apps/rails4/basic/.gitignore +16 -0
- data/spec/apps/rails4/basic/Gemfile +41 -0
- data/spec/apps/rails4/basic/Gemfile.lock +127 -0
- data/spec/apps/rails4/basic/README.rdoc +28 -0
- data/spec/apps/rails4/basic/Rakefile +6 -0
- data/spec/apps/rails4/basic/app/assets/images/.keep +0 -0
- data/spec/apps/rails4/basic/app/assets/images/rails.png +0 -0
- data/spec/apps/rails4/basic/app/assets/javascripts/application.js +12 -0
- data/spec/apps/rails4/basic/app/assets/stylesheets/application.css +13 -0
- data/spec/apps/rails4/basic/app/controllers/application_controller.rb +5 -0
- data/spec/apps/rails4/basic/app/controllers/concerns/.keep +0 -0
- data/spec/apps/rails4/basic/app/controllers/reloader_controller.rb +11 -0
- data/spec/apps/rails4/basic/app/controllers/reloader_controller.rb.erb +11 -0
- data/spec/apps/rails4/basic/app/controllers/root_controller.rb +14 -0
- data/spec/apps/rails4/basic/app/helpers/application_helper.rb +2 -0
- data/spec/apps/rails4/basic/app/mailers/.keep +0 -0
- data/spec/apps/rails4/basic/app/models/.keep +0 -0
- data/spec/apps/rails4/basic/app/models/concerns/.keep +0 -0
- data/spec/apps/rails4/basic/app/views/layouts/application.html.erb +14 -0
- data/spec/apps/rails4/basic/app/views/reloader/index.html.erb +1 -0
- data/spec/apps/rails4/basic/app/views/root/index.html.erb +8 -0
- data/spec/apps/rails4/basic/app/views/root/streaming.html.erb +6 -0
- data/spec/apps/rails4/basic/bin/bundle +3 -0
- data/spec/apps/rails4/basic/bin/rails +4 -0
- data/spec/apps/rails4/basic/bin/rake +4 -0
- data/spec/apps/rails4/basic/config.ru +4 -0
- data/spec/apps/rails4/basic/config/application.rb +23 -0
- data/spec/apps/rails4/basic/config/boot.rb +4 -0
- data/spec/apps/rails4/basic/config/database.yml +20 -0
- data/spec/apps/rails4/basic/config/environment.rb +5 -0
- data/spec/apps/rails4/basic/config/environments/development.rb +29 -0
- data/spec/apps/rails4/basic/config/environments/production.rb +80 -0
- data/spec/apps/rails4/basic/config/environments/test.rb +36 -0
- data/spec/apps/rails4/basic/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/apps/rails4/basic/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/apps/rails4/basic/config/initializers/inflections.rb +16 -0
- data/spec/apps/rails4/basic/config/initializers/mime_types.rb +5 -0
- data/spec/apps/rails4/basic/config/initializers/secret_token.rb +12 -0
- data/spec/apps/rails4/basic/config/initializers/session_store.rb +2 -0
- data/spec/apps/rails4/basic/config/initializers/wrap_parameters.rb +14 -0
- data/spec/apps/rails4/basic/config/locales/en.yml +23 -0
- data/spec/apps/rails4/basic/config/routes.rb +5 -0
- data/spec/apps/rails4/basic/db/seeds.rb +7 -0
- data/spec/apps/rails4/basic/lib/assets/.keep +0 -0
- data/spec/apps/rails4/basic/lib/tasks/.keep +0 -0
- data/spec/apps/rails4/basic/public/404.html +58 -0
- data/spec/apps/rails4/basic/public/422.html +58 -0
- data/spec/apps/rails4/basic/public/500.html +57 -0
- data/spec/apps/rails4/basic/public/favicon.ico +0 -0
- data/spec/apps/rails4/basic/public/robots.txt +5 -0
- data/spec/apps/rails4/basic/public/some_page.html +7 -0
- data/spec/apps/rails4/basic/test/controllers/.keep +0 -0
- data/spec/apps/rails4/basic/test/fixtures/.keep +0 -0
- data/spec/apps/rails4/basic/test/helpers/.keep +0 -0
- data/spec/apps/rails4/basic/test/integration/.keep +0 -0
- data/spec/apps/rails4/basic/test/mailers/.keep +0 -0
- data/spec/apps/rails4/basic/test/models/.keep +0 -0
- data/spec/apps/rails4/basic/test/test_helper.rb +15 -0
- data/spec/apps/rails4/basic/vendor/assets/javascripts/.keep +0 -0
- data/spec/apps/rails4/basic/vendor/assets/stylesheets/.keep +0 -0
- data/spec/apps/sinatra/basic/Gemfile +4 -0
- data/spec/apps/sinatra/basic/Gemfile.lock +20 -0
- data/spec/apps/sinatra/basic/basic.rb +27 -0
- data/spec/apps/sinatra/basic/config.ru +7 -0
- data/spec/apps/sinatra/basic/public/some_page.html +7 -0
- data/spec/apps/sinatra/basic/views/index.erb +4 -0
- data/spec/apps/sinatra/basic/views/posted.haml +2 -0
- data/spec/apps/sinatra/basic/views/poster.haml +4 -0
- data/spec/apps/sinatra/basic/views/request_mapping.haml +4 -0
- data/spec/integration/basic_rack_spec.rb +89 -0
- data/spec/integration/basic_rails4_spec.rb +64 -0
- data/spec/integration/basic_sinatra_spec.rb +80 -0
- data/spec/spec_helper.rb +13 -0
- data/test/.ruby-version +1 -0
- data/test/config/app.rb +5 -0
- data/test/jubilee/test_cli.rb +11 -0
- data/test/jubilee/test_configuration.rb +31 -0
- data/test/jubilee/test_rack_server.rb +137 -0
- data/test/jubilee/test_response.rb +272 -0
- data/test/jubilee/test_server.rb +72 -0
- data/test/jubilee/test_upload.rb +301 -0
- data/test/sinatra_app/app.rb +31 -0
- data/test/sinatra_app/config.ru +6 -0
- data/test/sinatra_app/public/test.html +10 -0
- data/test/sinatra_app/unicorn.conf.rb +29 -0
- data/test/test_helper.rb +93 -0
- metadata +242 -0
File without changes
|
File without changes
|
@@ -0,0 +1,20 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
haml (4.0.4)
|
5
|
+
tilt
|
6
|
+
rack (1.5.2)
|
7
|
+
rack-protection (1.5.1)
|
8
|
+
rack
|
9
|
+
sinatra (1.4.4)
|
10
|
+
rack (~> 1.4)
|
11
|
+
rack-protection (~> 1.4)
|
12
|
+
tilt (~> 1.3, >= 1.3.4)
|
13
|
+
tilt (1.4.1)
|
14
|
+
|
15
|
+
PLATFORMS
|
16
|
+
java
|
17
|
+
|
18
|
+
DEPENDENCIES
|
19
|
+
haml
|
20
|
+
sinatra
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
require 'rubygems'
|
3
|
+
require 'sinatra'
|
4
|
+
|
5
|
+
disable :logging
|
6
|
+
|
7
|
+
options '/' do
|
8
|
+
response.headers['Access-Control-Allow-Origin'] = '*'
|
9
|
+
response.headers['Access-Control-Allow-Methods'] = 'POST'
|
10
|
+
end
|
11
|
+
|
12
|
+
get '/' do
|
13
|
+
headers 'Biscuit' => 'Gravy'
|
14
|
+
erb :index
|
15
|
+
end
|
16
|
+
|
17
|
+
get '/request-mapping' do
|
18
|
+
haml :request_mapping
|
19
|
+
end
|
20
|
+
|
21
|
+
get '/poster' do
|
22
|
+
haml :poster
|
23
|
+
end
|
24
|
+
|
25
|
+
post '/poster' do
|
26
|
+
haml :posted
|
27
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature "basic rack at non-root context" do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
configurator = Jubilee::Configuration.new(chdir: "#{apps_dir}/rack/basic")
|
7
|
+
@server = Jubilee::Server.new(configurator.app, configurator.options)
|
8
|
+
@server.start
|
9
|
+
end
|
10
|
+
|
11
|
+
after(:all) do
|
12
|
+
@server.stop
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should work for basic requests" do
|
16
|
+
visit "/basic-rack"
|
17
|
+
page.should have_content('it worked')
|
18
|
+
page.find("#success")[:class].strip.should == 'basic-rack'
|
19
|
+
page.find("#script_name").text.strip.should == ''
|
20
|
+
page.find("#path_info").text.strip.should == '/basic-rack'
|
21
|
+
page.find("#request_uri").text.strip.should == '/basic-rack'
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should work for subcontext root with trailing slash" do
|
25
|
+
visit "/basic-rack/"
|
26
|
+
page.should have_content('it worked')
|
27
|
+
page.find("#success")[:class].strip.should == 'basic-rack'
|
28
|
+
page.find("#script_name").text.strip.should == ''
|
29
|
+
page.find("#path_info").text.strip.should == '/basic-rack/'
|
30
|
+
page.find("#request_uri").text.strip.should == '/basic-rack/'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should be running under the proper ruby version" do
|
34
|
+
visit "/basic-rack/"
|
35
|
+
page.find("#ruby-version").text.strip.should == RUBY_VERSION
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should not have a vfs path for __FILE__" do
|
39
|
+
visit "/basic-rack/"
|
40
|
+
page.find("#path").text.strip.should_not match(/^vfs:/)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should not decode characters in URL" do
|
44
|
+
visit "/basic-rack/foo%23%2C"
|
45
|
+
page.find("#path_info").text.strip.should == '/basic-rack/foo%23%2C'
|
46
|
+
page.find("#request_uri").text.strip.should == '/basic-rack/foo%23%2C'
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should contain correct request headers" do
|
50
|
+
uri = URI.parse("#{Capybara.app_host}/basic-rack/")
|
51
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
52
|
+
accept = 'text/html;q=0.9,*/*;q=0.7'
|
53
|
+
response = http.get(uri.request_uri, {'Accept' => accept})
|
54
|
+
response.code.should == "200"
|
55
|
+
response.body.should include("<div id='accept_header'>#{accept}</div>")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should read post bodies via gets" do
|
60
|
+
uri = URI.parse("#{Capybara.app_host}/basic-rack/gets")
|
61
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
62
|
+
request = Net::HTTP::Post.new(uri.request_uri)
|
63
|
+
request.form_data = {'field' => 'nothing'}
|
64
|
+
response = http.request(request)
|
65
|
+
response.body.should include("<div id='posted'>field=nothing</div>")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should read post bodies via read" do
|
70
|
+
uri = URI.parse("#{Capybara.app_host}/basic-rack/read")
|
71
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
72
|
+
request = Net::HTTP::Post.new(uri.request_uri)
|
73
|
+
request.form_data = {'field' => 'nothing'}
|
74
|
+
response = http.request(request)
|
75
|
+
response.body.should include("<div id='posted'>field=nothing</div>")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should read post bodies via each" do
|
80
|
+
uri = URI.parse("#{Capybara.app_host}/basic-rack/each")
|
81
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
82
|
+
request = Net::HTTP::Post.new(uri.request_uri)
|
83
|
+
request.form_data = {'field' => 'nothing'}
|
84
|
+
response = http.request(request)
|
85
|
+
response.body.should include("<div id='posted'>field=nothing</div>")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'basic rails4 test' do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
configurator = Jubilee::Configuration.new(chdir: "#{apps_dir}/rails4/basic")
|
7
|
+
@server = Jubilee::Server.new(configurator.app, configurator.options)
|
8
|
+
@server.start
|
9
|
+
sleep 0.1
|
10
|
+
end
|
11
|
+
|
12
|
+
after(:all) do
|
13
|
+
@server.stop
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should do a basic get' do
|
17
|
+
visit '/'
|
18
|
+
page.should have_content('It works')
|
19
|
+
page.find('#success')[:class].should == 'basic-rails4'
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'streaming' do
|
23
|
+
it "should work for small responses" do
|
24
|
+
verify_streaming("/root/streaming?count=0")
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should work for large responses" do
|
28
|
+
verify_streaming("/root/streaming?count=500")
|
29
|
+
end
|
30
|
+
|
31
|
+
def verify_streaming(url)
|
32
|
+
uri = URI.parse("#{Capybara.app_host}#{url}")
|
33
|
+
Net::HTTP.get_response(uri) do |response|
|
34
|
+
response.should be_chunked
|
35
|
+
response.header['transfer-encoding'].should == 'chunked'
|
36
|
+
chunk_count, body = 0, ""
|
37
|
+
response.read_body do |chunk|
|
38
|
+
chunk_count += 1
|
39
|
+
body += chunk
|
40
|
+
end
|
41
|
+
body.should include('It works')
|
42
|
+
body.each_line do |line|
|
43
|
+
line.should_not match(/^\d+\s*$/)
|
44
|
+
end
|
45
|
+
chunk_count.should be > 1
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should return a static page beneath default public dir' do
|
51
|
+
visit "/some_page.html"
|
52
|
+
element = page.find('#success')
|
53
|
+
element.should_not be_nil
|
54
|
+
element.text.should == 'static page'
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should support setting multiple cookies" do
|
58
|
+
visit "/root/multiple_cookies"
|
59
|
+
page.driver.cookies['foo1'].value.should == 'bar1'
|
60
|
+
page.driver.cookies['foo2'].value.should == 'bar2'
|
61
|
+
page.driver.cookies['foo3'].value.should == 'bar3'
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature "basic sinatra test" do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
configurator = Jubilee::Configuration.new(chdir: "#{apps_dir}/sinatra/basic")
|
7
|
+
@server = Jubilee::Server.new(configurator.app, configurator.options)
|
8
|
+
@server.start
|
9
|
+
end
|
10
|
+
|
11
|
+
after(:all) do
|
12
|
+
@server.stop
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should work" do
|
16
|
+
visit ""
|
17
|
+
page.should have_content('it worked')
|
18
|
+
page.should have_selector('div.sinatra-basic')
|
19
|
+
find("#success").should have_content('it worked')
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return a valid request scheme" do
|
23
|
+
visit "/request-mapping"
|
24
|
+
find("#success #scheme").text.should eql("http")
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should return a static page beneath default 'public' dir" do
|
28
|
+
visit "/some_page.html"
|
29
|
+
page.find('#success')[:class].should == 'default'
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should return 304 for unmodified static assets" do
|
33
|
+
uri = URI.parse("#{Capybara.app_host}/some_page.html")
|
34
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
35
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
36
|
+
request.add_field('If-Modified-Since', 'Sat, 31 Dec 2050 00:00:00 GMT')
|
37
|
+
response = http.request(request)
|
38
|
+
response.code.should == "304"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should post something" do
|
43
|
+
visit "/poster"
|
44
|
+
fill_in 'field', :with => 'something'
|
45
|
+
click_button 'submit'
|
46
|
+
find('#success').should have_content("you posted something")
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
it "should allow headers through" do
|
51
|
+
uri = URI.parse("#{Capybara.app_host}/")
|
52
|
+
response = Net::HTTP.get_response(uri)
|
53
|
+
response['Biscuit'].should == 'Gravy'
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should allow OPTIONS requests" do
|
57
|
+
uri = URI.parse("#{Capybara.app_host}/")
|
58
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
59
|
+
request = Net::HTTP::Options.new(uri.request_uri)
|
60
|
+
response = http.request(request)
|
61
|
+
response['access-control-allow-origin'].should == '*'
|
62
|
+
response['access-control-allow-methods'].should == 'POST'
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should test Sir Postalot" do
|
68
|
+
uri = URI.parse("#{Capybara.app_host}/poster")
|
69
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
70
|
+
100.times do |i|
|
71
|
+
http.request(Net::HTTP::Get.new(uri.request_uri))
|
72
|
+
request = Net::HTTP::Post.new(uri.request_uri)
|
73
|
+
request.form_data = {'field' => 'nothing'}
|
74
|
+
response = http.request(request)
|
75
|
+
response.body.should include("<div id='success'>you posted nothing</div>")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'jubilee'
|
2
|
+
require 'capybara/poltergeist'
|
3
|
+
require 'capybara/rspec'
|
4
|
+
require 'ostruct'
|
5
|
+
require 'net/http'
|
6
|
+
|
7
|
+
Capybara.app_host = "http://localhost:8080"
|
8
|
+
Capybara.run_server = false
|
9
|
+
Capybara.default_driver = :poltergeist
|
10
|
+
|
11
|
+
def apps_dir
|
12
|
+
File.expand_path("../apps", __FILE__)
|
13
|
+
end
|
data/test/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
jruby-1.7.4
|
data/test/config/app.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'jubilee/cli'
|
3
|
+
|
4
|
+
class TestJubileeCLI < MiniTest::Unit::TestCase
|
5
|
+
def test_parse_options
|
6
|
+
cli = Jubilee::CLI.new(["app.rb"])
|
7
|
+
cli.parse_options
|
8
|
+
assert_equal "app.rb", cli.options[:rackup]
|
9
|
+
assert_equal 8080, cli.options[:Port]
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'jubilee/configuration'
|
3
|
+
|
4
|
+
class TestConfig < MiniTest::Unit::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_load
|
10
|
+
@config = Jubilee::Configuration.new({rackup: "config/app.rb"})
|
11
|
+
resp = [200, {"Content-Type" => "text/plain"}, ["embeded app"]]
|
12
|
+
assert_equal resp, @config.app.call({})
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_config_invalid
|
16
|
+
tmp = Tempfile.new("jubilee_config")
|
17
|
+
tmp.syswrite(%q(abcd "helloword"))
|
18
|
+
assert_raises(NoMethodError) do
|
19
|
+
Jubilee::Configuration.new(config_file: tmp.path)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_config_non_exist
|
24
|
+
tmp = Tempfile.new("jubilee_config")
|
25
|
+
path = tmp.path
|
26
|
+
tmp.close!
|
27
|
+
assert_raises(Errno::ENOENT) do
|
28
|
+
Jubilee::Configuration.new(config_file: path)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'rack/lint'
|
3
|
+
require 'rack/commonlogger'
|
4
|
+
|
5
|
+
class TestRackServer < MiniTest::Unit::TestCase
|
6
|
+
include Helpers
|
7
|
+
|
8
|
+
class ErrorChecker
|
9
|
+
def initialize(app)
|
10
|
+
@app = app
|
11
|
+
@exception = nil
|
12
|
+
@env = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :exception, :env
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
begin
|
19
|
+
@env = env
|
20
|
+
return @app.call(env)
|
21
|
+
rescue Exception => e
|
22
|
+
@exception = e
|
23
|
+
|
24
|
+
[
|
25
|
+
500,
|
26
|
+
{ "X-Exception" => e.message, "X-Exception-Class" => e.class.to_s },
|
27
|
+
["Error detected"]
|
28
|
+
]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class ServerLint < Rack::Lint
|
34
|
+
def call(env)
|
35
|
+
assert("No env given") { env }
|
36
|
+
check_env env
|
37
|
+
|
38
|
+
@app.call(env)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def setup
|
43
|
+
@valid_request = "GET / HTTP/1.1\r\nHost: test.com\r\nContent-Type: text/plain\r\n\r\n"
|
44
|
+
|
45
|
+
@simple = lambda { |env| [200, { "X-Header" => "Works" }, ["Hello"]] }
|
46
|
+
@checker = ErrorChecker.new ServerLint.new(@simple)
|
47
|
+
@host = "localhost"
|
48
|
+
@port = 8080
|
49
|
+
end
|
50
|
+
|
51
|
+
def teardown
|
52
|
+
@server.stop
|
53
|
+
sleep 0.1
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_lint
|
57
|
+
@server = Jubilee::Server.new @checker
|
58
|
+
|
59
|
+
@server.start
|
60
|
+
|
61
|
+
hit(['http://127.0.0.1:8080/test'])
|
62
|
+
|
63
|
+
if exc = @checker.exception
|
64
|
+
raise exc
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_large_post_body
|
69
|
+
@checker = ErrorChecker.new ServerLint.new(@simple)
|
70
|
+
@server = Jubilee::Server.new @checker
|
71
|
+
|
72
|
+
@server.start
|
73
|
+
sleep 0.1
|
74
|
+
|
75
|
+
big = "x" * (1024 * 16)
|
76
|
+
|
77
|
+
Net::HTTP.post_form URI.parse('http://127.0.0.1:8080/test'),
|
78
|
+
{ "big" => big }
|
79
|
+
|
80
|
+
if exc = @checker.exception
|
81
|
+
raise exc
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_path_info
|
86
|
+
input = nil
|
87
|
+
@server = Jubilee::Server.new (lambda { |env| input = env; @simple.call(env) })
|
88
|
+
@server.start
|
89
|
+
|
90
|
+
hit(['http://127.0.0.1:8080/test/a/b/c'])
|
91
|
+
|
92
|
+
assert_equal "/test/a/b/c", input['PATH_INFO']
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_request_method
|
96
|
+
input = nil
|
97
|
+
@server = Jubilee::Server.new(Rack::MethodOverride.new(lambda { |env| input = env; @simple.call(env) }))
|
98
|
+
@server.start
|
99
|
+
sleep 0.1
|
100
|
+
|
101
|
+
POST('/test/a/b/c', {"_method" => "delete", "user" => 1})
|
102
|
+
assert_equal "DELETE", input['REQUEST_METHOD']
|
103
|
+
|
104
|
+
# it should not memorize env
|
105
|
+
POST('/test/a/b/c', {"foo" => "bar"})
|
106
|
+
assert_equal "POST", input['REQUEST_METHOD']
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_query_string
|
111
|
+
input = nil
|
112
|
+
@server = Jubilee::Server.new (lambda { |env| input = env; @simple.call(env) })
|
113
|
+
@server.start
|
114
|
+
|
115
|
+
hit(['http://127.0.0.1:8080/test/a/b/c?foo=bar'])
|
116
|
+
|
117
|
+
assert_equal "foo=bar", input['QUERY_STRING']
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_post_data
|
121
|
+
require 'rack/request'
|
122
|
+
input = nil
|
123
|
+
@server = Jubilee::Server.new (lambda { |env| input = env; @simple.call(env) })
|
124
|
+
@server.start
|
125
|
+
sleep 0.1
|
126
|
+
|
127
|
+
req = Net::HTTP::Post::Multipart.new("/", "foo" => "bar")
|
128
|
+
resp = Net::HTTP.start('localhost', 8080) do |http|
|
129
|
+
http.request req
|
130
|
+
end
|
131
|
+
|
132
|
+
#Net::HTTP.post_form URI.parse('http://127.0.0.1:8080/test'), { "foo" => "bar" }
|
133
|
+
|
134
|
+
request = Rack::Request.new input
|
135
|
+
assert_equal "bar", request.params["foo"]
|
136
|
+
end
|
137
|
+
end
|