1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
package llb
import (
"context"
"encoding/json"
"testing"
"github.com/containerd/containerd/platforms"
"github.com/moby/buildkit/client/llb/sourceresolver"
"github.com/moby/buildkit/solver/pb"
digest "github.com/opencontainers/go-digest"
"github.com/pkg/errors"
"github.com/stretchr/testify/require"
)
func TestImageMetaResolver(t *testing.T) {
t.Parallel()
tr := &testResolver{
digest: digest.FromBytes([]byte("foo")),
dir: "/bar",
}
st := Image("alpine", WithMetaResolver(tr))
require.Equal(t, false, tr.called)
def, err := st.Marshal(context.TODO(), LinuxPpc64le)
require.NoError(t, err)
require.Equal(t, true, tr.called)
require.Equal(t, "linux/ppc64le", tr.platform)
m, arr := parseDef(t, def.Def)
require.Equal(t, 2, len(arr))
dgst, idx := last(t, arr)
require.Equal(t, 0, idx)
require.Equal(t, m[dgst], arr[0])
require.Equal(t, "docker-image://docker.io/library/alpine:latest", arr[0].Op.(*pb.Op_Source).Source.GetIdentifier())
d, err := st.GetDir(context.TODO())
require.NoError(t, err)
require.Equal(t, "/bar", d)
}
func TestImageResolveDigest(t *testing.T) {
t.Parallel()
st := Image("alpine", WithMetaResolver(&testResolver{
digest: digest.FromBytes([]byte("bar")),
dir: "/foo",
}), ResolveDigest(true))
def, err := st.Marshal(context.TODO())
require.NoError(t, err)
m, arr := parseDef(t, def.Def)
require.Equal(t, 2, len(arr))
dgst, idx := last(t, arr)
require.Equal(t, 0, idx)
require.Equal(t, m[dgst], arr[0])
require.Equal(t, "docker-image://docker.io/library/alpine:latest@"+string(digest.FromBytes([]byte("bar"))), arr[0].Op.(*pb.Op_Source).Source.GetIdentifier())
d, err := st.GetDir(context.TODO())
require.NoError(t, err)
require.Equal(t, "/foo", d)
}
type testResolver struct {
digest digest.Digest
dir string
called bool
platform string
}
func (r *testResolver) ResolveImageConfig(ctx context.Context, ref string, opt sourceresolver.Opt) (string, digest.Digest, []byte, error) {
var img struct {
Config struct {
Env []string `json:"Env,omitempty"`
WorkingDir string `json:"WorkingDir,omitempty"`
User string `json:"User,omitempty"`
} `json:"config,omitempty"`
}
r.called = true
img.Config.WorkingDir = r.dir
if opt.Platform != nil {
r.platform = platforms.Format(*opt.Platform)
}
dt, err := json.Marshal(img)
if err != nil {
return "", "", nil, errors.WithStack(err)
}
return ref, r.digest, dt, nil
}
|