// Copyright 2022 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 main

import (
	"bytes"
	"encoding/json"
	"errors"
	"os"
	"os/exec"
	"runtime"
	"strings"
	"testing"

	"golang.org/x/exp/slices"
	"golang.org/x/pkgsite-metrics/internal/log"
	"golang.org/x/pkgsite-metrics/internal/worker"
	"golang.org/x/vuln/vulncheck"
)

func Test(t *testing.T) {
	if runtime.GOOS == "windows" {
		t.Skip("cannot run on Windows")
	}

	checkVuln := func(t *testing.T, res *vulncheck.Result) {
		wantID := "GO-2021-0113"
		i := slices.IndexFunc(res.Vulns, func(v *vulncheck.Vuln) bool {
			return v.OSV.ID == wantID
		})
		if i < 0 {
			t.Fatalf("no vuln with ID %s. Result:\n%+v", wantID, res)
		}
	}

	t.Run("source", func(t *testing.T) {
		res, err := runTest([]string{worker.ModeVTA, "testdata/module"}, "testdata/vulndb")
		if err != nil {
			t.Fatal(err)
		}
		checkVuln(t, res)
	})

	t.Run("binary", func(t *testing.T) {
		t.Skip("vulncheck.Binary may not support the Go version")
		const binary = "testdata/module/vuln"
		if _, err := exec.Command("/bin/sh", "-c", "cd testdata/module && go build").Output(); err != nil {
			t.Fatal(log.IncludeStderr(err))
		}
		defer os.Remove(binary)
		res, err := runTest([]string{worker.ModeBinary, binary}, "testdata/vulndb")
		if err != nil {
			t.Fatal(err)
		}
		checkVuln(t, res)
	})

	// Errors
	for _, test := range []struct {
		name   string
		args   []string
		vulndb string
		want   string
	}{
		{
			name:   "too few args",
			args:   []string{"testdata/module"},
			vulndb: "testdata/vulndb",
			want:   "need two args",
		},
		{
			name:   "no vulndb",
			args:   []string{worker.ModeVTA, "testdata/module"},
			vulndb: "does not exist",
			want:   "no such file",
		},
		{
			name:   "no mode",
			args:   []string{"MODE", "testdata/module"},
			vulndb: "testdata/vulndb",
			want:   "not a valid mode",
		},
		{
			name:   "no module",
			args:   []string{worker.ModeVTA, "testdata/nosuchmodule"},
			vulndb: "testdata/vulndb",
			want:   "no such file",
		},
	} {
		t.Run(test.name, func(t *testing.T) {
			_, err := runTest(test.args, test.vulndb)
			if err == nil {
				t.Fatal("got nil, want error")
			}
			if g, w := err.Error(), test.want; !strings.Contains(g, w) {
				t.Fatalf("error %q does not contain %q", g, w)
			}
		})
	}
}

func runTest(args []string, vulndbDir string) (*vulncheck.Result, error) {
	var buf bytes.Buffer
	run(&buf, args, vulndbDir)
	return unmarshalVulncheckOutput(buf.Bytes())
}

func unmarshalVulncheckOutput(output []byte) (*vulncheck.Result, error) {
	var e struct {
		Error string
	}
	if err := json.Unmarshal(output, &e); err != nil {
		return nil, err
	}
	if e.Error != "" {
		return nil, errors.New(e.Error)
	}
	var res vulncheck.Result
	if err := json.Unmarshal(output, &res); err != nil {
		return nil, err
	}
	return &res, nil
}
