d3db94e5db6c2ad62f59c347c441ad821b0ef1bb
[arvados.git] / services / keep-web / s3aws_test.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package main
6
7 import (
8         "bytes"
9         "context"
10         "io/ioutil"
11
12         "git.arvados.org/arvados.git/sdk/go/arvadostest"
13         "github.com/aws/aws-sdk-go-v2/aws"
14         "github.com/aws/aws-sdk-go-v2/aws/defaults"
15         "github.com/aws/aws-sdk-go-v2/aws/ec2metadata"
16         "github.com/aws/aws-sdk-go-v2/aws/ec2rolecreds"
17         "github.com/aws/aws-sdk-go-v2/aws/endpoints"
18         "github.com/aws/aws-sdk-go-v2/service/s3"
19         check "gopkg.in/check.v1"
20 )
21
22 func (s *IntegrationSuite) TestS3AWSSDK(c *check.C) {
23         stage := s.s3setup(c)
24         defer stage.teardown(c)
25
26         cfg := defaults.Config()
27         cfg.Credentials = aws.NewChainProvider([]aws.CredentialsProvider{
28                 aws.NewStaticCredentialsProvider(arvadostest.ActiveTokenUUID, arvadostest.ActiveToken, ""),
29                 ec2rolecreds.New(ec2metadata.New(cfg)),
30         })
31         cfg.EndpointResolver = aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) {
32                 if service == "s3" {
33                         return aws.Endpoint{
34                                 URL:           "http://" + s.testServer.Addr,
35                                 SigningRegion: "custom-signing-region",
36                         }, nil
37                 } else {
38                         return endpoints.NewDefaultResolver().ResolveEndpoint(service, region)
39                 }
40         })
41         client := s3.New(cfg)
42         client.ForcePathStyle = true
43         listreq := client.ListObjectsV2Request(&s3.ListObjectsV2Input{
44                 Bucket:            aws.String(arvadostest.FooCollection),
45                 MaxKeys:           aws.Int64(100),
46                 Prefix:            aws.String(""),
47                 ContinuationToken: nil,
48         })
49         resp, err := listreq.Send(context.Background())
50         c.Assert(err, check.IsNil)
51         c.Check(resp.Contents, check.HasLen, 1)
52         for _, key := range resp.Contents {
53                 c.Check(*key.Key, check.Equals, "foo")
54         }
55
56         p := make([]byte, 100000000)
57         for i := range p {
58                 p[i] = byte('a')
59         }
60         putreq := client.PutObjectRequest(&s3.PutObjectInput{
61                 Body:        bytes.NewReader(p),
62                 Bucket:      aws.String(stage.collbucket.Name),
63                 ContentType: aws.String("application/octet-stream"),
64                 Key:         aws.String("aaaa"),
65         })
66         _, err = putreq.Send(context.Background())
67         c.Assert(err, check.IsNil)
68
69         getreq := client.GetObjectRequest(&s3.GetObjectInput{
70                 Bucket: aws.String(stage.collbucket.Name),
71                 Key:    aws.String("aaaa"),
72         })
73         getresp, err := getreq.Send(context.Background())
74         c.Assert(err, check.IsNil)
75         getdata, err := ioutil.ReadAll(getresp.Body)
76         c.Assert(err, check.IsNil)
77         c.Check(bytes.Equal(getdata, p), check.Equals, true)
78 }