mirror of
https://github.com/hashicorp/terraform.git
synced 2026-02-03 20:50:59 -05:00
Changes the release manifest format to more closely match the releases API V1 (example https://api.releases.hashicorp.com/v1/releases/terraform-cloudplugin/0.1.0-prototype) - The new format doesn't carry the SHASUM for each build, so it made the matching_sums check in releaseauth redundant. - Added tests for checksum parsing - Added ID-based selection of signature file
86 lines
2.3 KiB
Go
86 lines
2.3 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package cloudplugin
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
var testManifest = `{
|
|
"builds": [
|
|
{
|
|
"arch": "amd64",
|
|
"os": "darwin",
|
|
"url": "/archives/terraform-cloudplugin_0.1.0_darwin_amd64.zip"
|
|
}
|
|
],
|
|
"is_prerelease": true,
|
|
"license_class": "ent",
|
|
"name": "terraform-cloudplugin",
|
|
"status": {
|
|
"state": "supported",
|
|
"timestamp_updated": "2023-07-31T15:18:20.243Z"
|
|
},
|
|
"timestamp_created": "2023-07-31T15:18:20.243Z",
|
|
"timestamp_updated": "2023-07-31T15:18:20.243Z",
|
|
"url_changelog": "https://github.com/hashicorp/terraform-cloudplugin/blob/main/CHANGELOG.md",
|
|
"url_license": "https://github.com/hashicorp/terraform-cloudplugin/blob/main/LICENSE",
|
|
"url_project_website": "https://www.terraform.io/",
|
|
"url_shasums": "/archives/terraform-cloudplugin_0.1.0_SHA256SUMS",
|
|
"url_shasums_signatures": [
|
|
"/archives/terraform-cloudplugin_0.1.0_SHA256SUMS.sig",
|
|
"/archives/terraform-cloudplugin_0.1.0_SHA256SUMS.72D7468F.sig"
|
|
],
|
|
"url_source_repository": "https://github.com/hashicorp/terraform-cloudplugin",
|
|
"version": "0.1.0"
|
|
}`
|
|
|
|
var (
|
|
// This is the same as timestamp_updated above
|
|
testManifestLastModified, _ = time.Parse(time.RFC3339, "2023-07-31T15:18:20Z")
|
|
)
|
|
|
|
type testHTTPHandler struct {
|
|
}
|
|
|
|
func (h *testHTTPHandler) Handle(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodGet {
|
|
w.WriteHeader(http.StatusNotFound)
|
|
w.Write([]byte("404 Not Found"))
|
|
}
|
|
|
|
switch r.URL.Path {
|
|
case "/api/cloudplugin/v1/manifest.json":
|
|
ifModifiedSince, _ := time.Parse(http.TimeFormat, r.Header.Get("If-Modified-Since"))
|
|
w.Header().Set("Last-Modified", testManifestLastModified.Format(http.TimeFormat))
|
|
|
|
if ifModifiedSince.Equal(testManifestLastModified) || testManifestLastModified.Before(ifModifiedSince) {
|
|
w.WriteHeader(http.StatusNotModified)
|
|
} else {
|
|
w.Write([]byte(testManifest))
|
|
}
|
|
default:
|
|
fileToSend, err := os.Open(fmt.Sprintf("testdata/%s", r.URL.Path))
|
|
if err == nil {
|
|
io.Copy(w, fileToSend)
|
|
return
|
|
}
|
|
|
|
w.WriteHeader(http.StatusNotFound)
|
|
w.Write([]byte("404 Not Found"))
|
|
}
|
|
}
|
|
|
|
func newCloudPluginManifestHTTPTestServer(t *testing.T) (*httptest.Server, error) {
|
|
t.Helper()
|
|
|
|
handler := new(testHTTPHandler)
|
|
return httptest.NewServer(http.HandlerFunc(handler.Handle)), nil
|
|
}
|