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  `