Skip to content

Commit c94c26e

Browse files
committed
Add (partial) spec for IO::Buffer#valid?
1 parent b027cd1 commit c94c26e

File tree

1 file changed

+115
-0
lines changed

1 file changed

+115
-0
lines changed

core/io/buffer/valid_spec.rb

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
require_relative '../../../spec_helper'
2+
3+
describe "IO::Buffer#valid?" do
4+
after :each do
5+
@buffer&.free
6+
@buffer = nil
7+
end
8+
9+
# Non-slices are always valid
10+
context "with a non-slice buffer" do
11+
it "is true for a regular buffer" do
12+
@buffer = IO::Buffer.new(4)
13+
@buffer.valid?.should be_true
14+
end
15+
16+
it "is true for a 0-size buffer" do
17+
@buffer = IO::Buffer.new(0)
18+
@buffer.valid?.should be_true
19+
end
20+
21+
it "is true for a freed buffer" do
22+
@buffer = IO::Buffer.new(4)
23+
@buffer.free
24+
@buffer.valid?.should be_true
25+
end
26+
27+
it "is true for a freed file-backed buffer" do
28+
File.open(__FILE__, "r") do |file|
29+
@buffer = IO::Buffer.map(file, nil, 0, IO::Buffer::READONLY)
30+
@buffer.valid?.should be_true
31+
@buffer.free
32+
@buffer.valid?.should be_true
33+
end
34+
end
35+
36+
it "is true for a freed string-backed buffer" do
37+
@buffer = IO::Buffer.for("hello")
38+
@buffer.valid?.should be_true
39+
@buffer.free
40+
@buffer.valid?.should be_true
41+
end
42+
end
43+
44+
# "A buffer becomes invalid if it is a slice of another buffer (or string)
45+
# which has been freed or re-allocated at a different address."
46+
context "with a slice buffer" do
47+
it "is true for a slice of a live buffer" do
48+
@buffer = IO::Buffer.new(4)
49+
slice = @buffer.slice(0, 2)
50+
slice.valid?.should be_true
51+
end
52+
53+
context "when buffer is resized" do
54+
it "is true when slice is still inside the buffer" do
55+
@buffer = IO::Buffer.new(4)
56+
slice = @buffer.slice(1, 2)
57+
@buffer.resize(3)
58+
slice.valid?.should be_true
59+
end
60+
61+
it "is false when slice becomes outside the buffer" do
62+
@buffer = IO::Buffer.new(4)
63+
slice = @buffer.slice(2, 2)
64+
@buffer.resize(3)
65+
slice.valid?.should be_false
66+
end
67+
68+
platform_is_not :linux do
69+
it "is false when buffer is copied on resize" do
70+
@buffer = IO::Buffer.new(4, IO::Buffer::MAPPED)
71+
slice = @buffer.slice(0, 2)
72+
@buffer.resize(8)
73+
slice.valid?.should be_false
74+
end
75+
end
76+
end
77+
78+
it "is false for a slice of a transferred buffer" do
79+
buffer = IO::Buffer.new(4)
80+
slice = buffer.slice(0, 2)
81+
@buffer = buffer.transfer
82+
slice.valid?.should be_false
83+
end
84+
85+
it "is false for a slice of a freed buffer" do
86+
@buffer = IO::Buffer.new(4)
87+
slice = @buffer.slice(0, 2)
88+
@buffer.free
89+
slice.valid?.should be_false
90+
end
91+
92+
it "is false for a slice of a freed file-backed buffer" do
93+
File.open(__FILE__, "r") do |file|
94+
@buffer = IO::Buffer.map(file, nil, 0, IO::Buffer::READONLY)
95+
slice = @buffer.slice(0, 2)
96+
slice.valid?.should be_true
97+
@buffer.free
98+
slice.valid?.should be_false
99+
end
100+
end
101+
102+
it "is true for a slice of a freed string-backed buffer while string is alive" do
103+
@buffer = IO::Buffer.for("alive")
104+
slice = @buffer.slice(0, 2)
105+
slice.valid?.should be_true
106+
@buffer.free
107+
slice.valid?.should be_true
108+
end
109+
110+
# There probably should be a test with a garbage-collected string,
111+
# but it's not clear how to force that.
112+
113+
it "needs to be reviewed for spec completeness"
114+
end
115+
end

0 commit comments

Comments
 (0)