Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions ext/zstdruby/streaming_decompress.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,8 @@ rb_streaming_decompress_decompress(VALUE obj, VALUE src)
if (output.pos > 0) {
rb_str_cat(result, output.dst, output.pos);
}
if (ret == 0 && output.pos == 0) {
break;
}
/* Carry on after the end of a frame, even one without output such as an
empty or skippable frame: the rest of the input can hold more frames. */
}
return result;
}
Expand Down
25 changes: 25 additions & 0 deletions spec/zstd-ruby-streaming-decompress_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,31 @@
end
end

describe 'streaming decompress of several frames' do
it 'decompresses every frame' do
input = Zstd.compress('Hello, ') + Zstd.compress('World!')
expect(Zstd::StreamingDecompress.new.decompress(input)).to eq('Hello, World!')
end

it 'decompresses the frames after an empty frame' do
input = Zstd.compress('') + Zstd.compress('Hello, ') + Zstd.compress('') + Zstd.compress('World!')
expect(Zstd::StreamingDecompress.new.decompress(input)).to eq('Hello, World!')
end

it 'decompresses the frames after a skippable frame' do
# pzstd writes a skippable frame before each frame.
skippable = [0x184D2A50, 4].pack('VV') + 'meta'
input = skippable + Zstd.compress('Hello, ') + skippable + Zstd.compress('World!')
expect(Zstd::StreamingDecompress.new.decompress(input)).to eq('Hello, World!')

# Split within the frame that follows the first skippable frame
stream = Zstd::StreamingDecompress.new
result = stream.decompress(input.byteslice(0, 15))
result << stream.decompress(input.byteslice(15..-1))
expect(result).to eq('Hello, World!')
end
end

describe 'decompress_with_pos' do
it 'should return decompressed data and consumed input position' do
str = "hello world test data"
Expand Down