mirror of
https://github.com/hashicorp/terraform.git
synced 2026-02-03 20:50:59 -05:00
109 lines
2.7 KiB
Go
109 lines
2.7 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package pluginshared
|
|
|
|
import (
|
|
"context"
|
|
"net/url"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func assertResolvedBinary(t *testing.T, binary *Binary, assertCached, assertOverridden bool) {
|
|
t.Helper()
|
|
|
|
if binary == nil {
|
|
t.Fatal("expected non-nil binary")
|
|
}
|
|
|
|
if binary.ResolvedFromCache != assertCached {
|
|
t.Errorf("expected ResolvedFromCache to be %v, got %v", assertCached, binary.ResolvedFromCache)
|
|
}
|
|
|
|
if binary.ResolvedFromDevOverride != assertOverridden {
|
|
t.Errorf("expected ResolvedFromDevOverride to be %v, got %v", assertOverridden, binary.ResolvedFromDevOverride)
|
|
}
|
|
|
|
info, err := os.Stat(binary.Path)
|
|
if err != nil {
|
|
t.Fatalf("expected no error when getting binary location, got %q", err)
|
|
}
|
|
|
|
if info.IsDir() || info.Size() == 0 {
|
|
t.Fatalf("expected non-zero file at %q", binary.Path)
|
|
}
|
|
|
|
var expectedVersion string
|
|
if assertOverridden {
|
|
expectedVersion = "dev"
|
|
} else {
|
|
expectedVersion = "0.1.0"
|
|
}
|
|
|
|
if binary.ProductVersion != expectedVersion { // from sample manifest
|
|
t.Errorf("expected product binary %q, got %q", expectedVersion, binary.ProductVersion)
|
|
}
|
|
}
|
|
|
|
func TestBinaryManager_Resolve(t *testing.T) {
|
|
publicKey, err := os.ReadFile("testdata/sample.public.key")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
server, err := newCloudPluginManifestHTTPTestServer(t)
|
|
if err != nil {
|
|
t.Fatalf("could not create test server: %s", err)
|
|
}
|
|
defer server.Close()
|
|
|
|
serverURL, _ := url.Parse(server.URL)
|
|
serviceURL := serverURL.JoinPath("/api/cloudplugin/v1")
|
|
|
|
tempDir := t.TempDir()
|
|
manager, err := NewCloudBinaryManager(context.Background(), tempDir, "", serviceURL, "darwin", "amd64")
|
|
if err != nil {
|
|
t.Fatalf("expected no err, got: %s", err)
|
|
}
|
|
manager.signingKey = string(publicKey)
|
|
manager.binaryName = "toucan.txt" // The file contained in the test archive
|
|
|
|
binary, err := manager.Resolve()
|
|
if err != nil {
|
|
t.Fatalf("expected no err, got %s", err)
|
|
}
|
|
|
|
assertResolvedBinary(t, binary, false, false)
|
|
|
|
// Resolving a second time should return a cached binary
|
|
binary, err = manager.Resolve()
|
|
if err != nil {
|
|
t.Fatalf("expected no err, got %s", err)
|
|
}
|
|
|
|
assertResolvedBinary(t, binary, true, false)
|
|
|
|
// Change the local binary data
|
|
err = os.WriteFile(filepath.Join(filepath.Dir(binary.Path), ".version"), []byte("0.0.9"), 0644)
|
|
if err != nil {
|
|
t.Fatalf("could not write to .binary file: %s", err)
|
|
}
|
|
|
|
binary, err = manager.Resolve()
|
|
if err != nil {
|
|
t.Fatalf("expected no err, got %s", err)
|
|
}
|
|
|
|
assertResolvedBinary(t, binary, false, false)
|
|
|
|
// Set a dev override
|
|
manager.overridePath = "testdata/cloudplugin-dev"
|
|
binary, err = manager.Resolve()
|
|
if err != nil {
|
|
t.Fatalf("expected no err, got %s", err)
|
|
}
|
|
|
|
assertResolvedBinary(t, binary, false, true)
|
|
}
|