mirror of
https://github.com/aquasecurity/trivy.git
synced 2025-12-21 06:43:05 -08:00
* 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
78 lines
1.4 KiB
Go
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")
|
|
}
|
|
}
|
|
}
|
|
}
|