@@ -130,9 +130,17 @@ include("utils.jl")
130130 @test CodecZstd. find_decompressed_size (v) == 22
131131
132132 codec = ZstdCompressor
133- buffer3 = transcode (codec, b " Hello" )
134- buffer4 = transcode (codec, b " World!" )
133+ sink = IOBuffer ()
134+ s = TranscodingStream (codec (), sink; stop_on_end= true )
135+ write (s, b " Hello" )
136+ close (s)
137+ buffer3 = take! (sink)
135138 @test CodecZstd. find_decompressed_size (buffer3) == CodecZstd. ZSTD_CONTENTSIZE_UNKNOWN
139+ sink = IOBuffer ()
140+ s = TranscodingStream (codec (), sink; stop_on_end= true )
141+ write (s, b " Hello" )
142+ close (s)
143+ buffer4 = take! (sink)
136144 @test CodecZstd. find_decompressed_size (buffer4) == CodecZstd. ZSTD_CONTENTSIZE_UNKNOWN
137145
138146 write (iob, buffer1)
@@ -156,6 +164,68 @@ include("utils.jl")
156164 @test CodecZstd. find_decompressed_size (v) == CodecZstd. ZSTD_CONTENTSIZE_ERROR
157165 end
158166
167+ if isdefined (TranscodingStreams, :pledgeinsize )
168+ @testset " pledgeinsize" begin
169+ # when pledgeinsize is available transcode should save the
170+ # decompressed size in a header
171+ for n in [0 : 30 ; 1000 ; 1000000 ;]
172+ v = transcode (ZstdCompressor, rand (UInt8, n))
173+ @test CodecZstd. find_decompressed_size (v) == n
174+ end
175+
176+ # Test what happens if pledgeinsize promise is broken
177+ d1 = zeros (UInt8, 10000 )
178+ d2 = zeros (UInt8, 10000 )
179+ GC. @preserve d1 d2 begin
180+ @testset " too many bytes" begin
181+ m1 = TranscodingStreams. Memory (pointer (d1), 1000 )
182+ m2 = TranscodingStreams. Memory (pointer (d2), 1000 )
183+ codec = ZstdCompressor ()
184+ e = TranscodingStreams. Error ()
185+ @test TranscodingStreams. startproc (codec, :read , e) === :ok
186+ @test TranscodingStreams. pledgeinsize (codec, Int64 (10 ), e) === :ok
187+ @test TranscodingStreams. process (codec, m1, m2, e) === (0 , 0 , :error )
188+ @test e[] == ErrorException (" zstd compression error: Src size is incorrect" )
189+ TranscodingStreams. finalize (codec)
190+ end
191+ @testset " too few bytes" begin
192+ m1 = TranscodingStreams. Memory (pointer (d1), 10 )
193+ m2 = TranscodingStreams. Memory (pointer (d2), 1000 )
194+ codec = ZstdCompressor ()
195+ e = TranscodingStreams. Error ()
196+ @test TranscodingStreams. startproc (codec, :read , e) === :ok
197+ @test TranscodingStreams. pledgeinsize (codec, Int64 (10000 ), e) === :ok
198+ @test TranscodingStreams. process (codec, m1, m2, e)[3 ] === :ok
199+ m1 = TranscodingStreams. Memory (pointer (d1), 0 )
200+ @test TranscodingStreams. process (codec, m1, m2, e)[3 ] === :error
201+ @test e[] == ErrorException (" zstd compression error: Src size is incorrect" )
202+ TranscodingStreams. finalize (codec)
203+ end
204+ @testset " set pledgeinsize after process" begin
205+ m1 = TranscodingStreams. Memory (pointer (d1), 1000 )
206+ m2 = TranscodingStreams. Memory (pointer (d2), 1000 )
207+ codec = ZstdCompressor ()
208+ e = TranscodingStreams. Error ()
209+ @test TranscodingStreams. startproc (codec, :read , e) === :ok
210+ @test TranscodingStreams. process (codec, m1, m2, e)[3 ] === :ok
211+ @test TranscodingStreams. pledgeinsize (codec, Int64 (10000 ), e) === :error
212+ @test e[] == ErrorException (" zstd error setting pledged source size" )
213+ TranscodingStreams. finalize (codec)
214+ end
215+ @testset " set unknown pledgeinsize" begin
216+ m1 = TranscodingStreams. Memory (pointer (d1), 1000 )
217+ m2 = TranscodingStreams. Memory (pointer (d2), 1000 )
218+ codec = ZstdCompressor ()
219+ e = TranscodingStreams. Error ()
220+ @test TranscodingStreams. startproc (codec, :read , e) === :ok
221+ @test TranscodingStreams. pledgeinsize (codec, Int64 (- 1 ), e) === :ok
222+ @test TranscodingStreams. process (codec, m1, m2, e)[3 ] === :ok
223+ TranscodingStreams. finalize (codec)
224+ end
225+ end
226+ end
227+ end
228+
159229 include (" compress_endOp.jl" )
160230 include (" static_only_tests.jl" )
161231
@@ -195,6 +265,10 @@ include("utils.jl")
195265 TranscodingStreams. finalize (codec)
196266 data = [0x00 ,0x01 ]
197267 GC. @preserve data let m = TranscodingStreams. Memory (pointer (data), length (data))
268+ try
269+ TranscodingStreams. pledgeinsize (codec, Int64 (10 ), TranscodingStreams. Error ())
270+ catch
271+ end
198272 try
199273 TranscodingStreams. expectedsize (codec, m)
200274 catch
0 commit comments