github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/module/module_test.go (about) 1 package module_test 2 3 import ( 4 "context" 5 "io/fs" 6 "path/filepath" 7 "runtime" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 13 "github.com/devseccon/trivy/pkg/fanal/analyzer" 14 "github.com/devseccon/trivy/pkg/module" 15 "github.com/devseccon/trivy/pkg/scanner/post" 16 ) 17 18 func TestManager_Register(t *testing.T) { 19 if runtime.GOOS == "windows" { 20 // WASM tests difficult on Windows 21 t.Skip("Test satisfied adequately by Linux tests") 22 } 23 tests := []struct { 24 name string 25 moduleDir string 26 enabledModules []string 27 wantAnalyzerVersions analyzer.Versions 28 wantPostScannerVersions map[string]int 29 wantErr bool 30 }{ 31 { 32 name: "happy path", 33 moduleDir: "testdata/happy", 34 wantAnalyzerVersions: analyzer.Versions{ 35 Analyzers: map[string]int{ 36 "happy": 1, 37 }, 38 PostAnalyzers: map[string]int{}, 39 }, 40 wantPostScannerVersions: map[string]int{ 41 "happy": 1, 42 }, 43 }, 44 { 45 name: "only analyzer", 46 moduleDir: "testdata/analyzer", 47 wantAnalyzerVersions: analyzer.Versions{ 48 Analyzers: map[string]int{ 49 "analyzer": 1, 50 }, 51 PostAnalyzers: map[string]int{}, 52 }, 53 wantPostScannerVersions: map[string]int{}, 54 }, 55 { 56 name: "only post scanner", 57 moduleDir: "testdata/scanner", 58 wantAnalyzerVersions: analyzer.Versions{ 59 Analyzers: map[string]int{}, 60 PostAnalyzers: map[string]int{}, 61 }, 62 wantPostScannerVersions: map[string]int{ 63 "scanner": 2, 64 }, 65 }, 66 { 67 name: "no module dir", 68 moduleDir: "no-such-dir", 69 wantAnalyzerVersions: analyzer.Versions{ 70 Analyzers: map[string]int{}, 71 PostAnalyzers: map[string]int{}, 72 }, 73 wantPostScannerVersions: map[string]int{}, 74 }, 75 { 76 name: "pass enabled modules", 77 moduleDir: "testdata", 78 enabledModules: []string{ 79 "happy", 80 "analyzer", 81 }, 82 wantAnalyzerVersions: analyzer.Versions{ 83 Analyzers: map[string]int{ 84 "happy": 1, 85 "analyzer": 1, 86 }, 87 PostAnalyzers: map[string]int{}, 88 }, 89 wantPostScannerVersions: map[string]int{ 90 "happy": 1, 91 }, 92 }, 93 } 94 95 // Confirm that wasm modules are generated beforehand 96 var count int 97 err := filepath.WalkDir("testdata", func(path string, d fs.DirEntry, err error) error { 98 if filepath.Ext(path) == ".wasm" { 99 count++ 100 } 101 return nil 102 }) 103 require.NoError(t, err) 104 // WASM modules must be generated before running the tests. 105 require.Equal(t, count, 3, "missing WASM modules, try 'mage test:unit' or 'mage test:generateModules'") 106 107 for _, tt := range tests { 108 t.Run(tt.name, func(t *testing.T) { 109 m, err := module.NewManager(context.Background(), module.Options{ 110 Dir: tt.moduleDir, 111 EnabledModules: tt.enabledModules, 112 }) 113 require.NoError(t, err) 114 115 // Register analyzer and post scanner from WASM module 116 m.Register() 117 118 // Remove registered analyzers and post scanners so that it will not affect other tests. 119 defer m.Deregister() 120 121 // Confirm the analyzer is registered 122 a, err := analyzer.NewAnalyzerGroup(analyzer.AnalyzerOptions{}) 123 require.NoError(t, err) 124 125 got := a.AnalyzerVersions() 126 assert.Equal(t, tt.wantAnalyzerVersions, got) 127 128 // Confirm the post scanner is registered 129 gotScannerVersions := post.ScannerVersions() 130 assert.Equal(t, tt.wantPostScannerVersions, gotScannerVersions) 131 }) 132 } 133 }