decoder_test.go 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294
  1. // Copyright 2019+ Klaus Post. All rights reserved.
  2. // License information can be found in the LICENSE file.
  3. // Based on work by Yann Collet, released under BSD License.
  4. package zstd
  5. import (
  6. "bufio"
  7. "bytes"
  8. "encoding/binary"
  9. "encoding/hex"
  10. "fmt"
  11. "io"
  12. "io/ioutil"
  13. "log"
  14. "math/rand"
  15. "os"
  16. "path/filepath"
  17. "reflect"
  18. "runtime"
  19. "strings"
  20. "sync"
  21. "testing"
  22. "time"
  23. // "github.com/DataDog/zstd"
  24. // zstd "github.com/valyala/gozstd"
  25. "github.com/klauspost/compress/zip"
  26. "github.com/klauspost/compress/zstd/internal/xxhash"
  27. )
  28. func TestNewReaderMismatch(t *testing.T) {
  29. // To identify a potential decoding error, do the following steps:
  30. // 1) Place the compressed file in testdata, eg 'testdata/backup.bin.zst'
  31. // 2) Decompress the file to using zstd, so it will be named 'testdata/backup.bin'
  32. // 3) Run the test. A hash file will be generated 'testdata/backup.bin.hash'
  33. // 4) The decoder will also run and decode the file. It will stop as soon as a mismatch is found.
  34. // The hash file will be reused between runs if present.
  35. const baseFile = "testdata/backup.bin"
  36. const blockSize = 1024
  37. hashes, err := ioutil.ReadFile(baseFile + ".hash")
  38. if os.IsNotExist(err) {
  39. // Create the hash file.
  40. f, err := os.Open(baseFile)
  41. if os.IsNotExist(err) {
  42. t.Skip("no decompressed file found")
  43. return
  44. }
  45. defer f.Close()
  46. br := bufio.NewReader(f)
  47. var tmp [8]byte
  48. xx := xxhash.New()
  49. for {
  50. xx.Reset()
  51. buf := make([]byte, blockSize)
  52. n, err := io.ReadFull(br, buf)
  53. if err != nil {
  54. if err != io.EOF && err != io.ErrUnexpectedEOF {
  55. t.Fatal(err)
  56. }
  57. }
  58. if n > 0 {
  59. _, _ = xx.Write(buf[:n])
  60. binary.LittleEndian.PutUint64(tmp[:], xx.Sum64())
  61. hashes = append(hashes, tmp[4:]...)
  62. }
  63. if n != blockSize {
  64. break
  65. }
  66. }
  67. err = ioutil.WriteFile(baseFile+".hash", hashes, os.ModePerm)
  68. if err != nil {
  69. // We can continue for now
  70. t.Error(err)
  71. }
  72. t.Log("Saved", len(hashes)/4, "hashes as", baseFile+".hash")
  73. }
  74. f, err := os.Open(baseFile + ".zst")
  75. if os.IsNotExist(err) {
  76. t.Skip("no compressed file found")
  77. return
  78. }
  79. defer f.Close()
  80. dec, err := NewReader(f, WithDecoderConcurrency(1))
  81. if err != nil {
  82. t.Fatal(err)
  83. }
  84. defer dec.Close()
  85. var tmp [8]byte
  86. xx := xxhash.New()
  87. var cHash int
  88. for {
  89. xx.Reset()
  90. buf := make([]byte, blockSize)
  91. n, err := io.ReadFull(dec, buf)
  92. if err != nil {
  93. if err != io.EOF && err != io.ErrUnexpectedEOF {
  94. t.Fatal("block", cHash, "err:", err)
  95. }
  96. }
  97. if n > 0 {
  98. if cHash+4 > len(hashes) {
  99. extra, _ := io.Copy(ioutil.Discard, dec)
  100. t.Fatal("not enough hashes (length mismatch). Only have", len(hashes)/4, "hashes. Got block of", n, "bytes and", extra, "bytes still on stream.")
  101. }
  102. _, _ = xx.Write(buf[:n])
  103. binary.LittleEndian.PutUint64(tmp[:], xx.Sum64())
  104. want, got := hashes[cHash:cHash+4], tmp[4:]
  105. if !bytes.Equal(want, got) {
  106. org, err := os.Open(baseFile)
  107. if err == nil {
  108. const sizeBack = 8 << 20
  109. defer org.Close()
  110. start := int64(cHash)/4*blockSize - sizeBack
  111. if start < 0 {
  112. start = 0
  113. }
  114. _, err = org.Seek(start, io.SeekStart)
  115. buf2 := make([]byte, sizeBack+1<<20)
  116. n, _ := io.ReadFull(org, buf2)
  117. if n > 0 {
  118. err = ioutil.WriteFile(baseFile+".section", buf2[:n], os.ModePerm)
  119. if err == nil {
  120. t.Log("Wrote problematic section to", baseFile+".section")
  121. }
  122. }
  123. }
  124. t.Fatal("block", cHash/4, "offset", cHash/4*blockSize, "hash mismatch, want:", hex.EncodeToString(want), "got:", hex.EncodeToString(got))
  125. }
  126. cHash += 4
  127. }
  128. if n != blockSize {
  129. break
  130. }
  131. }
  132. t.Log("Output matched")
  133. }
  134. func TestNewDecoder(t *testing.T) {
  135. defer timeout(60 * time.Second)()
  136. testDecoderFile(t, "testdata/decoder.zip")
  137. dec, err := NewReader(nil)
  138. if err != nil {
  139. t.Fatal(err)
  140. }
  141. testDecoderDecodeAll(t, "testdata/decoder.zip", dec)
  142. }
  143. func TestNewDecoderGood(t *testing.T) {
  144. defer timeout(30 * time.Second)()
  145. testDecoderFile(t, "testdata/good.zip")
  146. dec, err := NewReader(nil)
  147. if err != nil {
  148. t.Fatal(err)
  149. }
  150. testDecoderDecodeAll(t, "testdata/good.zip", dec)
  151. }
  152. func TestNewDecoderBad(t *testing.T) {
  153. defer timeout(10 * time.Second)()
  154. dec, err := NewReader(nil)
  155. if err != nil {
  156. t.Fatal(err)
  157. }
  158. testDecoderDecodeAllError(t, "testdata/bad.zip", dec)
  159. }
  160. func TestNewDecoderLarge(t *testing.T) {
  161. testDecoderFile(t, "testdata/large.zip")
  162. dec, err := NewReader(nil)
  163. if err != nil {
  164. t.Fatal(err)
  165. }
  166. testDecoderDecodeAll(t, "testdata/large.zip", dec)
  167. }
  168. func TestNewReaderRead(t *testing.T) {
  169. dec, err := NewReader(nil)
  170. if err != nil {
  171. t.Fatal(err)
  172. }
  173. defer dec.Close()
  174. _, err = dec.Read([]byte{0})
  175. if err == nil {
  176. t.Fatal("Wanted error on uninitialized read, got nil")
  177. }
  178. t.Log("correctly got error", err)
  179. }
  180. func TestNewDecoderBig(t *testing.T) {
  181. if testing.Short() {
  182. t.SkipNow()
  183. }
  184. file := "testdata/zstd-10kfiles.zip"
  185. if _, err := os.Stat(file); os.IsNotExist(err) {
  186. t.Skip("To run extended tests, download https://files.klauspost.com/compress/zstd-10kfiles.zip \n" +
  187. "and place it in " + file + "\n" + "Running it requires about 5GB of RAM")
  188. }
  189. testDecoderFile(t, file)
  190. dec, err := NewReader(nil)
  191. if err != nil {
  192. t.Fatal(err)
  193. }
  194. testDecoderDecodeAll(t, file, dec)
  195. }
  196. func TestNewDecoderBigFile(t *testing.T) {
  197. if testing.Short() {
  198. t.SkipNow()
  199. }
  200. file := "testdata/enwik9.zst"
  201. const wantSize = 1000000000
  202. if _, err := os.Stat(file); os.IsNotExist(err) {
  203. t.Skip("To run extended tests, download http://mattmahoney.net/dc/enwik9.zip unzip it \n" +
  204. "compress it with 'zstd -15 -T0 enwik9' and place it in " + file)
  205. }
  206. f, err := os.Open(file)
  207. if err != nil {
  208. t.Fatal(err)
  209. }
  210. defer f.Close()
  211. start := time.Now()
  212. dec, err := NewReader(f)
  213. if err != nil {
  214. t.Fatal(err)
  215. }
  216. n, err := io.Copy(ioutil.Discard, dec)
  217. if err != nil {
  218. t.Fatal(err)
  219. }
  220. if n != wantSize {
  221. t.Errorf("want size %d, got size %d", wantSize, n)
  222. }
  223. elapsed := time.Since(start)
  224. mbpersec := (float64(n) / (1024 * 1024)) / (float64(elapsed) / (float64(time.Second)))
  225. t.Logf("Decoded %d bytes with %f.2 MB/s", n, mbpersec)
  226. }
  227. func TestNewDecoderSmallFile(t *testing.T) {
  228. if testing.Short() {
  229. t.SkipNow()
  230. }
  231. file := "testdata/z000028.zst"
  232. const wantSize = 39807
  233. f, err := os.Open(file)
  234. if err != nil {
  235. t.Fatal(err)
  236. }
  237. defer f.Close()
  238. start := time.Now()
  239. dec, err := NewReader(f)
  240. if err != nil {
  241. t.Fatal(err)
  242. }
  243. defer dec.Close()
  244. n, err := io.Copy(ioutil.Discard, dec)
  245. if err != nil {
  246. t.Fatal(err)
  247. }
  248. if n != wantSize {
  249. t.Errorf("want size %d, got size %d", wantSize, n)
  250. }
  251. mbpersec := (float64(n) / (1024 * 1024)) / (float64(time.Since(start)) / (float64(time.Second)))
  252. t.Logf("Decoded %d bytes with %f.2 MB/s", n, mbpersec)
  253. }
  254. type readAndBlock struct {
  255. buf []byte
  256. unblock chan struct{}
  257. }
  258. func (r *readAndBlock) Read(p []byte) (int, error) {
  259. n := copy(p, r.buf)
  260. if n == 0 {
  261. <-r.unblock
  262. return 0, io.EOF
  263. }
  264. r.buf = r.buf[n:]
  265. return n, nil
  266. }
  267. func TestNewDecoderFlushed(t *testing.T) {
  268. if testing.Short() {
  269. t.SkipNow()
  270. }
  271. file := "testdata/z000028.zst"
  272. payload, err := ioutil.ReadFile(file)
  273. if err != nil {
  274. t.Fatal(err)
  275. }
  276. payload = append(payload, payload...) //2x
  277. payload = append(payload, payload...) //4x
  278. payload = append(payload, payload...) //8x
  279. rng := rand.New(rand.NewSource(0x1337))
  280. runs := 100
  281. if testing.Short() {
  282. runs = 5
  283. }
  284. enc, err := NewWriter(nil, WithWindowSize(128<<10))
  285. if err != nil {
  286. t.Fatal(err)
  287. }
  288. defer enc.Close()
  289. for i := 0; i < runs; i++ {
  290. wantSize := rng.Intn(len(payload)-1) + 1
  291. t.Run(fmt.Sprint("size-", wantSize), func(t *testing.T) {
  292. var encoded bytes.Buffer
  293. enc.Reset(&encoded)
  294. _, err := enc.Write(payload[:wantSize])
  295. if err != nil {
  296. t.Fatal(err)
  297. }
  298. err = enc.Flush()
  299. if err != nil {
  300. t.Fatal(err)
  301. }
  302. // We must be able to read back up until the flush...
  303. r := readAndBlock{
  304. buf: encoded.Bytes(),
  305. unblock: make(chan struct{}),
  306. }
  307. defer timeout(5 * time.Second)()
  308. dec, err := NewReader(&r)
  309. if err != nil {
  310. t.Fatal(err)
  311. }
  312. defer dec.Close()
  313. defer close(r.unblock)
  314. readBack := 0
  315. dst := make([]byte, 1024)
  316. for readBack < wantSize {
  317. // Read until we have enough.
  318. n, err := dec.Read(dst)
  319. if err != nil {
  320. t.Fatal(err)
  321. }
  322. readBack += n
  323. }
  324. })
  325. }
  326. }
  327. func TestDecoderRegression(t *testing.T) {
  328. defer timeout(160 * time.Second)()
  329. data, err := ioutil.ReadFile("testdata/regression.zip")
  330. if err != nil {
  331. t.Fatal(err)
  332. }
  333. zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
  334. if err != nil {
  335. t.Fatal(err)
  336. }
  337. dec, err := NewReader(nil, WithDecoderConcurrency(1), WithDecoderLowmem(true), WithDecoderMaxMemory(1<<20))
  338. if err != nil {
  339. t.Error(err)
  340. return
  341. }
  342. defer dec.Close()
  343. for i, tt := range zr.File {
  344. if !strings.HasSuffix(tt.Name, "") || (testing.Short() && i > 10) {
  345. continue
  346. }
  347. t.Run("Reader-"+tt.Name, func(t *testing.T) {
  348. r, err := tt.Open()
  349. if err != nil {
  350. t.Error(err)
  351. return
  352. }
  353. err = dec.Reset(r)
  354. if err != nil {
  355. t.Error(err)
  356. return
  357. }
  358. got, gotErr := ioutil.ReadAll(dec)
  359. t.Log("Received:", len(got), gotErr)
  360. // Check a fresh instance
  361. r, err = tt.Open()
  362. if err != nil {
  363. t.Error(err)
  364. return
  365. }
  366. decL, err := NewReader(r, WithDecoderConcurrency(1), WithDecoderLowmem(true), WithDecoderMaxMemory(1<<20))
  367. if err != nil {
  368. t.Error(err)
  369. return
  370. }
  371. defer decL.Close()
  372. got2, gotErr2 := ioutil.ReadAll(decL)
  373. t.Log("Fresh Reader received:", len(got2), gotErr2)
  374. if gotErr != gotErr2 {
  375. if gotErr != nil && gotErr2 != nil && gotErr.Error() != gotErr2.Error() {
  376. t.Error(gotErr, "!=", gotErr2)
  377. }
  378. if (gotErr == nil) != (gotErr2 == nil) {
  379. t.Error(gotErr, "!=", gotErr2)
  380. }
  381. }
  382. if !bytes.Equal(got2, got) {
  383. if gotErr != nil {
  384. t.Log("Buffer mismatch without Reset")
  385. } else {
  386. t.Error("Buffer mismatch without Reset")
  387. }
  388. }
  389. })
  390. t.Run("DecodeAll-"+tt.Name, func(t *testing.T) {
  391. r, err := tt.Open()
  392. if err != nil {
  393. t.Error(err)
  394. return
  395. }
  396. in, err := ioutil.ReadAll(r)
  397. if err != nil {
  398. t.Error(err)
  399. }
  400. got, gotErr := dec.DecodeAll(in, nil)
  401. t.Log("Received:", len(got), gotErr)
  402. // Check if we got the same:
  403. decL, err := NewReader(nil, WithDecoderConcurrency(1), WithDecoderLowmem(true), WithDecoderMaxMemory(1<<20))
  404. if err != nil {
  405. t.Error(err)
  406. return
  407. }
  408. defer decL.Close()
  409. got2, gotErr2 := decL.DecodeAll(in, nil)
  410. t.Log("Fresh Reader received:", len(got2), gotErr2)
  411. if gotErr != gotErr2 {
  412. if gotErr != nil && gotErr2 != nil && gotErr.Error() != gotErr2.Error() {
  413. t.Error(gotErr, "!=", gotErr2)
  414. }
  415. if (gotErr == nil) != (gotErr2 == nil) {
  416. t.Error(gotErr, "!=", gotErr2)
  417. }
  418. }
  419. if !bytes.Equal(got2, got) {
  420. if gotErr != nil {
  421. t.Log("Buffer mismatch without Reset")
  422. } else {
  423. t.Error("Buffer mismatch without Reset")
  424. }
  425. }
  426. })
  427. t.Run("Match-"+tt.Name, func(t *testing.T) {
  428. r, err := tt.Open()
  429. if err != nil {
  430. t.Error(err)
  431. return
  432. }
  433. in, err := ioutil.ReadAll(r)
  434. if err != nil {
  435. t.Error(err)
  436. }
  437. got, gotErr := dec.DecodeAll(in, nil)
  438. t.Log("Received:", len(got), gotErr)
  439. // Check a fresh instance
  440. decL, err := NewReader(bytes.NewBuffer(in), WithDecoderConcurrency(1), WithDecoderLowmem(true), WithDecoderMaxMemory(1<<20))
  441. if err != nil {
  442. t.Error(err)
  443. return
  444. }
  445. defer decL.Close()
  446. got2, gotErr2 := ioutil.ReadAll(decL)
  447. t.Log("Reader Reader received:", len(got2), gotErr2)
  448. if gotErr != gotErr2 {
  449. if gotErr != nil && gotErr2 != nil && gotErr.Error() != gotErr2.Error() {
  450. t.Error(gotErr, "!=", gotErr2)
  451. }
  452. if (gotErr == nil) != (gotErr2 == nil) {
  453. t.Error(gotErr, "!=", gotErr2)
  454. }
  455. }
  456. if !bytes.Equal(got2, got) {
  457. if gotErr != nil {
  458. t.Log("Buffer mismatch")
  459. } else {
  460. t.Error("Buffer mismatch")
  461. }
  462. }
  463. })
  464. }
  465. }
  466. func TestDecoder_Reset(t *testing.T) {
  467. in, err := ioutil.ReadFile("testdata/z000028")
  468. if err != nil {
  469. t.Fatal(err)
  470. }
  471. in = append(in, in...)
  472. var e Encoder
  473. start := time.Now()
  474. dst := e.EncodeAll(in, nil)
  475. t.Log("Simple Encoder len", len(in), "-> zstd len", len(dst))
  476. mbpersec := (float64(len(in)) / (1024 * 1024)) / (float64(time.Since(start)) / (float64(time.Second)))
  477. t.Logf("Encoded %d bytes with %.2f MB/s", len(in), mbpersec)
  478. dec, err := NewReader(nil)
  479. if err != nil {
  480. t.Fatal(err)
  481. }
  482. defer dec.Close()
  483. decoded, err := dec.DecodeAll(dst, nil)
  484. if err != nil {
  485. t.Error(err, len(decoded))
  486. }
  487. if !bytes.Equal(decoded, in) {
  488. t.Fatal("Decoded does not match")
  489. }
  490. t.Log("Encoded content matched")
  491. // Decode using reset+copy
  492. for i := 0; i < 3; i++ {
  493. err = dec.Reset(bytes.NewBuffer(dst))
  494. if err != nil {
  495. t.Fatal(err)
  496. }
  497. var dBuf bytes.Buffer
  498. n, err := io.Copy(&dBuf, dec)
  499. if err != nil {
  500. t.Fatal(err)
  501. }
  502. decoded = dBuf.Bytes()
  503. if int(n) != len(decoded) {
  504. t.Fatalf("decoded reported length mismatch %d != %d", n, len(decoded))
  505. }
  506. if !bytes.Equal(decoded, in) {
  507. ioutil.WriteFile("testdata/"+t.Name()+"-z000028.got", decoded, os.ModePerm)
  508. ioutil.WriteFile("testdata/"+t.Name()+"-z000028.want", in, os.ModePerm)
  509. t.Fatal("Decoded does not match")
  510. }
  511. }
  512. // Test without WriterTo interface support.
  513. for i := 0; i < 3; i++ {
  514. err = dec.Reset(bytes.NewBuffer(dst))
  515. if err != nil {
  516. t.Fatal(err)
  517. }
  518. decoded, err := ioutil.ReadAll(ioutil.NopCloser(dec))
  519. if err != nil {
  520. t.Fatal(err)
  521. }
  522. if !bytes.Equal(decoded, in) {
  523. ioutil.WriteFile("testdata/"+t.Name()+"-z000028.got", decoded, os.ModePerm)
  524. ioutil.WriteFile("testdata/"+t.Name()+"-z000028.want", in, os.ModePerm)
  525. t.Fatal("Decoded does not match")
  526. }
  527. }
  528. }
  529. func TestDecoderMultiFrame(t *testing.T) {
  530. fn := "testdata/benchdecoder.zip"
  531. data, err := ioutil.ReadFile(fn)
  532. if err != nil {
  533. t.Fatal(err)
  534. }
  535. zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
  536. if err != nil {
  537. t.Fatal(err)
  538. }
  539. dec, err := NewReader(nil)
  540. if err != nil {
  541. t.Fatal(err)
  542. return
  543. }
  544. defer dec.Close()
  545. for _, tt := range zr.File {
  546. if !strings.HasSuffix(tt.Name, ".zst") {
  547. continue
  548. }
  549. t.Run(tt.Name, func(t *testing.T) {
  550. r, err := tt.Open()
  551. if err != nil {
  552. t.Fatal(err)
  553. }
  554. defer r.Close()
  555. in, err := ioutil.ReadAll(r)
  556. if err != nil {
  557. t.Fatal(err)
  558. }
  559. // 2x
  560. in = append(in, in...)
  561. if !testing.Short() {
  562. // 4x
  563. in = append(in, in...)
  564. // 8x
  565. in = append(in, in...)
  566. }
  567. err = dec.Reset(bytes.NewBuffer(in))
  568. if err != nil {
  569. t.Fatal(err)
  570. }
  571. got, err := ioutil.ReadAll(dec)
  572. if err != nil {
  573. t.Fatal(err)
  574. }
  575. err = dec.Reset(bytes.NewBuffer(in))
  576. if err != nil {
  577. t.Fatal(err)
  578. }
  579. got2, err := ioutil.ReadAll(dec)
  580. if err != nil {
  581. t.Fatal(err)
  582. }
  583. if !bytes.Equal(got, got2) {
  584. t.Error("results mismatch")
  585. }
  586. })
  587. }
  588. }
  589. func TestDecoderMultiFrameReset(t *testing.T) {
  590. fn := "testdata/benchdecoder.zip"
  591. data, err := ioutil.ReadFile(fn)
  592. if err != nil {
  593. t.Fatal(err)
  594. }
  595. zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
  596. if err != nil {
  597. t.Fatal(err)
  598. }
  599. dec, err := NewReader(nil)
  600. if err != nil {
  601. t.Fatal(err)
  602. return
  603. }
  604. rng := rand.New(rand.NewSource(1337))
  605. defer dec.Close()
  606. for _, tt := range zr.File {
  607. if !strings.HasSuffix(tt.Name, ".zst") {
  608. continue
  609. }
  610. t.Run(tt.Name, func(t *testing.T) {
  611. r, err := tt.Open()
  612. if err != nil {
  613. t.Fatal(err)
  614. }
  615. defer r.Close()
  616. in, err := ioutil.ReadAll(r)
  617. if err != nil {
  618. t.Fatal(err)
  619. }
  620. // 2x
  621. in = append(in, in...)
  622. if !testing.Short() {
  623. // 4x
  624. in = append(in, in...)
  625. // 8x
  626. in = append(in, in...)
  627. }
  628. err = dec.Reset(bytes.NewBuffer(in))
  629. if err != nil {
  630. t.Fatal(err)
  631. }
  632. got, err := ioutil.ReadAll(dec)
  633. if err != nil {
  634. t.Fatal(err)
  635. }
  636. err = dec.Reset(bytes.NewBuffer(in))
  637. if err != nil {
  638. t.Fatal(err)
  639. }
  640. // Read a random number of bytes
  641. tmp := make([]byte, rng.Intn(len(got)))
  642. _, err = io.ReadAtLeast(dec, tmp, len(tmp))
  643. if err != nil {
  644. t.Fatal(err)
  645. }
  646. err = dec.Reset(bytes.NewBuffer(in))
  647. if err != nil {
  648. t.Fatal(err)
  649. }
  650. got2, err := ioutil.ReadAll(dec)
  651. if err != nil {
  652. t.Fatal(err)
  653. }
  654. if !bytes.Equal(got, got2) {
  655. t.Error("results mismatch")
  656. }
  657. })
  658. }
  659. }
  660. func testDecoderFile(t *testing.T, fn string) {
  661. data, err := ioutil.ReadFile(fn)
  662. if err != nil {
  663. t.Fatal(err)
  664. }
  665. zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
  666. if err != nil {
  667. t.Fatal(err)
  668. }
  669. var want = make(map[string][]byte)
  670. for _, tt := range zr.File {
  671. if strings.HasSuffix(tt.Name, ".zst") {
  672. continue
  673. }
  674. r, err := tt.Open()
  675. if err != nil {
  676. t.Fatal(err)
  677. return
  678. }
  679. want[tt.Name+".zst"], _ = ioutil.ReadAll(r)
  680. }
  681. dec, err := NewReader(nil)
  682. if err != nil {
  683. t.Error(err)
  684. return
  685. }
  686. defer dec.Close()
  687. for i, tt := range zr.File {
  688. if !strings.HasSuffix(tt.Name, ".zst") || (testing.Short() && i > 20) {
  689. continue
  690. }
  691. t.Run("Reader-"+tt.Name, func(t *testing.T) {
  692. r, err := tt.Open()
  693. if err != nil {
  694. t.Error(err)
  695. return
  696. }
  697. defer r.Close()
  698. err = dec.Reset(r)
  699. if err != nil {
  700. t.Error(err)
  701. return
  702. }
  703. got, err := ioutil.ReadAll(dec)
  704. if err != nil {
  705. t.Error(err)
  706. if err != ErrCRCMismatch {
  707. return
  708. }
  709. }
  710. wantB := want[tt.Name]
  711. if !bytes.Equal(wantB, got) {
  712. if len(wantB)+len(got) < 1000 {
  713. t.Logf(" got: %v\nwant: %v", got, wantB)
  714. } else {
  715. fileName, _ := filepath.Abs(filepath.Join("testdata", t.Name()+"-want.bin"))
  716. _ = os.MkdirAll(filepath.Dir(fileName), os.ModePerm)
  717. err := ioutil.WriteFile(fileName, wantB, os.ModePerm)
  718. t.Log("Wrote file", fileName, err)
  719. fileName, _ = filepath.Abs(filepath.Join("testdata", t.Name()+"-got.bin"))
  720. _ = os.MkdirAll(filepath.Dir(fileName), os.ModePerm)
  721. err = ioutil.WriteFile(fileName, got, os.ModePerm)
  722. t.Log("Wrote file", fileName, err)
  723. }
  724. t.Logf("Length, want: %d, got: %d", len(wantB), len(got))
  725. t.Error("Output mismatch")
  726. return
  727. }
  728. t.Log(len(got), "bytes returned, matches input, ok!")
  729. })
  730. }
  731. }
  732. func BenchmarkDecoder_DecoderSmall(b *testing.B) {
  733. fn := "testdata/benchdecoder.zip"
  734. data, err := ioutil.ReadFile(fn)
  735. if err != nil {
  736. b.Fatal(err)
  737. }
  738. zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
  739. if err != nil {
  740. b.Fatal(err)
  741. }
  742. dec, err := NewReader(nil)
  743. if err != nil {
  744. b.Fatal(err)
  745. return
  746. }
  747. defer dec.Close()
  748. for _, tt := range zr.File {
  749. if !strings.HasSuffix(tt.Name, ".zst") {
  750. continue
  751. }
  752. b.Run(tt.Name, func(b *testing.B) {
  753. r, err := tt.Open()
  754. if err != nil {
  755. b.Fatal(err)
  756. }
  757. defer r.Close()
  758. in, err := ioutil.ReadAll(r)
  759. if err != nil {
  760. b.Fatal(err)
  761. }
  762. // 2x
  763. in = append(in, in...)
  764. // 4x
  765. in = append(in, in...)
  766. // 8x
  767. in = append(in, in...)
  768. err = dec.Reset(bytes.NewBuffer(in))
  769. if err != nil {
  770. b.Fatal(err)
  771. }
  772. got, err := ioutil.ReadAll(dec)
  773. if err != nil {
  774. b.Fatal(err)
  775. }
  776. b.SetBytes(int64(len(got)))
  777. b.ReportAllocs()
  778. b.ResetTimer()
  779. for i := 0; i < b.N; i++ {
  780. err = dec.Reset(bytes.NewBuffer(in))
  781. if err != nil {
  782. b.Fatal(err)
  783. }
  784. _, err := io.Copy(ioutil.Discard, dec)
  785. if err != nil {
  786. b.Fatal(err)
  787. }
  788. }
  789. })
  790. }
  791. }
  792. func BenchmarkDecoder_DecodeAll(b *testing.B) {
  793. fn := "testdata/benchdecoder.zip"
  794. data, err := ioutil.ReadFile(fn)
  795. if err != nil {
  796. b.Fatal(err)
  797. }
  798. zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
  799. if err != nil {
  800. b.Fatal(err)
  801. }
  802. dec, err := NewReader(nil, WithDecoderConcurrency(1))
  803. if err != nil {
  804. b.Fatal(err)
  805. return
  806. }
  807. defer dec.Close()
  808. for _, tt := range zr.File {
  809. if !strings.HasSuffix(tt.Name, ".zst") {
  810. continue
  811. }
  812. b.Run(tt.Name, func(b *testing.B) {
  813. r, err := tt.Open()
  814. if err != nil {
  815. b.Fatal(err)
  816. }
  817. defer r.Close()
  818. in, err := ioutil.ReadAll(r)
  819. if err != nil {
  820. b.Fatal(err)
  821. }
  822. got, err := dec.DecodeAll(in, nil)
  823. if err != nil {
  824. b.Fatal(err)
  825. }
  826. b.SetBytes(int64(len(got)))
  827. b.ReportAllocs()
  828. b.ResetTimer()
  829. for i := 0; i < b.N; i++ {
  830. _, err = dec.DecodeAll(in, got[:0])
  831. if err != nil {
  832. b.Fatal(err)
  833. }
  834. }
  835. })
  836. }
  837. }
  838. /*
  839. func BenchmarkDecoder_DecodeAllCgo(b *testing.B) {
  840. fn := "testdata/benchdecoder.zip"
  841. data, err := ioutil.ReadFile(fn)
  842. if err != nil {
  843. b.Fatal(err)
  844. }
  845. zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
  846. if err != nil {
  847. b.Fatal(err)
  848. }
  849. for _, tt := range zr.File {
  850. if !strings.HasSuffix(tt.Name, ".zst") {
  851. continue
  852. }
  853. b.Run(tt.Name, func(b *testing.B) {
  854. tt := tt
  855. r, err := tt.Open()
  856. if err != nil {
  857. b.Fatal(err)
  858. }
  859. defer r.Close()
  860. in, err := ioutil.ReadAll(r)
  861. if err != nil {
  862. b.Fatal(err)
  863. }
  864. got, err := zstd.Decompress(nil, in)
  865. if err != nil {
  866. b.Fatal(err)
  867. }
  868. b.SetBytes(int64(len(got)))
  869. b.ReportAllocs()
  870. b.ResetTimer()
  871. for i := 0; i < b.N; i++ {
  872. got, err = zstd.Decompress(got[:0], in)
  873. if err != nil {
  874. b.Fatal(err)
  875. }
  876. }
  877. })
  878. }
  879. }
  880. func BenchmarkDecoderSilesiaCgo(b *testing.B) {
  881. fn := "testdata/silesia.tar.zst"
  882. data, err := ioutil.ReadFile(fn)
  883. if err != nil {
  884. if os.IsNotExist(err) {
  885. b.Skip("Missing testdata/silesia.tar.zst")
  886. return
  887. }
  888. b.Fatal(err)
  889. }
  890. dec := zstd.NewReader(bytes.NewBuffer(data))
  891. n, err := io.Copy(ioutil.Discard, dec)
  892. if err != nil {
  893. b.Fatal(err)
  894. }
  895. b.SetBytes(n)
  896. b.ReportAllocs()
  897. b.ResetTimer()
  898. for i := 0; i < b.N; i++ {
  899. dec := zstd.NewReader(bytes.NewBuffer(data))
  900. _, err := io.CopyN(ioutil.Discard, dec, n)
  901. if err != nil {
  902. b.Fatal(err)
  903. }
  904. }
  905. }
  906. func BenchmarkDecoderEnwik9Cgo(b *testing.B) {
  907. fn := "testdata/enwik9-1.zst"
  908. data, err := ioutil.ReadFile(fn)
  909. if err != nil {
  910. if os.IsNotExist(err) {
  911. b.Skip("Missing " + fn)
  912. return
  913. }
  914. b.Fatal(err)
  915. }
  916. dec := zstd.NewReader(bytes.NewBuffer(data))
  917. n, err := io.Copy(ioutil.Discard, dec)
  918. if err != nil {
  919. b.Fatal(err)
  920. }
  921. b.SetBytes(n)
  922. b.ReportAllocs()
  923. b.ResetTimer()
  924. for i := 0; i < b.N; i++ {
  925. dec := zstd.NewReader(bytes.NewBuffer(data))
  926. _, err := io.CopyN(ioutil.Discard, dec, n)
  927. if err != nil {
  928. b.Fatal(err)
  929. }
  930. }
  931. }
  932. */
  933. func BenchmarkDecoderSilesia(b *testing.B) {
  934. fn := "testdata/silesia.tar.zst"
  935. data, err := ioutil.ReadFile(fn)
  936. if err != nil {
  937. if os.IsNotExist(err) {
  938. b.Skip("Missing testdata/silesia.tar.zst")
  939. return
  940. }
  941. b.Fatal(err)
  942. }
  943. dec, err := NewReader(nil, WithDecoderLowmem(false))
  944. if err != nil {
  945. b.Fatal(err)
  946. }
  947. defer dec.Close()
  948. err = dec.Reset(bytes.NewBuffer(data))
  949. if err != nil {
  950. b.Fatal(err)
  951. }
  952. n, err := io.Copy(ioutil.Discard, dec)
  953. if err != nil {
  954. b.Fatal(err)
  955. }
  956. b.SetBytes(n)
  957. b.ReportAllocs()
  958. b.ResetTimer()
  959. for i := 0; i < b.N; i++ {
  960. err = dec.Reset(bytes.NewBuffer(data))
  961. if err != nil {
  962. b.Fatal(err)
  963. }
  964. _, err := io.CopyN(ioutil.Discard, dec, n)
  965. if err != nil {
  966. b.Fatal(err)
  967. }
  968. }
  969. }
  970. func BenchmarkDecoderEnwik9(b *testing.B) {
  971. fn := "testdata/enwik9-1.zst"
  972. data, err := ioutil.ReadFile(fn)
  973. if err != nil {
  974. if os.IsNotExist(err) {
  975. b.Skip("Missing " + fn)
  976. return
  977. }
  978. b.Fatal(err)
  979. }
  980. dec, err := NewReader(nil, WithDecoderLowmem(false))
  981. if err != nil {
  982. b.Fatal(err)
  983. }
  984. defer dec.Close()
  985. err = dec.Reset(bytes.NewBuffer(data))
  986. if err != nil {
  987. b.Fatal(err)
  988. }
  989. n, err := io.Copy(ioutil.Discard, dec)
  990. if err != nil {
  991. b.Fatal(err)
  992. }
  993. b.SetBytes(n)
  994. b.ReportAllocs()
  995. b.ResetTimer()
  996. for i := 0; i < b.N; i++ {
  997. err = dec.Reset(bytes.NewBuffer(data))
  998. if err != nil {
  999. b.Fatal(err)
  1000. }
  1001. _, err := io.CopyN(ioutil.Discard, dec, n)
  1002. if err != nil {
  1003. b.Fatal(err)
  1004. }
  1005. }
  1006. }
  1007. func testDecoderDecodeAll(t *testing.T, fn string, dec *Decoder) {
  1008. data, err := ioutil.ReadFile(fn)
  1009. if err != nil {
  1010. t.Fatal(err)
  1011. }
  1012. zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
  1013. if err != nil {
  1014. t.Fatal(err)
  1015. }
  1016. var want = make(map[string][]byte)
  1017. for _, tt := range zr.File {
  1018. if strings.HasSuffix(tt.Name, ".zst") {
  1019. continue
  1020. }
  1021. r, err := tt.Open()
  1022. if err != nil {
  1023. t.Fatal(err)
  1024. return
  1025. }
  1026. want[tt.Name+".zst"], _ = ioutil.ReadAll(r)
  1027. }
  1028. var wg sync.WaitGroup
  1029. for i, tt := range zr.File {
  1030. tt := tt
  1031. if !strings.HasSuffix(tt.Name, ".zst") || (testing.Short() && i > 20) {
  1032. continue
  1033. }
  1034. wg.Add(1)
  1035. t.Run("DecodeAll-"+tt.Name, func(t *testing.T) {
  1036. defer wg.Done()
  1037. t.Parallel()
  1038. r, err := tt.Open()
  1039. if err != nil {
  1040. t.Fatal(err)
  1041. }
  1042. in, err := ioutil.ReadAll(r)
  1043. if err != nil {
  1044. t.Fatal(err)
  1045. }
  1046. wantB := want[tt.Name]
  1047. // make a buffer that is too small.
  1048. got, err := dec.DecodeAll(in, make([]byte, 10, 200))
  1049. if err != nil {
  1050. t.Error(err)
  1051. }
  1052. got = got[10:]
  1053. if !bytes.Equal(wantB, got) {
  1054. if len(wantB)+len(got) < 1000 {
  1055. t.Logf(" got: %v\nwant: %v", got, wantB)
  1056. } else {
  1057. fileName, _ := filepath.Abs(filepath.Join("testdata", t.Name()+"-want.bin"))
  1058. _ = os.MkdirAll(filepath.Dir(fileName), os.ModePerm)
  1059. err := ioutil.WriteFile(fileName, wantB, os.ModePerm)
  1060. t.Log("Wrote file", fileName, err)
  1061. fileName, _ = filepath.Abs(filepath.Join("testdata", t.Name()+"-got.bin"))
  1062. _ = os.MkdirAll(filepath.Dir(fileName), os.ModePerm)
  1063. err = ioutil.WriteFile(fileName, got, os.ModePerm)
  1064. t.Log("Wrote file", fileName, err)
  1065. }
  1066. t.Logf("Length, want: %d, got: %d", len(wantB), len(got))
  1067. t.Error("Output mismatch")
  1068. return
  1069. }
  1070. t.Log(len(got), "bytes returned, matches input, ok!")
  1071. })
  1072. }
  1073. go func() {
  1074. wg.Wait()
  1075. dec.Close()
  1076. }()
  1077. }
  1078. func testDecoderDecodeAllError(t *testing.T, fn string, dec *Decoder) {
  1079. data, err := ioutil.ReadFile(fn)
  1080. if err != nil {
  1081. t.Fatal(err)
  1082. }
  1083. zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
  1084. if err != nil {
  1085. t.Fatal(err)
  1086. }
  1087. var wg sync.WaitGroup
  1088. for _, tt := range zr.File {
  1089. tt := tt
  1090. if !strings.HasSuffix(tt.Name, ".zst") {
  1091. continue
  1092. }
  1093. wg.Add(1)
  1094. t.Run("DecodeAll-"+tt.Name, func(t *testing.T) {
  1095. defer wg.Done()
  1096. t.Parallel()
  1097. r, err := tt.Open()
  1098. if err != nil {
  1099. t.Fatal(err)
  1100. }
  1101. in, err := ioutil.ReadAll(r)
  1102. if err != nil {
  1103. t.Fatal(err)
  1104. }
  1105. // make a buffer that is too small.
  1106. _, err = dec.DecodeAll(in, make([]byte, 0, 200))
  1107. if err == nil {
  1108. t.Error("Did not get expected error")
  1109. }
  1110. })
  1111. }
  1112. go func() {
  1113. wg.Wait()
  1114. dec.Close()
  1115. }()
  1116. }
  1117. // Test our predefined tables are correct.
  1118. // We don't predefine them, since this also tests our transformations.
  1119. // Reference from here: https://github.com/facebook/zstd/blob/ededcfca57366461021c922720878c81a5854a0a/lib/decompress/zstd_decompress_block.c#L234
  1120. func TestPredefTables(t *testing.T) {
  1121. x := func(nextState uint16, nbAddBits, nbBits uint8, baseVal uint32) decSymbol {
  1122. return newDecSymbol(nbBits, nbAddBits, nextState, baseVal)
  1123. }
  1124. for i := range fsePredef[:] {
  1125. var want []decSymbol
  1126. switch tableIndex(i) {
  1127. case tableLiteralLengths:
  1128. want = []decSymbol{
  1129. /* nextState, nbAddBits, nbBits, baseVal */
  1130. x(0, 0, 4, 0), x(16, 0, 4, 0),
  1131. x(32, 0, 5, 1), x(0, 0, 5, 3),
  1132. x(0, 0, 5, 4), x(0, 0, 5, 6),
  1133. x(0, 0, 5, 7), x(0, 0, 5, 9),
  1134. x(0, 0, 5, 10), x(0, 0, 5, 12),
  1135. x(0, 0, 6, 14), x(0, 1, 5, 16),
  1136. x(0, 1, 5, 20), x(0, 1, 5, 22),
  1137. x(0, 2, 5, 28), x(0, 3, 5, 32),
  1138. x(0, 4, 5, 48), x(32, 6, 5, 64),
  1139. x(0, 7, 5, 128), x(0, 8, 6, 256),
  1140. x(0, 10, 6, 1024), x(0, 12, 6, 4096),
  1141. x(32, 0, 4, 0), x(0, 0, 4, 1),
  1142. x(0, 0, 5, 2), x(32, 0, 5, 4),
  1143. x(0, 0, 5, 5), x(32, 0, 5, 7),
  1144. x(0, 0, 5, 8), x(32, 0, 5, 10),
  1145. x(0, 0, 5, 11), x(0, 0, 6, 13),
  1146. x(32, 1, 5, 16), x(0, 1, 5, 18),
  1147. x(32, 1, 5, 22), x(0, 2, 5, 24),
  1148. x(32, 3, 5, 32), x(0, 3, 5, 40),
  1149. x(0, 6, 4, 64), x(16, 6, 4, 64),
  1150. x(32, 7, 5, 128), x(0, 9, 6, 512),
  1151. x(0, 11, 6, 2048), x(48, 0, 4, 0),
  1152. x(16, 0, 4, 1), x(32, 0, 5, 2),
  1153. x(32, 0, 5, 3), x(32, 0, 5, 5),
  1154. x(32, 0, 5, 6), x(32, 0, 5, 8),
  1155. x(32, 0, 5, 9), x(32, 0, 5, 11),
  1156. x(32, 0, 5, 12), x(0, 0, 6, 15),
  1157. x(32, 1, 5, 18), x(32, 1, 5, 20),
  1158. x(32, 2, 5, 24), x(32, 2, 5, 28),
  1159. x(32, 3, 5, 40), x(32, 4, 5, 48),
  1160. x(0, 16, 6, 65536), x(0, 15, 6, 32768),
  1161. x(0, 14, 6, 16384), x(0, 13, 6, 8192),
  1162. }
  1163. case tableOffsets:
  1164. want = []decSymbol{
  1165. /* nextState, nbAddBits, nbBits, baseVal */
  1166. x(0, 0, 5, 0), x(0, 6, 4, 61),
  1167. x(0, 9, 5, 509), x(0, 15, 5, 32765),
  1168. x(0, 21, 5, 2097149), x(0, 3, 5, 5),
  1169. x(0, 7, 4, 125), x(0, 12, 5, 4093),
  1170. x(0, 18, 5, 262141), x(0, 23, 5, 8388605),
  1171. x(0, 5, 5, 29), x(0, 8, 4, 253),
  1172. x(0, 14, 5, 16381), x(0, 20, 5, 1048573),
  1173. x(0, 2, 5, 1), x(16, 7, 4, 125),
  1174. x(0, 11, 5, 2045), x(0, 17, 5, 131069),
  1175. x(0, 22, 5, 4194301), x(0, 4, 5, 13),
  1176. x(16, 8, 4, 253), x(0, 13, 5, 8189),
  1177. x(0, 19, 5, 524285), x(0, 1, 5, 1),
  1178. x(16, 6, 4, 61), x(0, 10, 5, 1021),
  1179. x(0, 16, 5, 65533), x(0, 28, 5, 268435453),
  1180. x(0, 27, 5, 134217725), x(0, 26, 5, 67108861),
  1181. x(0, 25, 5, 33554429), x(0, 24, 5, 16777213),
  1182. }
  1183. case tableMatchLengths:
  1184. want = []decSymbol{
  1185. /* nextState, nbAddBits, nbBits, baseVal */
  1186. x(0, 0, 6, 3), x(0, 0, 4, 4),
  1187. x(32, 0, 5, 5), x(0, 0, 5, 6),
  1188. x(0, 0, 5, 8), x(0, 0, 5, 9),
  1189. x(0, 0, 5, 11), x(0, 0, 6, 13),
  1190. x(0, 0, 6, 16), x(0, 0, 6, 19),
  1191. x(0, 0, 6, 22), x(0, 0, 6, 25),
  1192. x(0, 0, 6, 28), x(0, 0, 6, 31),
  1193. x(0, 0, 6, 34), x(0, 1, 6, 37),
  1194. x(0, 1, 6, 41), x(0, 2, 6, 47),
  1195. x(0, 3, 6, 59), x(0, 4, 6, 83),
  1196. x(0, 7, 6, 131), x(0, 9, 6, 515),
  1197. x(16, 0, 4, 4), x(0, 0, 4, 5),
  1198. x(32, 0, 5, 6), x(0, 0, 5, 7),
  1199. x(32, 0, 5, 9), x(0, 0, 5, 10),
  1200. x(0, 0, 6, 12), x(0, 0, 6, 15),
  1201. x(0, 0, 6, 18), x(0, 0, 6, 21),
  1202. x(0, 0, 6, 24), x(0, 0, 6, 27),
  1203. x(0, 0, 6, 30), x(0, 0, 6, 33),
  1204. x(0, 1, 6, 35), x(0, 1, 6, 39),
  1205. x(0, 2, 6, 43), x(0, 3, 6, 51),
  1206. x(0, 4, 6, 67), x(0, 5, 6, 99),
  1207. x(0, 8, 6, 259), x(32, 0, 4, 4),
  1208. x(48, 0, 4, 4), x(16, 0, 4, 5),
  1209. x(32, 0, 5, 7), x(32, 0, 5, 8),
  1210. x(32, 0, 5, 10), x(32, 0, 5, 11),
  1211. x(0, 0, 6, 14), x(0, 0, 6, 17),
  1212. x(0, 0, 6, 20), x(0, 0, 6, 23),
  1213. x(0, 0, 6, 26), x(0, 0, 6, 29),
  1214. x(0, 0, 6, 32), x(0, 16, 6, 65539),
  1215. x(0, 15, 6, 32771), x(0, 14, 6, 16387),
  1216. x(0, 13, 6, 8195), x(0, 12, 6, 4099),
  1217. x(0, 11, 6, 2051), x(0, 10, 6, 1027),
  1218. }
  1219. }
  1220. pre := fsePredef[i]
  1221. got := pre.dt[:1<<pre.actualTableLog]
  1222. if !reflect.DeepEqual(got, want) {
  1223. t.Logf("want: %v", want)
  1224. t.Logf("got : %v", got)
  1225. t.Errorf("Predefined table %d incorrect, len(got) = %d, len(want) = %d", i, len(got), len(want))
  1226. }
  1227. }
  1228. }
  1229. func timeout(after time.Duration) (cancel func()) {
  1230. c := time.After(after)
  1231. cc := make(chan struct{})
  1232. go func() {
  1233. select {
  1234. case <-cc:
  1235. return
  1236. case <-c:
  1237. buf := make([]byte, 1<<20)
  1238. stacklen := runtime.Stack(buf, true)
  1239. log.Printf("=== Timeout, assuming deadlock ===\n*** goroutine dump...\n%s\n*** end\n", string(buf[:stacklen]))
  1240. os.Exit(2)
  1241. }
  1242. }()
  1243. return func() {
  1244. close(cc)
  1245. }
  1246. }