| // 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) | |
| } | |
| } |