blob: f14df7b8b9215e0decc70140b6aa41b8b475fc00 [file] [log] [blame]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package cloudplugin
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 := NewBinaryManager(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)
}