2020-04-23 14:21:56 +02:00
|
|
|
package providercache
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/hashicorp/terraform/addrs"
|
|
|
|
"github.com/hashicorp/terraform/internal/getproviders"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestEnsureProviderVersions(t *testing.T) {
|
|
|
|
// Set up a test provider "foo" with two versions which support different protocols
|
|
|
|
// used by both package metas
|
|
|
|
provider := addrs.NewDefaultProvider("foo")
|
|
|
|
platform := getproviders.Platform{OS: "gameboy", Arch: "lr35902"}
|
|
|
|
|
|
|
|
// foo version 1.0 supports protocol 4
|
|
|
|
version1 := getproviders.MustParseVersion("1.0.0")
|
|
|
|
protocols1 := getproviders.VersionList{getproviders.MustParseVersion("4.0")}
|
|
|
|
meta1, close1, _ := getproviders.FakeInstallablePackageMeta(provider, version1, protocols1, platform)
|
|
|
|
defer close1()
|
|
|
|
|
|
|
|
// foo version 2.0 supports protocols 4 and 5.2
|
|
|
|
version2 := getproviders.MustParseVersion("2.0.0")
|
|
|
|
protocols2 := getproviders.VersionList{getproviders.MustParseVersion("4.0"), getproviders.MustParseVersion("5.2")}
|
|
|
|
meta2, close2, _ := getproviders.FakeInstallablePackageMeta(provider, version2, protocols2, platform)
|
|
|
|
defer close2()
|
|
|
|
|
|
|
|
// foo version 3.0 supports protocol 6
|
|
|
|
version3 := getproviders.MustParseVersion("3.0.0")
|
|
|
|
protocols3 := getproviders.VersionList{getproviders.MustParseVersion("6.0")}
|
|
|
|
meta3, close3, _ := getproviders.FakeInstallablePackageMeta(provider, version3, protocols3, platform)
|
|
|
|
defer close3()
|
|
|
|
|
|
|
|
// set up the mock source
|
|
|
|
source := getproviders.NewMockSource(
|
|
|
|
[]getproviders.PackageMeta{meta1, meta2, meta3},
|
|
|
|
)
|
|
|
|
|
|
|
|
// create a temporary workdir
|
|
|
|
tmpDirPath, err := ioutil.TempDir("", "terraform-test-providercache")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
defer os.RemoveAll(tmpDirPath)
|
|
|
|
|
|
|
|
// set up the installer using the temporary directory and mock source
|
2020-04-23 14:33:28 +02:00
|
|
|
dir := NewDirWithPlatform(tmpDirPath, platform)
|
2020-04-23 14:21:56 +02:00
|
|
|
installer := NewInstaller(dir, source)
|
|
|
|
|
|
|
|
// First test: easy case. The requested version supports the current plugin protocol version
|
|
|
|
reqs := getproviders.Requirements{
|
|
|
|
provider: getproviders.MustParseVersionConstraints("2.0"),
|
|
|
|
}
|
|
|
|
ctx := context.TODO()
|
|
|
|
selections, err := installer.EnsureProviderVersions(ctx, reqs, InstallNewProvidersOnly)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("expected sucess, got error: %s", err)
|
|
|
|
}
|
|
|
|
if len(selections) != 1 {
|
|
|
|
t.Fatalf("wrong number of results. Got %d, expected 1", len(selections))
|
|
|
|
}
|
|
|
|
got := selections[provider]
|
|
|
|
if !got.Same(version2) {
|
|
|
|
t.Fatalf("wrong result. Expected provider version %s, got %s", version2, got)
|
|
|
|
}
|
|
|
|
|
|
|
|
// For the second test, set the requirement to something later than the
|
|
|
|
// version that supports the current plugin protocol version 5.0
|
|
|
|
reqs[provider] = getproviders.MustParseVersionConstraints("3.0")
|
|
|
|
|
|
|
|
selections, err = installer.EnsureProviderVersions(ctx, reqs, InstallNewProvidersOnly)
|
|
|
|
if err == nil {
|
|
|
|
t.Fatalf("expected error, got success")
|
|
|
|
}
|
|
|
|
if len(selections) != 0 {
|
|
|
|
t.Errorf("wrong number of results. Got %d, expected 0", len(selections))
|
|
|
|
}
|
|
|
|
if !strings.Contains(err.Error(), "Provider version 2.0.0 is the latest compatible version.") {
|
|
|
|
t.Fatalf("wrong error: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// For the third test, set the requirement to something earlier than the
|
|
|
|
// version that supports the current plugin protocol version 5.0
|
|
|
|
reqs[provider] = getproviders.MustParseVersionConstraints("1.0")
|
|
|
|
|
|
|
|
selections, err = installer.EnsureProviderVersions(ctx, reqs, InstallNewProvidersOnly)
|
|
|
|
if err == nil {
|
|
|
|
t.Fatalf("expected error, got success")
|
|
|
|
}
|
|
|
|
if len(selections) != 0 {
|
|
|
|
t.Errorf("wrong number of results. Got %d, expected 0", len(selections))
|
|
|
|
}
|
|
|
|
if !strings.Contains(err.Error(), "Provider version 2.0.0 is the earliest compatible version.") {
|
|
|
|
t.Fatalf("wrong error: %s", err)
|
|
|
|
}
|
|
|
|
}
|