client: add test for whiteout parent dirs
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>docker-18.09
parent
7906fb3085
commit
c71799dff4
|
@ -40,6 +40,7 @@ func TestClientIntegration(t *testing.T) {
|
|||
testResolveAndHosts,
|
||||
testUser,
|
||||
testOCIExporter,
|
||||
testWhiteoutParentDir,
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -552,6 +553,70 @@ func testBuildPushAndValidate(t *testing.T, sb integration.Sandbox) {
|
|||
require.False(t, ok)
|
||||
}
|
||||
|
||||
// #276
|
||||
func testWhiteoutParentDir(t *testing.T, sb integration.Sandbox) {
|
||||
requiresLinux(t)
|
||||
t.Parallel()
|
||||
c, err := New(sb.Address())
|
||||
require.NoError(t, err)
|
||||
defer c.Close()
|
||||
|
||||
busybox := llb.Image("busybox:latest")
|
||||
st := llb.Scratch()
|
||||
|
||||
run := func(cmd string) {
|
||||
st = busybox.Run(llb.Shlex(cmd), llb.Dir("/wd")).AddMount("/wd", st)
|
||||
}
|
||||
|
||||
run(`sh -c "mkdir -p foo; echo -n first > foo/bar;"`)
|
||||
run(`rm foo/bar`)
|
||||
|
||||
def, err := st.Marshal()
|
||||
require.NoError(t, err)
|
||||
|
||||
destDir, err := ioutil.TempDir("", "buildkit")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(destDir)
|
||||
|
||||
out := filepath.Join(destDir, "out.tar")
|
||||
|
||||
err = c.Solve(context.TODO(), def, SolveOpt{
|
||||
Exporter: ExporterOCI,
|
||||
ExporterAttrs: map[string]string{
|
||||
"output": out,
|
||||
},
|
||||
}, nil)
|
||||
require.NoError(t, err)
|
||||
|
||||
dt, err := ioutil.ReadFile(out)
|
||||
require.NoError(t, err)
|
||||
|
||||
m, err := readTarToMap(dt, false)
|
||||
require.NoError(t, err)
|
||||
|
||||
var index ocispec.Index
|
||||
err = json.Unmarshal(m["index.json"].data, &index)
|
||||
require.NoError(t, err)
|
||||
|
||||
var mfst ocispec.Manifest
|
||||
err = json.Unmarshal(m["blobs/sha256/"+index.Manifests[0].Digest.Hex()].data, &mfst)
|
||||
require.NoError(t, err)
|
||||
|
||||
lastLayer := mfst.Layers[len(mfst.Layers)-1]
|
||||
|
||||
layer, ok := m["blobs/sha256/"+lastLayer.Digest.Hex()]
|
||||
require.True(t, ok)
|
||||
|
||||
m, err = readTarToMap(layer.data, true)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, ok = m["foo/.wh.bar"]
|
||||
require.True(t, ok)
|
||||
|
||||
_, ok = m["foo/"]
|
||||
require.True(t, ok)
|
||||
}
|
||||
|
||||
func requiresLinux(t *testing.T) {
|
||||
if runtime.GOOS != "linux" {
|
||||
t.Skipf("unsupported GOOS: %s", runtime.GOOS)
|
||||
|
|
Loading…
Reference in New Issue