Skip to content

Commit ec3d184

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

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed

core/io/buffer/valid_spec.rb

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
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" 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+
platform_is_not :windows do
55+
it "is true when slice is still inside the buffer" do
56+
@buffer = IO::Buffer.new(4)
57+
slice = @buffer.slice(1, 2)
58+
@buffer.resize(3)
59+
slice.valid?.should be_true
60+
end
61+
end
62+
63+
it "is false when slice becomes outside the buffer" do
64+
@buffer = IO::Buffer.new(4)
65+
slice = @buffer.slice(2, 2)
66+
@buffer.resize(3)
67+
slice.valid?.should be_false
68+
end
69+
70+
platform_is_not :linux do
71+
# This test does not cause a copy-resize on Linux.
72+
# It MAY cause the buffer to move, but there is no guarantee.
73+
it "is false when buffer is copied on resize" do
74+
@buffer = IO::Buffer.new(4, IO::Buffer::MAPPED)
75+
slice = @buffer.slice(0, 2)
76+
@buffer.resize(8)
77+
slice.valid?.should be_false
78+
end
79+
end
80+
end
81+
82+
it "is false for a slice of a transferred buffer" do
83+
buffer = IO::Buffer.new(4)
84+
slice = buffer.slice(0, 2)
85+
@buffer = buffer.transfer
86+
slice.valid?.should be_false
87+
end
88+
89+
it "is false for a slice of a freed buffer" do
90+
@buffer = IO::Buffer.new(4)
91+
slice = @buffer.slice(0, 2)
92+
@buffer.free
93+
slice.valid?.should be_false
94+
end
95+
96+
it "is false for a slice of a freed file-backed buffer" do
97+
File.open(__FILE__, "r") do |file|
98+
@buffer = IO::Buffer.map(file, nil, 0, IO::Buffer::READONLY)
99+
slice = @buffer.slice(0, 2)
100+
slice.valid?.should be_true
101+
@buffer.free
102+
slice.valid?.should be_false
103+
end
104+
end
105+
106+
it "is true for a slice of a freed string-backed buffer while string is alive" do
107+
@buffer = IO::Buffer.for("alive")
108+
slice = @buffer.slice(0, 2)
109+
slice.valid?.should be_true
110+
@buffer.free
111+
slice.valid?.should be_true
112+
end
113+
114+
# There probably should be a test with a garbage-collected string,
115+
# but it's not clear how to force that.
116+
117+
it "needs to be reviewed for spec completeness"
118+
end
119+
end

0 commit comments

Comments
 (0)