Skip to content

Commit 76f19a4

Browse files
committed
clean: Ensure proper dependency injection for testable code
1 parent ef99b5d commit 76f19a4

File tree

5 files changed

+57
-16
lines changed

5 files changed

+57
-16
lines changed

cmd/tool/main.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,17 @@ import (
55

66
codacy "github.com/codacy/codacy-engine-golang-seed/v6"
77
"github.com/codacy/codacy-trivy/internal/tool"
8+
"github.com/sirupsen/logrus"
89
)
910

1011
func main() {
11-
codacyTrivy := tool.New()
12-
retCode := codacy.StartTool(&codacyTrivy)
12+
codacyTrivy, err := tool.New(tool.MaliciousPackagesIndexPath)
13+
if err != nil {
14+
logrus.Errorf("Failed to create tool execution: %s", err.Error())
15+
os.Exit(-1)
16+
}
17+
18+
retCode := codacy.StartTool(codacyTrivy)
1319

1420
os.Exit(retCode)
1521
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ require (
1010
github.com/google/go-cmp v0.7.0
1111
github.com/package-url/packageurl-go v0.1.3
1212
github.com/samber/lo v1.52.0
13+
github.com/sirupsen/logrus v1.9.3 // Logrus is the logging library used in codacy-engine-golang-seed
1314
github.com/stretchr/testify v1.11.1
1415
go.uber.org/mock v0.6.0
1516
golang.org/x/mod v0.30.0
@@ -316,7 +317,6 @@ require (
316317
github.com/sigstore/rekor v1.4.2 // indirect
317318
github.com/sigstore/sigstore v1.9.5 // indirect
318319
github.com/sigstore/timestamp-authority v1.2.2 // indirect
319-
github.com/sirupsen/logrus v1.9.3 // indirect
320320
github.com/skeema/knownhosts v1.3.1 // indirect
321321
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect
322322
github.com/spdx/tools-golang v0.5.5 // indirect

internal/tool/malicious_packages_scanner.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
"golang.org/x/mod/semver"
1515
)
1616

17-
const maliciousPackagesIndexPath = "/dist/cache/codacy-trivy/openssf-malicious-packages-index.json.gz"
17+
const MaliciousPackagesIndexPath = "/dist/cache/codacy-trivy/openssf-malicious-packages-index.json.gz"
1818

1919
// maliciousPackage represents a shallow representation of an Open Source Vulnerability (OSV).
2020
// Although it's schema is generic, it is guaranteed that it is only instantiated for Malicious Package vulnerabilities.
@@ -111,8 +111,8 @@ type MaliciousPackagesScanner struct {
111111

112112
// NewMaliciousPackagesScanner creates a new OpenSSF malicious packages scanner and loads
113113
// malicious data from disk, as defined by the build process of this tool.
114-
func NewMaliciousPackagesScanner() (*MaliciousPackagesScanner, error) {
115-
index, err := loadIndex(maliciousPackagesIndexPath)
114+
func NewMaliciousPackagesScanner(indexPath string) (*MaliciousPackagesScanner, error) {
115+
index, err := loadIndex(indexPath)
116116
if err != nil {
117117
return nil, err
118118
}

internal/tool/tool.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,21 @@ const (
4848
var ruleIDsVulnerability = []string{ruleIDVulnerabilityCritical, ruleIDVulnerabilityHigh, ruleIDVulnerabilityMedium, ruleIDVulnerabilityMinor}
4949

5050
// New creates a new instance of Codacy Trivy.
51-
func New() codacyTrivy {
52-
return codacyTrivy{
53-
runnerFactory: &defaultRunnerFactory{},
51+
func New(maliciousPackagesIndexPath string) (*codacyTrivy, error) {
52+
maliciousPackagesScanner, err := NewMaliciousPackagesScanner(maliciousPackagesIndexPath)
53+
if err != nil {
54+
return nil, err
5455
}
56+
57+
return &codacyTrivy{
58+
runnerFactory: &defaultRunnerFactory{},
59+
maliciousPackagesScanner: *maliciousPackagesScanner,
60+
}, nil
5561
}
5662

5763
type codacyTrivy struct {
58-
runnerFactory RunnerFactory
64+
runnerFactory RunnerFactory
65+
maliciousPackagesScanner MaliciousPackagesScanner
5966
}
6067

6168
// https://github.com/uber-go/guide/blob/master/style.md#verify-interface-compliance
@@ -87,11 +94,7 @@ func (t codacyTrivy) Run(ctx context.Context, toolExecution codacy.ToolExecution
8794

8895
secretScanningIssues := t.runSecretScanning(toolExecution)
8996

90-
maliciousPackagesScanner, err := NewMaliciousPackagesScanner()
91-
if err != nil {
92-
return nil, err
93-
}
94-
maliciousPackagesIssues := maliciousPackagesScanner.Scan(report, toolExecution)
97+
maliciousPackagesIssues := t.maliciousPackagesScanner.Scan(report, toolExecution)
9598

9699
allIssues := append(vulnerabilityScanningIssues, secretScanningIssues...)
97100
allIssues = append(allIssues, maliciousPackagesIssues...)

internal/tool/tool_test.go

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package tool
44

55
import (
6+
"compress/gzip"
67
"context"
78
"fmt"
89
"os"
@@ -27,13 +28,44 @@ import (
2728
)
2829

2930
func TestNew(t *testing.T) {
31+
// Arrange
32+
// Create an empty temporary file for the malicious packages index
33+
maliciousPackageIndexFileName := "malicious-package.json.gz"
34+
35+
f, err := os.Create(maliciousPackageIndexFileName)
36+
if err != nil {
37+
assert.FailNow(t, "Failed to create malicious package index", err.Error())
38+
}
39+
defer os.Remove(f.Name())
40+
defer f.Close()
41+
42+
gz := gzip.NewWriter(f)
43+
_, err = gz.Write([]byte("{}"))
44+
if err != nil {
45+
assert.FailNow(t, "Failed to write to malicious package index", err.Error())
46+
}
47+
err = gz.Close()
48+
if err != nil {
49+
assert.FailNow(t, "Failed to write to malicious package index", err.Error())
50+
}
51+
3052
// Act
31-
underTest := New()
53+
underTest, err := New(f.Name())
3254

3355
// Assert
56+
assert.NoError(t, err)
3457
assert.Equal(t, &defaultRunnerFactory{}, underTest.runnerFactory)
3558
}
3659

60+
func TestNew_MaliciousPackageIndexFileNotFound(t *testing.T) {
61+
// Act
62+
underTest, err := New("non-existent-file.json.gz")
63+
64+
// Assert
65+
assert.Error(t, err)
66+
assert.Nil(t, underTest)
67+
}
68+
3769
func TestRun(t *testing.T) {
3870
// Arrange
3971
ctx := context.Background()

0 commit comments

Comments
 (0)