Skip to content

Commit

Permalink
Merge branch 'main' into fix-archived-typo
Browse files Browse the repository at this point in the history
  • Loading branch information
spencerschrock committed Nov 28, 2023
2 parents 39edc53 + fea2f45 commit 5c754b7
Show file tree
Hide file tree
Showing 12 changed files with 449 additions and 123 deletions.
16 changes: 12 additions & 4 deletions checks/cii_best_practices.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import (
"github.com/ossf/scorecard/v4/checks/evaluation"
"github.com/ossf/scorecard/v4/checks/raw"
sce "github.com/ossf/scorecard/v4/errors"
"github.com/ossf/scorecard/v4/probes"
"github.com/ossf/scorecard/v4/probes/zrunner"
)

// CheckCIIBestPractices is the registered name for CIIBestPractices.
Expand All @@ -40,11 +42,17 @@ func CIIBestPractices(c *checker.CheckRequest) checker.CheckResult {
return checker.CreateRuntimeErrorResult(CheckCIIBestPractices, e)
}

// Return raw results.
if c.RawResults != nil {
c.RawResults.CIIBestPracticesResults = rawData
// Set the raw results.
pRawResults := getRawResults(c)
pRawResults.CIIBestPracticesResults = rawData

// Evaluate the probes.
findings, err := zrunner.Run(pRawResults, probes.CIIBestPractices)
if err != nil {
e := sce.WithMessage(sce.ErrScorecardInternal, err.Error())
return checker.CreateRuntimeErrorResult(CheckCIIBestPractices, e)
}

// Return the score evaluation.
return evaluation.CIIBestPractices(CheckCIIBestPractices, c.Dlogger, &rawData)
return evaluation.CIIBestPractices(CheckCIIBestPractices, findings, c.Dlogger)
}
75 changes: 48 additions & 27 deletions checks/evaluation/cii_best_practices.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,12 @@
package evaluation

import (
"fmt"

"github.com/ossf/scorecard/v4/checker"
"github.com/ossf/scorecard/v4/clients"
sce "github.com/ossf/scorecard/v4/errors"
"github.com/ossf/scorecard/v4/finding"
"github.com/ossf/scorecard/v4/probes/hasOpenSSFBadge"
)

