// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package e2etest

import (
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"strings"
	"testing"

	"github.com/hashicorp/terraform/internal/e2e"
)

// TestProviderDevOverrides is a test for the special dev_overrides setting
// in the provider_installation section of the CLI configuration file, which
// is our current answer to smoothing provider development by allowing
// developers to opt out of the version number and checksum verification
// we normally do, so they can just overwrite the same local executable
// in-place to iterate faster.
func TestProviderDevOverrides(t *testing.T) {
	if !canRunGoBuild {
		// We're running in a separate-build-then-run context, so we can't
		// currently execute this test which depends on being able to build
		// new executable at runtime.
		//
		// (See the comment on canRunGoBuild's declaration for more information.)
		t.Skip("can't run without building a new provider executable")
	}
	t.Parallel()

	tf := e2e.NewBinary(t, terraformBin, "testdata/provider-dev-override")

	// In order to do a decent end-to-end test for this case we will need a
	// real enough provider plugin to try to run and make sure we are able
	// to actually run it. For now we'll use the "test" provider for that,
	// because it happens to be in this repository and therefore allows
	// us to avoid drawing in anything external, but we might revisit this
	// strategy in future if other needs cause us to evolve the test
	// provider in a way that makes it less suitable for this particular test,
	// such as if it stops being buildable into an independent executable.
	providerExeDir := filepath.Join(tf.WorkDir(), "pkgdir")
	providerExePrefix := filepath.Join(providerExeDir, "terraform-provider-test_")
	providerExe := e2e.GoBuild("github.com/hashicorp/terraform/internal/provider-simple/main", providerExePrefix)
	t.Logf("temporary provider executable is %s", providerExe)

	err := ioutil.WriteFile(filepath.Join(tf.WorkDir(), "dev.tfrc"), []byte(fmt.Sprintf(`
		provider_installation {
			dev_overrides {
				"example.com/test/test" = %q
			}
		}
	`, providerExeDir)), os.ModePerm)
	if err != nil {
		t.Fatal(err)
	}

	tf.AddEnv("TF_CLI_CONFIG_FILE=dev.tfrc")

	stdout, stderr, err := tf.Run("providers")
	if err != nil {
		t.Fatalf("unexpected error: %s\n%s", err, stderr)
	}
	if got, want := stdout, `provider[example.com/test/test]`; !strings.Contains(got, want) {
		t.Errorf("configuration should depend on %s, but doesn't\n%s", want, got)
	}

	// NOTE: We're intentionally not running "terraform init" here, because
	// dev overrides are always ready to use and don't need any special action
	// to "install" them. This test is mimicking the a happy path of going
	// directly from "go build" to validate/plan/apply without interacting
	// with any registries, mirrors, lock files, etc. To verify "terraform
	// init" does actually show a warning, that behavior is tested at the end.
	stdout, stderr, err = tf.Run("validate")
	if err != nil {
		t.Fatalf("unexpected error: %s\n%s", err, stderr)
	}

	if got, want := stdout, `The configuration is valid, but`; !strings.Contains(got, want) {
		t.Errorf("stdout doesn't include the success message\nwant: %s\n%s", want, got)
	}
	if got, want := stdout, `Provider development overrides are in effect`; !strings.Contains(got, want) {
		t.Errorf("stdout doesn't include the warning about development overrides\nwant: %s\n%s", want, got)
	}

	stdout, stderr, err = tf.Run("init")
	if err == nil {
		t.Fatal("expected error: Failed to query available provider packages")
	}
	if got, want := stdout, `Provider development overrides are in effect`; !strings.Contains(got, want) {
		t.Errorf("stdout doesn't include the warning about development overrides\nwant: %s\n%s", want, got)
	}
	if got, want := stderr, `Failed to query available provider packages`; !strings.Contains(got, want) {
		t.Errorf("stderr doesn't include the error about listing unavailable development provider\nwant: %s\n%s", want, got)
	}
}
