blob: 393de70be4be7fe4fa652775631063bb86f17c61 [file] [log] [blame]
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package database
import (
"bytes"
"encoding/json"
"fmt"
"os"
"path/filepath"
"golang.org/x/tools/txtar"
)
// Helper functions for working with txtar files in tests.
const (
validTxtar = "testdata/db.txtar"
smallTxtar = "testdata/db-small.txtar"
invalidDBMetaTxtar = "testdata/invalid-db-meta.txtar"
invalidModulesTxtar = "testdata/invalid-modules.txtar"
invalidVulnsTxtar = "testdata/invalid-vulns.txtar"
invalidFilenameTxtar = "testdata/invalid-filename.txtar"
invalidEntriesTxtar = "testdata/invalid-entries.txtar"
vulndbTxtar = "testdata/vulndb-repo.txtar"
)
// data returns the raw JSON data contained in the pseudofile filename,
// with any whitespace removed.
//
// This a test helper function.
func data(ar *txtar.Archive, filename string) ([]byte, error) {
for _, f := range ar.Files {
if f.Name == filename {
return removeWhitespace(f.Data)
}
}
return nil, fmt.Errorf("file %s not found", filename)
}
// txtarToDir writes the contents of a txtar file into a directory dir,
// removing any whitespace from the contents.
// It assumes that all "files" in the txtar file contain json.
// If gzip is true, it adds a corresponding gzipped file for each file present.
//
// This a test helper function.
func txtarToDir(filename string, dir string, gzip bool) error {
ar, err := txtar.ParseFile(filename)
if err != nil {
return err
}
for _, f := range ar.Files {
if err := os.MkdirAll(filepath.Join(dir, filepath.Dir(f.Name)), 0755); err != nil {
return err
}
data, err := removeWhitespace(f.Data)
if err != nil {
return err
}
fname := filepath.Join(dir, f.Name)
if err := os.WriteFile(fname, data, 0644); err != nil {
return err
}
if gzip {
if err := writeGzipped(fname+".gz", data); err != nil {
return err
}
}
}
return nil
}
func removeWhitespace(data []byte) ([]byte, error) {
var b bytes.Buffer
if err := json.Compact(&b, data); err != nil {
return nil, err
}
return b.Bytes(), nil
}