2019-04-26 18:12:43 -04:00
|
|
|
package dockerfile // import "github.com/docker/docker/builder/dockerfile"
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"runtime"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/containerd/containerd/platforms"
|
|
|
|
"github.com/docker/docker/builder"
|
|
|
|
"github.com/docker/docker/image"
|
|
|
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
2020-02-07 08:39:24 -05:00
|
|
|
"gotest.tools/v3/assert"
|
2019-04-26 18:12:43 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
func getMockImageSource(getImageImage builder.Image, getImageLayer builder.ROLayer, getImageError error) *imageSources {
|
|
|
|
return &imageSources{
|
|
|
|
byImageID: make(map[string]*imageMount),
|
|
|
|
mounts: []*imageMount{},
|
|
|
|
getImage: func(name string, localOnly bool, platform *ocispec.Platform) (builder.Image, builder.ROLayer, error) {
|
|
|
|
return getImageImage, getImageLayer, getImageError
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func getMockImageMount() *imageMount {
|
|
|
|
return &imageMount{
|
|
|
|
image: nil,
|
|
|
|
layer: nil,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestAddScratchImageAddsToMounts(t *testing.T) {
|
|
|
|
is := getMockImageSource(nil, nil, fmt.Errorf("getImage is not implemented"))
|
|
|
|
im := getMockImageMount()
|
|
|
|
|
|
|
|
// We are testing whether the imageMount is added to is.mounts
|
|
|
|
assert.Equal(t, len(is.mounts), 0)
|
|
|
|
is.Add(im, nil)
|
|
|
|
assert.Equal(t, len(is.mounts), 1)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestAddFromScratchPopulatesPlatform(t *testing.T) {
|
|
|
|
is := getMockImageSource(nil, nil, fmt.Errorf("getImage is not implemented"))
|
|
|
|
|
|
|
|
platforms := []*ocispec.Platform{
|
|
|
|
{
|
|
|
|
OS: "linux",
|
|
|
|
Architecture: "amd64",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
OS: "linux",
|
|
|
|
Architecture: "arm64",
|
|
|
|
Variant: "v8",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for i, platform := range platforms {
|
|
|
|
im := getMockImageMount()
|
|
|
|
assert.Equal(t, len(is.mounts), i)
|
|
|
|
is.Add(im, platform)
|
|
|
|
image, ok := im.image.(*image.Image)
|
|
|
|
assert.Assert(t, ok)
|
|
|
|
assert.Equal(t, image.OS, platform.OS)
|
|
|
|
assert.Equal(t, image.Architecture, platform.Architecture)
|
|
|
|
assert.Equal(t, image.Variant, platform.Variant)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestAddFromScratchDoesNotModifyArgPlatform(t *testing.T) {
|
|
|
|
is := getMockImageSource(nil, nil, fmt.Errorf("getImage is not implemented"))
|
|
|
|
im := getMockImageMount()
|
|
|
|
|
|
|
|
platform := &ocispec.Platform{
|
|
|
|
OS: "windows",
|
|
|
|
Architecture: "amd64",
|
|
|
|
}
|
|
|
|
argPlatform := *platform
|
|
|
|
|
|
|
|
is.Add(im, &argPlatform)
|
|
|
|
// The way the code is written right now, this test
|
|
|
|
// really doesn't do much except on Windows.
|
|
|
|
assert.DeepEqual(t, *platform, argPlatform)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestAddFromScratchPopulatesPlatformIfNil(t *testing.T) {
|
|
|
|
is := getMockImageSource(nil, nil, fmt.Errorf("getImage is not implemented"))
|
|
|
|
im := getMockImageMount()
|
|
|
|
is.Add(im, nil)
|
|
|
|
image, ok := im.image.(*image.Image)
|
|
|
|
assert.Assert(t, ok)
|
|
|
|
|
|
|
|
expectedPlatform := platforms.DefaultSpec()
|
|
|
|
if runtime.GOOS == "windows" {
|
|
|
|
expectedPlatform.OS = "linux"
|
|
|
|
}
|
|
|
|
assert.Equal(t, expectedPlatform.OS, image.OS)
|
|
|
|
assert.Equal(t, expectedPlatform.Architecture, image.Architecture)
|
|
|
|
assert.Equal(t, expectedPlatform.Variant, image.Variant)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestImageSourceGetAddsToMounts(t *testing.T) {
|
|
|
|
is := getMockImageSource(nil, nil, nil)
|
|
|
|
_, err := is.Get("test", false, nil)
|
|
|
|
assert.NilError(t, err)
|
|
|
|
assert.Equal(t, len(is.mounts), 1)
|
|
|
|
}
|