Skip to content

Commit 4f7abdc

Browse files
trinistrandrykonchin
authored andcommitted
Add spec for IO::Buffer#locked and #locked?
1 parent 770744a commit 4f7abdc

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

core/io/buffer/locked_spec.rb

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
require_relative '../../../spec_helper'
2+
3+
describe "IO::Buffer#locked" do
4+
after :each do
5+
@buffer&.free
6+
@buffer = nil
7+
end
8+
9+
context "when buffer is locked" do
10+
it "allows reading and writing operations on the buffer" do
11+
@buffer = IO::Buffer.new(4)
12+
@buffer.set_string("test")
13+
@buffer.locked do
14+
@buffer.get_string.should == "test"
15+
@buffer.set_string("meat")
16+
end
17+
@buffer.get_string.should == "meat"
18+
end
19+
20+
it "disallows operations changing buffer itself, raising IO::Buffer::LockedError" do
21+
@buffer = IO::Buffer.new(4)
22+
@buffer.locked do
23+
# Just an example, each method is responsible for checking the lock state.
24+
-> { @buffer.resize(8) }.should raise_error(IO::Buffer::LockedError)
25+
end
26+
end
27+
end
28+
29+
it "disallows reentrant locking, raising IO::Buffer::LockedError" do
30+
@buffer = IO::Buffer.new(4)
31+
@buffer.locked do
32+
-> { @buffer.locked {} }.should raise_error(IO::Buffer::LockedError, "Buffer already locked!")
33+
end
34+
end
35+
36+
it "does not propagate to buffer's slices" do
37+
@buffer = IO::Buffer.new(4)
38+
slice = @buffer.slice(0, 2)
39+
@buffer.locked do
40+
@buffer.locked?.should be_true
41+
slice.locked?.should be_false
42+
slice.locked { slice.locked?.should be_true }
43+
end
44+
end
45+
46+
it "does not propagate backwards from buffer's slices" do
47+
@buffer = IO::Buffer.new(4)
48+
slice = @buffer.slice(0, 2)
49+
slice.locked do
50+
slice.locked?.should be_true
51+
@buffer.locked?.should be_false
52+
@buffer.locked { @buffer.locked?.should be_true }
53+
end
54+
end
55+
end
56+
57+
describe "IO::Buffer#locked?" do
58+
after :each do
59+
@buffer&.free
60+
@buffer = nil
61+
end
62+
63+
it "is false by default" do
64+
@buffer = IO::Buffer.new(4)
65+
@buffer.locked?.should be_false
66+
end
67+
68+
it "is true only inside of #locked block" do
69+
@buffer = IO::Buffer.new(4)
70+
@buffer.locked do
71+
@buffer.locked?.should be_true
72+
end
73+
@buffer.locked?.should be_false
74+
end
75+
end

0 commit comments

Comments
 (0)