func TestPutObjectPresignedUrl(t *testing.T) { params := &s3.PutObjectInput{ Bucket: aws.String(bucket), // bucket名称 Key: aws.String(key), // object key ACL: aws.String("public-read"), //设置ACL ContentType: aws.String("application/ocet-stream"), //设置文件的content-type ContentMaxLength: aws.Long(20), //设置允许的最大长度,对应的header:x-amz-content-maxlength } resp, err := svc.PutObjectPresignedUrl(params, 1444370289000000000) //第二个参数为外链过期时间,第二个参数为time.Duration类型 if err != nil { panic(err) } httpReq, _ := http.NewRequest("PUT", "", strings.NewReader("123")) httpReq.URL = resp httpReq.Header["x-amz-acl"] = []string{"public-read"} httpReq.Header["x-amz-content-maxlength"] = []string{"20"} httpReq.Header.Add("Content-Type", "application/ocet-stream") fmt.Println(httpReq) httpRep, err := http.DefaultClient.Do(httpReq) fmt.Println(httpRep) if err != nil { panic(err) } assert.Equal(t, "200 OK", httpRep.Status) }
func TestInputService6ProtocolTestSerializeMapTypeWithLocationNameCase1(t *testing.T) { svc := NewInputService6ProtocolTest(nil) svc.Endpoint = "https://test" input := &InputService6TestShapeInputShape{ MapArg: map[string]*string{ "key1": aws.String("val1"), "key2": aws.String("val2"), }, } req, _ := svc.InputService6TestCaseOperation1Request(input) r := req.HTTPRequest // build request query.Build(req) assert.NoError(t, req.Error) // assert body assert.NotNil(t, r.Body) body, _ := ioutil.ReadAll(r.Body) assert.Equal(t, util.Trim(`Action=OperationName&MapArg.entry.1.TheKey=key1&MapArg.entry.1.TheValue=val1&MapArg.entry.2.TheKey=key2&MapArg.entry.2.TheValue=val2&Version=2014-01-01`), util.Trim(string(body))) // assert URL assert.Equal(t, "https://test/", r.URL.String()) // assert headers }
func TestInputService6ProtocolTestListWithLocationNameAndQueryNameCase1(t *testing.T) { svc := NewInputService6ProtocolTest(nil) svc.Endpoint = "https://test" input := &InputService6TestShapeInputShape{ ListArg: []*string{ aws.String("a"), aws.String("b"), aws.String("c"), }, } req, _ := svc.InputService6TestCaseOperation1Request(input) r := req.HTTPRequest // build request ec2query.Build(req) assert.NoError(t, req.Error) // assert body assert.NotNil(t, r.Body) body, _ := ioutil.ReadAll(r.Body) assert.Equal(t, util.Trim(`Action=OperationName&ListQueryName.1=a&ListQueryName.2=b&ListQueryName.3=c&Version=2014-01-01`), util.Trim(string(body))) // assert URL assert.Equal(t, "https://test/", r.URL.String()) // assert headers }
func loggingSvc() (*s3.S3, *[]string, *[]interface{}) { var m sync.Mutex partNum := 0 names := []string{} params := []interface{}{} svc := s3.New(nil) svc.Handlers.Unmarshal.Clear() svc.Handlers.UnmarshalMeta.Clear() svc.Handlers.UnmarshalError.Clear() svc.Handlers.Send.Clear() svc.Handlers.Send.PushBack(func(r *aws.Request) { m.Lock() defer m.Unlock() names = append(names, r.Operation.Name) params = append(params, r.Params) r.HTTPResponse = &http.Response{ StatusCode: 200, Body: ioutil.NopCloser(bytes.NewReader([]byte{})), } switch data := r.Data.(type) { case *s3.CreateMultipartUploadOutput: data.UploadID = aws.String("UPLOAD-ID") case *s3.UploadPartOutput: partNum++ data.ETag = aws.String(fmt.Sprintf("ETAG%d", partNum)) case *s3.CompleteMultipartUploadOutput: data.Location = aws.String("https://location") } }) return svc, &names, ¶ms }
func TestInputService3ProtocolTestListTypesCase1(t *testing.T) { svc := NewInputService3ProtocolTest(nil) svc.Endpoint = "https://test" input := &InputService3TestShapeInputShape{ ListArg: []*string{ aws.String("foo"), aws.String("bar"), aws.String("baz"), }, } req, _ := svc.InputService3TestCaseOperation1Request(input) r := req.HTTPRequest // build request query.Build(req) assert.NoError(t, req.Error) // assert body assert.NotNil(t, r.Body) body, _ := ioutil.ReadAll(r.Body) assert.Equal(t, util.Trim(`Action=OperationName&ListArg.member.1=foo&ListArg.member.2=bar&ListArg.member.3=baz&Version=2014-01-01`), util.Trim(string(body))) // assert URL assert.Equal(t, "https://test/", r.URL.String()) // assert headers }
func TestInputService4ProtocolTestURIParameterQuerystringParamsAndJSONBodyCase1(t *testing.T) { svc := NewInputService4ProtocolTest(nil) svc.Endpoint = "https://test" input := &InputService4TestShapeInputShape{ Ascending: aws.String("true"), Config: &InputService4TestShapeStructType{ A: aws.String("one"), B: aws.String("two"), }, PageToken: aws.String("bar"), PipelineId: aws.String("foo"), } req, _ := svc.InputService4TestCaseOperation1Request(input) r := req.HTTPRequest // build request restjson.Build(req) assert.NoError(t, req.Error) // assert body assert.NotNil(t, r.Body) body, _ := ioutil.ReadAll(r.Body) assert.Equal(t, util.Trim(`{"Config":{"A":"one","B":"two"}}`), util.Trim(string(body))) // assert URL assert.Equal(t, "https://test/2014-01-01/jobsByPipeline/foo?Ascending=true&PageToken=bar", r.URL.String()) // assert headers }
func TestInputService6ProtocolTestStreamingPayloadCase1(t *testing.T) { svc := NewInputService6ProtocolTest(nil) svc.Endpoint = "https://test" input := &InputService6TestShapeInputShape{ Body: aws.ReadSeekCloser(bytes.NewBufferString("contents")), Checksum: aws.String("foo"), VaultName: aws.String("name"), } req, _ := svc.InputService6TestCaseOperation1Request(input) r := req.HTTPRequest // build request restjson.Build(req) assert.NoError(t, req.Error) // assert body assert.NotNil(t, r.Body) body, _ := ioutil.ReadAll(r.Body) assert.Equal(t, util.Trim(`contents`), util.Trim(string(body))) // assert URL assert.Equal(t, "https://test/2014-01-01/vaults/name/archives", r.URL.String()) // assert headers assert.Equal(t, "foo", r.Header.Get("x-amz-sha256-tree-hash")) }
func TestUploadOrderMultiFailureLeaveParts(t *testing.T) { s, ops, _ := loggingSvc() s.Handlers.Send.PushBack(func(r *aws.Request) { switch data := r.Data.(type) { case *s3.UploadPartOutput: if *data.ETag == "ETAG2" { r.HTTPResponse.StatusCode = 400 } } }) mgr := s3manager.NewUploader(&s3manager.UploadOptions{ S3: s, Concurrency: 1, LeavePartsOnError: true, }) _, err := mgr.Upload(&s3manager.UploadInput{ Bucket: aws.String("Bucket"), Key: aws.String("Key"), Body: bytes.NewReader(make([]byte, 1024*1024*12)), }) assert.Error(t, err) assert.Equal(t, []string{"CreateMultipartUpload", "UploadPart", "UploadPart"}, *ops) }
func TestInputService9ProtocolTestRecursiveShapesCase6(t *testing.T) { svc := NewInputService9ProtocolTest(nil) svc.Endpoint = "https://test" input := &InputService9TestShapeInputShape{ RecursiveStruct: &InputService9TestShapeRecursiveStructType{ RecursiveMap: map[string]*InputService9TestShapeRecursiveStructType{ "bar": { NoRecurse: aws.String("bar"), }, "foo": { NoRecurse: aws.String("foo"), }, }, }, } req, _ := svc.InputService9TestCaseOperation6Request(input) r := req.HTTPRequest // build request query.Build(req) assert.NoError(t, req.Error) // assert body assert.NotNil(t, r.Body) body, _ := ioutil.ReadAll(r.Body) assert.Equal(t, util.Trim(`Action=OperationName&RecursiveStruct.RecursiveMap.entry.1.key=bar&RecursiveStruct.RecursiveMap.entry.1.value.NoRecurse=bar&RecursiveStruct.RecursiveMap.entry.2.key=foo&RecursiveStruct.RecursiveMap.entry.2.value.NoRecurse=foo&Version=2014-01-01`), util.Trim(string(body))) // assert URL assert.Equal(t, "https://test/", r.URL.String()) // assert headers }
func TestInputService8ProtocolTestRecursiveShapesCase6(t *testing.T) { svc := NewInputService8ProtocolTest(nil) svc.Endpoint = "https://test" input := &InputService8TestShapeInputShape{ RecursiveStruct: &InputService8TestShapeRecursiveStructType{ RecursiveMap: map[string]*InputService8TestShapeRecursiveStructType{ "bar": { NoRecurse: aws.String("bar"), }, "foo": { NoRecurse: aws.String("foo"), }, }, }, } req, _ := svc.InputService8TestCaseOperation6Request(input) r := req.HTTPRequest // build request restjson.Build(req) assert.NoError(t, req.Error) // assert body assert.NotNil(t, r.Body) body, _ := ioutil.ReadAll(r.Body) assert.Equal(t, util.Trim(`{"RecursiveStruct":{"RecursiveMap":{"bar":{"NoRecurse":"bar"},"foo":{"NoRecurse":"foo"}}}}`), util.Trim(string(body))) // assert URL assert.Equal(t, "https://test/path", r.URL.String()) // assert headers }
func TestInputService2ProtocolTestStructureWithLocationNameAndQueryNameAppliedToMembersCase1(t *testing.T) { svc := NewInputService2ProtocolTest(nil) svc.Endpoint = "https://test" input := &InputService2TestShapeInputShape{ Bar: aws.String("val2"), Foo: aws.String("val1"), Yuck: aws.String("val3"), } req, _ := svc.InputService2TestCaseOperation1Request(input) r := req.HTTPRequest // build request ec2query.Build(req) assert.NoError(t, req.Error) // assert body assert.NotNil(t, r.Body) body, _ := ioutil.ReadAll(r.Body) assert.Equal(t, util.Trim(`Action=OperationName&BarLocationName=val2&Foo=val1&Version=2014-01-01&yuckQueryName=val3`), util.Trim(string(body))) // assert URL assert.Equal(t, "https://test/", r.URL.String()) // assert headers }
func TestDownloadError(t *testing.T) { s, names, _ := dlLoggingSvc([]byte{1, 2, 3}) opts := &s3manager.DownloadOptions{S3: s, PartSize: 1, Concurrency: 1} num := 0 s.Handlers.Send.PushBack(func(r *aws.Request) { num++ if num > 1 { r.HTTPResponse.StatusCode = 400 r.HTTPResponse.Body = ioutil.NopCloser(bytes.NewReader([]byte{})) } }) d := s3manager.NewDownloader(opts) w := newDLWriter(3) n, err := d.Download(w, &s3.GetObjectInput{ Bucket: aws.String("bucket"), Key: aws.String("key"), }) assert.NotNil(t, err) assert.Equal(t, int64(1), n) assert.Equal(t, []string{"GetObject", "GetObject"}, *names) assert.Equal(t, []byte{1, 0, 0}, w.buf) }
func TestListObjects(t *testing.T) { putObjectSimple() objects, err := svc.ListObjects(&s3.ListObjectsInput{ Bucket: aws.String(bucket), Delimiter: aws.String("/"), MaxKeys: aws.Long(999), Prefix: aws.String(""), }) assert.NoError(t, err) assert.Equal(t, "/", *objects.Delimiter) assert.Equal(t, *aws.Long(999), *objects.MaxKeys) assert.Equal(t, "", *objects.Prefix) assert.False(t, *objects.IsTruncated) objects1, err := svc.ListObjects(&s3.ListObjectsInput{ Bucket: aws.String(bucket), }) assert.NoError(t, err) objectList := objects1.Contents found := false for i := 0; i < len(objectList); i++ { object := objectList[i] assert.Equal(t, "STANDARD", *object.StorageClass) if *object.Key == key { found = true } } assert.True(t, found, "expected found "+key+"in object listing") }
func TestMD5InPutBucketPolicy(t *testing.T) { svc := s3.New(nil) req, _ := svc.PutBucketPolicyRequest(&s3.PutBucketPolicyInput{ Bucket: aws.String("bucketname"), Policy: aws.String("{}"), }) assertMD5(t, req) }
func TestCreateBucket(t *testing.T) { _, err := svc.CreateBucket(&s3.CreateBucketInput{ ACL: aws.String("public-read"), Bucket: aws.String(bucket), }) assert.Error(t, err) assert.Equal(t, "BucketAlreadyExists", err.(*apierr.RequestError).Code()) }
func TestDelObject(t *testing.T) { putObjectSimple() assert.True(t, objectExists(bucket, key)) _, err := svc.DeleteObject(&s3.DeleteObjectInput{ Bucket: aws.String(bucket), Key: aws.String(key), }) assert.NoError(t, err) assert.False(t, objectExists(bucket, key)) }
func TestMD5InDeleteObjects(t *testing.T) { svc := s3.New(nil) req, _ := svc.DeleteObjectsRequest(&s3.DeleteObjectsInput{ Bucket: aws.String("bucketname"), Delete: &s3.Delete{ Objects: []*s3.ObjectIdentifier{ {Key: aws.String("key")}, }, }, }) assertMD5(t, req) }
func TestMD5InPutBucketTagging(t *testing.T) { svc := s3.New(nil) req, _ := svc.PutBucketTaggingRequest(&s3.PutBucketTaggingInput{ Bucket: aws.String("bucketname"), Tagging: &s3.Tagging{ TagSet: []*s3.Tag{ {Key: aws.String("KEY"), Value: aws.String("VALUE")}, }, }, }) assertMD5(t, req) }
func TestMD5InPutBucketCORS(t *testing.T) { svc := s3.New(nil) req, _ := svc.PutBucketCORSRequest(&s3.PutBucketCORSInput{ Bucket: aws.String("bucketname"), CORSConfiguration: &s3.CORSConfiguration{ CORSRules: []*s3.CORSRule{ {AllowedMethods: []*string{aws.String("GET")}}, }, }, }) assertMD5(t, req) }
// Use DynamoDB methods for simplicity func TestPaginationEachPage(t *testing.T) { db := dynamodb.New(nil) tokens, pages, numPages, gotToEnd := []string{}, []string{}, 0, false reqNum := 0 resps := []*dynamodb.ListTablesOutput{ {TableNames: []*string{aws.String("Table1"), aws.String("Table2")}, LastEvaluatedTableName: aws.String("Table2")}, {TableNames: []*string{aws.String("Table3"), aws.String("Table4")}, LastEvaluatedTableName: aws.String("Table4")}, {TableNames: []*string{aws.String("Table5")}}, } db.Handlers.Send.Clear() // mock sending db.Handlers.Unmarshal.Clear() db.Handlers.UnmarshalMeta.Clear() db.Handlers.ValidateResponse.Clear() db.Handlers.Build.PushBack(func(r *aws.Request) { in := r.Params.(*dynamodb.ListTablesInput) if in == nil { tokens = append(tokens, "") } else if in.ExclusiveStartTableName != nil { tokens = append(tokens, *in.ExclusiveStartTableName) } }) db.Handlers.Unmarshal.PushBack(func(r *aws.Request) { r.Data = resps[reqNum] reqNum++ }) params := &dynamodb.ListTablesInput{Limit: aws.Long(2)} req, _ := db.ListTablesRequest(params) err := req.EachPage(func(p interface{}, last bool) bool { numPages++ for _, t := range p.(*dynamodb.ListTablesOutput).TableNames { pages = append(pages, *t) } if last { if gotToEnd { assert.Fail(t, "last=true happened twice") } gotToEnd = true } return true }) assert.Equal(t, []string{"Table2", "Table4"}, tokens) assert.Equal(t, []string{"Table1", "Table2", "Table3", "Table4", "Table5"}, pages) assert.Equal(t, 3, numPages) assert.True(t, gotToEnd) assert.Nil(t, err) }
func TestUploadOrderSingleBufferedReader(t *testing.T) { s, ops, _ := loggingSvc() mgr := s3manager.NewUploader(&s3manager.UploadOptions{S3: s}) resp, err := mgr.Upload(&s3manager.UploadInput{ Bucket: aws.String("Bucket"), Key: aws.String("Key"), Body: sizedReader{&sizedReaderImpl{size: 1024 * 1024 * 2}}, }) assert.NoError(t, err) assert.Equal(t, []string{"PutObject"}, *ops) assert.NotEqual(t, "", resp.Location) assert.Equal(t, "", resp.UploadID) }
func TestPutObjectWithSSEC(t *testing.T) { putRet, putErr := svc.PutObject(&s3.PutObjectInput{ Bucket: aws.String(bucket), Key: aws.String(key), SSECustomerAlgorithm: aws.String("AES256"), SSECustomerKey: aws.String("12345678901234567890123456789012"), }) assert.NoError(t, putErr) assert.NotNil(t, putRet.SSECustomerAlgorithm) if putRet.SSECustomerAlgorithm != nil { assert.Equal(t, "AES256", *putRet.SSECustomerAlgorithm) } assert.NotNil(t, putRet.SSECustomerKeyMD5) if putRet.SSECustomerKeyMD5 != nil { assert.NotNil(t, *putRet.SSECustomerKeyMD5) } headRet, headErr := svc.HeadObject(&s3.HeadObjectInput{ Bucket: aws.String(bucket), Key: aws.String(key), SSECustomerAlgorithm: aws.String("AES256"), SSECustomerKey: aws.String("12345678901234567890123456789012"), }) assert.NoError(t, headErr) assert.NotNil(t, headRet.SSECustomerAlgorithm) if headRet.SSECustomerAlgorithm != nil { assert.Equal(t, "AES256", *headRet.SSECustomerAlgorithm) } assert.NotNil(t, headRet.SSECustomerKeyMD5) if headRet.SSECustomerKeyMD5 != nil { assert.NotNil(t, *headRet.SSECustomerKeyMD5) } }
func TestCopySourceSSECustomerKeyOverHTTPError(t *testing.T) { s := s3.New(&aws.Config{DisableSSL: true}) req, _ := s.CopyObjectRequest(&s3.CopyObjectInput{ Bucket: aws.String("bucket"), CopySource: aws.String("bucket/source"), Key: aws.String("dest"), CopySourceSSECustomerKey: aws.String("key"), }) err := req.Build() assert.Error(t, err) assert.Equal(t, "ConfigError", err.(awserr.Error).Code()) assert.Contains(t, err.(awserr.Error).Message(), "cannot send SSE keys over HTTP") }
func TestUploadOrderReadFail2(t *testing.T) { failreaderCount = 0 s, ops, _ := loggingSvc() mgr := s3manager.NewUploader(&s3manager.UploadOptions{S3: s}) _, err := mgr.Upload(&s3manager.UploadInput{ Bucket: aws.String("Bucket"), Key: aws.String("Key"), Body: failreader{2}, }) assert.Equal(t, "ReadRequestBody", err.(awserr.Error).Code()) assert.EqualError(t, err.(awserr.Error).OrigErr(), "random failure") assert.Equal(t, []string{"CreateMultipartUpload", "AbortMultipartUpload"}, *ops) }
func TestNoErrors(t *testing.T) { input := &StructShape{ RequiredList: []*ConditionalStructShape{}, RequiredMap: map[string]*ConditionalStructShape{ "key1": {Name: aws.String("Name")}, "key2": {Name: aws.String("Name")}, }, RequiredBool: aws.Boolean(true), OptionalStruct: &ConditionalStructShape{Name: aws.String("Name")}, } req := aws.NewRequest(service, &aws.Operation{}, input, nil) aws.ValidateParameters(req) assert.NoError(t, req.Error) }
func putObjectSimple() { /* svc.DeleteObject( &s3.DeleteObjectInput{ Bucket:aws.String(bucket), Key:aws.String(key), }, )*/ svc.PutObject( &s3.PutObjectInput{ Bucket: aws.String(bucket), Key: aws.String(key), Body: strings.NewReader(content), }, ) }
func TestUploadOrderZero(t *testing.T) { s, ops, args := loggingSvc() mgr := s3manager.NewUploader(&s3manager.UploadOptions{S3: s}) resp, err := mgr.Upload(&s3manager.UploadInput{ Bucket: aws.String("Bucket"), Key: aws.String("Key"), Body: bytes.NewReader(make([]byte, 0)), }) assert.NoError(t, err) assert.Equal(t, []string{"PutObject"}, *ops) assert.NotEqual(t, "", resp.Location) assert.Equal(t, "", resp.UploadID) assert.Equal(t, 0, buflen(val((*args)[0], "Body"))) }
func TestObjectAcl(t *testing.T) { putObjectSimple() _, err := svc.PutObjectACL(&s3.PutObjectACLInput{ Bucket: aws.String(bucket), Key: aws.String(key), ACL: aws.String("public-read"), }) assert.NoError(t, err) acp, err := svc.GetObjectACL(&s3.GetObjectACLInput{ Bucket: aws.String(bucket), Key: aws.String(key), }) assert.NoError(t, err) grants := acp.Grants assert.Equal(t, 2, len(grants), "size of grants") foundFull := false foundRead := false for i := 0; i < len(grants); i++ { grant := grants[i] if *grant.Permission == "FULL_CONTROL" { foundFull = true assert.NotNil(t, *grant.Grantee.ID, "grantee userid should not null") assert.NotNil(t, *grant.Grantee.DisplayName, "grantee displayname should not null") } else if *grant.Permission == "READ" { foundRead = true assert.NotNil(t, *grant.Grantee.URI, "grantee uri should not null") } } assert.True(t, foundRead, "acp should contains READ") assert.True(t, foundFull, "acp should contains FULL_CONTROL") _, putaclErr := svc.PutObjectACL(&s3.PutObjectACLInput{ Bucket: aws.String(bucket), Key: aws.String(key), ACL: aws.String("private"), }) assert.NoError(t, putaclErr) acp, getaclErr := svc.GetObjectACL(&s3.GetObjectACLInput{ Bucket: aws.String(bucket), Key: aws.String(key), }) assert.NoError(t, getaclErr) privategrants := acp.Grants assert.Equal(t, 1, len(privategrants), "size of grants") }
func TestInputService3ProtocolTestNestedStructureMembersCase1(t *testing.T) { svc := NewInputService3ProtocolTest(nil) svc.Endpoint = "https://test" input := &InputService3TestShapeInputShape{ StructArg: &InputService3TestShapeStructType{ ScalarArg: aws.String("foo"), }, } req, _ := svc.InputService3TestCaseOperation1Request(input) r := req.HTTPRequest // build request ec2query.Build(req) assert.NoError(t, req.Error) // assert body assert.NotNil(t, r.Body) body, _ := ioutil.ReadAll(r.Body) assert.Equal(t, util.Trim(`Action=OperationName&Struct.Scalar=foo&Version=2014-01-01`), util.Trim(string(body))) // assert URL assert.Equal(t, "https://test/", r.URL.String()) // assert headers }
func TestDownloadZero(t *testing.T) { s, names, ranges := dlLoggingSvc([]byte{}) opts := &s3manager.DownloadOptions{S3: s} d := s3manager.NewDownloader(opts) w := newDLWriter(0) n, err := d.Download(w, &s3.GetObjectInput{ Bucket: aws.String("bucket"), Key: aws.String("key"), }) assert.Nil(t, err) assert.Equal(t, int64(0), n) assert.Equal(t, []string{"GetObject"}, *names) assert.Equal(t, []string{"bytes=0-5242879"}, *ranges) }