Skip to content

Commit 2d387d9

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

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

core/io/buffer/valid_spec.rb

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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+
it "is false for a slice of a transferred buffer" do
54+
buffer = IO::Buffer.new(4)
55+
slice = buffer.slice(0, 2)
56+
@buffer = buffer.transfer
57+
slice.valid?.should be_false
58+
end
59+
60+
it "is false for a slice of a freed buffer" do
61+
@buffer = IO::Buffer.new(4)
62+
slice = @buffer.slice(0, 2)
63+
@buffer.free
64+
slice.valid?.should be_false
65+
end
66+
67+
it "is false for a slice of a freed file-backed buffer" do
68+
File.open(__FILE__, "r") do |file|
69+
@buffer = IO::Buffer.map(file, nil, 0, IO::Buffer::READONLY)
70+
slice = @buffer.slice(0, 2)
71+
slice.valid?.should be_true
72+
@buffer.free
73+
slice.valid?.should be_false
74+
end
75+
end
76+
77+
it "is true for a slice of a freed string-backed buffer while string is alive" do
78+
@buffer = IO::Buffer.for("alive")
79+
slice = @buffer.slice(0, 2)
80+
slice.valid?.should be_true
81+
@buffer.free
82+
slice.valid?.should be_true
83+
end
84+
85+
# There probably should be a test with a garbage-collected string,
86+
# but it's not clear how to force that.
87+
# Also, a test for re-allocated memory, as #transfer does not
88+
# change the address.
89+
90+
it "needs to be reviewed for spec completeness"
91+
end
92+
end

0 commit comments

Comments
 (0)