image/image_test.go
4f0d95fa
 package image // import "github.com/docker/docker/image"
504e67b8
 
 import (
01ba0a93
 	"encoding/json"
832f39c2
 	"runtime"
01ba0a93
 	"sort"
 	"strings"
504e67b8
 	"testing"
69d73620
 
b50ade0b
 	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/layer"
c9e52bd0
 	"github.com/google/go-cmp/cmp"
38457285
 	"gotest.tools/assert"
 	is "gotest.tools/assert/cmp"
504e67b8
 )
 
01ba0a93
 const sampleImageJSON = `{
 	"architecture": "amd64",
 	"os": "linux",
 	"config": {},
 	"rootfs": {
 		"type": "layers",
 		"diff_ids": []
 	}
 }`
504e67b8
 
69d73620
 func TestNewFromJSON(t *testing.T) {
01ba0a93
 	img, err := NewFromJSON([]byte(sampleImageJSON))
6be0f709
 	assert.NilError(t, err)
 	assert.Check(t, is.Equal(sampleImageJSON, string(img.RawJSON())))
504e67b8
 }
 
69d73620
 func TestNewFromJSONWithInvalidJSON(t *testing.T) {
01ba0a93
 	_, err := NewFromJSON([]byte("{}"))
6be0f709
 	assert.Check(t, is.Error(err, "invalid image JSON, no RootFS key"))
504e67b8
 }
 
01ba0a93
 func TestMarshalKeyOrder(t *testing.T) {
 	b, err := json.Marshal(&Image{
 		V1Image: V1Image{
 			Comment:      "a",
 			Author:       "b",
 			Architecture: "c",
 		},
 	})
6be0f709
 	assert.Check(t, err)
01ba0a93
 
 	expectedOrder := []string{"architecture", "author", "comment"}
 	var indexes []int
 	for _, k := range expectedOrder {
 		indexes = append(indexes, strings.Index(string(b), k))
 	}
504e67b8
 
01ba0a93
 	if !sort.IntsAreSorted(indexes) {
 		t.Fatal("invalid key order in JSON: ", string(b))
504e67b8
 	}
 }
b50ade0b
 
832f39c2
 func TestImage(t *testing.T) {
 	cid := "50a16564e727"
 	config := &container.Config{
 		Hostname:   "hostname",
 		Domainname: "domain",
 		User:       "root",
 	}
d98ecf2d
 	os := runtime.GOOS
832f39c2
 
 	img := &Image{
 		V1Image: V1Image{
 			Config: config,
 		},
 		computedID: ID(cid),
 	}
 
6be0f709
 	assert.Check(t, is.Equal(cid, img.ImageID()))
 	assert.Check(t, is.Equal(cid, img.ID().String()))
 	assert.Check(t, is.Equal(os, img.OperatingSystem()))
 	assert.Check(t, is.DeepEqual(config, img.RunConfig()))
832f39c2
 }
 
d98ecf2d
 func TestImageOSNotEmpty(t *testing.T) {
 	os := "os"
832f39c2
 	img := &Image{
 		V1Image: V1Image{
d98ecf2d
 			OS: os,
832f39c2
 		},
 		OSVersion: "osversion",
 	}
6be0f709
 	assert.Check(t, is.Equal(os, img.OperatingSystem()))
832f39c2
 }
 
b50ade0b
 func TestNewChildImageFromImageWithRootFS(t *testing.T) {
 	rootFS := NewRootFS()
 	rootFS.Append(layer.DiffID("ba5e"))
 	parent := &Image{
 		RootFS: rootFS,
 		History: []History{
 			NewHistory("a", "c", "r", false),
 		},
 	}
 	childConfig := ChildConfig{
 		DiffID:  layer.DiffID("abcdef"),
 		Author:  "author",
 		Comment: "comment",
 		ContainerConfig: &container.Config{
 			Cmd: []string{"echo", "foo"},
 		},
 		Config: &container.Config{},
 	}
 
 	newImage := NewChildImage(parent, childConfig, "platform")
 	expectedDiffIDs := []layer.DiffID{layer.DiffID("ba5e"), layer.DiffID("abcdef")}
6be0f709
 	assert.Check(t, is.DeepEqual(expectedDiffIDs, newImage.RootFS.DiffIDs))
 	assert.Check(t, is.Equal(childConfig.Author, newImage.Author))
 	assert.Check(t, is.DeepEqual(childConfig.Config, newImage.Config))
 	assert.Check(t, is.DeepEqual(*childConfig.ContainerConfig, newImage.ContainerConfig))
 	assert.Check(t, is.Equal("platform", newImage.OS))
 	assert.Check(t, is.DeepEqual(childConfig.Config, newImage.Config))
b50ade0b
 
6be0f709
 	assert.Check(t, is.Len(newImage.History, 2))
 	assert.Check(t, is.Equal(childConfig.Comment, newImage.History[1].Comment))
b50ade0b
 
c9e52bd0
 	assert.Check(t, !cmp.Equal(parent.RootFS.DiffIDs, newImage.RootFS.DiffIDs),
 		"RootFS should be copied not mutated")
b50ade0b
 }