diff --git a/checks/dependencies_selected_test.go b/checks/dependencies_selected_test.go index 97fd368..f170fcc 100644 --- a/checks/dependencies_selected_test.go +++ b/checks/dependencies_selected_test.go @@ -29,8 +29,7 @@ func TestDependenciesSelected(t *testing.T) { Modules: []report.Module{ {Name: "Test", Instances: []report.ModuleInstance{ - {IsDependency: true}, - {IsSelected: true}, + {IsDependency: true, IsSelected: true, Source: report.DetailedReportModuleSelected}, }}, }, } diff --git a/checks/general_recommendations_test.go b/checks/general_recommendations_test.go index 615c7b0..c0460b6 100644 --- a/checks/general_recommendations_test.go +++ b/checks/general_recommendations_test.go @@ -97,6 +97,7 @@ func TestGeneralRecommendations(t *testing.T) { Instances: []report.ModuleInstance{{ IsSelected: false, HasFatalErrors: false, + Source: report.DetailedReportModuleSelected, }}, }, {Name: "gradle-wrapper.jar", @@ -105,6 +106,7 @@ func TestGeneralRecommendations(t *testing.T) { Instances: []report.ModuleInstance{{ IsSelected: true, HasFatalErrors: false, + Source: report.DetailedReportModuleSelected, }}, }, {Name: "test.jar", @@ -113,6 +115,7 @@ func TestGeneralRecommendations(t *testing.T) { Instances: []report.ModuleInstance{{ IsSelected: false, HasFatalErrors: false, + Source: report.DetailedReportModuleSelected, }}, }, }, diff --git a/checks/gradle_wrapper_test.go b/checks/gradle_wrapper_test.go index 7e0ba1b..c56a807 100644 --- a/checks/gradle_wrapper_test.go +++ b/checks/gradle_wrapper_test.go @@ -42,6 +42,7 @@ func TestGradleWrapper(t *testing.T) { Instances: []report.ModuleInstance{{ IsSelected: false, HasFatalErrors: false, + Source: report.DetailedReportModuleSelected, }}, }, {Name: "gradle-wrapper.jar", @@ -50,6 +51,7 @@ func TestGradleWrapper(t *testing.T) { Instances: []report.ModuleInstance{{ IsSelected: true, HasFatalErrors: false, + Source: report.DetailedReportModuleSelected, }}, }, {Name: "test.jar", @@ -58,6 +60,7 @@ func TestGradleWrapper(t *testing.T) { Instances: []report.ModuleInstance{{ IsSelected: false, HasFatalErrors: false, + Source: report.DetailedReportModuleSelected, }}, }, }, diff --git a/checks/missing_precompiled_files_test.go b/checks/missing_precompiled_files_test.go index 8ba64fd..e40df60 100644 --- a/checks/missing_precompiled_files_test.go +++ b/checks/missing_precompiled_files_test.go @@ -87,9 +87,9 @@ func TestMissingPrecompiledFiles(t *testing.T) { t.Parallel() testReport := report.Report{ Modules: []report.Module{ - {Name: "file1.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: true}}}, - {Name: "file2.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: true}}}, - {Name: "file3.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: true}, + {Name: "file1.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: true, Source: report.DetailedReportModuleSelected}}}, + {Name: "file2.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: true, Source: report.DetailedReportModuleSelected}}}, + {Name: "file3.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: true, Source: report.DetailedReportModuleSelected}, {Issues: []string{"No precompiled files were found for this .NET web application"}}}, }, }, @@ -113,11 +113,11 @@ func TestMissingPrecompiledFiles(t *testing.T) { t.Parallel() testReport := report.Report{ Modules: []report.Module{ - {Name: "file1.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: true}}}, - {Name: "file2.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: true}, + {Name: "file1.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: true, Source: report.DetailedReportModuleSelected}}}, + {Name: "file2.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: true, Source: report.DetailedReportModuleSelected}, {Issues: []string{"No precompiled files were found for this .NET web application"}}}, }, - {Name: "file3.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: true}, + {Name: "file3.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: true, Source: report.DetailedReportModuleSelected}, {Issues: []string{"No precompiled files were found for this .NET web application"}}}, }, }, diff --git a/checks/missing_supporting_files_test.go b/checks/missing_supporting_files_test.go index a31983c..93156b4 100644 --- a/checks/missing_supporting_files_test.go +++ b/checks/missing_supporting_files_test.go @@ -29,11 +29,11 @@ func TestMissingSupportingFiles(t *testing.T) { t.Parallel() testReport := report.Report{ Modules: []report.Module{ - {Name: "file1.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: true}}}, - {Name: "file2.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: true}, {Issues: []string{ + {Name: "file1.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: true, Source: report.DetailedReportModuleSelected}}}, + {Name: "file2.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: true, Source: report.DetailedReportModuleSelected}, {Issues: []string{ "Missing Supporting Files - 1 File", }}}}, - {Name: "file3.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: false}}}, + {Name: "file3.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: false, Source: report.DetailedReportModuleSelected}}}, }, Issues: []report.Issue{}, } @@ -51,11 +51,11 @@ func TestMissingSupportingFiles(t *testing.T) { t.Parallel() testReport := report.Report{ Modules: []report.Module{ - {Name: "file1.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: true}}}, - {Name: "file2.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: true}, {Issues: []string{ + {Name: "file1.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: true, Source: report.DetailedReportModuleSelected}}}, + {Name: "file2.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: true, Source: report.DetailedReportModuleSelected}, {Issues: []string{ "Missing Supporting Files - 3 Files", }}}}, - {Name: "file3.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: false}}}, + {Name: "file3.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: false, Source: report.DetailedReportModuleSelected}}}, }, Issues: []report.Issue{}, } @@ -73,14 +73,14 @@ func TestMissingSupportingFiles(t *testing.T) { t.Parallel() testReport := report.Report{ Modules: []report.Module{ - {Name: "file1.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: true}}}, - {Name: "file2.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: true}, {Issues: []string{ + {Name: "file1.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: true, Source: report.DetailedReportModuleSelected}}}, + {Name: "file2.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: true, Source: report.DetailedReportModuleSelected}, {Issues: []string{ "Missing Supporting Files - 1 File", "Missing Supporting Files - 1 File", "Missing Supporting Files - 1 File", "Missing Supporting Files - 1 File", }}}}, - {Name: "file3.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: false}}}, + {Name: "file3.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: false, Source: report.DetailedReportModuleSelected}}}, }, Issues: []report.Issue{}, } @@ -98,13 +98,13 @@ func TestMissingSupportingFiles(t *testing.T) { t.Parallel() testReport := report.Report{ Modules: []report.Module{ - {Name: "file1.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: true}, {Issues: []string{ + {Name: "file1.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: true, Source: report.DetailedReportModuleSelected}, {Issues: []string{ "Missing Supporting Files - 1 File", }}}}, - {Name: "file2.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: true}, {Issues: []string{ + {Name: "file2.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: true, Source: report.DetailedReportModuleSelected}, {Issues: []string{ "Missing Supporting Files - 1 File", }}}}, - {Name: "file3.dll", Instances: []report.ModuleInstance{{IsDependency: false}, {IsSelected: false}}}, + {Name: "file3.dll", Instances: []report.ModuleInstance{{IsDependency: false, Source: report.DetailedReportModuleSelected}, {IsSelected: false, Source: report.DetailedReportModuleSelected}}}, }, Issues: []report.Issue{}, } diff --git a/checks/module_count_test.go b/checks/module_count_test.go index 73bce20..46f96f8 100644 --- a/checks/module_count_test.go +++ b/checks/module_count_test.go @@ -16,8 +16,7 @@ func generateModule(name string) report.Module { IsIgnored: false, IsThirdParty: false, Instances: []report.ModuleInstance{ - {IsDependency: false}, - {IsSelected: true}, + {Id: 1}, }} } @@ -41,7 +40,7 @@ func TestModuleCount(t *testing.T) { var lotsOfModules []report.Module - for i := 0; i < utils.MaximumModuleSelectedCountThreshold+1; i++ { + for i := 0; i < utils.MaximumModuleCountThreshold+1; i++ { moduleName := fmt.Sprintf("module%d", i) lotsOfModules = append(lotsOfModules, generateModule(moduleName)) } @@ -56,7 +55,32 @@ func TestModuleCount(t *testing.T) { t.FailNow() } - assert.Contains(t, mockReport.Issues[0].Description, fmt.Sprintf("%d modules were selected", utils.MaximumModuleSelectedCountThreshold+1)) + assert.Contains(t, mockReport.Issues[0].Description, fmt.Sprintf("%d modules were identified from the upload", utils.MaximumModuleCountThreshold+1)) }) + t.Run("Large Number of Selected modules", func(t *testing.T) { + t.Parallel() + + var lotsOfModules []report.Module + + for i := 0; i < utils.MaximumModuleSelectedCountThreshold+1; i++ { + moduleName := fmt.Sprintf("module%d", i) + module := generateModule(moduleName) + module.Instances[0].IsSelected = true + module.Instances[0].Source = report.DetailedReportModuleSelected + lotsOfModules = append(lotsOfModules, module) + } + + mockReport := report.Report{ + Modules: lotsOfModules, + } + + moduleCount(&mockReport) + + if !assert.Equal(t, 1, len(mockReport.Issues)) { + t.FailNow() + } + + assert.Contains(t, mockReport.Issues[0].Description, fmt.Sprintf("%d modules were selected", utils.MaximumModuleSelectedCountThreshold+1)) + }) } diff --git a/checks/overscanning_test.go b/checks/overscanning_test.go index 8aa0463..f2511d8 100644 --- a/checks/overscanning_test.go +++ b/checks/overscanning_test.go @@ -15,13 +15,13 @@ func TestOverScanning(t *testing.T) { Modules: []report.Module{ { Name: "common-lib.dll", Instances: []report.ModuleInstance{ - {IsSelected: true}, + {IsSelected: true, Source: report.DetailedReportModuleSelected}, }, DependencyOf: []string{"app.dll"}, }, { Name: "app.dll", Instances: []report.ModuleInstance{ - {IsSelected: true}, + {IsSelected: true, Source: report.DetailedReportModuleSelected}, }, }, }, @@ -47,19 +47,19 @@ func TestOverScanning(t *testing.T) { Modules: []report.Module{ { Name: "common-lib.dll", Instances: []report.ModuleInstance{ - {IsSelected: true}, + {IsSelected: true, Source: report.DetailedReportModuleSelected}, }, DependencyOf: []string{"app.dll"}, }, { Name: "common-models.dll", Instances: []report.ModuleInstance{ - {IsSelected: true}, + {IsSelected: true, Source: report.DetailedReportModuleSelected}, }, DependencyOf: []string{"app.dll"}, }, { Name: "app.dll", Instances: []report.ModuleInstance{ - {IsSelected: true}, + {IsSelected: true, Source: report.DetailedReportModuleSelected}, }, }, }, diff --git a/checks/previous_scan_test.go b/checks/previous_scan_test.go index f16b2db..51d9cbb 100644 --- a/checks/previous_scan_test.go +++ b/checks/previous_scan_test.go @@ -96,8 +96,8 @@ func TestPreviousScan(t *testing.T) { BuildId: 1, }, Modules: []report.Module{ - {Name: "file3.jar", Instances: []report.ModuleInstance{{IsDependency: false, IsSelected: true}}}, - {Name: "file4.jar", Instances: []report.ModuleInstance{{IsDependency: false, IsSelected: false}}}, + {Name: "file3.jar", Instances: []report.ModuleInstance{{IsDependency: false, IsSelected: true, Source: report.DetailedReportModuleSelected}}}, + {Name: "file4.jar", Instances: []report.ModuleInstance{{IsDependency: false, IsSelected: false, Source: report.DetailedReportModuleSelected}}}, }, UploadedFiles: []report.UploadedFile{ {Id: 333333, Name: "file3.jar", MD5: "hash2", IsIgnored: false, IsThirdParty: false}, @@ -132,8 +132,8 @@ func TestPreviousScan(t *testing.T) { BuildId: 1, }, Modules: []report.Module{ - {Name: "file3.jar", Instances: []report.ModuleInstance{{IsDependency: false, IsSelected: true}}}, - {Name: "file4.jar", Instances: []report.ModuleInstance{{IsDependency: false, IsSelected: false}}}, + {Name: "file3.jar", Instances: []report.ModuleInstance{{IsDependency: false, IsSelected: true, Source: report.DetailedReportModuleSelected}}}, + {Name: "file4.jar", Instances: []report.ModuleInstance{{IsDependency: false, IsSelected: false, Source: report.DetailedReportModuleSelected}}}, }, UploadedFiles: []report.UploadedFile{ {Id: 333333, Name: "file3.jar", MD5: "hash2", IsIgnored: false, IsThirdParty: false}, diff --git a/checks/testing_artefacts_test.go b/checks/testing_artefacts_test.go index fde9cb0..a5743e2 100644 --- a/checks/testing_artefacts_test.go +++ b/checks/testing_artefacts_test.go @@ -85,12 +85,18 @@ func TestTestingArtefacts(t *testing.T) { {Name: "moq.dll", Instances: []report.ModuleInstance{ {IsDependency: false}, - {IsSelected: true}, + { + IsSelected: true, + Source: report.DetailedReportModuleSelected, + }, }}, {Name: "standalone.unittests.dll", Instances: []report.ModuleInstance{ {IsDependency: false}, - {IsSelected: true}, + { + IsSelected: true, + Source: report.DetailedReportModuleSelected, + }, }}, }, UploadedFiles: []report.UploadedFile{ diff --git a/data/detailed_report.go b/data/detailed_report.go index 5651671..e119d8b 100644 --- a/data/detailed_report.go +++ b/data/detailed_report.go @@ -134,7 +134,7 @@ func populateDetailedReportModules(r *report.Report, staticAnalysis detailedRepo Architecture: html.UnescapeString(module.Architecture), IsSelected: true, WasScanned: true, - Source: "detailed_report_module_selected", + Source: report.DetailedReportModuleSelected, }) } } diff --git a/report/queries.go b/report/queries.go index 1138bd8..a3cb22b 100644 --- a/report/queries.go +++ b/report/queries.go @@ -8,11 +8,17 @@ func (r *Report) GetSelectedModules() []Module { var selectedModules []Module for _, module := range r.Modules { + found := false + for _, instance := range module.Instances { - if !module.IsInListByName(selectedModules) && instance.IsSelected { - selectedModules = append(selectedModules, module) + if instance.Source == DetailedReportModuleSelected { + found = true } } + + if found { + selectedModules = append(selectedModules, module) + } } return selectedModules @@ -23,7 +29,7 @@ func (r *Report) GetPrescanModules() []Module { for _, module := range r.Modules { for _, instance := range module.Instances { - if !module.IsInListByName(prescanModules) && instance.Source == "prescan_module_list" { + if !module.IsInListByName(prescanModules) && instance.Source == PrescanModuleList { prescanModules = append(prescanModules, module) } } diff --git a/report/report_module.go b/report/report_module.go index 6b3b877..99eeb3b 100644 --- a/report/report_module.go +++ b/report/report_module.go @@ -15,22 +15,29 @@ type Module struct { DependencyOf []string `json:"dependency_of,omitempty"` } +type ModuleInstanceSource string + +const ( + DetailedReportModuleSelected ModuleInstanceSource = "detailed_report_module_selected" + PrescanModuleList ModuleInstanceSource = "prescan_module_list" +) + type ModuleInstance struct { - Id int `json:"id,omitempty"` - Compiler string `json:"compiler,omitempty"` - OperatingSystem string `json:"operating_system,omitempty"` - Architecture string `json:"architecture,omitempty"` - IsDependency bool `json:"is_dependency"` - IsSelected bool `json:"is_selected"` - WasScanned bool `json:"was_scanned"` - HasFatalErrors bool `json:"has_fatal_errors"` - Status string `json:"status,omitempty"` - Platform string `json:"platform,omitempty"` - Size string `json:"size,omitempty"` - MD5 string `json:"md5,omitempty"` - Issues []string `json:"issues,omitempty"` - SizeBytes int `json:"size_bytes,omitempty"` - Source string `json:"source,omitempty"` + Id int `json:"id,omitempty"` + Compiler string `json:"compiler,omitempty"` + OperatingSystem string `json:"operating_system,omitempty"` + Architecture string `json:"architecture,omitempty"` + IsDependency bool `json:"is_dependency"` + IsSelected bool `json:"is_selected"` + WasScanned bool `json:"was_scanned"` + HasFatalErrors bool `json:"has_fatal_errors"` + Status string `json:"status,omitempty"` + Platform string `json:"platform,omitempty"` + Size string `json:"size,omitempty"` + MD5 string `json:"md5,omitempty"` + Issues []string `json:"issues,omitempty"` + SizeBytes int `json:"size_bytes,omitempty"` + Source ModuleInstanceSource `json:"source,omitempty"` } func (m *Module) IsSelected() bool {