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  }