晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/opt/alt/ruby20/lib64/ruby/gems/2.0.0/gems/rack-1.6.4/test/ |
| Current File : //opt/alt/ruby20/lib64/ruby/gems/2.0.0/gems/rack-1.6.4/test/spec_server.rb |
require 'rack'
require 'rack/server'
require 'tempfile'
require 'socket'
require 'open-uri'
describe Rack::Server do
def app
lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['success']] }
end
def with_stderr
old, $stderr = $stderr, StringIO.new
yield $stderr
ensure
$stderr = old
end
it "overrides :config if :app is passed in" do
server = Rack::Server.new(:app => "FOO")
server.app.should.equal "FOO"
end
should "prefer to use :builder when it is passed in" do
server = Rack::Server.new(:builder => "run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['success']] }")
server.app.class.should.equal Proc
Rack::MockRequest.new(server.app).get("/").body.to_s.should.equal 'success'
end
should "allow subclasses to override middleware" do
server = Class.new(Rack::Server).class_eval { def middleware; Hash.new [] end; self }
server.middleware['deployment'].should.not.equal []
server.new(:app => 'foo').middleware['deployment'].should.equal []
end
should "allow subclasses to override default middleware" do
server = Class.new(Rack::Server).instance_eval { def default_middleware_by_environment; Hash.new [] end; self }
server.middleware['deployment'].should.equal []
server.new(:app => 'foo').middleware['deployment'].should.equal []
end
should "only provide default middleware for development and deployment environments" do
Rack::Server.default_middleware_by_environment.keys.sort.should.equal %w(deployment development)
end
should "always return an empty array for unknown environments" do
server = Rack::Server.new(:app => 'foo')
server.middleware['production'].should.equal []
end
should "not include Rack::Lint in deployment environment" do
server = Rack::Server.new(:app => 'foo')
server.middleware['deployment'].flatten.should.not.include(Rack::Lint)
end
should "not include Rack::ShowExceptions in deployment environment" do
server = Rack::Server.new(:app => 'foo')
server.middleware['deployment'].flatten.should.not.include(Rack::ShowExceptions)
end
should "include Rack::TempfileReaper in deployment environment" do
server = Rack::Server.new(:app => 'foo')
server.middleware['deployment'].flatten.should.include(Rack::TempfileReaper)
end
should "support CGI" do
begin
o, ENV["REQUEST_METHOD"] = ENV["REQUEST_METHOD"], 'foo'
server = Rack::Server.new(:app => 'foo')
server.server.name =~ /CGI/
Rack::Server.logging_middleware.call(server).should.eql(nil)
ensure
ENV['REQUEST_METHOD'] = o
end
end
should "be quiet if said so" do
server = Rack::Server.new(:app => "FOO", :quiet => true)
Rack::Server.logging_middleware.call(server).should.eql(nil)
end
should "use a full path to the pidfile" do
# avoids issues with daemonize chdir
opts = Rack::Server.new.send(:parse_options, %w[--pid testing.pid])
opts[:pid].should.eql(::File.expand_path('testing.pid'))
end
should "run a server" do
pidfile = Tempfile.open('pidfile') { |f| break f }.path
FileUtils.rm pidfile
server = Rack::Server.new(
:app => app,
:environment => 'none',
:pid => pidfile,
:Port => TCPServer.open('127.0.0.1', 0){|s| s.addr[1] },
:Host => '127.0.0.1',
:daemonize => false,
:server => 'webrick'
)
t = Thread.new { server.start { |s| Thread.current[:server] = s } }
t.join(0.01) until t[:server] && t[:server].status != :Stop
body = open("http://127.0.0.1:#{server.options[:Port]}/") { |f| f.read }
body.should.eql('success')
Process.kill(:INT, $$)
t.join
open(pidfile) { |f| f.read.should.eql $$.to_s }
end
should "check pid file presence and running process" do
pidfile = Tempfile.open('pidfile') { |f| f.write($$); break f }.path
server = Rack::Server.new(:pid => pidfile)
server.send(:pidfile_process_status).should.eql :running
end
should "check pid file presence and dead process" do
dead_pid = `echo $$`.to_i
pidfile = Tempfile.open('pidfile') { |f| f.write(dead_pid); break f }.path
server = Rack::Server.new(:pid => pidfile)
server.send(:pidfile_process_status).should.eql :dead
end
should "check pid file presence and exited process" do
pidfile = Tempfile.open('pidfile') { |f| break f }.path
::File.delete(pidfile)
server = Rack::Server.new(:pid => pidfile)
server.send(:pidfile_process_status).should.eql :exited
end
should "check pid file presence and not owned process" do
pidfile = Tempfile.open('pidfile') { |f| f.write(1); break f }.path
server = Rack::Server.new(:pid => pidfile)
server.send(:pidfile_process_status).should.eql :not_owned
end
should "not write pid file when it is created after check" do
pidfile = Tempfile.open('pidfile') { |f| break f }.path
::File.delete(pidfile)
server = Rack::Server.new(:pid => pidfile)
::File.open(pidfile, 'w') { |f| f.write(1) }
with_stderr do |err|
should.raise(SystemExit) do
server.send(:write_pid)
end
err.rewind
output = err.read
output.should.match(/already running/)
output.should.include? pidfile
end
end
should "inform the user about existing pidfiles with running processes" do
pidfile = Tempfile.open('pidfile') { |f| f.write(1); break f }.path
server = Rack::Server.new(:pid => pidfile)
with_stderr do |err|
should.raise(SystemExit) do
server.start
end
err.rewind
output = err.read
output.should.match(/already running/)
output.should.include? pidfile
end
end
end
|