Skip to content

Commit d56c477

Browse files
author
oranmoshai
committed
fix(s3/cache): HeadObject bucketName was missing.
Add unit testing
1 parent 717f36c commit d56c477

File tree

2 files changed

+118
-11
lines changed

2 files changed

+118
-11
lines changed

cache/s3.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,9 @@ func (c S3Cache) GetArtifact(artifactID string) (types.ArtifactInfo, error) {
110110
}
111111

112112
func (c S3Cache) getIndex(key string, keyType string) error {
113-
_, err := c.s3Client.HeadObject(&s3.HeadObjectInput{Key: aws.String(fmt.Sprintf("%s/%s/%s.index", keyType, c.prefix, key))})
113+
_, err := c.s3Client.HeadObject(&s3.HeadObjectInput{
114+
Key: aws.String(fmt.Sprintf("%s/%s/%s.index", keyType, c.prefix, key)),
115+
Bucket: &c.bucketName})
114116
if err != nil {
115117
return xerrors.Errorf("failed to get index from the cache: %w", err)
116118
}

cache/s3_test.go

Lines changed: 115 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
package cache_test
1+
package cache
22

33
import (
4-
"testing"
5-
"time"
6-
7-
"github.com/aquasecurity/fanal/cache"
84
"github.com/aquasecurity/fanal/types"
95
"github.com/aws/aws-sdk-go/service/s3"
106
"github.com/aws/aws-sdk-go/service/s3/s3iface"
117
"github.com/aws/aws-sdk-go/service/s3/s3manager"
8+
"golang.org/x/xerrors"
9+
"reflect"
10+
"testing"
11+
"time"
1212
)
1313

1414
type mockS3Client struct {
@@ -19,9 +19,8 @@ func (m *mockS3Client) PutObject(*s3.PutObjectInput) (*s3.PutObjectOutput, error
1919
return &s3.PutObjectOutput{}, nil
2020
}
2121

22-
func (m *mockS3Client) WaitUntilObjectExists(*s3.HeadObjectInput) error {
23-
return nil
24-
22+
func (m *mockS3Client) HeadObject(*s3.HeadObjectInput) (*s3.HeadObjectOutput, error) {
23+
return &s3.HeadObjectOutput{}, nil
2524
}
2625

2726
func TestS3Cache_PutBlob(t *testing.T) {
@@ -63,7 +62,7 @@ func TestS3Cache_PutBlob(t *testing.T) {
6362
}
6463
for _, tt := range tests {
6564
t.Run(tt.name, func(t *testing.T) {
66-
c := cache.NewS3Cache(tt.fields.BucketName, tt.fields.Prefix, tt.fields.S3, tt.fields.Downloader)
65+
c := NewS3Cache(tt.fields.BucketName, tt.fields.Prefix, tt.fields.S3, tt.fields.Downloader)
6766
if err := c.PutBlob(tt.args.blobID, tt.args.blobInfo); (err != nil) != tt.wantErr {
6867
t.Errorf("S3Cache.PutBlob() error = %v, wantErr %v", err, tt.wantErr)
6968
}
@@ -116,10 +115,116 @@ func TestS3Cache_PutArtifact(t *testing.T) {
116115
}
117116
for _, tt := range tests {
118117
t.Run(tt.name, func(t *testing.T) {
119-
c := cache.NewS3Cache(tt.fields.BucketName, tt.fields.Prefix, tt.fields.S3, tt.fields.Downloader)
118+
c := NewS3Cache(tt.fields.BucketName, tt.fields.Prefix, tt.fields.S3, tt.fields.Downloader)
120119
if err := c.PutArtifact(tt.args.artifactID, tt.args.artifactConfig); (err != nil) != tt.wantErr {
121120
t.Errorf("S3Cache.PutArtifact() error = %v, wantErr %v", err, tt.wantErr)
122121
}
123122
})
124123
}
125124
}
125+
126+
func TestS3Cache_getIndex(t *testing.T) {
127+
mockSvc := &mockS3Client{}
128+
129+
type fields struct {
130+
S3 s3iface.S3API
131+
Downloader *s3manager.Downloader
132+
BucketName string
133+
Prefix string
134+
}
135+
type args struct {
136+
key string
137+
keyType string
138+
}
139+
tests := []struct {
140+
name string
141+
fields fields
142+
args args
143+
wantErr bool
144+
}{
145+
{
146+
name: "happy path",
147+
fields: fields{
148+
S3: mockSvc,
149+
BucketName: "test",
150+
Prefix: "prefix",
151+
},
152+
args: args{
153+
key: "key",
154+
keyType: "artifactBucket",
155+
},
156+
wantErr: false,
157+
},
158+
}
159+
for _, tt := range tests {
160+
t.Run(tt.name, func(t *testing.T) {
161+
c := NewS3Cache(tt.fields.BucketName, tt.fields.Prefix, tt.fields.S3, tt.fields.Downloader)
162+
if err := c.getIndex(tt.args.key, tt.args.keyType); (err != nil) != tt.wantErr {
163+
t.Errorf("S3Cache.getIndex() error = %v, wantErr %v", err, tt.wantErr)
164+
}
165+
})
166+
}
167+
}
168+
169+
type mockS3ClientMissingBlobs struct {
170+
s3iface.S3API
171+
}
172+
173+
func (m *mockS3ClientMissingBlobs) PutObject(*s3.PutObjectInput) (*s3.PutObjectOutput, error) {
174+
return &s3.PutObjectOutput{}, nil
175+
}
176+
177+
func (m *mockS3ClientMissingBlobs) HeadObject(*s3.HeadObjectInput) (*s3.HeadObjectOutput, error) {
178+
return &s3.HeadObjectOutput{}, xerrors.Errorf("the object doesn't exist in S3")
179+
}
180+
181+
func TestS3Cache_MissingBlobs(t *testing.T) {
182+
mockSvc := &mockS3ClientMissingBlobs{}
183+
184+
type fields struct {
185+
S3 s3iface.S3API
186+
Downloader *s3manager.Downloader
187+
BucketName string
188+
Prefix string
189+
}
190+
type args struct {
191+
artifactID string
192+
blobIDs []string
193+
}
194+
tests := []struct {
195+
name string
196+
fields fields
197+
args args
198+
want bool
199+
wantStringSlice []string
200+
wantErr bool
201+
}{{
202+
name: "happy path",
203+
fields: fields{
204+
S3: mockSvc,
205+
BucketName: "test",
206+
Prefix: "prefix",
207+
},
208+
args: args{artifactID: "sha256:58701fd185bda36cab0557bb6438661831267aa4a9e0b54211c4d5317a48aff4", blobIDs: []string{"sha256:24df0d4e20c0f42d3703bf1f1db2bdd77346c7956f74f423603d651e8e5ae8a7"}},
209+
want: true,
210+
wantStringSlice: []string{"sha256:24df0d4e20c0f42d3703bf1f1db2bdd77346c7956f74f423603d651e8e5ae8a7"},
211+
wantErr: false,
212+
},
213+
}
214+
for _, tt := range tests {
215+
t.Run(tt.name, func(t *testing.T) {
216+
c := NewS3Cache(tt.fields.BucketName, tt.fields.Prefix, tt.fields.S3, tt.fields.Downloader)
217+
got, got1, err := c.MissingBlobs(tt.args.artifactID, tt.args.blobIDs)
218+
if (err != nil) != tt.wantErr {
219+
t.Errorf("S3Cache.MissingBlobs() error = %v, wantErr %v", err, tt.wantErr)
220+
return
221+
}
222+
if got != tt.want {
223+
t.Errorf("S3Cache.MissingBlobs() got = %v, want %v", got, tt.want)
224+
}
225+
if !reflect.DeepEqual(got1, tt.wantStringSlice) {
226+
t.Errorf("S3Cache.MissingBlobs() got1 = %v, want %v", got1, tt.wantStringSlice)
227+
}
228+
})
229+
}
230+
}

0 commit comments

Comments
 (0)