command/e2etest: test installation of plugins from cache
This is a tough one to unit tests because the behavior is tangled up in the code that hits releases.hashicorp.com, so we'll add this e2etest as some extra insurance that this works end-to-end.
This commit is contained in:
parent
cb17a9a607
commit
30e6f4e066
|
@ -1,7 +1,11 @@
|
||||||
package e2etest
|
package e2etest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
@ -45,3 +49,55 @@ func TestInitProviders(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestInitProviders_pluginCache(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
// This test reaches out to releases.hashicorp.com to access plugin
|
||||||
|
// metadata, and download the null plugin, though the template plugin
|
||||||
|
// should come from local cache.
|
||||||
|
skipIfCannotAccessNetwork(t)
|
||||||
|
|
||||||
|
fixturePath := filepath.Join("test-fixtures", "plugin-cache")
|
||||||
|
tf := e2e.NewBinary(terraformBin, fixturePath)
|
||||||
|
defer tf.Close()
|
||||||
|
|
||||||
|
// Our fixture dir has a generic os_arch dir, which we need to customize
|
||||||
|
// to the actual OS/arch where this test is running in order to get the
|
||||||
|
// desired result.
|
||||||
|
fixtMachineDir := tf.Path("cache/os_arch")
|
||||||
|
wantMachineDir := tf.Path("cache", fmt.Sprintf("%s_%s", runtime.GOOS, runtime.GOARCH))
|
||||||
|
os.Rename(fixtMachineDir, wantMachineDir)
|
||||||
|
|
||||||
|
cmd := tf.Cmd("init")
|
||||||
|
cmd.Env = append(cmd.Env, "TF_PLUGIN_CACHE_DIR=./cache")
|
||||||
|
cmd.Stdin = nil
|
||||||
|
cmd.Stderr = &bytes.Buffer{}
|
||||||
|
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("unexpected error: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
stderr := cmd.Stderr.(*bytes.Buffer).String()
|
||||||
|
if stderr != "" {
|
||||||
|
t.Errorf("unexpected stderr output:\n%s", stderr)
|
||||||
|
}
|
||||||
|
|
||||||
|
path := fmt.Sprintf(".terraform/plugins/%s_%s/terraform-provider-template_v0.1.0_x4", runtime.GOOS, runtime.GOARCH)
|
||||||
|
content, err := tf.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to read installed plugin from %s: %s", path, err)
|
||||||
|
}
|
||||||
|
if strings.TrimSpace(string(content)) != "this is not a real plugin" {
|
||||||
|
t.Errorf("template plugin was not installed from local cache")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !tf.FileExists(fmt.Sprintf(".terraform/plugins/%s_%s/terraform-provider-null_v0.1.0_x4", runtime.GOOS, runtime.GOARCH)) {
|
||||||
|
t.Errorf("null plugin was not installed")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !tf.FileExists(fmt.Sprintf("cache/%s_%s/terraform-provider-null_v0.1.0_x4", runtime.GOOS, runtime.GOARCH)) {
|
||||||
|
t.Errorf("null plugin is not in cache after install")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
this is not a real plugin
|
|
@ -0,0 +1,7 @@
|
||||||
|
provider "template" {
|
||||||
|
version = "0.1.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "null" {
|
||||||
|
version = "0.1.0"
|
||||||
|
}
|
Loading…
Reference in New Issue