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

// deps_test tests dependencies of cmd/pkgsite are kept to a limited set.
package deps_test

import (
	"os/exec"
	"strings"
	"testing"

	"golang.org/x/pkgsite/internal/testenv"
)

// non-test packages are allowed to depend on licensecheck and safehtml, x/ repos, and markdown.
var allowedModDeps = map[string]bool{
	"github.com/google/licensecheck": true,
	"github.com/google/safehtml":     true,
	"golang.org/x/mod":               true,
	"golang.org/x/net":               true,
	"golang.org/x/pkgsite":           true,
	"golang.org/x/sync":              true,
	"golang.org/x/text":              true,
	"golang.org/x/tools":             true,
	"rsc.io/markdown":                true,
}

// test packages are also allowed to depend on go-cmp
var additionalAllowedTestModDeps = map[string]bool{
	"github.com/google/go-cmp": true,
}

func TestCmdPkgsiteDeps(t *testing.T) {
	testenv.MustHaveExecPath(t, "go")

	// First, list all dependencies of pkgsite.
	out, err := exec.Command("go", "list", "-e", "-deps", "golang.org/x/pkgsite/cmd/pkgsite").Output()
	if err != nil {
		if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 {
			t.Fatalf("running go list -test -deps on package golang.org/x/pkgsite/cmd/pkgsite:\n%s", ee.Stderr)
		}
		t.Fatalf("running go list -test -deps on package golang.org/x/pkgsite/cmd/pkgsite: %v", err)

	}
	pkgs := strings.Fields(string(out))
	for _, pkg := range pkgs {
		// Filter to only the dependencies that are in the pkgsite module.
		if !strings.HasPrefix(pkg, "golang.org/x/pkgsite") {
			continue
		}

		// Get the test module deps and check them against allowedTestModDeps.
		out, err := exec.Command("go", "list", "-e", "-deps", "-test", "-f", "{{if .Module}}{{.Module.Path}}{{end}}", pkg).Output()
		if err != nil {
			if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 {
				t.Fatalf("running go list -test -deps on package %s:\n%s", pkg, ee.Stderr)
			}
			t.Fatalf("running go list -test -deps on package %s: %v", pkg, err)
		}
		testmodules := strings.Fields(string(out))
		for _, m := range testmodules {
			if !(allowedModDeps[m] || additionalAllowedTestModDeps[m]) {
				t.Fatalf("disallowed test module dependency %q found through %q", m, pkg)
			}
		}

		// Get the module deps and check them against allowedModDeps
		out, err = exec.Command("go", "list", "-e", "-deps", "-f", "{{if .Module}}{{.Module.Path}}{{end}}", pkg).Output()
		if err != nil {
			if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 {
				t.Fatalf("running go list -deps on package %s:\n%s", pkg, ee.Stderr)
			}
			t.Fatalf("running go list -deps on package %s: %v", pkg, err)
		}
		modules := strings.Fields(string(out))
		for _, m := range modules {
			if !allowedModDeps[m] {
				t.Fatalf("disallowed module dependency %q found through %q", m, pkg)
			}
		}
	}
}
