Skip to content

Commit 3bf110a

Browse files
authored
Add basic Supposition.jl tests (#190)
1 parent 39409a5 commit 3bf110a

File tree

4 files changed

+140
-0
lines changed

4 files changed

+140
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@
1111
/Manifest.toml
1212
/docs/build/
1313
/docs/Manifest.toml
14+
/fuzz/test/
15+
/fuzz/Manifest.toml

fuzz/Project.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[deps]
2+
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
3+
Supposition = "5a0628fe-1738-4658-9b6d-0b7605a9755b"
4+
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
5+
TranscodingStreams = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
6+
7+
[compat]
8+
Supposition = "0.3"

fuzz/fuzz.jl

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
# Basic Supposition.jl tests to ensure nested streams can be read and written to.
2+
3+
using Supposition: Data, @composed, @check, event!, produce!
4+
5+
include("../test/codecdoubleframe.jl")
6+
7+
const TS_kwarg = @composed (
8+
bufsize=Data.Integers(1, 2^10),
9+
stop_on_end=Data.Booleans(),
10+
sharedbuf=Data.Booleans(),
11+
) -> (
12+
if sharedbuf
13+
# default sharedbuf
14+
(;bufsize, stop_on_end)
15+
else
16+
# sharedbuf = false
17+
(;bufsize, stop_on_end, sharedbuf)
18+
end
19+
)
20+
21+
const datas = Data.Vectors(Data.Integers{UInt8}())
22+
const noopcodecs = Data.Vectors(Data.Just(Noop); max_size=3)
23+
24+
function codecwrap(child)
25+
map(child) do x
26+
DataType[
27+
DoubleFrameEncoder;
28+
x;
29+
DoubleFrameDecoder;
30+
]
31+
end | map(Data.Vectors(child; min_size=2, max_size=2)) do x
32+
reduce(vcat, x)
33+
end
34+
end
35+
36+
# possible vector of codec types that when read from
37+
# should be equivalent to a Noop.
38+
# Every encoder is balanced with a decoder.
39+
const codecs = Data.Recursive(noopcodecs, codecwrap; max_layers=4)
40+
41+
function prepare_kws(codecs)
42+
# res will be a nicely printed summary of the layers of the stream.
43+
res = []
44+
for codec in codecs
45+
kw = Data.produce!(TS_kwarg)
46+
push!(res, (codec, kw))
47+
end
48+
res
49+
end
50+
51+
const read_codecs_kws = map(prepare_kws, codecs)
52+
53+
function wrap_stream(codecs_kws, io::IO)::IO
54+
event!("IOBuffer:", nothing)
55+
foldl(codecs_kws; init=io) do stream, (codec, kw)
56+
event!("codec:", (codec, kw))
57+
TranscodingStream(codec(), stream; kw...)
58+
end
59+
end
60+
61+
@check function read_byte_data(
62+
kws=read_codecs_kws,
63+
data=datas,
64+
)
65+
stream = wrap_stream(kws, IOBuffer(data))
66+
for i in eachindex(data)
67+
read(stream, UInt8) == data[i] || return false
68+
end
69+
eof(stream)
70+
end
71+
@check function read_data(
72+
kws=read_codecs_kws,
73+
data=datas,
74+
)
75+
stream = wrap_stream(kws, IOBuffer(data))
76+
read(stream) == data || return false
77+
eof(stream)
78+
end
79+
80+
# flush all nested streams and return final data
81+
function take_all(stream)
82+
if stream isa Base.GenericIOBuffer
83+
take!(stream)
84+
else
85+
write(stream, TranscodingStreams.TOKEN_END)
86+
flush(stream)
87+
take_all(stream.stream)
88+
end
89+
end
90+
91+
const write_codecs_kws = map(reverse, read_codecs_kws)
92+
93+
@check function write_data(
94+
kws=write_codecs_kws,
95+
data=datas,
96+
)
97+
stream = wrap_stream(kws, IOBuffer())
98+
write(stream, data) == length(data) || return false
99+
take_all(stream) == data
100+
end
101+
@check function write_byte_data(
102+
kws=write_codecs_kws,
103+
data=datas,
104+
)
105+
stream = wrap_stream(kws, IOBuffer())
106+
for i in 1:length(data)
107+
write(stream, data[i]) == 1 || return false
108+
end
109+
take_all(stream) == data
110+
end

test/codecdoubleframe.jl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,26 @@ DoubleFrameDecoderStream(stream::IO; kwargs...) = TranscodingStream(DoubleFrameD
243243
@test String(take!(sink)) == "[ ][ aabbcc ][ ddee ]"
244244
end
245245

246+
@testset "stop_on_end=true in nested streams" begin
247+
s1 = DoubleFrameDecoderStream(DoubleFrameEncoderStream(
248+
DoubleFrameDecoderStream(
249+
DoubleFrameEncoderStream(IOBuffer(b""));
250+
stop_on_end=true,
251+
)
252+
))
253+
@test_broken read(s1) == b""
254+
@test_broken eof(s1)
255+
256+
s2 = NoopStream(
257+
DoubleFrameDecoderStream(
258+
DoubleFrameEncoderStream(IOBuffer(b""));
259+
stop_on_end=true,
260+
)
261+
)
262+
@test read(s2) == b""
263+
@test_broken eof(s2)
264+
end
265+
246266
test_roundtrip_read(DoubleFrameEncoderStream, DoubleFrameDecoderStream)
247267
test_roundtrip_write(DoubleFrameEncoderStream, DoubleFrameDecoderStream)
248268
test_roundtrip_lines(DoubleFrameEncoderStream, DoubleFrameDecoderStream)

0 commit comments

Comments
 (0)