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

import (
	"os"
	"path/filepath"
	"testing"

	"github.com/google/go-cmp/cmp"
	"github.com/google/go-cmp/cmp/cmpopts"
)

const (
	localTestData = "../testdata"
)

func less(a, b string) bool {
	return a < b
}

func TestFindBinaries(t *testing.T) {
	tests := []struct {
		name    string
		dir     string
		want    []string
		wantErr bool
	}{
		{
			name:    "local test",
			dir:     filepath.Join(localTestData, "module"),
			want:    []string{"golang.org/vuln"},
			wantErr: false,
		},
		{
			name:    "multiple test",
			dir:     filepath.Join(localTestData, "multipleBinModule"),
			want:    []string{"example.com/test", "example.com/test/multipleBinModule", "example.com/test/p1"},
			wantErr: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, err := findBinaries(tt.dir)
			if (err != nil) != tt.wantErr {
				t.Errorf("findBinaries() error = %v, wantErr %v", err, tt.wantErr)
				return
			}

			if diff := cmp.Diff(tt.want, got, cmpopts.SortSlices(less)); diff != "" {
				t.Errorf("mismatch (-want, +got):%s", diff)
			}
		})
	}
}

func TestRunBuild(t *testing.T) {
	if testing.Short() {
		t.Skip("skipping test that uses internet in short mode")
	}

	tests := []struct {
		name       string
		modulePath string
		importPath string
		want       string
		wantErr    bool
	}{
		{
			name:       "local test",
			modulePath: filepath.Join(localTestData, "module"),
			importPath: "golang.org/vuln",
			want:       filepath.Join(localTestData, "module", "bin1"),
		},
		{
			name:       "multiple binaries",
			modulePath: filepath.Join(localTestData, "multipleBinModule"),
			importPath: "example.com/test/multipleBinModule",
			want:       filepath.Join(localTestData, "multipleBinModule", "bin1"),
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, _, err := runBuild(tt.modulePath, tt.importPath, 1)
			defer os.Remove(got)
			if (err != nil) != tt.wantErr {
				t.Errorf("runBuild() error = %v, wantErr %v", err, tt.wantErr)
				return
			}

			if diff := cmp.Diff(tt.want, got); diff != "" {
				t.Errorf("mismatch (-want, +got):%s", diff)
			}
			_, err = os.Stat(got)
			if err != nil && os.IsNotExist(err) {
				t.Errorf("runBuild did not produce the expected binary")
			}
		})
	}
}
