Files
trivy/internal/testutil/gzip.go
Masahiro331 4d9b444499 fix(vm): update ext4-filesystem parser for parse multi block extents (#4616)
* chore(deps): update ext4-filesystem parser for parse multi block extents

* test(vm): update integration-vm test fixtures

* test(vm): add gzip decompresser for sparse file

* test(vm): add mage command update golden file for vm integration test

* chore(magefile): [WIP] change test repository

* Revert "chore(magefile): [WIP] change test repository"

This reverts commit c015c8892f.

* fix(test): update fixtures and golden file

* fix(test): revert fixVersion and PkgID
2023-06-18 16:41:55 +00:00

78 lines
1.4 KiB
Go

package testutil
import (
"bytes"
"compress/gzip"
"io"
"os"
"testing"
"github.com/stretchr/testify/require"
)
const (
max = int64(10) << 30 // 10GB
blockSize = 4096
)
func DecompressGzip(t *testing.T, src, dst string) {
w, err := os.Create(dst)
require.NoError(t, err)
defer w.Close()
f, err := os.Open(src)
require.NoError(t, err)
defer f.Close()
gr, err := gzip.NewReader(f)
require.NoError(t, err)
_, err = io.CopyN(w, gr, max)
require.ErrorIs(t, err, io.EOF)
}
// DecompressSparseGzip decompresses a sparse gzip file for virtual machine image.
func DecompressSparseGzip(t *testing.T, src, dst string) {
w, err := os.Create(dst)
require.NoError(t, err)
defer w.Close()
f, err := os.Open(src)
require.NoError(t, err)
defer f.Close()
gr, err := gzip.NewReader(f)
require.NoError(t, err)
buf := make([]byte, blockSize)
var size int
var written int64
for {
n, err := gr.Read(buf)
if n == 0 && err != nil {
if err == io.EOF {
break
}
require.NoError(t, err)
}
size += n
err = w.Truncate(int64(size))
require.NoError(t, err)
if !bytes.Equal(buf[:n], make([]byte, n)) {
wn, err := w.WriteAt(buf[:n], int64(size-n))
if err != nil {
if err == io.EOF {
break
}
require.NoError(t, err)
}
written += int64(wn)
if written > max {
require.Fail(t, "written size exceeds max")
}
}
}
}