spec/redstream/lock_spec.rb in redstream-0.5.0 vs spec/redstream/lock_spec.rb in redstream-0.6.0
- old
+ new
@@ -32,11 +32,11 @@
sleep 6
end
end
- sleep 6
+ sleep 5
threads << Thread.new do
Redstream::Lock.new(name: "lock").acquire do
calls << "thread-2"
end
@@ -59,8 +59,90 @@
end
end
expect(calls).to eq(2)
expect(lock_results).to eq([1, 1])
+ end
+
+ it "releases the lock and notifies" do
+ lock = Redstream::Lock.new(name: "lock")
+
+ expect(redis.llen("#{Redstream.lock_key_name("lock")}.notify")).to eq(0)
+
+ lock.acquire do
+ # nothing
+ end
+
+ expect(redis.exists?(Redstream.lock_key_name("lock"))).to eq(false)
+ expect(redis.llen("#{Redstream.lock_key_name("lock")}.notify")).to eq(1)
+ end
+
+ it "does not release the lock when the lock is already taken again" do
+ lock = Redstream::Lock.new(name: "lock")
+
+ lock.acquire do
+ redis.set(Redstream.lock_key_name("lock"), "other")
+ end
+
+ expect(redis.get(Redstream.lock_key_name("lock"))).to eq("other")
+ end
+
+ it "acquires the lock as soon as it gets released" do
+ time = nil
+
+ thread = Thread.new do
+ Redstream::Lock.new(name: "lock").acquire do
+ time = Time.now.to_f
+
+ sleep 2
+ end
+ end
+
+ sleep 1
+
+ lock = Redstream::Lock.new(name: "lock")
+ lock.wait(10) until lock.acquire { "nothing" }
+
+ thread.join
+
+ expect(Time.now.to_f - time).to be < 3
+ end
+ end
+
+ describe "#wait" do
+ it "blocks for the specified time max" do
+ stopped = false
+
+ thread = Thread.new do
+ Redstream::Lock.new(name: "lock").acquire do
+ sleep 0.1 until stopped
+ end
+ end
+
+ time = Time.now.to_f
+
+ Redstream::Lock.new(name: "lock").wait(2)
+
+ expect(Time.now.to_f - time).to be < 3
+
+ stopped = true
+
+ thread.join
+ end
+
+ it "wakes up when the lock gets released" do
+ thread = Thread.new do
+ Redstream::Lock.new(name: "lock").acquire do
+ sleep 2
+ end
+ end
+
+ time = Time.now.to_f
+
+ Redstream::Lock.new(name: "lock").wait(10)
+
+ expect(Time.now.to_f - time).to be < 3
+
+ thread.join
end
end
end