Skip to content

Commit 7af5453

Browse files
author
jojoliang
committed
下载校验key,增加ut
1 parent c6db7fe commit 7af5453

24 files changed

+1270
-104
lines changed

auth.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ type AuthTime struct {
161161

162162
// NewAuthTime 生成 AuthTime 的便捷函数
163163
//
164-
// expire: 从现在开始多久过期.
164+
// expire: 从现在开始多久过期.
165165
func NewAuthTime(expire time.Duration) *AuthTime {
166166
signStartTime := time.Now()
167167
keyStartTime := signStartTime
@@ -414,7 +414,7 @@ func (t *CVMCredentialTransport) GetRoles() ([]string, error) {
414414
return nil, err
415415
}
416416
roles := strings.Split(strings.TrimSpace(string(bs)), "\n")
417-
if len(roles) == 0 {
417+
if string(bs) == "" || len(roles) == 0 {
418418
return nil, fmt.Errorf("get cvm security-credentials role failed, No valid cam role was found")
419419
}
420420
return roles, nil

auth_test.go

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
6397
func 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

131272
func 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
}

batch_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,4 +403,9 @@ func TestBatchService_DeleteJob(t *testing.T) {
403403
if err != nil {
404404
t.Fatalf("Batch.DescribeJob returned error: %v", err)
405405
}
406+
_, err = client.Batch.DeleteJob(context.Background(), "", headers)
407+
if err == nil || err.Error() != "Id is invalid" {
408+
t.Fatalf("Batch.DescribeJob returned error: %v", err)
409+
}
410+
406411
}

bucket_acl.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,12 @@ type BucketPutACLOptions struct {
3939
//
4040
// Put Bucket ACL是一个覆盖操作,传入新的ACL将覆盖原有ACL。只有所有者有权操作。
4141
//
42-
// "x-cos-acl":枚举值为public-read,private;public-read意味这个Bucket有公有读私有写的权限,
43-
// private意味这个Bucket有私有读写的权限。
42+
// "x-cos-acl":枚举值为public-read,private;public-read意味这个Bucket有公有读私有写的权限,
43+
// private意味这个Bucket有私有读写的权限。
4444
//
45-
// "x-cos-grant-read":意味被赋予权限的用户拥有该Bucket的读权限
46-
// "x-cos-grant-write":意味被赋予权限的用户拥有该Bucket的写权限
47-
// "x-cos-grant-full-control":意味被赋予权限的用户拥有该Bucket的读写权限
45+
// "x-cos-grant-read":意味被赋予权限的用户拥有该Bucket的读权限
46+
// "x-cos-grant-write":意味被赋予权限的用户拥有该Bucket的写权限
47+
// "x-cos-grant-full-control":意味被赋予权限的用户拥有该Bucket的读写权限
4848
//
4949
// https://www.qcloud.com/document/product/436/7737
5050
func (s *BucketService) PutACL(ctx context.Context, opt *BucketPutACLOptions) (*Response, error) {

bucket_encryption.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
)
88

99
type BucketEncryptionConfiguration struct {
10-
SSEAlgorithm string `xml:"SSEAlgorithm"`
10+
SSEAlgorithm string `xml:"SSEAlgorithm"`
1111
KMSMasterKeyID string `xml:"KMSMasterKeyID,omitempty"`
1212
}
1313

bucket_intelligenttiering_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ func TestBucketService_GetIntelligentTiering(t *testing.T) {
5050
"intelligenttiering": "",
5151
}
5252
testFormValues(t, r, vs)
53+
testHeader(t, r, "x-cos-meta-test", "test")
5354

5455
fmt.Fprint(w, `<IntelligentTieringConfiguration>
5556
<Status>Enabled</Status>
@@ -58,7 +59,11 @@ func TestBucketService_GetIntelligentTiering(t *testing.T) {
5859
</Transition>
5960
</IntelligentTieringConfiguration>`)
6061
})
61-
res, _, err := client.Bucket.GetIntelligentTiering(context.Background())
62+
opt := &BucketGetIntelligentTieringOptions{
63+
XOptionHeader: &http.Header{},
64+
}
65+
opt.XOptionHeader.Add("x-cos-meta-test", "test")
66+
res, _, err := client.Bucket.GetIntelligentTiering(context.Background(), opt)
6267
if err != nil {
6368
t.Fatalf("Bucket.GetIntelligentTiering failed, error: %v", err)
6469
}

bucket_inventory_test.go

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ func TestBucketService_PutInventory(t *testing.T) {
1717
ID: "list1",
1818
IsEnabled: "True",
1919
IncludedObjectVersions: "All",
20-
Filter: &BucketInventoryFilter{
20+
Filter: &BucketInventoryFilter{
2121
Prefix: "myPrefix",
2222
Period: nil,
2323
},
24-
Schedule: &BucketInventorySchedule{"Daily"},
24+
Schedule: &BucketInventorySchedule{"Daily"},
2525
Destination: &BucketInventoryDestination{
2626
Bucket: "qcs::cos:ap-guangzhou::examplebucket-1250000000",
2727
AccountId: "100000000001",
@@ -113,11 +113,11 @@ func TestBucketService_GetInventory(t *testing.T) {
113113
ID: "list1",
114114
IsEnabled: "True",
115115
IncludedObjectVersions: "All",
116-
Filter: &BucketInventoryFilter{
116+
Filter: &BucketInventoryFilter{
117117
Prefix: "myPrefix",
118118
Period: nil,
119119
},
120-
Schedule: &BucketInventorySchedule{"Daily"},
120+
Schedule: &BucketInventorySchedule{"Daily"},
121121
Destination: &BucketInventoryDestination{
122122
Bucket: "qcs::cos:ap-guangzhou::examplebucket-1250000000",
123123
AccountId: "100000000001",
@@ -145,11 +145,16 @@ func TestBucketService_ListInventory(t *testing.T) {
145145
setup()
146146
defer teardown()
147147

148+
var useToken bool
149+
continueToken := "continueToken"
148150
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
149151
testMethod(t, r, http.MethodGet)
150152
vs := values{
151153
"inventory": "",
152154
}
155+
if useToken {
156+
vs["continuation-token"] = encodeURIComponent(continueToken)
157+
}
153158
testFormValues(t, r, vs)
154159
fmt.Fprint(w, `<ListInventoryConfigurationResult>
155160
<InventoryConfiguration>
@@ -216,10 +221,6 @@ func TestBucketService_ListInventory(t *testing.T) {
216221
</ListInventoryConfigurationResult>`)
217222
})
218223

219-
res, _, err := client.Bucket.ListInventoryConfigurations(context.Background(), "")
220-
if err != nil {
221-
t.Fatalf("Bucket.ListInventory failed, error: %v", err)
222-
}
223224
want := &ListBucketInventoryConfigResult{
224225
XMLName: xml.Name{Local: "ListInventoryConfigurationResult"},
225226
IsTruncated: true,
@@ -231,11 +232,11 @@ func TestBucketService_ListInventory(t *testing.T) {
231232
ID: "list1",
232233
IsEnabled: "True",
233234
IncludedObjectVersions: "All",
234-
Filter: &BucketInventoryFilter{
235+
Filter: &BucketInventoryFilter{
235236
Prefix: "myPrefix",
236237
Period: nil,
237238
},
238-
Schedule: &BucketInventorySchedule{"Daily"},
239+
Schedule: &BucketInventorySchedule{"Daily"},
239240
Destination: &BucketInventoryDestination{
240241
Bucket: "qcs::cos:ap-beijing::examplebucket-1250000000",
241242
AccountId: "1250000000",
@@ -259,11 +260,11 @@ func TestBucketService_ListInventory(t *testing.T) {
259260
ID: "list2",
260261
IsEnabled: "True",
261262
IncludedObjectVersions: "All",
262-
Filter: &BucketInventoryFilter{
263-
Prefix:"myPrefix2",
263+
Filter: &BucketInventoryFilter{
264+
Prefix: "myPrefix2",
264265
Period: nil,
265266
},
266-
Schedule: &BucketInventorySchedule{"Weekly"},
267+
Schedule: &BucketInventorySchedule{"Weekly"},
267268
Destination: &BucketInventoryDestination{
268269
Bucket: "qcs::cos:ap-beijing::examplebucket-1250000000",
269270
AccountId: "1250000000",
@@ -281,9 +282,26 @@ func TestBucketService_ListInventory(t *testing.T) {
281282
},
282283
},
283284
}
285+
286+
res, _, err := client.Bucket.ListInventoryConfigurations(context.Background(), "")
287+
if err != nil {
288+
t.Fatalf("Bucket.ListInventory failed, error: %v", err)
289+
}
290+
291+
if !reflect.DeepEqual(res, want) {
292+
t.Fatalf("Bucket.ListInventory failed, \nwant: %+v\nres: %+v", want, res)
293+
}
294+
295+
useToken = true
296+
res, _, err = client.Bucket.ListInventoryConfigurations(context.Background(), continueToken)
297+
if err != nil {
298+
t.Fatalf("Bucket.ListInventory failed, error: %v", err)
299+
}
300+
284301
if !reflect.DeepEqual(res, want) {
285302
t.Fatalf("Bucket.ListInventory failed, \nwant: %+v\nres: %+v", want, res)
286303
}
304+
287305
}
288306

289307
func TestBucketService_DeleteInventory(t *testing.T) {
@@ -314,7 +332,7 @@ func TestBucketService_PostInventory(t *testing.T) {
314332
XMLName: xml.Name{Local: "InventoryConfiguration"},
315333
ID: "list1",
316334
IncludedObjectVersions: "All",
317-
Filter: &BucketInventoryFilter{
335+
Filter: &BucketInventoryFilter{
318336
Prefix: "myPrefix",
319337
Period: nil,
320338
},
@@ -357,5 +375,3 @@ func TestBucketService_PostInventory(t *testing.T) {
357375
t.Fatalf("Bucket.PostInventory failed, error: %v", err)
358376
}
359377
}
360-
361-

0 commit comments

Comments
 (0)