Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ require (
github.com/vishvananda/netlink v1.3.1 //gomodjail:unconfined
github.com/vishvananda/netns v0.0.5 //gomodjail:unconfined
github.com/yuchanns/srslog v1.1.0
go.uber.org/mock v0.6.0
go.yaml.in/yaml/v3 v3.0.4
golang.org/x/crypto v0.51.0
golang.org/x/net v0.54.0
Expand Down
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -350,8 +350,6 @@ go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=
go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=
go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
Expand Down
149 changes: 73 additions & 76 deletions pkg/cmd/builder/build_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,104 +19,99 @@ package builder
import (
"fmt"
"path/filepath"
"reflect"
"runtime"
"testing"

specs "github.com/opencontainers/image-spec/specs-go/v1"
"go.uber.org/mock/gomock"
"gotest.tools/v3/assert"
)

type MockParse struct {
ctrl *gomock.Controller
recorder *MockParseRecorder
// fakePlatformParser is a hand-rolled test double for PlatformParser.
// Tests assign the function fields to control behavior.
type fakePlatformParser struct {
ParseFunc func(platform string) (specs.Platform, error)
DefaultSpecFunc func() specs.Platform
}

type MockParseRecorder struct {
mock *MockParse
}

func newMockParser(ctrl *gomock.Controller) *MockParse {
mock := &MockParse{ctrl: ctrl}
mock.recorder = &MockParseRecorder{mock}
return mock
}

func (m *MockParse) EXPECT() *MockParseRecorder {
return m.recorder
}

func (m *MockParse) Parse(platform string) (specs.Platform, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Parse")
ret0, _ := ret[0].(specs.Platform)
ret1, _ := ret[1].(error)
return ret0, ret1
}

func (m *MockParseRecorder) Parse(platform string) *gomock.Call {
m.mock.ctrl.T.Helper()
return m.mock.ctrl.RecordCallWithMethodType(m.mock, "Parse", reflect.TypeOf((*MockParse)(nil).Parse))
}

func (m *MockParse) DefaultSpec() specs.Platform {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "DefaultSpec")
ret0, _ := ret[0].(specs.Platform)
return ret0
func (f *fakePlatformParser) Parse(platform string) (specs.Platform, error) {
if f.ParseFunc == nil {
return specs.Platform{}, nil
}
return f.ParseFunc(platform)
}

func (m *MockParseRecorder) DefaultSpec() *gomock.Call {
m.mock.ctrl.T.Helper()
return m.mock.ctrl.RecordCallWithMethodType(m.mock, "DefaultSpec", reflect.TypeOf((*MockParse)(nil).DefaultSpec))
func (f *fakePlatformParser) DefaultSpec() specs.Platform {
if f.DefaultSpecFunc == nil {
return specs.Platform{}
}
return f.DefaultSpecFunc()
}

func TestIsMatchingRuntimePlatform(t *testing.T) {
t.Parallel()

testCases := []struct {
name string
mock func(*MockParse)
want bool
name string
parser *fakePlatformParser
want bool
}{
{
name: "Image is shareable when Runtime and build platform match for os, arch and variant",
mock: func(mockParser *MockParse) {
mockParser.EXPECT().Parse("test").Return(specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"}, nil)
mockParser.EXPECT().DefaultSpec().Return(specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"})
parser: &fakePlatformParser{
ParseFunc: func(string) (specs.Platform, error) {
return specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"}, nil
},
DefaultSpecFunc: func() specs.Platform {
return specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"}
},
},
want: true,
},
{
name: "Image is shareable when Runtime and build platform match for os, arch. Variant is not defined",
mock: func(mockParser *MockParse) {
mockParser.EXPECT().Parse("test").Return(specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: ""}, nil)
mockParser.EXPECT().DefaultSpec().Return(specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"})
parser: &fakePlatformParser{
ParseFunc: func(string) (specs.Platform, error) {
return specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: ""}, nil
},
DefaultSpecFunc: func() specs.Platform {
return specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"}
},
},
want: true,
},
{
name: "Image is not shareable when Runtime and build platform donot math OS",
mock: func(mockParser *MockParse) {
mockParser.EXPECT().Parse("test").Return(specs.Platform{OS: "OS", Architecture: "mockArch", Variant: ""}, nil)
mockParser.EXPECT().DefaultSpec().Return(specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"})
parser: &fakePlatformParser{
ParseFunc: func(string) (specs.Platform, error) {
return specs.Platform{OS: "OS", Architecture: "mockArch", Variant: ""}, nil
},
DefaultSpecFunc: func() specs.Platform {
return specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"}
},
},
want: false,
},
{
name: "Image is not shareable when Runtime and build platform donot math Arch",
mock: func(mockParser *MockParse) {
mockParser.EXPECT().Parse("test").Return(specs.Platform{OS: "mockOS", Architecture: "Arch", Variant: ""}, nil)
mockParser.EXPECT().DefaultSpec().Return(specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"})
parser: &fakePlatformParser{
ParseFunc: func(string) (specs.Platform, error) {
return specs.Platform{OS: "mockOS", Architecture: "Arch", Variant: ""}, nil
},
DefaultSpecFunc: func() specs.Platform {
return specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"}
},
},
want: false,
},
{
name: "Image is not shareable when Runtime and build platform donot math Variant",
mock: func(mockParser *MockParse) {
mockParser.EXPECT().Parse("test").Return(specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "Variant"}, nil)
mockParser.EXPECT().DefaultSpec().Return(specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"})
parser: &fakePlatformParser{
ParseFunc: func(string) (specs.Platform, error) {
return specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "Variant"}, nil
},
DefaultSpecFunc: func() specs.Platform {
return specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"}
},
},
want: false,
},
Expand All @@ -126,11 +121,7 @@ func TestIsMatchingRuntimePlatform(t *testing.T) {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()

ctrl := gomock.NewController(t)
mockParser := newMockParser(ctrl)
tc.mock(mockParser)
r := isMatchingRuntimePlatform("test", mockParser)
r := isMatchingRuntimePlatform("test", tc.parser)
assert.Equal(t, r, tc.want, tc.name)
})
}
Expand All @@ -141,7 +132,7 @@ func TestIsBuildPlatformDefault(t *testing.T) {

testCases := []struct {
name string
mock func(*MockParse)
parser *fakePlatformParser
platform []string
want bool
}{
Expand All @@ -153,18 +144,26 @@ func TestIsBuildPlatformDefault(t *testing.T) {
{
name: "Image is shareable when Runtime and build platform match for os, arch and variant",
platform: []string{"test"},
mock: func(mockParser *MockParse) {
mockParser.EXPECT().Parse("test").Return(specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"}, nil)
mockParser.EXPECT().DefaultSpec().Return(specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"})
parser: &fakePlatformParser{
ParseFunc: func(string) (specs.Platform, error) {
return specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"}, nil
},
DefaultSpecFunc: func() specs.Platform {
return specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"}
},
},
want: true,
},
{
name: "Image is not shareable when Runtime build platform dont match",
platform: []string{"test"},
mock: func(mockParser *MockParse) {
mockParser.EXPECT().Parse("test").Return(specs.Platform{OS: "OS", Architecture: "mockArch", Variant: "mockVariant"}, nil)
mockParser.EXPECT().DefaultSpec().Return(specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"})
parser: &fakePlatformParser{
ParseFunc: func(string) (specs.Platform, error) {
return specs.Platform{OS: "OS", Architecture: "mockArch", Variant: "mockVariant"}, nil
},
DefaultSpecFunc: func() specs.Platform {
return specs.Platform{OS: "mockOS", Architecture: "mockArch", Variant: "mockVariant"}
},
},
want: false,
},
Expand All @@ -179,13 +178,11 @@ func TestIsBuildPlatformDefault(t *testing.T) {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()

ctrl := gomock.NewController(t)
mockParser := newMockParser(ctrl)
if len(tc.platform) == 1 {
tc.mock(mockParser)
parser := tc.parser
if parser == nil {
parser = &fakePlatformParser{}
}
r := isBuildPlatformDefault(tc.platform, mockParser)
r := isBuildPlatformDefault(tc.platform, parser)
assert.Equal(t, r, tc.want, tc.name)
})
}
Expand Down
Loading
Loading