Skip to content

Commit 8fd426b

Browse files
committed
check if pledgeinsize is defined
1 parent 6d9dab0 commit 8fd426b

File tree

2 files changed

+74
-70
lines changed

2 files changed

+74
-70
lines changed

src/compression.jl

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -184,21 +184,23 @@ function TranscodingStreams.startproc(codec::ZstdCompressor, mode::Symbol, err::
184184
return :ok
185185
end
186186

187-
function TranscodingStreams.pledgeinsize(codec::ZstdCompressor, insize::Int64, error::Error)::Symbol
188-
if codec.cstream.ptr == C_NULL
189-
Base.error("`startproc` must be called before `pledgeinsize`")
190-
end
191-
srcsize = if signbit(insize)
192-
ZSTD_CONTENTSIZE_UNKNOWN
193-
else
194-
Culonglong(insize)
195-
end
196-
code = LibZstd.ZSTD_CCtx_setPledgedSrcSize(codec.cstream, srcsize)
197-
if iserror(code)
198-
error[] = ErrorException("zstd error setting pledged source size")
199-
:error
200-
else
201-
:ok
187+
@static if isdefined(TranscodingStreams, :pledgeinsize) # Defined in v0.11.3
188+
function TranscodingStreams.pledgeinsize(codec::ZstdCompressor, insize::Int64, err::Error)::Symbol
189+
if codec.cstream.ptr == C_NULL
190+
error("`startproc` must be called before `pledgeinsize`")
191+
end
192+
srcsize = if signbit(insize)
193+
ZSTD_CONTENTSIZE_UNKNOWN
194+
else
195+
Culonglong(insize)
196+
end
197+
code = LibZstd.ZSTD_CCtx_setPledgedSrcSize(codec.cstream, srcsize)
198+
if iserror(code)
199+
err[] = ErrorException("zstd error setting pledged source size")
200+
:error
201+
else
202+
:ok
203+
end
202204
end
203205
end
204206

test/runtests.jl

Lines changed: 57 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -164,62 +164,64 @@ include("utils.jl")
164164
@test CodecZstd.find_decompressed_size(v) == CodecZstd.ZSTD_CONTENTSIZE_ERROR
165165
end
166166

167-
@testset "pledgeinsize" begin
168-
# when pledgeinsize is available transcode should save the
169-
# decompressed size in a header
170-
for n in [0:30; 1000; 1000000;]
171-
v = transcode(ZstdCompressor, rand(UInt8, n))
172-
@test CodecZstd.find_decompressed_size(v) == n
173-
end
174-
175-
# Test what happens if pledgeinsize promise is broken
176-
d1 = zeros(UInt8, 10000)
177-
d2 = zeros(UInt8, 10000)
178-
GC.@preserve d1 d2 begin
179-
@testset "too many bytes" begin
180-
m1 = TranscodingStreams.Memory(pointer(d1), 1000)
181-
m2 = TranscodingStreams.Memory(pointer(d2), 1000)
182-
codec = ZstdCompressor()
183-
e = TranscodingStreams.Error()
184-
@test TranscodingStreams.startproc(codec, :read, e) === :ok
185-
@test TranscodingStreams.pledgeinsize(codec, Int64(10), e) === :ok
186-
@test TranscodingStreams.process(codec, m1, m2, e) === (0, 0, :error)
187-
@test e[] == ErrorException("zstd error: Src size is incorrect")
188-
TranscodingStreams.finalize(codec)
189-
end
190-
@testset "too few bytes" begin
191-
m1 = TranscodingStreams.Memory(pointer(d1), 10)
192-
m2 = TranscodingStreams.Memory(pointer(d2), 1000)
193-
codec = ZstdCompressor()
194-
e = TranscodingStreams.Error()
195-
@test TranscodingStreams.startproc(codec, :read, e) === :ok
196-
@test TranscodingStreams.pledgeinsize(codec, Int64(10000), e) === :ok
197-
@test TranscodingStreams.process(codec, m1, m2, e)[3] === :ok
198-
m1 = TranscodingStreams.Memory(pointer(d1), 0)
199-
@test TranscodingStreams.process(codec, m1, m2, e)[3] === :error
200-
@test e[] == ErrorException("zstd error: Src size is incorrect")
201-
TranscodingStreams.finalize(codec)
202-
end
203-
@testset "set pledgeinsize after process" begin
204-
m1 = TranscodingStreams.Memory(pointer(d1), 1000)
205-
m2 = TranscodingStreams.Memory(pointer(d2), 1000)
206-
codec = ZstdCompressor()
207-
e = TranscodingStreams.Error()
208-
@test TranscodingStreams.startproc(codec, :read, e) === :ok
209-
@test TranscodingStreams.process(codec, m1, m2, e)[3] === :ok
210-
@test TranscodingStreams.pledgeinsize(codec, Int64(10000), e) === :error
211-
@test e[] == ErrorException("zstd error setting pledged source size")
212-
TranscodingStreams.finalize(codec)
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
213174
end
214-
@testset "set unknown pledgeinsize" begin
215-
m1 = TranscodingStreams.Memory(pointer(d1), 1000)
216-
m2 = TranscodingStreams.Memory(pointer(d2), 1000)
217-
codec = ZstdCompressor()
218-
e = TranscodingStreams.Error()
219-
@test TranscodingStreams.startproc(codec, :read, e) === :ok
220-
@test TranscodingStreams.pledgeinsize(codec, Int64(-1), e) === :ok
221-
@test TranscodingStreams.process(codec, m1, m2, e)[3] === :ok
222-
TranscodingStreams.finalize(codec)
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 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 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
223225
end
224226
end
225227
end

0 commit comments

Comments
 (0)