internal/database, cmd/gendb: refactor Generate for unit testing

Modify Generate to take in a *git.Repository instead of a directory
string, so it can be more easily unit tested. Add a unit test.

For golang/go#56417

Change-Id: I3eaa84b41568e9582ac1f16be8c979d7b71d5ad3
Reviewed-on: https://go-review.googlesource.com/c/vulndb/+/457017
Run-TryBot: Tatiana Bradley <tatiana@golang.org>
Reviewed-by: Damien Neil <dneil@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
Tatiana Bradley 2022-12-12 17:07:56 -05:00 коммит произвёл Tatiana Bradley
Родитель f9476bea51
Коммит ffba2fd2e2
4 изменённых файлов: 33 добавлений и 22 удалений

Просмотреть файл

@ -12,6 +12,7 @@ import (
"log"
"golang.org/x/vulndb/internal/database"
"golang.org/x/vulndb/internal/gitrepo"
)
var (
@ -23,7 +24,11 @@ var (
func main() {
flag.Parse()
ctx := context.Background()
if err := database.Generate(ctx, *repoDir, *jsonDir, *indent); err != nil {
repo, err := gitrepo.CloneOrOpen(ctx, *repoDir)
if err != nil {
log.Fatal(err)
}
if err := database.Generate(ctx, repo, *jsonDir, *indent); err != nil {
log.Fatal(err)
}
}

Просмотреть файл

@ -73,7 +73,7 @@ const (
// associated index maps). The result is an in-memory vulnerability database
// that can be written to files via Database.Write.
//
// The repo must contain a "data/osv" folder to with files in
// The repo must contain a "data/osv" folder with files in
// OSV JSON format with filenames of the form GO-YYYY-XXXX.json.
//
// New does not modify the repo.

Просмотреть файл

@ -7,28 +7,23 @@ package database
import (
"context"
"github.com/go-git/go-git/v5"
"golang.org/x/vulndb/internal/derrors"
"golang.org/x/vulndb/internal/gitrepo"
)
// Generate creates and writes a new Go vulnerability database to outDir
// based on the contents of the "data/osv" folder inside repoDir, a local
// git repo.
// based on the contents of the "data/osv" folder inside repo.
//
// repoDir must contain a "data/osv" folder to with files in
// The repo must contain a "data/osv" folder with files in
// OSV JSON format with filenames of the form GO-YYYY-XXXX.json.
func Generate(ctx context.Context, repoDir, outDir string, indent bool) (err error) {
defer derrors.Wrap(&err, "Generate(%q)", repoDir)
func Generate(ctx context.Context, repo *git.Repository, outDir string, indent bool) (err error) {
defer derrors.Wrap(&err, "Generate()")
repo, err := gitrepo.Open(ctx, repoDir)
if err != nil {
return err
}
new, err := New(ctx, repo)
if err != nil {
return err
}
if err = new.Write(outDir, false); err != nil {
if err = new.Write(outDir, indent); err != nil {
return err
}

Просмотреть файл

@ -14,12 +14,22 @@ import (
)
func TestGenerate(t *testing.T) {
// TODO(https://github.com/golang/go#56417): Write unit tests for Generate.
ctx := context.Background()
testRepo, err := gitrepo.ReadTxtarRepo(testRepoDir, jan2002)
if err != nil {
t.Fatal(err)
}
tmpDir := t.TempDir()
err = Generate(ctx, testRepo, tmpDir, true)
if err != nil {
t.Fatal(err)
}
if err = cmpDirHashes(tmpDir, validDir); err != nil {
t.Error(err)
}
}
func TestGenerateIntegration(t *testing.T) {
// Generate (in its current state) can only be tested with respect to the
// real contents of vulndb.
if !*integration {
t.Skip("Skipping integration tests, use flag -integration to run")
}
@ -28,16 +38,17 @@ func TestGenerateIntegration(t *testing.T) {
ctx := context.Background()
genDir := t.TempDir()
err := Generate(ctx, ".", genDir, false)
if err != nil {
t.Fatal(err)
}
repo, err := gitrepo.Open(ctx, ".")
if err != nil {
t.Fatal(err)
}
genDir := t.TempDir()
err = Generate(ctx, repo, genDir, false)
if err != nil {
t.Fatal(err)
}
new, err := New(ctx, repo)
if err != nil {
t.Fatal(err)