Skip to content

Commit 9cfda3e

Browse files
authored
Merge pull request #645 from kubescape/panic
fix: handle nil case in layer size calculation and add unit tests
2 parents 95b6c74 + 9455d3b commit 9cfda3e

File tree

2 files changed

+100
-2
lines changed

2 files changed

+100
-2
lines changed

pkg/sbommanager/v1/source.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,11 @@ func toLayers(ds []imagedigest.Digest, ms []string) ([]source.LayerMetadata, int
162162
layers := make([]source.LayerMetadata, len(ds))
163163
msLen := len(ms)
164164
for i, d := range ds {
165-
s := diskUsage(ms[msLen-i-1])
166-
totalSize += s
165+
var s int64
166+
if msLen > i {
167+
s = diskUsage(ms[msLen-i-1])
168+
totalSize += s
169+
}
167170
layers[i] = source.LayerMetadata{
168171
MediaType: "application/vnd.oci.image.layer.v1.tar+gzip",
169172
Digest: d.String(),

pkg/sbommanager/v1/source_test.go

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package v1
2+
3+
import (
4+
"testing"
5+
6+
"github.com/anchore/syft/syft/source"
7+
imagedigest "github.com/opencontainers/go-digest"
8+
"github.com/stretchr/testify/assert"
9+
)
10+
11+
func Test_toLayers(t *testing.T) {
12+
type args struct {
13+
ds []imagedigest.Digest
14+
ms []string
15+
}
16+
tests := []struct {
17+
name string
18+
args args
19+
want []source.LayerMetadata
20+
want1 int64
21+
}{
22+
{
23+
name: "empty",
24+
args: args{
25+
ds: []imagedigest.Digest{},
26+
ms: []string{},
27+
},
28+
want: []source.LayerMetadata{},
29+
want1: 0,
30+
},
31+
{
32+
name: "multiple layers no size",
33+
args: args{
34+
ds: []imagedigest.Digest{
35+
imagedigest.Digest("sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
36+
imagedigest.Digest("sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"),
37+
imagedigest.Digest("sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"),
38+
},
39+
ms: []string{},
40+
},
41+
want: []source.LayerMetadata{
42+
{
43+
MediaType: "application/vnd.oci.image.layer.v1.tar+gzip",
44+
Digest: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
45+
Size: 0,
46+
},
47+
{
48+
MediaType: "application/vnd.oci.image.layer.v1.tar+gzip",
49+
Digest: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
50+
Size: 0,
51+
},
52+
{
53+
MediaType: "application/vnd.oci.image.layer.v1.tar+gzip",
54+
Digest: "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
55+
Size: 0,
56+
}},
57+
want1: 0,
58+
},
59+
{
60+
name: "multiple layers nil size",
61+
args: args{
62+
ds: []imagedigest.Digest{
63+
imagedigest.Digest("sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
64+
imagedigest.Digest("sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"),
65+
imagedigest.Digest("sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"),
66+
},
67+
ms: nil,
68+
},
69+
want: []source.LayerMetadata{
70+
{
71+
MediaType: "application/vnd.oci.image.layer.v1.tar+gzip",
72+
Digest: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
73+
Size: 0,
74+
},
75+
{
76+
MediaType: "application/vnd.oci.image.layer.v1.tar+gzip",
77+
Digest: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
78+
Size: 0,
79+
},
80+
{
81+
MediaType: "application/vnd.oci.image.layer.v1.tar+gzip",
82+
Digest: "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
83+
Size: 0,
84+
}},
85+
want1: 0,
86+
},
87+
}
88+
for _, tt := range tests {
89+
t.Run(tt.name, func(t *testing.T) {
90+
got, got1 := toLayers(tt.args.ds, tt.args.ms)
91+
assert.Equalf(t, tt.want, got, "toLayers(%v, %v)", tt.args.ds, tt.args.ms)
92+
assert.Equalf(t, tt.want1, got1, "toLayers(%v, %v)", tt.args.ds, tt.args.ms)
93+
})
94+
}
95+
}

0 commit comments

Comments
 (0)