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  }