@@ -2,7 +2,11 @@ package cos
22
33import (
44 "context"
5+ "fmt"
56 "net/http"
7+ "net/http/httptest"
8+ "strconv"
9+ "strings"
610 "testing"
711 "time"
812)
@@ -52,3 +56,70 @@ func TestAuthorizationTransport(t *testing.T) {
5256 req , _ := http .NewRequest ("GET" , client .BaseURL .BucketURL .String (), nil )
5357 client .doAPI (context .Background (), req , nil , true )
5458}
59+
60+ func TestCVMCredentialsTransport (t * testing.T ) {
61+ setup ()
62+ defer teardown ()
63+ uri := client .BaseURL .BucketURL .String ()
64+ ak := "test_ak"
65+ sk := "test_sk"
66+ token := "test_token"
67+
68+ mux .HandleFunc ("/" , func (w http.ResponseWriter , r * http.Request ) {
69+ if r .Header .Get ("x-cos-security-token" ) != token {
70+ t .Errorf ("CVMCredentialsTransport x-cos-security-token error, want:%v, return:%v\n " , token , r .Header .Get ("x-cos-security-token" ))
71+ }
72+ auth := r .Header .Get ("Authorization" )
73+ if auth == "" {
74+ t .Error ("CVMCredentialsTransport didn't add Authorization header" )
75+ }
76+ field := strings .Split (auth , "&" )
77+ if len (field ) != 7 {
78+ t .Errorf ("CVMCredentialsTransport Authorization header format error: %v\n " , auth )
79+ }
80+ st_et := strings .Split (strings .Split (field [2 ], "=" )[1 ], ";" )
81+ st , _ := strconv .ParseInt (st_et [0 ], 10 , 64 )
82+ et , _ := strconv .ParseInt (st_et [1 ], 10 , 64 )
83+ authTime := & AuthTime {
84+ SignStartTime : time .Unix (st , 0 ),
85+ SignEndTime : time .Unix (et , 0 ),
86+ KeyStartTime : time .Unix (st , 0 ),
87+ KeyEndTime : time .Unix (et , 0 ),
88+ }
89+ host := strings .TrimLeft (uri , "http://" )
90+ req , _ := http .NewRequest ("GET" , uri , nil )
91+ req .Header .Add ("Host" , host )
92+ expect := newAuthorization (ak , sk , req , authTime )
93+ if expect != auth {
94+ t .Errorf ("CVMCredentialsTransport Authorization error, want:%v, return:%v\n " , expect , auth )
95+ }
96+ })
97+
98+ // CVM http server
99+ cvm_mux := http .NewServeMux ()
100+ cvm_server := httptest .NewServer (cvm_mux )
101+ defer cvm_server .Close ()
102+ // 将默认 CVM Host 修改成测试IP:PORT
103+ defaultCVMMetaHost = strings .TrimLeft (cvm_server .URL , "http://" )
104+
105+ cvm_mux .HandleFunc ("/" + defaultCVMCredURI , func (w http.ResponseWriter , r * http.Request ) {
106+ fmt .Fprint (w , "cvm_read_cos_only" )
107+ })
108+ cvm_mux .HandleFunc ("/" + defaultCVMCredURI + "/cvm_read_cos_only" , func (w http.ResponseWriter , r * http.Request ) {
109+ fmt .Fprint (w , fmt .Sprintf (`{
110+ "TmpSecretId": "%s",
111+ "TmpSecretKey": "%s",
112+ "ExpiredTime": %v,
113+ "Expiration": "now",
114+ "Token": "%s",
115+ "Code": "Success"
116+ }` , ak , sk , time .Now ().Unix ()+ 3600 , token ))
117+ })
118+
119+ client .client .Transport = & CVMCredentialsTransport {}
120+ req , _ := http .NewRequest ("GET" , client .BaseURL .BucketURL .String (), nil )
121+ client .doAPI (context .Background (), req , nil , true )
122+
123+ req , _ = http .NewRequest ("GET" , client .BaseURL .BucketURL .String (), nil )
124+ client .doAPI (context .Background (), req , nil , true )
125+ }
0 commit comments