github.com/lymingtonprecision/terraform@v0.9.9-0.20170613092852-62acef9611a9/plugin/discovery/get_test.go (about) 1 package discovery 2 3 import ( 4 "archive/zip" 5 "fmt" 6 "io" 7 "io/ioutil" 8 "net/http" 9 "net/http/httptest" 10 "os" 11 "path/filepath" 12 "regexp" 13 "runtime" 14 "strings" 15 "testing" 16 ) 17 18 const testProviderFile = "test provider binary" 19 20 // return the directory listing for the "test" provider 21 func testListingHandler(w http.ResponseWriter, r *http.Request) { 22 w.Write([]byte(versionList)) 23 } 24 25 // returns a 200 for a valid provider url, using the patch number for the 26 // plugin protocol version. 27 func testHandler(w http.ResponseWriter, r *http.Request) { 28 if r.URL.Path == "/terraform-provider-test/" { 29 testListingHandler(w, r) 30 return 31 } 32 33 parts := strings.Split(r.URL.Path, "/") 34 if len(parts) != 4 { 35 http.Error(w, "not found", http.StatusNotFound) 36 return 37 } 38 39 filename := parts[3] 40 41 reg := regexp.MustCompile(`(terraform-provider-test_(\d).(\d).(\d)_([^_]+)_([^._]+)).zip`) 42 43 fileParts := reg.FindStringSubmatch(filename) 44 if len(fileParts) != 7 { 45 http.Error(w, "invalid provider: "+filename, http.StatusNotFound) 46 return 47 } 48 49 w.Header().Set(protocolVersionHeader, fileParts[4]) 50 51 // write a dummy file 52 z := zip.NewWriter(w) 53 f, err := z.Create(fileParts[1] + "_X" + fileParts[4]) 54 if err != nil { 55 panic(err) 56 } 57 io.WriteString(f, testProviderFile) 58 z.Close() 59 } 60 61 func testReleaseServer() *httptest.Server { 62 handler := http.NewServeMux() 63 handler.HandleFunc("/terraform-provider-test/", testHandler) 64 65 return httptest.NewServer(handler) 66 } 67 68 func TestMain(m *testing.M) { 69 server := testReleaseServer() 70 releaseHost = server.URL 71 72 os.Exit(m.Run()) 73 } 74 75 func TestVersionListing(t *testing.T) { 76 versions, err := listProviderVersions("test") 77 if err != nil { 78 t.Fatal(err) 79 } 80 81 Versions(versions).Sort() 82 83 expected := []string{ 84 "1.2.4", 85 "1.2.3", 86 "1.2.1", 87 } 88 89 if len(versions) != len(expected) { 90 t.Fatalf("Received wrong number of versions. expected: %q, got: %q", expected, versions) 91 } 92 93 for i, v := range versions { 94 if v.String() != expected[i] { 95 t.Fatalf("incorrect version: %q, expected %q", v, expected[i]) 96 } 97 } 98 } 99 100 func TestCheckProtocolVersions(t *testing.T) { 101 if checkPlugin(providerURL("test", VersionStr("1.2.3").MustParse().String()), 4) { 102 t.Fatal("protocol version 4 is not compatible") 103 } 104 105 if !checkPlugin(providerURL("test", VersionStr("1.2.3").MustParse().String()), 3) { 106 t.Fatal("protocol version 3 should be compatible") 107 } 108 } 109 110 func TestGetProvider(t *testing.T) { 111 tmpDir, err := ioutil.TempDir("", "tf-plugin") 112 if err != nil { 113 t.Fatal(err) 114 } 115 116 defer os.RemoveAll(tmpDir) 117 118 // attempt to use an incompatible protocol version 119 err = GetProvider(tmpDir, "test", AllVersions, 5) 120 if err == nil { 121 t.Fatal("protocol version is incompatible") 122 } 123 124 err = GetProvider(tmpDir, "test", AllVersions, 3) 125 if err != nil { 126 t.Fatal(err) 127 } 128 129 // we should have version 1.2.3 130 fileName := fmt.Sprintf("terraform-provider-test_1.2.3_%s_%s_X3", runtime.GOOS, runtime.GOARCH) 131 dest := filepath.Join(tmpDir, fileName) 132 f, err := ioutil.ReadFile(dest) 133 if err != nil { 134 t.Fatal(err) 135 } 136 137 // provider should have been unzipped 138 if string(f) != testProviderFile { 139 t.Fatalf("test provider contains: %q", f) 140 } 141 142 } 143 144 const versionList = `<!DOCTYPE html> 145 <html> 146 <body> 147 <ul> 148 <li> 149 <a href="../">../</a> 150 </li> 151 <li> 152 <a href="/terraform-provider-test/1.2.3/">terraform-provider-test_1.2.3</a> 153 </li> 154 <li> 155 <a href="/terraform-provider-test/1.2.1/">terraform-provider-test_1.2.1</a> 156 </li> 157 <li> 158 <a href="/terraform-provider-test/1.2.4/">terraform-provider-test_1.2.4</a> 159 </li> 160 </ul> 161 <footer> 162 Proudly fronted by <a href="https://fastly.com/?utm_source=hashicorp" target="_TOP">Fastly</a> 163 </footer> 164 </body> 165 </html> 166 `