github.com/mmcquillan/packer@v1.1.1-0.20171009221028-c85cf0483a5d/builder/oracle/oci/client/transport_test.go (about)

     1  package oci
     2  
     3  import (
     4  	"net/http"
     5  	"strings"
     6  	"testing"
     7  )
     8  
     9  const testKey = `-----BEGIN RSA PRIVATE KEY-----
    10  MIIEpQIBAAKCAQEAyLnyzmYj0dZuDo2nclIdEyLZrFZLtw5xFldWpCUl5W3SxKDL
    11  iIgwxpSO75Yf++Rzqc5j6S5bpIrdca6AwVXCNmjjxMPO7vLLm4l4IUOZMv5FqKaC
    12  I2plFz9uBkzGscnYnMbsDA430082E07lYpNv1xy8JwpbrIsqIMh4XCKci/Od5sLR
    13  kEicmOpQK42FGRTQjjmQoWtv+9XED+vYTRL0AxQEC/6i/E7yssFXZ+fpHSKWeKTQ
    14  K/1Fc4pZ1zNzJcDXGuweISx/QMLz78TAPH5OBq/EQzHKSpKvfnWFRyBHne8pwuN8
    15  8wzbbD+/7OFjz28jNSERVJvfYe3X1k69IWMNGwIDAQABAoIBAQCZhcdU38AzxSrG
    16  DMfuYymDslsEObiNWQlbig9lWlhCwx26cDVbxrZvm747NvpdgVyJmqbF+UP0dJVs
    17  Voh51qrFTLIwk4bZMXBTFPCBmJ865knG9RuCFOUew8/WF7C82GHJf0eY7OL7xpDY
    18  cbZ2D8gxofOydHSrYoElM88CwSI00xPCbBKEMrBO94oXC8yfp2bmV6bNhVXwFDEM
    19  qda7M6jVAsBrTOzxUF5VdUUU/MLsu2cCk/ap1zer2Bml9Afk1bMeGJ3XDQgol0pS
    20  CLxaGczpSNVMF9+pjA5sFHR5rmcl0b/kC9HsgOJGhLOimtS94O64dSdWifgsjf6+
    21  fhT2SMiRAoGBAOUDwkdzNqQfvS+qrP2ULpB4vt7MZ70rDGmyMDLZ1VWgcm2cDIad
    22  b7MkFG6GCa48mKkFXK9mOPyq8ELoTjZo2p+relEqf49BpaNxr+cp11pX7g0AkzCa
    23  a8LwdOOUW/poqYl2xLuw9Rz6ky6ybzatMvCwpQCwnbAdABIVxz4oQKHpAoGBAOBg
    24  3uYC/ynGdF9gJTfdS5XPYoLcKKRRspBZrvvDHaWyBnanm5KYwDAZPzLQMqcpyPeo
    25  5xgwMmtNlc6lKKyGkhSLNCV+eO3yAx1h/cq7ityvMS7u6o5sq+/bvtEnbUPYbEtk
    26  AhVD7/w5Yyzzi4beiQxDKe0q1mvUAH56aGqJivBjAoGBALmUMTPbDhUzTwg4Y1Rd
    27  ZtpVrj43H31wS+++oEYktTZc/T0LLi9Llr9w5kmlvmR94CtfF/ted6FwF5/wRajb
    28  kQXAXC83pAR/au0mbCeDhWpFRLculxfUmqxuVBozF9G0TGYDY2rA+++OsgQuPebt
    29  tRDL4/nKJQ4Ygf0lvr4EulM5AoGBALoIdyabu3WmfhwJujH8P8wA+ztmUCgVOIio
    30  YwWIe49C8Er2om1ESqxWcmit6CFi6qY0Gw6Z/2OqGxgPJY8NsBZqaBziJF+cdWqq
    31  MWMiZXqdopi4LC9T+KZROn9tQhGrYfaL/5IkFti3t/uwHbH/1f8dvKhQCSGzz4kN
    32  8n7KdTDjAoGAKh8XdIOQlThFK108VT2yp4BGZXEOvWrR19DLbuUzHVrEX+Bd+uFo
    33  Ruk9iKEH7PSnlRnIvWc1y9qN7fUi5OR3LvQNGlXHyUl6CtmH3/b064bBKudC+XTn
    34  VBelcIoGpH7Dn9I6pKUFauJz1TSbQCIjYGNqrjyzLtG+lH/gy5q4xs8=
    35  -----END RSA PRIVATE KEY-----`
    36  
    37  type testTarget struct {
    38  	CapturedReq *http.Request
    39  	Response    *http.Response
    40  }
    41  
    42  func (target *testTarget) RoundTrip(req *http.Request) (*http.Response, error) {
    43  	target.CapturedReq = req
    44  	return target.Response, nil
    45  }
    46  
    47  func testReq(method string, url string, body string, headers map[string]string) *http.Request {
    48  	req, err := http.NewRequest(method, url, strings.NewReader(body))
    49  	if err != nil {
    50  		panic(err.Error())
    51  	}
    52  
    53  	for k, v := range headers {
    54  		req.Header.Add(k, v)
    55  	}
    56  	return req
    57  }
    58  
    59  var KnownGoodCases = []struct {
    60  	name            string
    61  	inputRequest    func() *http.Request
    62  	expectedHeaders map[string]string
    63  }{
    64  	{
    65  		name: "Simple GET",
    66  		inputRequest: func() *http.Request {
    67  			return testReq("GET", "https://example.com/", "", map[string]string{
    68  				"date": "Mon, 26 Sep 2016 11:04:22 GMT"})
    69  		},
    70  		expectedHeaders: map[string]string{
    71  			"date":          "Mon, 26 Sep 2016 11:04:22 GMT",
    72  			"content-type":  "application/json",
    73  			"host":          "example.com",
    74  			"accept":        "application/json",
    75  			"Authorization": "Signature headers=\"date host (request-target)\",keyId=\"tenant/testuser/3c:b6:44:d7:49:1a:ac:bf:de:7d:76:22:a7:f5:df:55\",algorithm=\"rsa-sha256\",signature=\"UMw/FImQYZ5JBpfYcR9YN72lhupGl5yS+522NS9glLodU9f4oKRqaocpGdSUSRhhSDKxIx01rV547/HemJ6QqEPaJJuDQPXsGthokWMU2DBGyaMAqhLClgCJiRQMwpg4rdL2tETzkM3wy6UN+I52RYoNSdsnat2ZArCkfl8dIl9ydcwD8/+BqB8d2wyaAIS4iagdPKLAC/Mu9OzyUPOXQhYGYsoEdOowOUkHOlob65PFrlHmKJDdjEF3MDcygEpApItf4iUEloP5bjixAbZEVpj3HLQ5uaPx9m+RsLzYMeO0adE0wOv2YNmwZrExGhXh1BpTU33m5amHeUBxSaG+2A==\",version=\"1\"",
    76  		},
    77  	},
    78  	{
    79  		name: "Simple PUT request",
    80  		inputRequest: func() *http.Request {
    81  			return testReq("PUT", "https://example.com/", "Some Content", map[string]string{
    82  				"date": "Mon, 26 Sep 2016 11:04:22 GMT"})
    83  		},
    84  		expectedHeaders: map[string]string{
    85  			"date":             "Mon, 26 Sep 2016 11:04:22 GMT",
    86  			"content-type":     "application/json",
    87  			"content-length":   "12",
    88  			"x-content-sha256": "lQ8fsURxamLtHxnwTYqd3MNYadJ4ZB/U9yQBKzu/fXA=",
    89  			"accept":           "application/json",
    90  			"Authorization":    "Signature headers=\"(request-target) host date content-length content-type x-content-sha256\",keyId=\"tenant/testuser/3c:b6:44:d7:49:1a:ac:bf:de:7d:76:22:a7:f5:df:55\",algorithm=\"rsa-sha256\",signature=\"FHyPt4PE2HGH+iftzcViB76pCJ2R9+DdTCo1Ss4mH4KHQJdyQtPsCpe6Dc19zie6cRr6dsenk21yYnncic8OwZhII8DULj2//qLFGmgFi84s7LJqMQ/COiP7O9KtCN+U8MMt4PV7ZDsiGFn3/8EUJ1wxYscxSIB19S1NpuEL062JgGfkqxTkTPd7V3Xh1NlmUUtQrAMR3l56k1iV0zXY9Uw0CjWYjueMP0JUmkO7zycYAVBrx7Q8wkmejlyD7yFrAnObyEsMm9cIL9IcruWFHeCHFxRLslw7AoLxibAm2Dc9EROuvCK2UkUp8AFkE+QyYDMrrSm1NLBMWdnYqdickA==\",version=\"1\"",
    91  		},
    92  	},
    93  	{
    94  		name: "Simple POST request",
    95  		inputRequest: func() *http.Request {
    96  			return testReq("POST", "https://example.com/", "Some Content", map[string]string{
    97  				"date": "Mon, 26 Sep 2016 11:04:22 GMT"})
    98  		},
    99  		expectedHeaders: map[string]string{
   100  			"date":             "Mon, 26 Sep 2016 11:04:22 GMT",
   101  			"content-type":     "application/json",
   102  			"content-length":   "12",
   103  			"x-content-sha256": "lQ8fsURxamLtHxnwTYqd3MNYadJ4ZB/U9yQBKzu/fXA=",
   104  			"accept":           "application/json",
   105  			"Authorization":    "Signature headers=\"(request-target) host date content-length content-type x-content-sha256\",keyId=\"tenant/testuser/3c:b6:44:d7:49:1a:ac:bf:de:7d:76:22:a7:f5:df:55\",algorithm=\"rsa-sha256\",signature=\"WzGIoySkjqydwabMTxjVs05UBu0hThAEBzVs7HbYO45o2XpaoqGiNX67mNzs1PeYrGHpJp8+Ysoz66PChWV/1trxuTU92dQ/FgwvcwBRy5dQvdLkjWCZihNunSk4gt9652w6zZg/ybLon0CFbLRnlanDJDX9BgR3ttuTxf30t5qr2A4fnjFF4VjaU/CzE13cNfaWftjSd+xNcla2sbArF3R0+CEEb0xZEPzTyjjjkyvXdaPZwEprVn8IDmdJvLmRP4EniAPxE1EZIhd712M5ondQkR4/WckM44/hlKDeXGFb4y+QnU02i4IWgOWs3dh2tuzS1hp1zfq7qgPbZ4hp0A==\",version=\"1\"",
   106  		},
   107  	},
   108  
   109  	{
   110  		name: "Simple DELETE",
   111  		inputRequest: func() *http.Request {
   112  			return testReq("DELETE", "https://example.com/", "Some Content", map[string]string{
   113  				"date": "Mon, 26 Sep 2016 11:04:22 GMT"})
   114  		},
   115  		expectedHeaders: map[string]string{
   116  			"date":          "Mon, 26 Sep 2016 11:04:22 GMT",
   117  			"content-type":  "application/json",
   118  			"accept":        "application/json",
   119  			"Authorization": "Signature headers=\"date host (request-target)\",keyId=\"tenant/testuser/3c:b6:44:d7:49:1a:ac:bf:de:7d:76:22:a7:f5:df:55\",algorithm=\"rsa-sha256\",signature=\"Kj4YSpONZG1cibLbNgxIp4VoS5+80fsB2Fh2Ue28+QyXq4wwrJpMP+8jEupz1yTk1SNPYuxsk7lNOgtI6G1Hq0YJJVum74j46sUwRWe+f08tMJ3c9J+rrzLfpIrakQ8PaudLhHU0eK5kuTZme1dCwRWXvZq3r5IqkGot/OGMabKpBygRv9t0i5ry+bTslSjMqafTWLosY9hgIiGrXD+meB5tpyn+gPVYc//Hc/C7uNNgLJIMk5DKVa4U0YnoY3ojafZTXZQQNGRn2NDMcZUX3f3nJlUIfiZRiOCTkbPwx/fWb4MZtYaEsY5OPficbJRvfOBxSG1wjX+8rgO7ijhMAA==\",version=\"1\"",
   120  		},
   121  	},
   122  }
   123  
   124  func TestKnownGoodRequests(t *testing.T) {
   125  	pKey, err := ParsePrivateKey([]byte(testKey), []byte{})
   126  	if err != nil {
   127  		t.Fatalf("Failed to parse test key: %s", err.Error())
   128  	}
   129  
   130  	config := &Config{
   131  		Key:         pKey,
   132  		User:        "testuser",
   133  		Tenancy:     "tenant",
   134  		Fingerprint: "3c:b6:44:d7:49:1a:ac:bf:de:7d:76:22:a7:f5:df:55",
   135  	}
   136  
   137  	expectedResponse := &http.Response{}
   138  	for _, tt := range KnownGoodCases {
   139  		targetBackend := &testTarget{Response: expectedResponse}
   140  		target := NewTransport(targetBackend, config)
   141  
   142  		_, err = target.RoundTrip(tt.inputRequest())
   143  		if err != nil {
   144  			t.Fatalf("%s: Failed to handle request %s", tt.name, err.Error())
   145  		}
   146  
   147  		sentReq := targetBackend.CapturedReq
   148  
   149  		for header, val := range tt.expectedHeaders {
   150  			if sentReq.Header.Get(header) != val {
   151  				t.Fatalf("%s: Header mismatch in responnse,\n\t expecting \"%s\"\n\t got \"%s\"", tt.name, val, sentReq.Header.Get(header))
   152  			}
   153  		}
   154  	}
   155  
   156  }