mirror of
https://github.com/anchore/syft.git
synced 2026-11-01 23:16:30 +01:00
* test: add windows unit test job and capture dir resolver path bug - add a `Unit tests (Windows)` job running a new `make unit:windows` task, scoped to the packages that own host path handling (tests needing linux docker fixtures are skipped) - `Unit tests` is now a gate job over the Linux and Windows unit jobs - add a resolver test asserting that locations from `AllLocations` resolve again via `FilesByPath` and use posix paths. This is expected to fail on windows today, which is why file digests come back empty for `dir:` scans (#5325) - fix windows-only test files that no longer compiled Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * chore: drop verbose output from integration tests Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix: windows path handling outside of the file lookup bug - chroot paths are always posix (`ToChrootPath` no longer returns backslash paths on windows), same for the directory source name derived from `base` - `windows.FromPosix` no longer panics on input that isn't volume-encoded (e.g. relative or already native paths) - skip tests on windows that rely on symlink fixtures, shell script fixtures, or emulate windows paths on a posix host - disable `core.autocrlf` on the windows CI job so fixture digests match linux This leaves only the `FilesByPath` lookup failures from #5325. Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * test: skip posix-only fileresolver tests on windows Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix: split contained paths on posix separators on windows - `allContainedPaths` cleaned with the native separator but split on `/`, so a root reached through a symlink never had its ancestors indexed on windows - index assertions in tests now key on the posix path the index actually stores - skip symlink fixture tests and a posix-only test helper on windows Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * chore: revert unrelated go.sum churn and allContainedPaths change - restore `go.sum` and `.make/go.sum` (accidentally populated by a local `-mod=mod` invocation) - revert the `allContainedPaths` separator change: production passes native windows paths there, and splitting them on `/` produces drive-relative ancestors, so skip the posix-only test on windows instead - annotate the remaining `filepath` usages that operate on native paths Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix: search the file tree with posix paths on windows (#5325) The directory and file resolvers key their file tree on posix paths (`/c/some/path`), but `FilesByPath`, `HasPath` and root-anchored `FilesByGlob` searched it with the native path from the chroot context (`C:\some\path`). On windows every lookup silently missed, so anything that resolves files by path found nothing. This is why file digests were empty for `dir:` scans. Requests are now converted to posix before searching the tree. Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> --------- Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>
103 lines
2.6 KiB
Go
103 lines
2.6 KiB
Go
package fileresolver
|
|
|
|
import (
|
|
"io/fs"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// - Verify that both the parent and the path are indexed
|
|
func Test_index(t *testing.T) {
|
|
testPath := "testdata/system_paths/target/home/place"
|
|
indexer := newFileIndexer(testPath, "", make([]PathIndexVisitor, 0)...)
|
|
tree, index, err := indexer.build()
|
|
require.NoError(t, err)
|
|
|
|
tests := []struct {
|
|
name string
|
|
path string
|
|
}{
|
|
{
|
|
name: "has path",
|
|
path: "testdata/system_paths/target/home/place",
|
|
},
|
|
{
|
|
name: "has parent dir",
|
|
path: "testdata/system_paths/target/home",
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
info, err := os.Stat(test.path)
|
|
assert.NoError(t, err)
|
|
|
|
p := indexedPath(t, test.path)
|
|
assert.Equal(t, true, tree.HasPath(p))
|
|
exists, ref, err := tree.File(p)
|
|
assert.Equal(t, true, exists)
|
|
if assert.NoError(t, err) {
|
|
return
|
|
}
|
|
|
|
entry, err := index.Get(*ref.Reference)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, info.Mode(), entry.Mode)
|
|
})
|
|
}
|
|
|
|
}
|
|
|
|
// - Verify that directories are rejected
|
|
func Test_indexRejectsDirectory(t *testing.T) {
|
|
dirPath := "testdata/system_paths/target/home"
|
|
indexer := newFileIndexer(dirPath, "", make([]PathIndexVisitor, 0)...)
|
|
_, _, err := indexer.build()
|
|
require.Error(t, err)
|
|
}
|
|
|
|
// - Verify ignores if filterAndIndex sets up a filter for the filepath
|
|
func Test_ignoresPathIfFiltered(t *testing.T) {
|
|
testPath := "testdata/system_paths/target/home/place"
|
|
cwd, cwdErr := os.Getwd()
|
|
require.NoError(t, cwdErr)
|
|
// filepath (not path): filters see the native absolute path (before posix normalization), so the
|
|
// expected value must be joined with the host separator to match on windows
|
|
ignorePath := filepath.Join(cwd, testPath)
|
|
filterFn := func(_, path string, _ os.FileInfo, _ error) error {
|
|
if path == ignorePath {
|
|
return ErrSkipPath
|
|
}
|
|
|
|
return nil
|
|
}
|
|
indexer := newFileIndexer(testPath, "", filterFn)
|
|
_, _, err := indexer.build()
|
|
require.Error(t, err)
|
|
}
|
|
|
|
// - Verify ignores if filterAndIndex sets up a filter for the directory
|
|
func Test_ignoresPathIfParentFiltered(t *testing.T) {
|
|
testPath := "testdata/system_paths/target/home/place"
|
|
parentPath := "testdata/system_paths/target/home"
|
|
|
|
cwd, cwdErr := os.Getwd()
|
|
require.NoError(t, cwdErr)
|
|
// filepath (not path): see Test_ignoresPathIfFiltered
|
|
ignorePath := filepath.Join(cwd, parentPath)
|
|
filterFn := func(_, path string, _ os.FileInfo, _ error) error {
|
|
if path == ignorePath {
|
|
return fs.SkipDir
|
|
}
|
|
|
|
return nil
|
|
}
|
|
indexer := newFileIndexer(testPath, "", filterFn)
|
|
_, _, err := indexer.build()
|
|
require.Error(t, err)
|
|
}
|