// 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) }