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 }