// Note: exported for unit tests.
const (
silverScore = 7
// Note: if this value is changed, please update the action's threshold score
Expand All @@ -32,31 +30,54 @@ const (
)

// CIIBestPractices applies the score policy for the CIIBestPractices check.
func CIIBestPractices(name string, _ checker.DetailLogger, r *checker.CIIBestPracticesData) checker.CheckResult {
if r == nil {
e := sce.WithMessage(sce.ErrScorecardInternal, "empty raw data")
func CIIBestPractices(name string,
findings []finding.Finding, dl checker.DetailLogger,
) checker.CheckResult {
expectedProbes := []string{
hasOpenSSFBadge.Probe,
}

if !finding.UniqueProbesEqual(findings, expectedProbes) {
e := sce.WithMessage(sce.ErrScorecardInternal, "invalid probe results")
return checker.CreateRuntimeErrorResult(name, e)
}

var results checker.CheckResult
switch r.Badge {
case clients.NotFound:
results = checker.CreateMinScoreResult(name, "no effort to earn an OpenSSF best practices badge detected")
case clients.InProgress:
msg := fmt.Sprintf("badge detected: %v", r.Badge)
results = checker.CreateResultWithScore(name, msg, inProgressScore)
case clients.Passing:
msg := fmt.Sprintf("badge detected: %v", r.Badge)
results = checker.CreateResultWithScore(name, msg, passingScore)
case clients.Silver:
msg := fmt.Sprintf("badge detected: %v", r.Badge)
results = checker.CreateResultWithScore(name, msg, silverScore)
case clients.Gold:
msg := fmt.Sprintf("badge detected: %v", r.Badge)
results = checker.CreateMaxScoreResult(name, msg)
case clients.Unknown:
e := sce.WithMessage(sce.ErrScorecardInternal, fmt.Sprintf("unsupported badge: %v", r.Badge))
results = checker.CreateRuntimeErrorResult(name, e)
var score int
var text string

if len(findings) != 1 {
errText := "invalid probe results: multiple findings detected"
e := sce.WithMessage(sce.ErrScorecardInternal, errText)
return checker.CreateRuntimeErrorResult(name, e)
}
return results

f := &findings[0]
if f.Outcome == finding.OutcomeNegative {
text = "no effort to earn an OpenSSF best practices badge detected"
return checker.CreateMinScoreResult(name, text)
}
//nolint:nestif
if _, hasKey := f.Values[hasOpenSSFBadge.GoldLevel]; hasKey {
score = checker.MaxResultScore
text = "badge detected: Gold"
} else if _, hasKey := f.Values[hasOpenSSFBadge.SilverLevel]; hasKey {
score = silverScore
text = "badge detected: Silver"
} else if _, hasKey := f.Values[hasOpenSSFBadge.PassingLevel]; hasKey {
score = passingScore
text = "badge detected: Passing"
} else if _, hasKey := f.Values[hasOpenSSFBadge.InProgressLevel]; hasKey {
score = inProgressScore
text = "badge detected: InProgress"
} else if _, hasKey := f.Values[hasOpenSSFBadge.UnknownLevel]; hasKey {
text = "unknown badge detected"
e := sce.WithMessage(sce.ErrScorecardInternal, text)
return checker.CreateRuntimeErrorResult(name, e)
} else {
text = "unsupported badge detected"
e := sce.WithMessage(sce.ErrScorecardInternal, text)
return checker.CreateRuntimeErrorResult(name, e)
}

return checker.CreateResultWithScore(name, text, score)
}
189 changes: 127 additions & 62 deletions checks/evaluation/cii_best_practices_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,71 +16,136 @@ package evaluation
import (
"testing"

"github.com/ossf/scorecard/v4/checker"
"github.com/ossf/scorecard/v4/clients"
sce "github.com/ossf/scorecard/v4/errors"
"github.com/ossf/scorecard/v4/finding"
"github.com/ossf/scorecard/v4/probes/hasOpenSSFBadge"
scut "github.com/ossf/scorecard/v4/utests"
)

func TestCIIBestPractices(t *testing.T) {
t.Run("CIIBestPractices", func(t *testing.T) {
t.Run("in progress", func(t *testing.T) {
r := &checker.CIIBestPracticesData{
Badge: clients.InProgress,
}
result := CIIBestPractices("CIIBestPractices", nil, r)
if result.Score != inProgressScore {
t.Errorf("CIIBestPractices() = %v, want %v", result.Score, inProgressScore)
}
})
t.Run("passing", func(t *testing.T) {
r := &checker.CIIBestPracticesData{
Badge: clients.Passing,
}
result := CIIBestPractices("CIIBestPractices", nil, r)
if result.Score != passingScore {
t.Errorf("CIIBestPractices() = %v, want %v", result.Score, passingScore)
}
})
t.Run("silver", func(t *testing.T) {
r := &checker.CIIBestPracticesData{
Badge: clients.Silver,
}
result := CIIBestPractices("CIIBestPractices", nil, r)
if result.Score != silverScore {
t.Errorf("CIIBestPractices() = %v, want %v", result.Score, silverScore)
}
})
t.Run("gold", func(t *testing.T) {
r := &checker.CIIBestPracticesData{
Badge: clients.Gold,
}
result := CIIBestPractices("CIIBestPractices", nil, r)
if result.Score != checker.MaxResultScore {
t.Errorf("CIIBestPractices() = %v, want %v", result.Score, checker.MaxResultScore)
}
})
t.Run("not found", func(t *testing.T) {
r := &checker.CIIBestPracticesData{
Badge: clients.NotFound,
}
result := CIIBestPractices("CIIBestPractices", nil, r)
if result.Score != checker.MinResultScore {
t.Errorf("CIIBestPractices() = %v, want %v", result.Score, checker.MinResultScore)
}
})
t.Run("error", func(t *testing.T) {
r := &checker.CIIBestPracticesData{
Badge: clients.Unknown,
}
result := CIIBestPractices("CIIBestPractices", nil, r)
if result.Score != -1 {
t.Errorf("CIIBestPractices() = %v, want %v", result.Score, -1)
}
})
t.Run("nil response", func(t *testing.T) {
result := CIIBestPractices("CIIBestPractices", nil, nil)
if result.Score != -1 {
t.Errorf("CIIBestPractices() = %v, want %v", result.Score, -1)
t.Parallel()
tests := []struct {
name string
findings []finding.Finding
result scut.TestReturn
}{
{
name: "Unsupported badge found with negative finding",
findings: []finding.Finding{
{
Probe: "hasOpenSSFBadge",
Outcome: finding.OutcomeNegative,
Values: map[string]int{
"Unsupported": 1,
},
},
},
result: scut.TestReturn{
Score: 0,
},
},
{
name: "Unsupported badge found with positive finding",
findings: []finding.Finding{
{
Probe: "hasOpenSSFBadge",
Outcome: finding.OutcomePositive,
Values: map[string]int{
"Unsupported": 1,
},
},
},
result: scut.TestReturn{
Score: -1,
Error: sce.ErrScorecardInternal,
},
},
{
name: "Has InProgress Badge",
findings: []finding.Finding{
{
Probe: "hasOpenSSFBadge",
Outcome: finding.OutcomePositive,
Values: map[string]int{
hasOpenSSFBadge.InProgressLevel: 1,
},
},
},
result: scut.TestReturn{
Score: 2,
},
},
{
name: "Has Passing Badge",
findings: []finding.Finding{
{
Probe: "hasOpenSSFBadge",
Outcome: finding.OutcomePositive,
Values: map[string]int{
hasOpenSSFBadge.PassingLevel: 1,
},
},
},
result: scut.TestReturn{
Score: 5,
},
},
{
name: "Has Silver Badge",
findings: []finding.Finding{
{
Probe: "hasOpenSSFBadge",
Outcome: finding.OutcomePositive,
Values: map[string]int{
hasOpenSSFBadge.SilverLevel: 1,
},
},
},
result: scut.TestReturn{
Score: 7,
},
},
{
name: "Has Gold Badge",
findings: []finding.Finding{
{
Probe: "hasOpenSSFBadge",
Outcome: finding.OutcomePositive,
Values: map[string]int{
hasOpenSSFBadge.GoldLevel: 1,
},
},
},
result: scut.TestReturn{
Score: 10,
},
},
{
name: "Has Unknown Badge",
findings: []finding.Finding{
{
Probe: "hasOpenSSFBadge",
Outcome: finding.OutcomePositive,
Values: map[string]int{
"Unknown": 1,
},
},
},
result: scut.TestReturn{
Score: -1,
Error: sce.ErrScorecardInternal,
},
},
}
for _, tt := range tests {
tt := tt // Parallel testing
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
dl := scut.TestDetailLogger{}
got := CIIBestPractices(tt.name, tt.findings, &dl)
if !scut.ValidateTestReturn(t, tt.name, &tt.result, &got, &dl) {
t.Errorf("got %v, expected %v", got, tt.result)
}
})
})
}
}
4 changes: 2 additions & 2 deletions checks/evaluation/maintained.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,9 @@ func Maintained(name string,
if f.Outcome == finding.OutcomePositive {
switch f.Probe {
case issueActivityByProjectMember.Probe:
numberOfIssuesUpdatedWithinThreshold = f.Values["numberOfIssuesUpdatedWithinThreshold"]
numberOfIssuesUpdatedWithinThreshold = f.Values[issueActivityByProjectMember.NoOfIssuesValue]
case hasRecentCommits.Probe:
commitsWithinThreshold = f.Values["commitsWithinThreshold"]
commitsWithinThreshold = f.Values[hasRecentCommits.CommitsValue]
}
}
}
Expand Down
13 changes: 6 additions & 7 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ require (
contrib.go.opencensus.io/exporter/stackdriver v0.13.14
github.com/bombsimon/logrusr/v2 v2.0.1
github.com/bradleyfalzon/ghinstallation/v2 v2.8.0
github.com/go-git/go-git/v5 v5.10.0
github.com/go-git/go-git/v5 v5.10.1
github.com/go-logr/logr v1.3.0
github.com/golang/mock v1.6.0
github.com/google/go-cmp v0.6.0
Expand Down Expand Up @@ -106,7 +106,7 @@ require (
github.com/spdx/tools-golang v0.5.3 // indirect
github.com/zeebo/xxh3 v1.0.2 // indirect
golang.org/x/mod v0.13.0 // indirect
golang.org/x/term v0.14.0 // indirect
golang.org/x/term v0.15.0 // indirect
golang.org/x/time v0.3.0 // indirect
golang.org/x/vuln v1.0.1 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect
Expand All @@ -130,7 +130,6 @@ require (
cloud.google.com/go/storage v1.31.0 // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c // indirect
github.com/acomagu/bufpipe v1.0.4 // indirect
github.com/aws/aws-sdk-go v1.44.314 // indirect
github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect
github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect
Expand Down Expand Up @@ -173,12 +172,12 @@ require (
github.com/xanzy/ssh-agent v0.3.3 // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
golang.org/x/crypto v0.15.0 // indirect
golang.org/x/crypto v0.16.0 // indirect
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
golang.org/x/net v0.18.0 // indirect
golang.org/x/oauth2 v0.14.0
golang.org/x/net v0.19.0 // indirect
golang.org/x/oauth2 v0.15.0
golang.org/x/sync v0.4.0 // indirect
golang.org/x/sys v0.14.0 // indirect
golang.org/x/sys v0.15.0 // indirect
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
google.golang.org/api v0.149.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
Expand Down
Loading

0 comments on commit 5c754b7

Please sign in to comment.