Skip to content

Commit 7a1680c

Browse files
authored
Safely error in generic Base.seekstart if in write mode. (#159)
1 parent e38857b commit 7a1680c

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

src/stream.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,8 @@ end
283283

284284
function Base.seekstart(stream::TranscodingStream)
285285
mode = stream.state.mode
286-
@checkmode (:idle, :read, :write)
287-
if mode == :read || mode == :write
286+
@checkmode (:idle, :read)
287+
if mode == :read
288288
callstartproc(stream, mode)
289289
emptybuffer!(stream.state.buffer1)
290290
emptybuffer!(stream.state.buffer2)

test/codecquadruple.jl

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,19 +108,30 @@ end
108108
end
109109
end
110110

111+
@testset "seekstart" begin
112+
data = Vector(b"abracadabra")
113+
source = IOBuffer(data)
114+
seekend(source)
115+
stream = TranscodingStream(QuadrupleCodec(), source, bufsize=16)
116+
@test seekstart(stream) == stream
117+
@test position(stream) == 0
118+
@test read(stream, 5) == b"aaaab"
119+
@test position(stream) == 5
120+
@test seekstart(stream) == stream
121+
@test_broken position(stream) == 0
122+
@test read(stream, 5) == b"aaaab"
123+
@test_broken position(stream) == 5
124+
end
125+
111126
@testset "seekstart doesn't delete data" begin
112127
sink = IOBuffer()
113128
stream = TranscodingStream(QuadrupleCodec(), sink, bufsize=16)
114129
write(stream, "x")
115130
# seekstart must not delete user data even if it errors.
116-
try
117-
seekstart(stream)
118-
catch e
119-
e isa ArgumentError || rethrow()
120-
end
131+
@test_throws ArgumentError seekstart(stream)
121132
write(stream, TranscodingStreams.TOKEN_END)
122133
flush(stream)
123-
@test_broken take!(sink) == b"xxxx"
134+
@test take!(sink) == b"xxxx"
124135
close(stream)
125136
end
126137
end

0 commit comments

Comments
 (0)