// Copyright 2021 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 osv

import (
	"testing"
	"time"

	"github.com/google/go-cmp/cmp"
	"golang.org/x/vulndb/report"
)

func TestGenerate(t *testing.T) {
	r := report.Report{
		Module: "example.com/vulnerable/v2",
		AdditionalPackages: []report.Additional{
			{
				Module:  "vanity.host/vulnerable",
				Package: "vanity.host/vulnerable/package",
				Symbols: []string{"b", "A.b"},
				Versions: []report.VersionRange{
					{Fixed: "v2.1.1"},
					{Introduced: "v2.3.4", Fixed: "v2.3.5"},
					{Introduced: "v2.5.0"},
				},
			},
		},
		Versions: []report.VersionRange{
			{Fixed: "v2.1.1"},
			{Introduced: "v2.3.4", Fixed: "v2.3.5"},
			{Introduced: "v2.5.0"},
		},
		Description: "It's a real bad one, I'll tell you that",
		CVE:         "CVE-0000-0000",
		Credit:      "ignored",
		Symbols:     []string{"A", "B.b"},
		OS:          []string{"windows"},
		Arch:        []string{"arm64"},
		Links: report.Links{
			PR:      "pr",
			Commit:  "commit",
			Context: []string{"issue-a", "issue-b"},
		},
	}

	want := map[string][]Entry{
		"example.com/vulnerable/v2": []Entry{
			{
				ID: "GO-1991-0001",
				Package: Package{
					Name:      "example.com/vulnerable/v2",
					Ecosystem: "Go",
				},
				Details: "It's a real bad one, I'll tell you that",
				Affects: Affects{
					Ranges: []AffectsRange{
						{
							Type:  TypeSemver,
							Fixed: "2.1.1",
						},
						{
							Type:       TypeSemver,
							Introduced: "2.3.4",
							Fixed:      "2.3.5",
						},
						{
							Type:       TypeSemver,
							Introduced: "2.5.0",
						},
					},
				},
				References: []Reference{
					Reference{Type: "FIX", URL: "pr"},
					Reference{Type: "FIX", URL: "commit"},
					Reference{Type: "WEB", URL: "issue-a"},
					Reference{Type: "WEB", URL: "issue-b"},
				},
				Aliases: []string{"CVE-0000-0000"},
				EcosystemSpecific: GoSpecific{
					Symbols: []string{"A", "B.b"},
					GOOS:    []string{"windows"},
					GOARCH:  []string{"arm64"},
					URL:     "https://vulns.golang.org/GO-1991-0001.html",
				},
			},
		},
		"vanity.host/vulnerable": []Entry{
			{

				ID: "GO-1991-0001",
				Package: Package{
					Name:      "vanity.host/vulnerable/package",
					Ecosystem: "Go",
				},
				Details: "It's a real bad one, I'll tell you that",
				Affects: Affects{
					Ranges: []AffectsRange{
						{
							Type:  TypeSemver,
							Fixed: "2.1.1",
						},
						{
							Type:       TypeSemver,
							Introduced: "2.3.4",
							Fixed:      "2.3.5",
						},
						{
							Type:       TypeSemver,
							Introduced: "2.5.0",
						},
					},
				},
				References: []Reference{
					Reference{Type: "FIX", URL: "pr"},
					Reference{Type: "FIX", URL: "commit"},
					Reference{Type: "WEB", URL: "issue-a"},
					Reference{Type: "WEB", URL: "issue-b"},
				},
				Aliases: []string{"CVE-0000-0000"},
				EcosystemSpecific: GoSpecific{
					Symbols: []string{"b", "A.b"},
					GOOS:    []string{"windows"},
					GOARCH:  []string{"arm64"},
					URL:     "https://vulns.golang.org/GO-1991-0001.html",
				},
			},
		},
	}
	got := Generate("GO-1991-0001", "https://vulns.golang.org/GO-1991-0001.html", r)
	if diff := cmp.Diff(want, got, cmp.Comparer(func(_, _ time.Time) bool { return true })); diff != "" {
		t.Errorf("Generate returned unexpected result (-want +got):\n%s", diff)
	}
}

