@@ -2,9 +2,11 @@ package da
22
33import (
44 "bytes"
5+ "context"
56 "crypto/rand"
67 "testing"
78
9+ "github.com/klauspost/compress/zstd"
810 "github.com/stretchr/testify/assert"
911 "github.com/stretchr/testify/require"
1012)
@@ -39,7 +41,7 @@ func TestCompressDecompress_RoundTrip(t *testing.T) {
3941
4042 assert .True (t , IsCompressed (compressed ), "compressed data should have magic prefix" )
4143
42- decompressed , err := Decompress (compressed )
44+ decompressed , err := Decompress (context . Background (), compressed )
4345 require .NoError (t , err )
4446
4547 assert .Equal (t , tt .data , decompressed , "round-trip should preserve data" )
@@ -67,7 +69,7 @@ func TestCompress_AllLevelsRoundTrip(t *testing.T) {
6769
6870 sizes = append (sizes , len (compressed ))
6971
70- decompressed , err := Decompress (compressed )
72+ decompressed , err := Decompress (context . Background (), compressed )
7173 require .NoError (t , err )
7274 assert .Equal (t , data , decompressed )
7375
@@ -94,32 +96,32 @@ func TestCompress_Empty(t *testing.T) {
9496func TestDecompress_UncompressedPassthrough (t * testing.T ) {
9597 // Data without magic prefix should pass through unchanged
9698 raw := []byte ("this is uncompressed protobuf data" )
97- result , err := Decompress (raw )
99+ result , err := Decompress (context . Background (), raw )
98100 require .NoError (t , err )
99101 assert .Equal (t , raw , result )
100102}
101103
102104func TestDecompress_Empty (t * testing.T ) {
103- result , err := Decompress (nil )
105+ result , err := Decompress (context . Background (), nil )
104106 require .NoError (t , err )
105107 assert .Nil (t , result )
106108
107- result , err = Decompress ([]byte {})
109+ result , err = Decompress (context . Background (), []byte {})
108110 require .NoError (t , err )
109111 assert .Empty (t , result )
110112}
111113
112114func TestDecompress_ShortData (t * testing.T ) {
113115 // Data shorter than magic prefix should pass through
114- result , err := Decompress ([]byte {0x5A , 0x53 })
116+ result , err := Decompress (context . Background (), []byte {0x5A , 0x53 })
115117 require .NoError (t , err )
116118 assert .Equal (t , []byte {0x5A , 0x53 }, result )
117119}
118120
119121func TestDecompress_CorruptCompressedData (t * testing.T ) {
120122 // Magic prefix followed by invalid zstd data
121123 corrupt := append ([]byte {0x5A , 0x53 , 0x54 , 0x44 }, []byte ("not valid zstd" )... )
122- _ , err := Decompress (corrupt )
124+ _ , err := Decompress (context . Background (), corrupt )
123125 assert .Error (t , err , "should fail on corrupt compressed data" )
124126}
125127
@@ -163,14 +165,14 @@ func TestCompress_RandomDataStillWorks(t *testing.T) {
163165 compressed , err := Compress (data , LevelFastest )
164166 require .NoError (t , err )
165167
166- decompressed , err := Decompress (compressed )
168+ decompressed , err := Decompress (context . Background (), compressed )
167169 require .NoError (t , err )
168170 assert .Equal (t , data , decompressed )
169171}
170172
171173func TestDecompress_DataStartingWithMagicButUncompressed (t * testing.T ) {
172174 fakeCompressed := append ([]byte {0x5A , 0x53 , 0x54 , 0x44 }, bytes .Repeat ([]byte {0x00 }, 100 )... )
173- _ , err := Decompress (fakeCompressed )
175+ _ , err := Decompress (context . Background (), fakeCompressed )
174176 assert .Error (t , err , "data starting with magic but containing invalid zstd should error" )
175177}
176178
@@ -180,7 +182,43 @@ func TestCompress_InvalidLevel(t *testing.T) {
180182 compressed , err := Compress (data , CompressionLevel (99 ))
181183 require .NoError (t , err )
182184
183- decompressed , err := Decompress (compressed )
185+ decompressed , err := Decompress (context . Background (), compressed )
184186 require .NoError (t , err )
185187 assert .Equal (t , data , decompressed )
186188}
189+
190+ func TestDecompress_ContextCanceled (t * testing.T ) {
191+ data := []byte ("test data for context cancellation" )
192+ compressed , err := Compress (data , LevelDefault )
193+ require .NoError (t , err )
194+
195+ // Pre-canceled context should cause Decompress to return an error.
196+ ctx , cancel := context .WithCancel (context .Background ())
197+ cancel ()
198+
199+ _ , err = Decompress (ctx , compressed )
200+ assert .Error (t , err , "decompress with canceled context should fail" )
201+ assert .ErrorIs (t , err , context .Canceled )
202+ }
203+
204+ func TestDecompress_OversizedFrameRejected (t * testing.T ) {
205+ // Build a fake zstd frame header that declares 100 MiB decompressed size.
206+ // This should be rejected by the frame header pre-check before any
207+ // decompression occurs.
208+ hdr := zstd.Header {
209+ SingleSegment : true ,
210+ HasFCS : true ,
211+ FrameContentSize : 100 * 1024 * 1024 , // 100 MiB — way over the 7 MiB limit
212+ }
213+ frame , err := hdr .AppendTo (nil )
214+ require .NoError (t , err )
215+
216+ // Prepend our custom magic prefix
217+ blob := make ([]byte , len (magic )+ len (frame ))
218+ copy (blob , magic )
219+ copy (blob [len (magic ):], frame )
220+
221+ _ , err = Decompress (context .Background (), blob )
222+ assert .Error (t , err , "should reject blob declaring oversized decompressed output" )
223+ assert .ErrorIs (t , err , ErrDecompressedSizeExceeded )
224+ }
0 commit comments