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  }