@@ -60,6 +60,40 @@ func TestAuthorizationTransport(t *testing.T) {
6060 client .GetCredential ()
6161}
6262
63+ func TestAuthorizationTransportErr (t * testing.T ) {
64+ setup ()
65+ defer teardown ()
66+
67+ mux .HandleFunc ("/" , func (w http.ResponseWriter , r * http.Request ) {
68+ auth := r .Header .Get ("Authorization" )
69+ if auth == "" {
70+ t .Error ("AuthorizationTransport didn't add Authorization header" )
71+ }
72+ })
73+
74+ auth := & AuthorizationTransport {
75+ SecretID : "test " , //存在空格
76+ SecretKey : "test" ,
77+ }
78+ client .client .Transport = auth
79+ req , _ := http .NewRequest ("GET" , client .BaseURL .BucketURL .String (), nil )
80+ _ , err := client .doAPI (context .Background (), req , nil , true )
81+ if err == nil || strings .Index (err .Error (), "SecretID is invalid" ) < 0 {
82+ t .Errorf ("AuthorizationTransport RoundTrip expect error: %v" , err )
83+ }
84+ auth = & AuthorizationTransport {
85+ SecretID : "test" ,
86+ SecretKey : "test " , // 存在空格
87+ }
88+ client .client .Transport = auth
89+ req , _ = http .NewRequest ("GET" , client .BaseURL .BucketURL .String (), nil )
90+ _ , err = client .doAPI (context .Background (), req , nil , true )
91+ if err == nil || strings .Index (err .Error (), "SecretKey is invalid" ) < 0 {
92+ t .Errorf ("AuthorizationTransport RoundTrip expect error: %v" , err )
93+ }
94+
95+ }
96+
6397func TestCVMCredentialTransport (t * testing.T ) {
6498 setup ()
6599 defer teardown ()
@@ -126,6 +160,113 @@ func TestCVMCredentialTransport(t *testing.T) {
126160 req , _ = http .NewRequest ("GET" , client .BaseURL .BucketURL .String (), nil )
127161 client .doAPI (context .Background (), req , nil , true )
128162 client .GetCredential ()
163+
164+ client .client .Transport = & CVMCredentialTransport {
165+ Transport : http .DefaultTransport ,
166+ }
167+ req , _ = http .NewRequest ("GET" , client .BaseURL .BucketURL .String (), nil )
168+ client .doAPI (context .Background (), req , nil , true )
169+ client .GetCredential ()
170+ }
171+
172+ func TestCVMCredentialTransportErr (t * testing.T ) {
173+ setup ()
174+ defer teardown ()
175+
176+ // CVM http server
177+ cvm_mux := http .NewServeMux ()
178+ cvm_server := httptest .NewServer (cvm_mux )
179+ defer cvm_server .Close ()
180+ // 将默认 CVM Host 修改成测试IP:PORT
181+ defaultCVMMetaHost = strings .TrimLeft (cvm_server .URL , "http://" )
182+
183+ var statusCodeErr , bodyErr bool
184+ cvm_mux .HandleFunc ("/" + defaultCVMCredURI , func (w http.ResponseWriter , r * http.Request ) {
185+ if statusCodeErr {
186+ w .WriteHeader (http .StatusNotFound )
187+ return
188+ }
189+ if bodyErr {
190+ fmt .Fprint (w , "" )
191+ return
192+ }
193+ fmt .Fprint (w , "cvm_read_cos_only" )
194+ })
195+
196+ transport := & CVMCredentialTransport {}
197+
198+ statusCodeErr = true
199+ _ , err := transport .GetRoles ()
200+ if err == nil || err .Error () != "get cvm security-credentials role failed, StatusCode: 404, Body: " {
201+ t .Errorf ("CVMCredentialTransport GetRoles expect err: %v" , err )
202+ }
203+
204+ statusCodeErr = false
205+ bodyErr = true
206+ _ , err = transport .GetRoles ()
207+ if err == nil || err .Error () != "get cvm security-credentials role failed, No valid cam role was found" {
208+ t .Errorf ("CVMCredentialTransport GetRoles expect err: %v" , err )
209+ }
210+
211+ var tokenErr , tokenJsonErr , tokenCodeErr bool
212+ cvm_mux .HandleFunc ("/" + defaultCVMCredURI + "/cvm_read_cos_only" , func (w http.ResponseWriter , r * http.Request ) {
213+ if tokenErr {
214+ w .WriteHeader (http .StatusNotFound )
215+ return
216+ }
217+ if tokenJsonErr {
218+ fmt .Fprint (w , fmt .Sprintf (`
219+ "ExpiredTime": %v,
220+ "Expiration": "now",
221+ "Code": "Success"
222+ ` , time .Now ().Unix ()+ 3600 ))
223+ }
224+ if tokenCodeErr {
225+ fmt .Fprint (w , fmt .Sprintf (`{
226+ "ExpiredTime": %v,
227+ "Expiration": "now",
228+ "Code": "Failed"
229+ }` , time .Now ().Unix ()+ 3600 ))
230+ }
231+ })
232+
233+ nt := time .Now ().Unix ()
234+ transport = & CVMCredentialTransport {
235+ secretID : "ak" ,
236+ secretKey : "sk" ,
237+ sessionToken : "token" ,
238+ expiredTime : nt + defaultCVMAuthExpire + 1 ,
239+ }
240+ // 密钥未超时
241+ ak , sk , token , err := transport .UpdateCredential (nt )
242+ if ak != transport .secretID || sk != transport .secretKey || token != transport .sessionToken {
243+ t .Errorf ("UpdateCredential failed, return: %v, %v, %v, want: %v" , ak , sk , token , * transport )
244+ }
245+ // 密钥超时,GetRoles返回错误
246+ transport .expiredTime = nt + defaultCVMAuthExpire - 1
247+ ak , sk , token , err = transport .UpdateCredential (nt )
248+ if ak != transport .secretID || sk != transport .secretKey || token != transport .sessionToken || err == nil {
249+ t .Errorf ("UpdateCredential failed, return: %v, %v, %v, want: %v" , ak , sk , token , * transport )
250+ }
251+ // 密钥超时,GetRoles返回正常, 获取临时密钥返回错误
252+ statusCodeErr , bodyErr = false , false
253+ tokenErr = true
254+ ak , sk , token , err = transport .UpdateCredential (nt )
255+ if ak != transport .secretID || sk != transport .secretKey || token != transport .sessionToken || err == nil {
256+ t .Errorf ("UpdateCredential failed, return: %v, %v, %v, want: %v" , ak , sk , token , * transport )
257+ }
258+ // 密钥超时,GetRoles返回正常, 获取临时密钥返回body解析错误
259+ tokenErr , tokenJsonErr = false , true
260+ ak , sk , token , err = transport .UpdateCredential (nt )
261+ if ak != transport .secretID || sk != transport .secretKey || token != transport .sessionToken || err == nil {
262+ t .Errorf ("UpdateCredential failed, return: %v, %v, %v, want: %v" , ak , sk , token , * transport )
263+ }
264+ // 密钥超时,GetRoles返回正常, 获取临时密钥返回Code != Success
265+ tokenErr , tokenJsonErr , tokenCodeErr = false , false , true
266+ ak , sk , token , err = transport .UpdateCredential (nt )
267+ if ak != transport .secretID || sk != transport .secretKey || token != transport .sessionToken || err == nil {
268+ t .Errorf ("UpdateCredential failed, return: %v, %v, %v, want: %v" , ak , sk , token , * transport )
269+ }
129270}
130271
131272func TestDNSScatterTransport (t * testing.T ) {
@@ -166,4 +307,13 @@ func TestCredentialTransport(t *testing.T) {
166307 req , _ := http .NewRequest ("GET" , client .BaseURL .BucketURL .String (), nil )
167308 client .doAPI (context .Background (), req , nil , true )
168309 client .GetCredential ()
310+
311+ client .client .Transport = & CredentialTransport {
312+ Credential : NewTokenCredential ("test" , "test" , "" ),
313+ Transport : http .DefaultTransport ,
314+ }
315+ req , _ = http .NewRequest ("GET" , client .BaseURL .BucketURL .String (), nil )
316+ client .doAPI (context .Background (), req , nil , true )
317+ client .GetCredential ()
318+
169319}
0 commit comments