| // 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 genericosv |
| |
| import ( |
| "flag" |
| "io/fs" |
| "path/filepath" |
| "strings" |
| "testing" |
| "time" |
| |
| "github.com/google/go-cmp/cmp" |
| "golang.org/x/vulndb/internal/proxy" |
| "golang.org/x/vulndb/internal/report" |
| ) |
| |
| var ( |
| realProxy = flag.Bool("proxy", false, "if true, contact the real module proxy and update expected responses") |
| update = flag.Bool("update", false, "if true, update test YAML reports to reflect new expected behavior") |
| ) |
| |
| var ( |
| testdataDir = "testdata" |
| testOSVDir = filepath.Join(testdataDir, "osv") |
| testYAMLDir = filepath.Join(testdataDir, "yaml") |
| testTime = time.Date(1999, 1, 1, 0, 0, 0, 0, time.UTC) |
| ) |
| |
| // To update test cases to reflect new expected behavior |
| // (only use -proxy if the calls to the proxy will change): |
| // go test ./internal/genericosv/... -update -proxy -run TestToReport |
| func TestToReport(t *testing.T) { |
| if err := filepath.WalkDir(testOSVDir, func(path string, f fs.DirEntry, err error) error { |
| if err != nil { |
| return err |
| } |
| if f.IsDir() || filepath.Ext(path) != ".json" { |
| return nil |
| } |
| ghsaID := strings.TrimSuffix(f.Name(), ".json") |
| t.Run(ghsaID, func(t *testing.T) { |
| t.Parallel() |
| |
| pc, err := proxy.NewTestClient(t, *realProxy) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| osv := &Entry{} |
| if err := report.UnmarshalFromFile(path, osv); err != nil { |
| t.Fatal(err) |
| } |
| |
| for _, rs := range []report.ReviewStatus{report.Unreviewed, report.Reviewed} { |
| got := report.New(osv, pc, report.WithCreated(testTime), report.WithReviewStatus(rs)) |
| // Keep record of what lints would apply to each generated report. |
| got.LintAsNotes(pc) |
| yamlFile := filepath.Join(testYAMLDir, ghsaID+"_"+rs.String()+".yaml") |
| if *update { |
| if err := got.Write(yamlFile); err != nil { |
| t.Fatal(err) |
| } |
| } |
| want, err := report.Read(yamlFile) |
| if err != nil { |
| t.Fatal(err) |
| } |
| if diff := cmp.Diff(want, got); diff != "" { |
| t.Errorf("ToReport() mismatch (-want +got)\n%s", diff) |
| } |
| } |
| }) |
| return nil |
| }); err != nil { |
| t.Fatal(err) |
| } |
| } |