github.com/anchore/syft@v1.38.2/syft/internal/fileresolver/file_indexer_test.go (about)

     1  package fileresolver
     2  
     3  import (
     4  	"io/fs"
     5  	"os"
     6  	"path"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"github.com/anchore/stereoscope/pkg/file"
    13  )
    14  
    15  // - Verify that both the parent and the path are indexed
    16  func Test_index(t *testing.T) {
    17  	testPath := "test-fixtures/system_paths/target/home/place"
    18  	indexer := newFileIndexer(testPath, "", make([]PathIndexVisitor, 0)...)
    19  	tree, index, err := indexer.build()
    20  	require.NoError(t, err)
    21  
    22  	tests := []struct {
    23  		name string
    24  		path string
    25  	}{
    26  		{
    27  			name: "has path",
    28  			path: "test-fixtures/system_paths/target/home/place",
    29  		},
    30  		{
    31  			name: "has parent dir",
    32  			path: "test-fixtures/system_paths/target/home",
    33  		},
    34  	}
    35  
    36  	for _, test := range tests {
    37  		t.Run(test.name, func(t *testing.T) {
    38  			info, err := os.Stat(test.path)
    39  			assert.NoError(t, err)
    40  
    41  			// note: the index uses absolute paths, so assertions MUST keep this in mind
    42  			cwd, err := os.Getwd()
    43  			require.NoError(t, err)
    44  
    45  			p := file.Path(path.Join(cwd, test.path))
    46  			assert.Equal(t, true, tree.HasPath(p))
    47  			exists, ref, err := tree.File(p)
    48  			assert.Equal(t, true, exists)
    49  			if assert.NoError(t, err) {
    50  				return
    51  			}
    52  
    53  			entry, err := index.Get(*ref.Reference)
    54  			require.NoError(t, err)
    55  			assert.Equal(t, info.Mode(), entry.Mode)
    56  		})
    57  	}
    58  
    59  }
    60  
    61  // - Verify that directories are rejected
    62  func Test_indexRejectsDirectory(t *testing.T) {
    63  	dirPath := "test-fixtures/system_paths/target/home"
    64  	indexer := newFileIndexer(dirPath, "", make([]PathIndexVisitor, 0)...)
    65  	_, _, err := indexer.build()
    66  	require.Error(t, err)
    67  }
    68  
    69  // - Verify ignores if filterAndIndex sets up a filter for the filepath
    70  func Test_ignoresPathIfFiltered(t *testing.T) {
    71  	testPath := "test-fixtures/system_paths/target/home/place"
    72  	cwd, cwdErr := os.Getwd()
    73  	require.NoError(t, cwdErr)
    74  	ignorePath := path.Join(cwd, testPath)
    75  	filterFn := func(_, path string, _ os.FileInfo, _ error) error {
    76  		if path == ignorePath {
    77  			return ErrSkipPath
    78  		}
    79  
    80  		return nil
    81  	}
    82  	indexer := newFileIndexer(testPath, "", filterFn)
    83  	_, _, err := indexer.build()
    84  	require.Error(t, err)
    85  }
    86  
    87  // - Verify ignores if filterAndIndex sets up a filter for the directory
    88  func Test_ignoresPathIfParentFiltered(t *testing.T) {
    89  	testPath := "test-fixtures/system_paths/target/home/place"
    90  	parentPath := "test-fixtures/system_paths/target/home"
    91  
    92  	cwd, cwdErr := os.Getwd()
    93  	require.NoError(t, cwdErr)
    94  	ignorePath := path.Join(cwd, parentPath)
    95  	filterFn := func(_, path string, _ os.FileInfo, _ error) error {
    96  		if path == ignorePath {
    97  			return fs.SkipDir
    98  		}
    99  
   100  		return nil
   101  	}
   102  	indexer := newFileIndexer(testPath, "", filterFn)
   103  	_, _, err := indexer.build()
   104  	require.Error(t, err)
   105  }