github.com/qiniu/go-sdk/v7@v7.27.0/auth/credentials_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package auth 5 6 import ( 7 "io" 8 "net/http" 9 "strings" 10 "testing" 11 ) 12 13 var at *Credentials 14 15 func init() { 16 at = New("ak", "sk") 17 } 18 19 func TestNew(t *testing.T) { 20 if at.AccessKey != "ak" || string(at.SecretKey) != "sk" { 21 t.Fail() 22 } 23 } 24 25 func TestAuthSign(t *testing.T) { 26 testStrs := []struct { 27 Data string 28 Signed string 29 }{ 30 {Data: "hello", Signed: "ak:NDN8cM0rwosxhHJ6QAcI7ialr0g="}, 31 {Data: "world", Signed: "ak:wZ-sw41ayh3PFDmQA-D3o7eBJIY="}, 32 {Data: "-test", Signed: "ak:oJ59sZasiWSqL1o7ugZs5OInEK4="}, 33 {Data: "ba#a-", Signed: "ak:tqHL8V2BbNI0dVDXsvueZp_2QnI="}, 34 } 35 36 for _, b := range testStrs { 37 got := at.Sign([]byte(b.Data)) 38 if got != b.Signed { 39 t.Errorf("Sign %q, want=%q, got=%q\n", b.Data, b.Signed, got) 40 } 41 } 42 } 43 44 func TestAuthSignWithData(t *testing.T) { 45 testStrs := []struct { 46 Data string 47 Signed string 48 }{ 49 {Data: "hello", Signed: "ak:2pn0qs-2kfEsQFuHI2pAYlo0hpc=:aGVsbG8="}, 50 {Data: "world", Signed: "ak:vzqcP6VeODVu_youBJnyr_nefT4=:d29ybGQ="}, 51 {Data: "-test", Signed: "ak:uV60zWZgj-Jbrg9VHc06Nok64Bw=:LXRlc3Q="}, 52 {Data: "ba#a-", Signed: "ak:RLvTUx_kizrrbpSrinkdxC4jCy8=:YmEjYS0="}, 53 } 54 for _, b := range testStrs { 55 got := at.SignWithData([]byte(b.Data)) 56 if got != b.Signed { 57 t.Errorf("SignWithData %q, want=%q, got=%q\n", b.Data, b.Signed, got) 58 } 59 } 60 } 61 62 func TestCollectData(t *testing.T) { 63 inputs := []ReqParams{ 64 {Method: "", Url: "", Headers: nil, Body: strings.NewReader(`{"name": "test"}`)}, 65 {Method: "", Url: "", Headers: http.Header{"Content-Type": []string{"application/json"}}, Body: strings.NewReader(`{"name": "test"}`)}, 66 {Method: "GET", Url: "", Headers: nil, Body: strings.NewReader(`{"name": "test"}`)}, 67 {Method: "POST", Url: "", Headers: http.Header{"Content-Type": []string{"application/json"}}, Body: strings.NewReader(`{"name": "test"}`)}, 68 {Method: "", Url: "http://upload.qiniup.com", Headers: nil, Body: strings.NewReader(`{"name": "test"}`)}, 69 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"Content-Type": []string{"application/json"}}, Body: strings.NewReader(`{"name": "test"}`)}, 70 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"Content-Type": []string{"application/x-www-form-urlencoded"}}, Body: strings.NewReader(`name=test&language=go`)}, 71 {Method: "", Url: "http://upload.qiniup.com?v=2", Headers: http.Header{"Content-Type": []string{"application/x-www-form-urlencoded"}}, Body: strings.NewReader(`name=test&language=go`)}, 72 {Method: "", Url: "http://upload.qiniup.com/find/sdk?v=2", Headers: http.Header{"Content-Type": []string{"application/x-www-form-urlencoded"}}, Body: strings.NewReader(`name=test&language=go`)}, 73 } 74 wants := []string{"\n", "\n", "\n", "\n", "\n", "\n", "\nname=test&language=go", "?v=2\nname=test&language=go", "/find/sdk?v=2\nname=test&language=go"} 75 reqs, gErr := genRequests(inputs) 76 if gErr != nil { 77 t.Errorf("generate requests: %v\n", gErr) 78 } 79 80 for ind, req := range reqs { 81 data, err := collectData(req) 82 if err != nil { 83 t.Error("collectData: ", err) 84 } 85 if string(data) != wants[ind] { 86 t.Errorf("collectData, want = %q, got = %q\n", wants[ind], data) 87 } 88 } 89 } 90 91 func TestCollectDataV2(t *testing.T) { 92 inputs := []ReqParams{ 93 {Method: "", Url: "", Headers: http.Header{"Content-Type": []string{"application/json"}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 94 {Method: "", Url: "", Headers: http.Header{"X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 95 {Method: "", Url: "", Headers: http.Header{"Content-Type": []string{"application/json"}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 96 {Method: "GET", Url: "", Headers: http.Header{"X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 97 {Method: "POST", Url: "", Headers: http.Header{"Content-Type": []string{"application/json"}}, Body: strings.NewReader(`{"name": "test"}`)}, 98 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"X-Qiniu-BBB": []string{"BBB", "AAA"}, "X-Qiniu-AAA": []string{"DDD", "CCC"}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 99 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"Content-Type": []string{"application/json"}, "X-Qiniu-BBB": []string{"BBB", "AAA"}, "X-Qiniu-AAA": []string{"DDD", "CCC"}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 100 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"Content-Type": []string{"application/x-www-form-urlencoded"}, "X-Qiniu-BBB": []string{"BBB", "AAA"}, "X-Qiniu-AAA": []string{"DDD", "CCC"}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`name=test&language=go`)}, 101 {Method: "", Url: "http://upload.qiniup.com?v=2", Headers: http.Header{"Content-Type": []string{"application/x-www-form-urlencoded"}, "X-Qiniu-BBB": []string{"BBB", "AAA"}, "X-Qiniu-AAA": []string{"DDD", "CCC"}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`name=test&language=go`)}, 102 {Method: "", Url: "http://upload.qiniup.com/find/sdk?v=2", Headers: http.Header{"Content-Type": []string{"application/x-www-form-urlencoded"}, "X-Qiniu-BBB": []string{"BBB", "AAA"}, "X-Qiniu-AAA": []string{"DDD", "CCC"}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`name=test&language=go`)}, 103 } 104 105 wants := []string{ 106 "GET \nHost: \nContent-Type: application/json\n\n{\"name\": \"test\"}", 107 "GET \nHost: \nContent-Type: application/x-www-form-urlencoded\n\n{\"name\": \"test\"}", 108 "GET \nHost: \nContent-Type: application/json\n\n{\"name\": \"test\"}", 109 "GET \nHost: \nContent-Type: application/x-www-form-urlencoded\n\n{\"name\": \"test\"}", 110 "POST \nHost: \nContent-Type: application/json\n\n{\"name\": \"test\"}", 111 "GET \nHost: upload.qiniup.com\nContent-Type: application/x-www-form-urlencoded\nX-Qiniu-Aaa: \nX-Qiniu-Bbb: \n\n{\"name\": \"test\"}", 112 "GET \nHost: upload.qiniup.com\nContent-Type: application/json\nX-Qiniu-Aaa: \nX-Qiniu-Bbb: \n\n{\"name\": \"test\"}", 113 "GET \nHost: upload.qiniup.com\nContent-Type: application/x-www-form-urlencoded\nX-Qiniu-Aaa: \nX-Qiniu-Bbb: \n\nname=test&language=go", 114 "GET ?v=2\nHost: upload.qiniup.com\nContent-Type: application/x-www-form-urlencoded\nX-Qiniu-Aaa: \nX-Qiniu-Bbb: \n\nname=test&language=go", 115 "GET /find/sdk?v=2\nHost: upload.qiniup.com\nContent-Type: application/x-www-form-urlencoded\nX-Qiniu-Aaa: \nX-Qiniu-Bbb: \n\nname=test&language=go", 116 } 117 reqs, gErr := genRequests(inputs) 118 if gErr != nil { 119 t.Errorf("generate requests: %v\n", gErr) 120 } 121 122 for ind, req := range reqs { 123 data, err := collectDataV2(req) 124 if err != nil { 125 t.Error("collectDataV2: ", err) 126 } 127 if string(data) != wants[ind] { 128 t.Errorf("index:%d collectDataV2, want = %q, got = %q\n", ind, wants[ind], data) 129 } 130 } 131 } 132 133 func genRequest(method, url string, headers http.Header, body io.Reader) (req *http.Request, err error) { 134 req, err = http.NewRequest(method, url, body) 135 if err != nil { 136 return 137 } 138 req.Header = headers 139 return 140 } 141 142 type ReqParams struct { 143 Method string 144 Url string 145 Headers http.Header 146 Body io.Reader 147 } 148 149 func genRequests(params []ReqParams) (reqs []*http.Request, err error) { 150 for _, reqParam := range params { 151 req, rErr := genRequest(reqParam.Method, reqParam.Url, reqParam.Headers, reqParam.Body) 152 if rErr != nil { 153 err = rErr 154 return 155 } 156 reqs = append(reqs, req) 157 } 158 return 159 } 160 161 func TestAuthSignRequest(t *testing.T) { 162 inputs := []ReqParams{ 163 {Method: "", Url: "", Headers: nil, Body: strings.NewReader(`{"name": "test"}`)}, 164 {Method: "", Url: "", Headers: http.Header{"Content-Type": []string{"application/json"}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 165 {Method: "GET", Url: "", Headers: nil, Body: strings.NewReader(`{"name": "test"}`)}, 166 {Method: "POST", Url: "", Headers: http.Header{"Content-Type": []string{"application/json"}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 167 {Method: "", Url: "http://upload.qiniup.com", Headers: nil, Body: strings.NewReader(`{"name": "test"}`)}, 168 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"Content-Type": []string{"application/json"}}, Body: strings.NewReader(`{"name": "test"}`)}, 169 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"Content-Type": []string{"application/x-www-form-urlencoded"}}, Body: strings.NewReader(`name=test&language=go`)}, 170 } 171 wants := []string{ 172 "ak:qfWnqF1E_vfzjZnReCVkcSMl29M=", 173 "ak:qfWnqF1E_vfzjZnReCVkcSMl29M=", 174 "ak:qfWnqF1E_vfzjZnReCVkcSMl29M=", 175 "ak:qfWnqF1E_vfzjZnReCVkcSMl29M=", 176 "ak:qfWnqF1E_vfzjZnReCVkcSMl29M=", 177 "ak:qfWnqF1E_vfzjZnReCVkcSMl29M=", 178 "ak:h8gBb1Adb2Jgoys1N8sRVAnNvpw=", 179 } 180 reqs, gErr := genRequests(inputs) 181 if gErr != nil { 182 t.Errorf("generate requests: %v\n", gErr) 183 } 184 for ind, req := range reqs { 185 got, sErr := at.SignRequest(req) 186 if sErr != nil { 187 t.Errorf("SignRequest: %v\n", sErr) 188 } 189 if got != wants[ind] { 190 t.Errorf("SignRequest, want = %q, got = %q\n", wants[ind], got) 191 } 192 } 193 } 194 195 func TestAuthSignRequestV2(t *testing.T) { 196 inputs := []ReqParams{ 197 {Method: "", Url: "", Headers: http.Header{"X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 198 {Method: "", Url: "", Headers: http.Header{"Content-Type": []string{"application/json"}}, Body: strings.NewReader(`{"name": "test"}`)}, 199 {Method: "GET", Url: "", Headers: http.Header{"X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 200 {Method: "POST", Url: "", Headers: http.Header{"Content-Type": []string{"application/json"}}, Body: strings.NewReader(`{"name": "test"}`)}, 201 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 202 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"Content-Type": []string{"application/json"}, "X-Qiniu-BBB": []string{"BBB", "AAA"}, "X-Qiniu-AAA": []string{"DDD", "CCC"}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 203 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"Content-Type": []string{"application/x-www-form-urlencoded"}, "X-Qiniu-BBB": []string{"BBB", "AAA"}, "X-Qiniu-AAA": []string{"DDD", "CCC"}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`name=test&language=go`)}, 204 } 205 wants := []string{ 206 "ak:0i1vKClRDWFyNkcTFzwcE7PzX74=", 207 "ak:K1DI0goT05yhGizDFE5FiPJxAj4=", 208 "ak:0i1vKClRDWFyNkcTFzwcE7PzX74=", 209 "ak:0ujEjW_vLRZxebsveBgqa3JyQ-w=", 210 "ak:GShw5NitGmd5TLoo38nDkGUofRw=", 211 "ak:-fB4yn26QtKrW3jb_owJha4-W1I=", 212 "ak:PSssnOFa3sUvpEjTfACJ9WWKBS4=", 213 } 214 reqs, gErr := genRequests(inputs) 215 if gErr != nil { 216 t.Errorf("generate requests: %v\n", gErr) 217 } 218 for ind, req := range reqs { 219 got, sErr := at.SignRequestV2(req) 220 if sErr != nil { 221 t.Errorf("SignRequest: %v\n", sErr) 222 } 223 if got != wants[ind] { 224 t.Errorf("index:%d SignRequest, want = %q, got = %q\n", ind, wants[ind], got) 225 } 226 } 227 } 228 229 func TestCredentials_IsIAMKey(t *testing.T) { 230 iam := New("IAM-9fVILnUAhAs8XocaM9b0vafT3PkoVvntPGofpqJt", "secretTest") 231 if !iam.IsIAMKey() { 232 t.Error("IsIAMKey failed") 233 } 234 iam.AccessKey = "accessTest" 235 if iam.IsIAMKey() { 236 t.Error("IsIAMKey failed") 237 } 238 } 239 240 func TestCredentials_VerifyCallback(t *testing.T) { 241 inputs := []ReqParams{ 242 {Method: "", Url: "", Headers: http.Header{"Authorization": []string{"QBox ak:qfWnqF1E_vfzjZnReCVkcSMl29M="}}}, 243 {Method: "", Url: "", Headers: http.Header{"Authorization": []string{"QBox ak:qfWnqF1E_vfzjZnReCVkcSMl29M="}, "Content-Type": []string{"application/json"}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 244 {Method: "GET", Url: "", Headers: http.Header{"Authorization": []string{"QBox ak:qfWnqF1E_vfzjZnReCVkcSMl29M="}}, Body: strings.NewReader(`{"name": "test"}`)}, 245 {Method: "POST", Url: "", Headers: http.Header{"Authorization": []string{"QBox ak:qfWnqF1E_vfzjZnReCVkcSMl29M="}, "Content-Type": []string{"application/json"}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 246 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"Authorization": []string{"QBox ak:qfWnqF1E_vfzjZnReCVkcSMl29M="}}, Body: strings.NewReader(`{"name": "test"}`)}, 247 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"Authorization": []string{"QBox ak:qfWnqF1E_vfzjZnReCVkcSMl29M="}, "Content-Type": []string{"application/json"}}, Body: strings.NewReader(`{"name": "test"}`)}, 248 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"Authorization": []string{"QBox ak:h8gBb1Adb2Jgoys1N8sRVAnNvpw="}, "Content-Type": []string{"application/x-www-form-urlencoded"}}, Body: strings.NewReader(`name=test&language=go`)}, 249 {Method: "", Url: "", Headers: http.Header{"Authorization": []string{"Qiniu ak:0i1vKClRDWFyNkcTFzwcE7PzX74="}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 250 {Method: "", Url: "", Headers: http.Header{"Authorization": []string{"Qiniu ak:K1DI0goT05yhGizDFE5FiPJxAj4="}, "Content-Type": []string{"application/json"}}, Body: strings.NewReader(`{"name": "test"}`)}, 251 {Method: "GET", Url: "", Headers: http.Header{"Authorization": []string{"Qiniu ak:0i1vKClRDWFyNkcTFzwcE7PzX74="}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 252 {Method: "POST", Url: "", Headers: http.Header{"Authorization": []string{"Qiniu ak:0ujEjW_vLRZxebsveBgqa3JyQ-w="}, "Content-Type": []string{"application/json"}}, Body: strings.NewReader(`{"name": "test"}`)}, 253 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"Authorization": []string{"Qiniu ak:GShw5NitGmd5TLoo38nDkGUofRw="}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 254 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"Authorization": []string{"Qiniu ak:-fB4yn26QtKrW3jb_owJha4-W1I="}, "Content-Type": []string{"application/json"}, "X-Qiniu-BBB": []string{"BBB", "AAA"}, "X-Qiniu-AAA": []string{"DDD", "CCC"}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`{"name": "test"}`)}, 255 {Method: "", Url: "http://upload.qiniup.com", Headers: http.Header{"Authorization": []string{"Qiniu ak:PSssnOFa3sUvpEjTfACJ9WWKBS4="}, "Content-Type": []string{"application/x-www-form-urlencoded"}, "X-Qiniu-BBB": []string{"BBB", "AAA"}, "X-Qiniu-AAA": []string{"DDD", "CCC"}, "X-Qiniu-": []string{"a"}, "X-Qiniu": []string{"b"}}, Body: strings.NewReader(`name=test&language=go`)}, 256 } 257 reqs, gErr := genRequests(inputs) 258 if gErr != nil { 259 t.Errorf("generate requests: %v\n", gErr) 260 } 261 262 for ind, req := range reqs { 263 if ok, err := at.VerifyCallback(req); !ok { 264 t.Errorf("index:%d verify error:%+v\n", ind, err) 265 } 266 } 267 }