github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/fanal/image/registry/ecr/ecr_test.go (about)

     1  package ecr
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"testing"
     7  
     8  	"github.com/aws/aws-sdk-go-v2/aws"
     9  	"github.com/aws/aws-sdk-go-v2/service/ecr"
    10  	awstypes "github.com/aws/aws-sdk-go-v2/service/ecr/types"
    11  
    12  	"github.com/devseccon/trivy/pkg/fanal/types"
    13  )
    14  
    15  func TestCheckOptions(t *testing.T) {
    16  	var tests = map[string]struct {
    17  		domain  string
    18  		wantErr error
    19  	}{
    20  		"InvalidURL": {
    21  			domain:  "alpine:3.9",
    22  			wantErr: types.InvalidURLPattern,
    23  		},
    24  		"NoOption": {
    25  			domain: "xxx.ecr.ap-northeast-1.amazonaws.com",
    26  		},
    27  	}
    28  
    29  	for testname, v := range tests {
    30  		a := &ECR{}
    31  		err := a.CheckOptions(v.domain, types.RegistryOptions{})
    32  		if err != nil {
    33  			if !errors.Is(err, v.wantErr) {
    34  				t.Errorf("[%s]\nexpected error based on %v\nactual : %v", testname, v.wantErr, err)
    35  			}
    36  			continue
    37  		}
    38  	}
    39  }
    40  
    41  type mockedECR struct {
    42  	Resp ecr.GetAuthorizationTokenOutput
    43  }
    44  
    45  func (m mockedECR) GetAuthorizationToken(ctx context.Context, params *ecr.GetAuthorizationTokenInput, optFns ...func(*ecr.Options)) (*ecr.GetAuthorizationTokenOutput, error) {
    46  	return &m.Resp, nil
    47  }
    48  
    49  func TestECRGetCredential(t *testing.T) {
    50  	cases := []struct {
    51  		Resp             ecr.GetAuthorizationTokenOutput
    52  		expectedUser     string
    53  		expectedPassword string
    54  	}{
    55  		{
    56  			Resp: ecr.GetAuthorizationTokenOutput{
    57  				AuthorizationData: []awstypes.AuthorizationData{
    58  					{AuthorizationToken: aws.String("YXdzOnBhc3N3b3Jk")},
    59  				},
    60  			},
    61  			expectedUser:     "aws",
    62  			expectedPassword: "password",
    63  		},
    64  		{
    65  			Resp: ecr.GetAuthorizationTokenOutput{
    66  				AuthorizationData: []awstypes.AuthorizationData{
    67  					{AuthorizationToken: aws.String("YXdzOnBhc3N3b3JkOmJhZA==")},
    68  				},
    69  			},
    70  			expectedUser:     "aws",
    71  			expectedPassword: "password:bad",
    72  		},
    73  		{
    74  			Resp: ecr.GetAuthorizationTokenOutput{
    75  				AuthorizationData: []awstypes.AuthorizationData{
    76  					{AuthorizationToken: aws.String("YXdzcGFzc3dvcmQ=")},
    77  				},
    78  			},
    79  			expectedUser:     "",
    80  			expectedPassword: "",
    81  		},
    82  	}
    83  
    84  	for i, c := range cases {
    85  		e := ECR{
    86  			Client: mockedECR{Resp: c.Resp},
    87  		}
    88  		username, password, err := e.GetCredential(context.Background())
    89  		if err != nil {
    90  			t.Fatalf("%d, unexpected error", err)
    91  		}
    92  		if username != c.expectedUser {
    93  			t.Fatalf("%d, username: expected %s, got %s", i, c.expectedUser, username)
    94  		}
    95  		if password != c.expectedPassword {
    96  			t.Fatalf("%d, password: expected %s, got %s", i, c.expectedPassword, password)
    97  		}
    98  	}
    99  }