// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 package pluginshared import ( "fmt" "io" "net/http" "net/http/httptest" "os" "path/filepath" "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: path := filepath.Clean(r.URL.Path) fileToSend, err := os.Open(fmt.Sprintf("testdata/%s", 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 }