1package physical
2
3import (
4	"fmt"
5	"log"
6	"math/rand"
7	"os"
8	"testing"
9	"time"
10
11	"github.com/aws/aws-sdk-go/aws"
12	"github.com/aws/aws-sdk-go/aws/credentials"
13	"github.com/aws/aws-sdk-go/aws/session"
14	"github.com/aws/aws-sdk-go/service/s3"
15)
16
17func TestS3Backend(t *testing.T) {
18	if os.Getenv("AWS_ACCESS_KEY_ID") == "" || os.Getenv("AWS_SECRET_ACCESS_KEY") == "" {
19		t.SkipNow()
20	}
21
22	creds, err := credentials.NewEnvCredentials().Get()
23	if err != nil {
24		t.Fatalf("err: %v", err)
25	}
26
27	// If the variable is empty or doesn't exist, the default
28	// AWS endpoints will be used
29	endpoint := os.Getenv("AWS_S3_ENDPOINT")
30
31	region := os.Getenv("AWS_DEFAULT_REGION")
32	if region == "" {
33		region = "us-east-1"
34	}
35
36	s3conn := s3.New(session.New(&aws.Config{
37		Credentials: credentials.NewEnvCredentials(),
38		Endpoint:    aws.String(endpoint),
39		Region:      aws.String(region),
40	}))
41
42	var randInt = rand.New(rand.NewSource(time.Now().UnixNano())).Int()
43	bucket := fmt.Sprintf("vault-s3-testacc-%d", randInt)
44
45	_, err = s3conn.CreateBucket(&s3.CreateBucketInput{
46		Bucket: aws.String(bucket),
47	})
48	if err != nil {
49		t.Fatalf("unable to create test bucket: %s", err)
50	}
51
52	defer func() {
53		// Gotta list all the objects and delete them
54		// before being able to delete the bucket
55		listResp, _ := s3conn.ListObjects(&s3.ListObjectsInput{
56			Bucket: aws.String(bucket),
57		})
58
59		objects := &s3.Delete{}
60		for _, key := range listResp.Contents {
61			oi := &s3.ObjectIdentifier{Key: key.Key}
62			objects.Objects = append(objects.Objects, oi)
63		}
64
65		s3conn.DeleteObjects(&s3.DeleteObjectsInput{
66			Bucket: aws.String(bucket),
67			Delete: objects,
68		})
69
70		_, err := s3conn.DeleteBucket(&s3.DeleteBucketInput{Bucket: aws.String(bucket)})
71		if err != nil {
72			t.Fatalf("err: %s", err)
73		}
74	}()
75
76	logger := log.New(os.Stderr, "", log.LstdFlags)
77	b, err := NewBackend("s3", logger, map[string]string{
78		"access_key":    creds.AccessKeyID,
79		"secret_key":    creds.SecretAccessKey,
80		"session_token": creds.SessionToken,
81		"bucket":        bucket,
82	})
83	if err != nil {
84		t.Fatalf("err: %s", err)
85	}
86
87	testBackend(t, b)
88	testBackend_ListPrefix(t, b)
89
90}
91