Skip to content

Commit 4b7f8ad

Browse files
authored
Flush buffer to avoid deleting data when seeking NoopStream (#172)
1 parent db9b0ed commit 4b7f8ad

File tree

3 files changed

+47
-18
lines changed

3 files changed

+47
-18
lines changed

src/noop.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,18 +64,30 @@ function Base.position(stream::NoopStream)
6464
end
6565

6666
function Base.seek(stream::NoopStream, pos::Integer)
67+
mode = stream.state.mode
68+
if mode === :write
69+
flushbuffer(stream)
70+
end
6771
seek(stream.stream, pos)
6872
initbuffer!(stream.buffer1)
6973
return stream
7074
end
7175

7276
function Base.seekstart(stream::NoopStream)
77+
mode = stream.state.mode
78+
if mode === :write
79+
flushbuffer(stream)
80+
end
7381
seekstart(stream.stream)
7482
initbuffer!(stream.buffer1)
7583
return stream
7684
end
7785

7886
function Base.seekend(stream::NoopStream)
87+
mode = stream.state.mode
88+
if mode === :write
89+
flushbuffer(stream)
90+
end
7991
seekend(stream.stream)
8092
initbuffer!(stream.buffer1)
8193
return stream

test/codecnoop.jl

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -335,19 +335,29 @@
335335
end
336336
end
337337

338-
@testset "seekstart doesn't delete data" begin
338+
@testset "seek doesn't delete data" begin
339339
sink = IOBuffer()
340340
stream = NoopStream(sink, bufsize=16)
341341
write(stream, "x")
342-
# seekstart must not delete user data even if it errors.
343-
try
344-
seekstart(stream)
345-
catch e
346-
e isa ArgumentError || rethrow()
347-
end
348-
write(stream, TranscodingStreams.TOKEN_END)
342+
seekstart(stream)
349343
flush(stream)
350-
@test_broken take!(sink) == b"x"
344+
@test take!(sink) == b"x"
351345
close(stream)
346+
347+
op_expected = [
348+
(seekstart, b"dbc"),
349+
(seekend, b"abcd"),
350+
(Base.Fix2(seek, 1), b"adc"),
351+
]
352+
@testset "$op" for (op, expected) in op_expected
353+
sink = IOBuffer()
354+
stream = NoopStream(sink, bufsize=16)
355+
write(stream, "abc")
356+
@test op(stream) === stream
357+
write(stream, "d")
358+
flush(stream)
359+
@test take!(sink) == expected
360+
close(stream)
361+
end
352362
end
353363
end

test/codecquadruple.jl

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -124,15 +124,22 @@ end
124124
end
125125

126126
@testset "seekstart doesn't delete data" begin
127-
sink = IOBuffer()
128-
stream = TranscodingStream(QuadrupleCodec(), sink, bufsize=16)
129-
write(stream, "x")
130-
# seekstart must not delete user data even if it errors.
131-
@test_throws ArgumentError seekstart(stream)
132-
write(stream, TranscodingStreams.TOKEN_END)
133-
flush(stream)
134-
@test take!(sink) == b"xxxx"
135-
close(stream)
127+
for n in 0:3
128+
sink = IOBuffer()
129+
# wrap stream in NoopStream n times.
130+
stream = foldl(
131+
(s,_) -> NoopStream(s),
132+
1:n;
133+
init=TranscodingStream(QuadrupleCodec(), sink, bufsize=16)
134+
)
135+
write(stream, "x")
136+
# seekstart must not delete user data even if it errors.
137+
@test_throws ArgumentError seekstart(stream)
138+
write(stream, TranscodingStreams.TOKEN_END)
139+
flush(stream)
140+
@test take!(sink) == b"xxxx"
141+
close(stream)
142+
end
136143
end
137144

138145
@testset "eof is true after write" begin

0 commit comments

Comments
 (0)