github.com/aquasecurity/trivy-iac@v0.8.1-0.20240127024015-3d8e412cf0ab/test/docker_test.go (about) 1 package test 2 3 import ( 4 "context" 5 "fmt" 6 "os" 7 "testing" 8 9 "github.com/aquasecurity/defsec/pkg/scan" 10 "github.com/aquasecurity/defsec/pkg/scanners/options" 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 14 "github.com/aquasecurity/trivy-iac/pkg/scanners/dockerfile" 15 ) 16 17 // func addFilesToMemFS(memfs *memoryfs.FS, typePolicy bool, folderName string) error { 18 // base := filepath.Base(folderName) 19 // if err := memfs.MkdirAll(base, 0o700); err != nil { 20 // return err 21 // } 22 // err := filepath.Walk(filepath.FromSlash(folderName), 23 // func(fpath string, info os.FileInfo, err error) error { 24 // if err != nil { 25 // return err 26 // } 27 // if info.IsDir() { 28 // return nil 29 // } 30 // if typePolicy && !rego.IsRegoFile(info.Name()) { 31 // return nil 32 // } 33 // data, err := os.ReadFile(fpath) 34 // if err != nil { 35 // return err 36 // } 37 // fileName := getFileName(fpath, info, typePolicy) 38 // if err := memfs.WriteFile(path.Join(base, fileName), data, 0o644); err != nil { 39 // return err 40 // } 41 // return nil 42 // }) 43 // 44 // if err != nil { 45 // return err 46 // } 47 // return nil 48 //} 49 50 // TODO: Evaluate usefulness of this test 51 // func Test_Docker_RegoPoliciesFromDisk(t *testing.T) { 52 // t.Parallel() 53 // 54 // entries, err := os.ReadDir("./testdata/dockerfile") 55 // require.NoError(t, err) 56 // 57 // policiesPath, err := filepath.Abs("../rules") 58 // require.NoError(t, err) 59 // scanner := dockerfile.NewScanner( 60 // options.ScannerWithPolicyDirs(filepath.Base(policiesPath)), 61 // ) 62 // memfs := memoryfs.New() 63 // // add policies 64 // err = addFilesToMemFS(memfs, true, policiesPath) 65 // require.NoError(t, err) 66 // 67 // // add test data 68 // testDataPath, err := filepath.Abs("./testdata/dockerfile") 69 // require.NoError(t, err) 70 // err = addFilesToMemFS(memfs, false, testDataPath) 71 // require.NoError(t, err) 72 // 73 // results, err := scanner.ScanFS(context.TODO(), memfs, filepath.Base(testDataPath)) 74 // require.NoError(t, err) 75 // 76 // for _, entry := range entries { 77 // if !entry.IsDir() { 78 // continue 79 // } 80 // t.Run(entry.Name(), func(t *testing.T) { 81 // require.NoError(t, err) 82 // t.Run(entry.Name(), func(t *testing.T) { 83 // var matched int 84 // for _, result := range results { 85 // if result.Rule().HasID(entry.Name()) && result.Status() == scan.StatusFailed { 86 // if result.Description() != "Specify at least 1 USER command in Dockerfile with non-root user as argument" { 87 // assert.Greater(t, result.Range().GetStartLine(), 0) 88 // assert.Greater(t, result.Range().GetEndLine(), 0) 89 // } 90 // if !strings.HasSuffix(result.Range().GetFilename(), entry.Name()) { 91 // continue 92 // } 93 // matched++ 94 // } 95 // } 96 // assert.Equal(t, 1, matched, "Rule should be matched once") 97 // }) 98 // 99 // }) 100 // } 101 //} 102 103 func Test_Docker_RegoPoliciesEmbedded(t *testing.T) { 104 t.Parallel() 105 106 entries, err := os.ReadDir("./testdata/dockerfile") 107 require.NoError(t, err) 108 109 scanner := dockerfile.NewScanner(options.ScannerWithEmbeddedPolicies(true), options.ScannerWithEmbeddedLibraries(true)) 110 srcFS := os.DirFS("../") 111 112 results, err := scanner.ScanFS(context.TODO(), srcFS, "test/testdata/dockerfile") 113 require.NoError(t, err) 114 115 for _, entry := range entries { 116 if !entry.IsDir() { 117 continue 118 } 119 t.Run(entry.Name(), func(t *testing.T) { 120 require.NoError(t, err) 121 t.Run(entry.Name(), func(t *testing.T) { 122 var matched bool 123 for _, result := range results { 124 if result.Rule().HasID(entry.Name()) && result.Status() == scan.StatusFailed { 125 if result.Description() != "Specify at least 1 USER command in Dockerfile with non-root user as argument" { 126 assert.Greater(t, result.Range().GetStartLine(), 0) 127 assert.Greater(t, result.Range().GetEndLine(), 0) 128 } 129 assert.Equal(t, fmt.Sprintf("test/testdata/dockerfile/%s/Dockerfile.denied", entry.Name()), result.Range().GetFilename()) 130 matched = true 131 } 132 } 133 assert.True(t, matched) 134 }) 135 136 }) 137 } 138 }