| // 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 ( |
| "context" |
| "flag" |
| "os" |
| "testing" |
| |
| "github.com/google/go-cmp/cmp" |
| "golang.org/x/vulndb/internal/gitrepo" |
| ) |
| |
| var integration = flag.Bool("integration", false, "test with respect to current contents of vulndb") |
| |
| func TestNewWriteLoadValidate(t *testing.T) { |
| newDB, err := New(testOSV1, testOSV2, testOSV3) |
| if err != nil { |
| t.Fatal(err) |
| } |
| tmpDir := t.TempDir() |
| if err = newDB.Write(tmpDir); err != nil { |
| t.Fatal(err) |
| } |
| loaded, err := Load(tmpDir) |
| if err != nil { |
| t.Fatal(err) |
| } |
| if diff := cmp.Diff(newDB, loaded); diff != "" { |
| t.Errorf("new/write/load mismatch (-new, +loaded):\n%s", diff) |
| } |
| if err := ValidateDeploy(tmpDir, tmpDir); err != nil { |
| t.Error(err) |
| } |
| } |
| |
| func TestFromRepoWriteLoadValidate(t *testing.T) { |
| ctx := context.Background() |
| testRepo, err := gitrepo.ReadTxtarRepo(vulndbTxtar, jan2002.Time) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| fromRepo, err := FromRepo(ctx, testRepo) |
| if err != nil { |
| t.Fatal(err) |
| } |
| tmpDir := t.TempDir() |
| if err = fromRepo.Write(tmpDir); err != nil { |
| t.Fatal(err) |
| } |
| loaded, err := Load(tmpDir) |
| if err != nil { |
| t.Fatal(err) |
| } |
| if diff := cmp.Diff(fromRepo, loaded); diff != "" { |
| t.Errorf("fromRepo/write/load mismatch (-fromRepo, +loaded):\n%s", diff) |
| } |
| if err := ValidateDeploy(tmpDir, tmpDir); err != nil { |
| t.Error(err) |
| } |
| } |
| |
| func TestIntegration(t *testing.T) { |
| if !*integration { |
| t.Skip("Skipping integration tests, use flag -integration to run") |
| } |
| |
| moveToVulnDBRoot(t) |
| |
| ctx := context.Background() |
| |
| repo, err := gitrepo.Open(ctx, ".") |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| dir := t.TempDir() |
| created, err := FromRepo(ctx, repo) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| if err := created.Write(dir); err != nil { |
| t.Fatal(err) |
| } |
| |
| loaded, err := Load(dir) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| if diff := cmp.Diff(created, loaded); diff != "" { |
| t.Errorf("unexpected diff: (-created,+loaded):\n%s", diff) |
| } |
| |
| if err := ValidateDeploy(dir, dir); err != nil { |
| t.Error(err) |
| } |
| } |
| |
| func moveToVulnDBRoot(t *testing.T) { |
| // Store current working directory and move into vulndb/ folder. |
| wd, err := os.Getwd() |
| if err != nil { |
| t.Fatal(err) |
| } |
| if err := os.Chdir("../.."); err != nil { |
| t.Fatal(err) |
| } |
| |
| // Restore state from before test. |
| t.Cleanup(func() { |
| if err = os.Chdir(wd); err != nil { |
| t.Log(err) |
| } |
| }) |
| } |