summaryrefslogtreecommitdiff
path: root/test/spec_lock.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/spec_lock.rb')
-rw-r--r--test/spec_lock.rb203
1 files changed, 0 insertions, 203 deletions
diff --git a/test/spec_lock.rb b/test/spec_lock.rb
deleted file mode 100644
index 89570498..00000000
--- a/test/spec_lock.rb
+++ /dev/null
@@ -1,203 +0,0 @@
-# frozen_string_literal: true
-
-require_relative 'helper'
-
-class Lock
- attr_reader :synchronized
-
- def initialize
- @synchronized = false
- end
-
- def lock
- @synchronized = true
- end
-
- def unlock
- @synchronized = false
- end
-end
-
-module LockHelpers
- def lock_app(app, lock = Lock.new)
- app = if lock
- Rack::Lock.new app, lock
- else
- Rack::Lock.new app
- end
- Rack::Lint.new app
- end
-end
-
-describe Rack::Lock do
- include LockHelpers
-
- describe 'Proxy' do
- include LockHelpers
-
- it 'delegate each' do
- env = Rack::MockRequest.env_for("/")
- response = Class.new {
- attr_accessor :close_called
- def initialize; @close_called = false; end
- def each; %w{ hi mom }.each { |x| yield x }; end
- }.new
-
- app = lock_app(lambda { |inner_env| [200, { "Content-Type" => "text/plain" }, response] })
- response = app.call(env)[2]
- list = []
- response.each { |x| list << x }
- list.must_equal %w{ hi mom }
- end
-
- it 'delegate to_path' do
- lock = Lock.new
- env = Rack::MockRequest.env_for("/")
-
- res = ['Hello World']
- def res.to_path ; "/tmp/hello.txt" ; end
-
- app = Rack::Lock.new(lambda { |inner_env| [200, { "Content-Type" => "text/plain" }, res] }, lock)
- body = app.call(env)[2]
-
- body.must_respond_to :to_path
- body.to_path.must_equal "/tmp/hello.txt"
- end
-
- it 'not delegate to_path if body does not implement it' do
- env = Rack::MockRequest.env_for("/")
-
- res = ['Hello World']
-
- app = lock_app(lambda { |inner_env| [200, { "Content-Type" => "text/plain" }, res] })
- body = app.call(env)[2]
-
- body.wont_respond_to :to_path
- end
- end
-
- it 'call super on close' do
- env = Rack::MockRequest.env_for("/")
- response = Class.new {
- attr_accessor :close_called
- def initialize; @close_called = false; end
- def close; @close_called = true; end
- }.new
-
- app = lock_app(lambda { |inner_env| [200, { "Content-Type" => "text/plain" }, response] })
- app.call(env)
- response.close_called.must_equal false
- response.close
- response.close_called.must_equal true
- end
-
- it "not unlock until body is closed" do
- lock = Lock.new
- env = Rack::MockRequest.env_for("/")
- response = Object.new
- app = lock_app(lambda { |inner_env| [200, { "Content-Type" => "text/plain" }, response] }, lock)
- lock.synchronized.must_equal false
- response = app.call(env)[2]
- lock.synchronized.must_equal true
- response.close
- lock.synchronized.must_equal false
- end
-
- it "return value from app" do
- env = Rack::MockRequest.env_for("/")
- body = [200, { "Content-Type" => "text/plain" }, %w{ hi mom }]
- app = lock_app(lambda { |inner_env| body })
-
- res = app.call(env)
- res[0].must_equal body[0]
- res[1].must_equal body[1]
- res[2].to_enum.to_a.must_equal ["hi", "mom"]
- end
-
- it "call synchronize on lock" do
- lock = Lock.new
- env = Rack::MockRequest.env_for("/")
- app = lock_app(lambda { |inner_env| [200, { "Content-Type" => "text/plain" }, %w{ a b c }] }, lock)
- lock.synchronized.must_equal false
- app.call(env)
- lock.synchronized.must_equal true
- end
-
- it "unlock if the app raises" do
- lock = Lock.new
- env = Rack::MockRequest.env_for("/")
- app = lock_app(lambda { raise Exception }, lock)
- lambda { app.call(env) }.must_raise Exception
- lock.synchronized.must_equal false
- end
-
- it "unlock if the app throws" do
- lock = Lock.new
- env = Rack::MockRequest.env_for("/")
- app = lock_app(lambda {|_| throw :bacon }, lock)
- lambda { app.call(env) }.must_throw :bacon
- lock.synchronized.must_equal false
- end
-
- it "set multithread flag to false" do
- app = lock_app(lambda { |env|
- env['rack.multithread'].must_equal false
- [200, { "Content-Type" => "text/plain" }, %w{ a b c }]
- }, false)
- env = Rack::MockRequest.env_for("/")
- env['rack.multithread'].must_equal true
- _, _, body = app.call(env)
- body.close
- env['rack.multithread'].must_equal true
- end
-
- it "reset original multithread flag when exiting lock" do
- app = Class.new(Rack::Lock) {
- def call(env)
- env['rack.multithread'].must_equal true
- super
- end
- }.new(lambda { |env| [200, { "Content-Type" => "text/plain" }, %w{ a b c }] })
- Rack::Lint.new(app).call(Rack::MockRequest.env_for("/"))
- end
-
- it 'not unlock if an error is raised before the mutex is locked' do
- lock = Class.new do
- def initialize() @unlocked = false end
- def unlocked?() @unlocked end
- def lock() raise Exception end
- def unlock() @unlocked = true end
- end.new
- env = Rack::MockRequest.env_for("/")
- app = lock_app(proc { [200, { "Content-Type" => "text/plain" }, []] }, lock)
- lambda { app.call(env) }.must_raise Exception
- lock.unlocked?.must_equal false
- end
-
- it "not reset the environment while the body is proxied" do
- proxy = Class.new do
- attr_reader :env
- def initialize(env) @env = env end
- end
- app = Rack::Lock.new lambda { |env| [200, { "Content-Type" => "text/plain" }, proxy.new(env)] }
- response = app.call(Rack::MockRequest.env_for("/"))[2]
- response.env['rack.multithread'].must_equal false
- end
-
- it "unlock if an exception occurs before returning" do
- lock = Lock.new
- env = Rack::MockRequest.env_for("/")
- app = lock_app(proc { [].freeze }, lock)
- lambda { app.call(env) }.must_raise Exception
- lock.synchronized.must_equal false
- end
-
- it "not replace the environment" do
- env = Rack::MockRequest.env_for("/")
- app = lock_app(lambda { |inner_env| [200, { "Content-Type" => "text/plain" }, [inner_env.object_id.to_s]] })
-
- _, _, body = app.call(env)
-
- body.to_enum.to_a.must_equal [env.object_id.to_s]
- end
-end