func TestAffectsSemver(t *testing.T) {
	cases := []struct {
		affects Affects
		version string
		want    bool
	}{
		{
			// empty Affects indicates everything is affected
			affects: Affects{},
			version: "v0.0.0",
			want:    true,
		},
		{
			// Affects containing an empty SEMVER range also indicates
			// everything is affected
			affects: Affects{Ranges: []AffectsRange{{Type: TypeSemver}}},
			version: "v0.0.0",
			want:    true,
		},
		{
			// v1.0.0 < v2.0.0
			affects: Affects{
				Ranges: []AffectsRange{
					{Type: TypeSemver, Fixed: "2.0.0"},
				},
			},
			version: "v1.0.0",
			want:    true,
		},
		{
			// v0.0.1 <= v1.0.0
			affects: Affects{
				Ranges: []AffectsRange{
					{Type: TypeSemver, Introduced: "0.0.1"},
				},
			},
			version: "v1.0.0",
			want:    true,
		},
		{
			// v1.0.0 <= v1.0.0
			affects: Affects{
				Ranges: []AffectsRange{
					{Type: TypeSemver, Introduced: "1.0.0"},
				},
			},
			version: "v1.0.0",
			want:    true,
		},
		{
			// v1.0.0 <= v1.0.0 < v2.0.0
			affects: Affects{
				Ranges: []AffectsRange{
					{Type: TypeSemver, Introduced: "1.0.0", Fixed: "2.0.0"},
				},
			},
			version: "v1.0.0",
			want:    true,
		},
		{
			// v0.0.1 <= v1.0.0 < v2.0.0
			affects: Affects{
				Ranges: []AffectsRange{
					{Type: TypeSemver, Introduced: "0.0.1", Fixed: "2.0.0"},
				},
			},
			version: "v1.0.0",
			want:    true,
		},
		{
			// v2.0.0 < v3.0.0
			affects: Affects{
				Ranges: []AffectsRange{
					{Type: TypeSemver, Introduced: "1.0.0", Fixed: "2.0.0"},
				},
			},
			version: "v3.0.0",
			want:    false,
		},
		{
			// Multiple ranges
			affects: Affects{
				Ranges: []AffectsRange{
					{Type: TypeSemver, Introduced: "1.0.0", Fixed: "2.0.0"},
					{Type: TypeSemver, Introduced: "3.0.0"},
				},
			},
			version: "v3.0.0",
			want:    true,
		},
		{
			// Wrong type range
			affects: Affects{
				Ranges: []AffectsRange{
					{Type: TypeUnspecified, Introduced: "3.0.0"},
				},
			},
			version: "v3.0.0",
			want:    true,
		},
		{
			// Semver ranges don't match
			affects: Affects{
				Ranges: []AffectsRange{
					{Type: TypeUnspecified, Introduced: "3.0.0"},
					{Type: TypeSemver, Introduced: "4.0.0"},
				},
			},
			version: "v3.0.0",
			want:    false,
		},
		{
			// Semver ranges do match
			affects: Affects{
				Ranges: []AffectsRange{
					{Type: TypeUnspecified, Introduced: "3.0.0"},
					{Type: TypeSemver, Introduced: "3.0.0"},
				},
			},
			version: "v3.0.0",
			want:    true,
		},
		{
			// Semver ranges match (go prefix)
			affects: Affects{
				Ranges: []AffectsRange{
					{Type: TypeSemver, Introduced: "3.0.0"},
				},
			},
			version: "go3.0.1",
			want:    true,
		},
	}

	for _, c := range cases {
		got := c.affects.AffectsSemver(c.version)
		if c.want != got {
			t.Errorf("%#v.AffectsSemver(%s): want %t, got %t", c.affects, c.version, c.want, got)
		}
	}
}
