Skip to content

Commit 1f55bc3

Browse files
authored
prohibit stream from changing read/write mode (#17)
1 parent d9448a5 commit 1f55bc3

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed

src/stream.jl

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,8 @@ function changestate!(stream::TranscodingStream, newstate::Symbol)
466466
state = stream.state.state
467467
buffer1 = stream.state.buffer1
468468
buffer2 = stream.state.buffer2
469+
transition_error() =
470+
throw(ArgumentError("cannot change the mode from $(state) to $(newstate)"))
469471
if state == newstate
470472
# state does not change
471473
return
@@ -488,9 +490,7 @@ function changestate!(stream::TranscodingStream, newstate::Symbol)
488490
stream.state.state = newstate
489491
return
490492
elseif newstate == :write
491-
changestate!(stream, :idle)
492-
changestate!(stream, :write)
493-
return
493+
transition_error()
494494
elseif newstate == :close
495495
changestate!(stream, :idle)
496496
changestate!(stream, :close)
@@ -504,9 +504,7 @@ function changestate!(stream::TranscodingStream, newstate::Symbol)
504504
stream.state.state = newstate
505505
return
506506
elseif newstate == :read
507-
changestate!(stream, :idle)
508-
changestate!(stream, :read)
509-
return
507+
transition_error()
510508
elseif newstate == :close
511509
changestate!(stream, :idle)
512510
changestate!(stream, :close)

test/runtests.jl

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,6 @@ end
5757
@test_throws EOFError unsafe_read(stream, pointer(Vector{UInt8}(3)), 3)
5858
close(stream)
5959

60-
# switch write => read
61-
buf = IOBuffer(b"foobar", true, true)
62-
stream = TranscodingStream(Identity(), buf)
63-
@test write(stream, b"xyz") == 3
64-
@test read(stream, 3) == b"bar"
65-
@test take!(buf) == b"xyzbar"
66-
close(stream)
67-
6860
sink = IOBuffer()
6961
stream = TranscodingStream(Identity(), sink)
7062
@test write(stream, "foo") === 3
@@ -192,6 +184,20 @@ end
192184
TranscodingStreams.test_roundtrip_read(NoopStream, NoopStream)
193185
TranscodingStreams.test_roundtrip_write(NoopStream, NoopStream)
194186
TranscodingStreams.test_roundtrip_lines(NoopStream, NoopStream)
187+
188+
# switch write => read
189+
stream = NoopStream(IOBuffer(b"foobar", true, true))
190+
@test_throws ArgumentError begin
191+
write(stream, b"xyz")
192+
read(stream, 3)
193+
end
194+
195+
# switch read => write
196+
stream = NoopStream(IOBuffer(b"foobar", true, true))
197+
@test_throws ArgumentError begin
198+
read(stream, 3)
199+
write(stream, b"xyz")
200+
end
195201
end
196202

197203
# This does not implement necessary interface methods.

0 commit comments

Comments
 (0)