[common] Fix content-length issue w/ VCAP::Component

At some point we switched to a version of Rack/Thin that no longer
sends 'Content-Length' headers by default. This behavior was causing tests
to fail. Also, some of the tests were written using the 1.0
branch of em-http-request but were not updated when we switched to the 0.3
branch. This diff updates the tests to work with 0.3

Test plan:
- All specs pass :)

Change-Id: I4dde6bb5695a9c8ab92b71c7f25c03a89e66b678
This commit is contained in:
mpage 2012-02-17 14:58:40 -08:00
Родитель 6b6936f6d3
Коммит 774ae54d55
3 изменённых файлов: 20 добавлений и 56 удалений

Просмотреть файл

@ -1,7 +1,7 @@
PATH
remote: .
specs:
vcap_common (1.0.8)
vcap_common (1.0.9)
eventmachine (~> 0.12.11.cloudfoundry.3)
nats (~> 0.4.22.beta.8)
posix-spawn (~> 0.3.6)

Просмотреть файл

@ -19,7 +19,7 @@ module VCAP
def call(env)
@logger.debug "varz access"
varz = Yajl::Encoder.encode(Component.updated_varz, :pretty => true, :terminator => "\n")
[200, { 'Content-Type' => 'application/json' }, varz]
[200, { 'Content-Type' => 'application/json', 'Content-Length' => varz.length.to_s }, varz]
rescue => e
@logger.error "varz error #{e.inspect} #{e.backtrace.join("\n")}"
raise e
@ -34,7 +34,7 @@ module VCAP
def call(env)
@logger.debug "healthz access"
healthz = Component.updated_healthz
[200, { 'Content-Type' => 'application/json' }, healthz]
[200, { 'Content-Type' => 'application/json', 'Content-Length' => healthz.length.to_s }, healthz]
rescue => e
@logger.error "healthz error #{e.inspect} #{e.backtrace.join("\n")}"
raise e

Просмотреть файл

@ -18,7 +18,7 @@ describe VCAP::Component do
end
it "should publish an announcement" do
em(:timeout => 1) do
em(:timeout => 2) do
nats.subscribe("vcap.component.announce") do |msg|
body = Yajl::Parser.parse(msg, :symbolize_keys => true)
body[:type].should == "type"
@ -120,20 +120,17 @@ describe VCAP::Component do
describe "http endpoint" do
let(:host) { VCAP::Component.varz[:host] }
let(:http) { ::EM::HttpRequest.new("http://#{host}/varz") }
let(:http2) { ::EM::HttpRequest.new("http://#{host}/varz") }
let(:authorization) { { :head => { "authorization" => VCAP::Component.varz[:credentials] } } }
it "should let you specify the port" do
em do
options = default_options
options[:port] = 18123
port = 18123
options = default_options.merge(:port => port)
VCAP::Component.register(options)
VCAP::Component.varz[:host].split(':').last.to_i.should == port
http.opts.port.should == 18123
request = http.get authorization.merge(:path => "/varz")
request = make_em_httprequest(:get, host, "/varz", authorization)
request.callback do
request.response_header.status.should == 200
done
@ -142,19 +139,19 @@ describe VCAP::Component do
end
it "should not truncate varz on second request" do
em do
em(:timeout => 2) do
options = default_options
VCAP::Component.register(options)
request = http.get authorization.merge(:path => "/varz")
request = make_em_httprequest(:get, host, "/varz", authorization)
request.callback do
request.response_header.status.should == 200
content_length = request.response_header['CONTENT_LENGTH'].to_i
VCAP::Component.varz[:var] = 'var'
request2 = http2.get authorization.merge(:path => "/varz")
request2 = make_em_httprequest(:get, host, "/varz", authorization)
request2.callback do
request2.response_header.status.should == 200
content_length2 = request2.response_header['CONTENT_LENGTH'].to_i
@ -172,13 +169,13 @@ describe VCAP::Component do
VCAP::Component.register(options)
request = http.get authorization.merge(:path => "/healthz")
request = make_em_httprequest(:get, host, "/healthz", authorization)
request.callback do
request.response_header.status.should == 200
VCAP::Component.healthz = 'healthz'
request2 = http2.get authorization.merge(:path => "/healthz")
request2 = make_em_httprequest(:get, host, "/healthz", authorization)
request2.callback do
request2.response_header.status.should == 200
content_length2 = request2.response_header['CONTENT_LENGTH'].to_i
@ -200,7 +197,7 @@ describe VCAP::Component do
VCAP::Component.varz[:credentials].should == ["foo", "bar"]
request = http.get authorization.merge(:path => "/varz")
request = make_em_httprequest(:get, host, "/varz", authorization)
request.callback do
request.response_header.status.should == 200
done
@ -208,48 +205,11 @@ describe VCAP::Component do
end
end
it "should skip keep-alive by default" do
em do
VCAP::Component.register(default_options)
request = http.get authorization
request.callback do
request.response_header.should_not be_keepalive
request = http.get authorization
request.callback { raise "second request shouldn't succeed" }
request.errback { done }
end
end
end
it "should support keep-alive" do
em do
VCAP::Component.register(default_options)
first_peername = nil
request = http.get authorization.merge(:path => "/varz", :keepalive => true)
request.callback do
request.response_header.should be_keepalive
first_peername = http.get_peername
first_peername.should be
request = http.get authorization.merge(:path => "/varz", :keepalive => true)
request.callback do
request.response_header.should be_keepalive
second_peername = http.get_peername
second_peername.should eql first_peername
done
end
end
end
end
it "should return 401 on unauthorized requests" do
em do
VCAP::Component.register(default_options)
request = http.get :path => "/varz"
request = make_em_httprequest(:get, host, "/varz")
request.callback do
request.response_header.status.should == 401
done
@ -261,7 +221,7 @@ describe VCAP::Component do
em do
VCAP::Component.register(default_options)
request = http.get :path => "/varz", :head => { "authorization" => "foo" }
request = make_em_httprequest(:get, host, "/varz", :head => { "authorization" => "foo" })
request.callback do
request.response_header.status.should == 400
done
@ -269,4 +229,8 @@ describe VCAP::Component do
end
end
end
def make_em_httprequest(method, host, path, opts={})
::EM::HttpRequest.new("http://#{host}#{path}").send(method, opts)
end
end