github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/internal/adapters/cloud/aws/test/adaptor.go (about) 1 package test 2 3 import ( 4 "bytes" 5 "context" 6 "os" 7 "sync" 8 "testing" 9 10 "github.com/aws/aws-sdk-go-v2/aws" 11 "github.com/aws/aws-sdk-go-v2/config" 12 "github.com/aws/aws-sdk-go-v2/credentials" 13 aws2 "github.com/khulnasoft-lab/defsec/internal/adapters/cloud/aws" 14 "github.com/khulnasoft-lab/defsec/pkg/progress" 15 localstack "github.com/khulnasoft-lab/go-mock-aws" 16 log "github.com/sirupsen/logrus" 17 "github.com/stretchr/testify/require" 18 ) 19 20 func getOrCreateLocalStack(ctx context.Context) (*localstack.Stack, error) { 21 _ = os.Setenv("DOCKER_API_VERSION", "1.41") 22 stack := localstack.New() 23 24 initScripts, err := localstack.WithInitScriptMount( 25 "../test/init-scripts", 26 "Bootstrap Complete") 27 if err != nil { 28 return nil, err 29 } 30 31 buf := &concurrentWriter{buf: &bytes.Buffer{}} 32 logger := log.New() 33 logger.SetLevel(log.DebugLevel) 34 logger.SetOutput(buf) 35 36 err = stack.Start(false, initScripts, localstack.WithContext(ctx)) 37 if err != nil { 38 return nil, err 39 } 40 41 return stack, nil 42 } 43 44 func CreateLocalstackAdapter(t *testing.T) (*aws2.RootAdapter, *localstack.Stack, error) { 45 ctx := context.Background() 46 l, err := getOrCreateLocalStack(ctx) 47 require.NoError(t, err) 48 49 cfg, err := createTestConfig(ctx, l) 50 require.NoError(t, err) 51 52 ra := aws2.NewRootAdapter(ctx, cfg, progress.NoProgress) 53 require.NotNil(t, ra) 54 return ra, l, err 55 } 56 57 func createTestConfig(ctx context.Context, l *localstack.Stack) (aws.Config, error) { 58 return config.LoadDefaultConfig(ctx, 59 config.WithRegion("us-east-1"), 60 config.WithEndpointResolverWithOptions(aws.EndpointResolverWithOptionsFunc(func(_, _ string, _ ...interface{}) (aws.Endpoint, error) { 61 return aws.Endpoint{ 62 PartitionID: "aws", 63 SigningRegion: "us-east-1", 64 URL: l.EndpointURL(), 65 HostnameImmutable: true, 66 }, nil 67 })), 68 config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider("dummy", "dummy", "dummy")), 69 ) 70 } 71 72 type concurrentWriter struct { 73 buf *bytes.Buffer 74 mu sync.RWMutex 75 } 76 77 func (c *concurrentWriter) Write(p []byte) (n int, err error) { 78 c.mu.Lock() 79 defer c.mu.Unlock() 80 return c.buf.Write(p) 81 } 82 83 func (c *concurrentWriter) Bytes() []byte { 84 c.mu.RLock() 85 defer c.mu.RUnlock() 86 return c.buf.Bytes() 87 }