You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							227 lines
						
					
					
						
							4.8 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							227 lines
						
					
					
						
							4.8 KiB
						
					
					
				
								package basic
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"fmt"
							 | 
						|
									"io"
							 | 
						|
									"os"
							 | 
						|
									"strings"
							 | 
						|
									"testing"
							 | 
						|
								
							 | 
						|
									"github.com/aws/aws-sdk-go/aws"
							 | 
						|
									"github.com/aws/aws-sdk-go/aws/awserr"
							 | 
						|
									"github.com/aws/aws-sdk-go/aws/session"
							 | 
						|
									"github.com/aws/aws-sdk-go/service/s3"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								var (
							 | 
						|
									svc *s3.S3
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								func init() {
							 | 
						|
									// Initialize a session in us-west-2 that the SDK will use to load
							 | 
						|
									// credentials from the shared credentials file ~/.aws/credentials.
							 | 
						|
									sess, err := session.NewSession(&aws.Config{
							 | 
						|
										Region:     aws.String("us-west-2"),
							 | 
						|
										Endpoint:   aws.String("localhost:8333"),
							 | 
						|
										DisableSSL: aws.Bool(true),
							 | 
						|
									})
							 | 
						|
									if err != nil {
							 | 
						|
										exitErrorf("create session, %v", err)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Create S3 service client
							 | 
						|
									svc = s3.New(sess)
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func TestCreateBucket(t *testing.T) {
							 | 
						|
								
							 | 
						|
									input := &s3.CreateBucketInput{
							 | 
						|
										Bucket: aws.String("theBucket"),
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									result, err := svc.CreateBucket(input)
							 | 
						|
									if err != nil {
							 | 
						|
										if aerr, ok := err.(awserr.Error); ok {
							 | 
						|
											switch aerr.Code() {
							 | 
						|
											case s3.ErrCodeBucketAlreadyExists:
							 | 
						|
												fmt.Println(s3.ErrCodeBucketAlreadyExists, aerr.Error())
							 | 
						|
											case s3.ErrCodeBucketAlreadyOwnedByYou:
							 | 
						|
												fmt.Println(s3.ErrCodeBucketAlreadyOwnedByYou, aerr.Error())
							 | 
						|
											default:
							 | 
						|
												fmt.Println(aerr.Error())
							 | 
						|
											}
							 | 
						|
										} else {
							 | 
						|
											// Print the error, cast err to awserr.Error to get the Code and
							 | 
						|
											// Message from an error.
							 | 
						|
											fmt.Println(err.Error())
							 | 
						|
										}
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									fmt.Println(result)
							 | 
						|
								
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func TestPutObject(t *testing.T) {
							 | 
						|
								
							 | 
						|
									input := &s3.PutObjectInput{
							 | 
						|
										ACL:    aws.String("authenticated-read"),
							 | 
						|
										Body:   aws.ReadSeekCloser(strings.NewReader("filetoupload")),
							 | 
						|
										Bucket: aws.String("theBucket"),
							 | 
						|
										Key:    aws.String("exampleobject"),
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									result, err := svc.PutObject(input)
							 | 
						|
									if err != nil {
							 | 
						|
										if aerr, ok := err.(awserr.Error); ok {
							 | 
						|
											switch aerr.Code() {
							 | 
						|
											default:
							 | 
						|
												fmt.Println(aerr.Error())
							 | 
						|
											}
							 | 
						|
										} else {
							 | 
						|
											// Print the error, cast err to awserr.Error to get the Code and
							 | 
						|
											// Message from an error.
							 | 
						|
											fmt.Println(err.Error())
							 | 
						|
										}
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									fmt.Println(result)
							 | 
						|
								
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func TestListBucket(t *testing.T) {
							 | 
						|
								
							 | 
						|
									result, err := svc.ListBuckets(nil)
							 | 
						|
									if err != nil {
							 | 
						|
										exitErrorf("Unable to list buckets, %v", err)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									fmt.Println("Buckets:")
							 | 
						|
								
							 | 
						|
									for _, b := range result.Buckets {
							 | 
						|
										fmt.Printf("* %s created on %s\n",
							 | 
						|
											aws.StringValue(b.Name), aws.TimeValue(b.CreationDate))
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func TestListObjectV2(t *testing.T) {
							 | 
						|
								
							 | 
						|
									listObj, err := svc.ListObjectsV2(&s3.ListObjectsV2Input{
							 | 
						|
										Bucket:    aws.String(Bucket),
							 | 
						|
										Prefix:    aws.String("foo"),
							 | 
						|
										Delimiter: aws.String("/"),
							 | 
						|
									})
							 | 
						|
									if err != nil {
							 | 
						|
										exitErrorf("Unable to list objects, %v", err)
							 | 
						|
									}
							 | 
						|
									for _, content := range listObj.Contents {
							 | 
						|
										fmt.Println(aws.StringValue(content.Key))
							 | 
						|
									}
							 | 
						|
									fmt.Printf("list: %s\n", listObj)
							 | 
						|
								
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func exitErrorf(msg string, args ...interface{}) {
							 | 
						|
									fmt.Fprintf(os.Stderr, msg+"\n", args...)
							 | 
						|
									os.Exit(1)
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								const (
							 | 
						|
									Bucket = "theBucket"
							 | 
						|
									object = "foo/bar"
							 | 
						|
									Data   = "<data>"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								func TestObjectOp(t *testing.T) {
							 | 
						|
									_, err := svc.CreateBucket(&s3.CreateBucketInput{
							 | 
						|
										Bucket: aws.String(Bucket),
							 | 
						|
									})
							 | 
						|
									if err != nil {
							 | 
						|
										exitErrorf("Unable to create bucket, %v", err)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									_, err = svc.PutObject(&s3.PutObjectInput{
							 | 
						|
										Bucket: aws.String(Bucket),
							 | 
						|
										Key:    aws.String(object),
							 | 
						|
										Body:   strings.NewReader(Data),
							 | 
						|
									})
							 | 
						|
									if err != nil {
							 | 
						|
										exitErrorf("Unable to put object, %v", err)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									dest := fmt.Sprintf("%s_bak", object)
							 | 
						|
									copyObj, err := svc.CopyObject(&s3.CopyObjectInput{
							 | 
						|
										Bucket:     aws.String(Bucket),
							 | 
						|
										CopySource: aws.String(fmt.Sprintf("%s/%s", Bucket, object)),
							 | 
						|
										Key:        aws.String(dest),
							 | 
						|
									})
							 | 
						|
									if err != nil {
							 | 
						|
										exitErrorf("Unable to copy object, %v", err)
							 | 
						|
									}
							 | 
						|
									t.Log("copy object result -> ", copyObj.CopyObjectResult)
							 | 
						|
								
							 | 
						|
									getObj, err := svc.GetObject(&s3.GetObjectInput{
							 | 
						|
										Bucket: aws.String(Bucket),
							 | 
						|
										Key:    aws.String(dest),
							 | 
						|
									})
							 | 
						|
									if err != nil {
							 | 
						|
										exitErrorf("Unable to get copy object, %v", err)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									data, err := io.ReadAll(getObj.Body)
							 | 
						|
									if err != nil {
							 | 
						|
										exitErrorf("Unable to read object data, %v", err)
							 | 
						|
									}
							 | 
						|
									if string(data) != Data {
							 | 
						|
										t.Error("object data -> ", string(data))
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									listObj, err := svc.ListObjectsV2(&s3.ListObjectsV2Input{
							 | 
						|
										Bucket: aws.String(Bucket),
							 | 
						|
										Prefix: aws.String("foo/"),
							 | 
						|
									})
							 | 
						|
									if err != nil {
							 | 
						|
										exitErrorf("Unable to list objects, %v", err)
							 | 
						|
									}
							 | 
						|
									count := 0
							 | 
						|
									for _, content := range listObj.Contents {
							 | 
						|
										key := aws.StringValue(content.Key)
							 | 
						|
										if key == dest {
							 | 
						|
											count++
							 | 
						|
										} else if key == object {
							 | 
						|
											count++
							 | 
						|
										}
							 | 
						|
										if count == 2 {
							 | 
						|
											break
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									if count != 2 {
							 | 
						|
										exitErrorf("Unable to find two objects, %v", listObj.Contents)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									_, err = svc.DeleteObject(&s3.DeleteObjectInput{
							 | 
						|
										Bucket: aws.String(Bucket),
							 | 
						|
										Key:    aws.String(object),
							 | 
						|
									})
							 | 
						|
									if err != nil {
							 | 
						|
										exitErrorf("Unable to delete source object, %v", err)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									_, err = svc.DeleteObject(&s3.DeleteObjectInput{
							 | 
						|
										Bucket: aws.String(Bucket),
							 | 
						|
										Key:    aws.String(dest),
							 | 
						|
									})
							 | 
						|
									if err != nil {
							 | 
						|
										exitErrorf("Unable to delete object, %v", err)
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									_, err = svc.DeleteBucket(&s3.DeleteBucketInput{
							 | 
						|
										Bucket: aws.String(Bucket),
							 | 
						|
									})
							 | 
						|
								
							 | 
						|
									if err != nil {
							 | 
						|
										exitErrorf("Unable to delete bucket, %v", err)
							 | 
						|
									}
							 | 
						|
								}
							 |