diff --git a/test/integration/path_type_change_test.go b/test/integration/path_type_change_test.go new file mode 100644 index 00000000..998acefb --- /dev/null +++ b/test/integration/path_type_change_test.go @@ -0,0 +1,62 @@ +package integration + +import ( + "testing" + + "github.com/anchore/stereoscope/pkg/file" + "github.com/anchore/stereoscope/pkg/filetree/filenode" + "github.com/anchore/stereoscope/pkg/imagetest" +) + +func TestPathTypeChangeImage(t *testing.T) { + image := imagetest.GetFixtureImage(t, "docker-archive", "image-path-type-change") + + layerAssertions := []map[string]file.Type{ + make(map[string]file.Type), + { + "/chimera/a.txt": file.TypeRegular, + "/chimera/b.txt": file.TypeRegular, + "/chimera": file.TypeDirectory, + }, + { + "/chimera": file.TypeDirectory, + }, + make(map[string]file.Type), + { + "/chimera": file.TypeRegular, + }, + make(map[string]file.Type), + { + "/chimera": file.TypeSymLink, + }, + make(map[string]file.Type), + { + "/chimera": file.TypeDirectory, + }, + } + + for idx, layer := range image.Layers { + assertions := layerAssertions[idx] + err := layer.SquashedTree.Walk(func(path file.Path, f filenode.FileNode) error { + expect, ok := assertions[string(path)] + if !ok { + return nil + } + if f.FileType != expect { + t.Errorf("at %v got %v want %v", path, f.FileType, expect) + } + delete(assertions, string(path)) + return nil + }, nil) + if err != nil { + t.Error(err) + } + } + for i, a := range layerAssertions { + if len(a) > 0 { + for k, v := range a { + t.Errorf("for layer %v, never saw %v of type %v", i, k, v) + } + } + } +} diff --git a/test/integration/test-fixtures/image-path-type-change/Dockerfile b/test/integration/test-fixtures/image-path-type-change/Dockerfile new file mode 100644 index 00000000..16a58798 --- /dev/null +++ b/test/integration/test-fixtures/image-path-type-change/Dockerfile @@ -0,0 +1,20 @@ +FROM busybox:1.37.0@sha256:db142d433cdde11f10ae479dbf92f3b13d693fd1c91053da9979728cceb1dc68 + +# makes /chimera/a.txt /chimera/b.txt +COPY . / + +# make a layer where the dir is empty +RUN rm /chimera/a.txt /chimera/b.txt + +RUN rmdir /chimera + +RUN touch /chimera + +RUN rm /chimera + +RUN ln -s /etc/hostname /chimera + +RUN unlink /chimera + +RUN mkdir /chimera + diff --git a/test/integration/test-fixtures/image-path-type-change/chimera/a.txt b/test/integration/test-fixtures/image-path-type-change/chimera/a.txt new file mode 100644 index 00000000..e69de29b diff --git a/test/integration/test-fixtures/image-path-type-change/chimera/b.txt b/test/integration/test-fixtures/image-path-type-change/chimera/b.txt new file mode 100644 index 00000000..e69de29b