// 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 worker

import (
	"context"
	"flag"
	"net/http"
	"testing"

	"github.com/google/go-cmp/cmp"
	"golang.org/x/pkgsite-metrics/internal/config"
	"golang.org/x/pkgsite-metrics/internal/queue"
	"golang.org/x/pkgsite-metrics/internal/scan"
)

var binaryBucket = flag.String("binary-bucket", "", "bucket for scannable binaries")

func TestReadBinaries(t *testing.T) {
	if *binaryBucket == "" {
		t.Skip("missing -binary-bucket")
	}
	sreqs, err := readBinaries(context.Background(), *binaryBucket)
	if err != nil {
		t.Fatal(err)
	}
	want := &vulncheckRequest{
		scan.ModuleURLPath{
			Module:  "golang.org/x/pkgsite",
			Version: "v0.0.0-20221004150836-873fb37c2479",
			Suffix:  "cmd/worker",
		},
		vulncheckRequestParams{Mode: ModeBinary},
	}
	found := false
	for _, sr := range sreqs {
		if *sr == *want {
			found = true
			break
		}
	}
	if !found {
		t.Errorf("did not find %+v in results:", want)
		for _, r := range sreqs {
			t.Logf("  %+v", r)
		}
	}
}

func TestCreateQueueTasks(t *testing.T) {
	vreq := func(path, version, mode string, importedBy int) *vulncheckRequest {
		return &vulncheckRequest{
			scan.ModuleURLPath{Module: path, Version: version},
			vulncheckRequestParams{Mode: mode, ImportedBy: importedBy},
		}
	}

	req, err := http.NewRequest("GET", "https://path?min=8&file=testdata/modules.txt", nil)
	if err != nil {
		t.Fatal(err)
	}
	gotTasks, _, err := createVulncheckQueueTasks(req, &config.Config{}, false)
	if err != nil {
		t.Fatal(err)
	}

	wantTasks := []queue.Task{
		vreq("github.com/pkg/errors", "v0.9.1", ModeVTA, 10),
		vreq("golang.org/x/net", "v0.4.0", ModeVTA, 20),
	}
	if diff := cmp.Diff(wantTasks, gotTasks, cmp.AllowUnexported(vulncheckRequest{})); diff != "" {
		t.Errorf("mismatch (-want, +got):\n%s", diff)
	}

	gotTasks, _, err = createVulncheckQueueTasks(req, &config.Config{}, true)
	if err != nil {
		t.Fatal(err)
	}
	wantTasks = nil
	// cfg.BinaryBucket is empty, so no binary-mode tasks are created.
	for _, mode := range []string{ModeImports, ModeVTA, ModeVTAStacks} {
		wantTasks = append(wantTasks,
			vreq("github.com/pkg/errors", "v0.9.1", mode, 10),
			vreq("golang.org/x/net", "v0.4.0", mode, 20))
	}

	if diff := cmp.Diff(wantTasks, gotTasks, cmp.AllowUnexported(vulncheckRequest{})); diff != "" {
		t.Errorf("mismatch (-want, +got):\n%s", diff)
	}
}
