2022-12-02 02:08:48 +03:00
|
|
|
// Copyright 2021 OpenSSF Scorecard Authors
|
2021-08-24 00:31:33 +03:00
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package pkg
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"fmt"
|
2021-11-12 22:34:46 +03:00
|
|
|
"os"
|
2021-08-24 00:31:33 +03:00
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
2022-02-15 21:26:06 +03:00
|
|
|
"github.com/google/go-cmp/cmp"
|
|
|
|
|
2022-01-12 22:49:01 +03:00
|
|
|
"github.com/ossf/scorecard/v4/checker"
|
2023-01-31 05:41:36 +03:00
|
|
|
"github.com/ossf/scorecard/v4/finding"
|
2022-01-21 02:57:39 +03:00
|
|
|
"github.com/ossf/scorecard/v4/log"
|
2023-03-23 00:40:00 +03:00
|
|
|
"github.com/ossf/scorecard/v4/options"
|
2022-01-12 22:49:01 +03:00
|
|
|
spol "github.com/ossf/scorecard/v4/policy"
|
2023-01-31 05:41:36 +03:00
|
|
|
rules "github.com/ossf/scorecard/v4/rule"
|
2021-08-24 00:31:33 +03:00
|
|
|
)
|
|
|
|
|
2021-09-10 01:09:39 +03:00
|
|
|
func sarifMockDocRead() *mockDoc {
|
|
|
|
d := map[string]mockCheck{
|
|
|
|
"Check-Name": {
|
|
|
|
name: "Check-Name",
|
2021-10-02 01:01:46 +03:00
|
|
|
risk: "High",
|
2021-09-10 01:09:39 +03:00
|
|
|
short: "short description",
|
|
|
|
description: "long description\n other line",
|
|
|
|
url: "https://github.com/ossf/scorecard/blob/main/docs/checks.md#check-name",
|
|
|
|
tags: []string{"tag1", "tag2"},
|
2021-11-09 02:30:37 +03:00
|
|
|
repos: []string{"GitHub", "local"},
|
2021-09-10 01:09:39 +03:00
|
|
|
remediation: []string{"not-used1", "not-used2"},
|
|
|
|
},
|
|
|
|
"Check-Name2": {
|
|
|
|
name: "Check-Name2",
|
2021-10-02 01:01:46 +03:00
|
|
|
risk: "Medium",
|
2021-09-10 01:09:39 +03:00
|
|
|
short: "short description 2",
|
|
|
|
description: "long description\n other line 2",
|
|
|
|
url: "https://github.com/ossf/scorecard/blob/main/docs/checks.md#check-name2",
|
|
|
|
tags: []string{" tag1 ", " tag2 ", "tag3"},
|
2021-11-09 02:30:37 +03:00
|
|
|
repos: []string{"GitHub", "local"},
|
2021-09-10 01:09:39 +03:00
|
|
|
remediation: []string{"not-used1", "not-used2"},
|
|
|
|
},
|
|
|
|
"Check-Name3": {
|
|
|
|
name: "Check-Name3",
|
2021-10-02 01:01:46 +03:00
|
|
|
risk: "Low",
|
2021-09-10 01:09:39 +03:00
|
|
|
short: "short description 3",
|
|
|
|
description: "long description\n other line 3",
|
|
|
|
url: "https://github.com/ossf/scorecard/blob/main/docs/checks.md#check-name3",
|
|
|
|
tags: []string{" tag1", " tag2", "tag3", "tag 4 "},
|
2021-11-09 02:30:37 +03:00
|
|
|
repos: []string{"GitHub", "local"},
|
|
|
|
remediation: []string{"not-used1", "not-used2"},
|
|
|
|
},
|
|
|
|
"Check-Name4": {
|
|
|
|
name: "Check-Name4",
|
|
|
|
risk: "Low",
|
|
|
|
short: "short description 4",
|
|
|
|
description: "long description\n other line 4",
|
|
|
|
url: "https://github.com/ossf/scorecard/blob/main/docs/checks.md#check-name4",
|
|
|
|
tags: []string{" tag1", " tag2", "tag3", "tag 4 "},
|
|
|
|
repos: []string{"GitHub"},
|
|
|
|
remediation: []string{"not-used1", "not-used2"},
|
|
|
|
},
|
|
|
|
"Check-Name5": {
|
|
|
|
name: "Check-Name5",
|
|
|
|
risk: "Low",
|
|
|
|
short: "short description 5",
|
|
|
|
description: "long description\n other line 5",
|
|
|
|
url: "https://github.com/ossf/scorecard/blob/main/docs/checks.md#check-name5",
|
|
|
|
tags: []string{" tag1", " tag2", "tag3", "tag 4 "},
|
|
|
|
repos: []string{"local"},
|
|
|
|
remediation: []string{"not-used1", "not-used2"},
|
|
|
|
},
|
|
|
|
"Check-Name6": {
|
|
|
|
name: "Check-Name6",
|
|
|
|
risk: "Low",
|
|
|
|
short: "short description 6",
|
|
|
|
description: "long description\n other line 6",
|
|
|
|
url: "https://github.com/ossf/scorecard/blob/main/docs/checks.md#check-name6",
|
|
|
|
tags: []string{" tag1", " tag2", "tag3", "tag 4 "},
|
|
|
|
repos: []string{"Git-local"},
|
2021-09-10 01:09:39 +03:00
|
|
|
remediation: []string{"not-used1", "not-used2"},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
m := mockDoc{checks: d}
|
|
|
|
return &m
|
|
|
|
}
|
|
|
|
|
2023-01-31 05:41:36 +03:00
|
|
|
// nolint
|
2021-08-26 04:42:34 +03:00
|
|
|
func TestSARIFOutput(t *testing.T) {
|
2021-08-24 00:31:33 +03:00
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
type Check struct {
|
|
|
|
Risk string `yaml:"-"`
|
|
|
|
Short string `yaml:"short"`
|
|
|
|
Description string `yaml:"description"`
|
|
|
|
Remediation []string `yaml:"remediation"`
|
|
|
|
Tags string `yaml:"tags"`
|
|
|
|
}
|
|
|
|
|
2021-09-01 20:29:40 +03:00
|
|
|
repoCommit := "68bc59901773ab4c051dfcea0cc4201a1567ab32"
|
|
|
|
scorecardCommit := "ccbc59901773ab4c051dfcea0cc4201a1567abdd"
|
|
|
|
scorecardVersion := "1.2.3"
|
|
|
|
repoName := "repo not used"
|
2021-08-24 00:31:33 +03:00
|
|
|
date, e := time.Parse(time.RFC822Z, "17 Aug 21 18:57 +0000")
|
|
|
|
if e != nil {
|
|
|
|
panic(fmt.Errorf("time.Parse: %w", e))
|
|
|
|
}
|
|
|
|
|
2021-09-10 01:09:39 +03:00
|
|
|
checkDocs := sarifMockDocRead()
|
|
|
|
|
2021-08-24 00:31:33 +03:00
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
expected string
|
|
|
|
showDetails bool
|
2022-01-21 02:57:39 +03:00
|
|
|
logLevel log.Level
|
2021-08-24 00:31:33 +03:00
|
|
|
result ScorecardResult
|
2021-09-24 02:55:41 +03:00
|
|
|
policy spol.ScorecardPolicy
|
2021-08-24 00:31:33 +03:00
|
|
|
}{
|
2022-05-06 22:52:30 +03:00
|
|
|
{
|
|
|
|
name: "check with detail remediation",
|
|
|
|
showDetails: true,
|
|
|
|
expected: "./testdata/check-remediation.sarif",
|
|
|
|
logLevel: log.DebugLevel,
|
|
|
|
policy: spol.ScorecardPolicy{
|
|
|
|
Version: 1,
|
|
|
|
Policies: map[string]*spol.CheckPolicy{
|
|
|
|
"Check-Name": {
|
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
|
|
|
},
|
|
|
|
"Check-Name2": {
|
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_DISABLED,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
result: ScorecardResult{
|
|
|
|
Repo: RepoInfo{
|
|
|
|
Name: repoName,
|
|
|
|
CommitSHA: repoCommit,
|
|
|
|
},
|
|
|
|
Scorecard: ScorecardInfo{
|
|
|
|
Version: scorecardVersion,
|
|
|
|
CommitSHA: scorecardCommit,
|
|
|
|
},
|
|
|
|
Date: date,
|
|
|
|
Checks: []checker.CheckResult{
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2022-05-06 22:52:30 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "src/file1.cpp",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2022-05-06 22:52:30 +03:00
|
|
|
Offset: 5,
|
|
|
|
Snippet: "if (bad) {BUG();}",
|
2023-01-31 05:41:36 +03:00
|
|
|
Remediation: &rules.Remediation{
|
|
|
|
Markdown: "this is the custom markdown help",
|
|
|
|
Text: "this is the custom text help",
|
2022-05-06 22:52:30 +03:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: 5,
|
|
|
|
Reason: "half score reason",
|
|
|
|
Name: "Check-Name",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Metadata: []string{},
|
|
|
|
},
|
|
|
|
},
|
2021-09-28 22:50:17 +03:00
|
|
|
{
|
|
|
|
name: "check-1",
|
|
|
|
showDetails: true,
|
|
|
|
expected: "./testdata/check1.sarif",
|
2022-01-21 02:57:39 +03:00
|
|
|
logLevel: log.DebugLevel,
|
2021-09-28 22:50:17 +03:00
|
|
|
policy: spol.ScorecardPolicy{
|
|
|
|
Version: 1,
|
|
|
|
Policies: map[string]*spol.CheckPolicy{
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name": {
|
2021-09-28 22:50:17 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
|
|
|
},
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name2": {
|
2021-09-28 22:50:17 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_DISABLED,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
result: ScorecardResult{
|
|
|
|
Repo: RepoInfo{
|
|
|
|
Name: repoName,
|
|
|
|
CommitSHA: repoCommit,
|
|
|
|
},
|
|
|
|
Scorecard: ScorecardInfo{
|
|
|
|
Version: scorecardVersion,
|
|
|
|
CommitSHA: scorecardCommit,
|
|
|
|
},
|
|
|
|
Date: date,
|
|
|
|
Checks: []checker.CheckResult{
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-09-28 22:50:17 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "src/file1.cpp",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-09-28 22:50:17 +03:00
|
|
|
Offset: 5,
|
|
|
|
Snippet: "if (bad) {BUG();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: 5,
|
|
|
|
Reason: "half score reason",
|
|
|
|
Name: "Check-Name",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Metadata: []string{},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "check-2",
|
|
|
|
showDetails: true,
|
|
|
|
expected: "./testdata/check2.sarif",
|
2022-01-21 02:57:39 +03:00
|
|
|
logLevel: log.DebugLevel,
|
2021-09-28 22:50:17 +03:00
|
|
|
policy: spol.ScorecardPolicy{
|
|
|
|
Version: 1,
|
|
|
|
Policies: map[string]*spol.CheckPolicy{
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name": {
|
2021-09-28 22:50:17 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
|
|
|
},
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name2": {
|
2021-09-28 22:50:17 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_DISABLED,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
result: ScorecardResult{
|
|
|
|
Repo: RepoInfo{
|
|
|
|
Name: repoName,
|
|
|
|
CommitSHA: repoCommit,
|
|
|
|
},
|
|
|
|
Scorecard: ScorecardInfo{
|
|
|
|
Version: scorecardVersion,
|
|
|
|
CommitSHA: scorecardCommit,
|
|
|
|
},
|
|
|
|
Date: date,
|
|
|
|
Checks: []checker.CheckResult{
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-09-28 22:50:17 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "bin/binary.elf",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeBinary,
|
2021-09-28 22:50:17 +03:00
|
|
|
Offset: 0,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: checker.MinResultScore,
|
|
|
|
Reason: "min score reason",
|
|
|
|
Name: "Check-Name",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Metadata: []string{},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "check-3",
|
|
|
|
showDetails: true,
|
|
|
|
expected: "./testdata/check3.sarif",
|
2022-01-21 02:57:39 +03:00
|
|
|
logLevel: log.InfoLevel,
|
2021-09-28 22:50:17 +03:00
|
|
|
policy: spol.ScorecardPolicy{
|
|
|
|
Version: 1,
|
|
|
|
Policies: map[string]*spol.CheckPolicy{
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name": {
|
2021-09-28 22:50:17 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
|
|
|
},
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name2": {
|
2021-09-28 22:50:17 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
|
|
|
},
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name3": {
|
2021-09-28 22:50:17 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
result: ScorecardResult{
|
|
|
|
Repo: RepoInfo{
|
|
|
|
Name: repoName,
|
|
|
|
CommitSHA: repoCommit,
|
|
|
|
},
|
|
|
|
Scorecard: ScorecardInfo{
|
|
|
|
Version: scorecardVersion,
|
|
|
|
CommitSHA: scorecardCommit,
|
|
|
|
},
|
|
|
|
Date: date,
|
|
|
|
Checks: []checker.CheckResult{
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-09-28 22:50:17 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "bin/binary.elf",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeBinary,
|
2021-09-28 22:50:17 +03:00
|
|
|
Offset: 0,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: checker.MinResultScore,
|
|
|
|
Reason: "min result reason",
|
|
|
|
Name: "Check-Name",
|
|
|
|
},
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-09-28 22:50:17 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "src/doc.txt",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeText,
|
2021-09-28 22:50:17 +03:00
|
|
|
Offset: 3,
|
|
|
|
Snippet: "some text",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: checker.MinResultScore,
|
|
|
|
Reason: "min result reason",
|
|
|
|
Name: "Check-Name2",
|
|
|
|
},
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-09-28 22:50:17 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailInfo,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "info message",
|
|
|
|
Path: "some/path.js",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-09-28 22:50:17 +03:00
|
|
|
Offset: 3,
|
|
|
|
Snippet: "if (bad) {BUG();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "some/path.py",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-09-28 22:50:17 +03:00
|
|
|
Offset: 3,
|
|
|
|
Snippet: "if (bad) {BUG2();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Type: checker.DetailDebug,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "debug message",
|
|
|
|
Path: "some/path.go",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-09-28 22:50:17 +03:00
|
|
|
Offset: 3,
|
|
|
|
Snippet: "if (bad) {BUG5();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: checker.InconclusiveResultScore,
|
|
|
|
Reason: "inconclusive reason",
|
|
|
|
Name: "Check-Name3",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Metadata: []string{},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "check-4",
|
|
|
|
showDetails: true,
|
|
|
|
expected: "./testdata/check4.sarif",
|
2022-01-21 02:57:39 +03:00
|
|
|
logLevel: log.DebugLevel,
|
2021-09-28 22:50:17 +03:00
|
|
|
policy: spol.ScorecardPolicy{
|
|
|
|
Version: 1,
|
|
|
|
Policies: map[string]*spol.CheckPolicy{
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name": {
|
2021-09-28 22:50:17 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
|
|
|
},
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name2": {
|
2021-09-28 22:50:17 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
|
|
|
},
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name3": {
|
2021-09-28 22:50:17 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
result: ScorecardResult{
|
|
|
|
Repo: RepoInfo{
|
|
|
|
Name: repoName,
|
|
|
|
CommitSHA: repoCommit,
|
|
|
|
},
|
|
|
|
Scorecard: ScorecardInfo{
|
|
|
|
Version: scorecardVersion,
|
|
|
|
CommitSHA: scorecardCommit,
|
|
|
|
},
|
|
|
|
Date: date,
|
|
|
|
Checks: []checker.CheckResult{
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-09-28 22:50:17 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "bin/binary.elf",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeBinary,
|
2021-09-28 22:50:17 +03:00
|
|
|
Offset: 0,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: checker.MinResultScore,
|
|
|
|
Reason: "min result reason",
|
|
|
|
Name: "Check-Name",
|
|
|
|
},
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-09-28 22:50:17 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "src/doc.txt",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeText,
|
2021-09-28 22:50:17 +03:00
|
|
|
Offset: 3,
|
|
|
|
Snippet: "some text",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: checker.MinResultScore,
|
|
|
|
Reason: "min result reason",
|
|
|
|
Name: "Check-Name2",
|
|
|
|
},
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-09-28 22:50:17 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailInfo,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "info message",
|
|
|
|
Path: "some/path.js",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-09-28 22:50:17 +03:00
|
|
|
Offset: 3,
|
|
|
|
Snippet: "if (bad) {BUG();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "some/path.py",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-09-28 22:50:17 +03:00
|
|
|
Offset: 3,
|
|
|
|
Snippet: "if (bad) {BUG2();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Type: checker.DetailDebug,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "debug message",
|
|
|
|
Path: "some/path.go",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-09-28 22:50:17 +03:00
|
|
|
Offset: 3,
|
|
|
|
Snippet: "if (bad) {BUG5();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: checker.InconclusiveResultScore,
|
|
|
|
Reason: "inconclusive reason",
|
|
|
|
Name: "Check-Name3",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Metadata: []string{},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "check-5",
|
|
|
|
showDetails: true,
|
|
|
|
expected: "./testdata/check5.sarif",
|
2022-01-21 02:57:39 +03:00
|
|
|
logLevel: log.WarnLevel,
|
2021-09-28 22:50:17 +03:00
|
|
|
policy: spol.ScorecardPolicy{
|
|
|
|
Version: 1,
|
|
|
|
Policies: map[string]*spol.CheckPolicy{
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name": {
|
2021-09-28 22:50:17 +03:00
|
|
|
Score: 5,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
result: ScorecardResult{
|
|
|
|
Repo: RepoInfo{
|
|
|
|
Name: repoName,
|
|
|
|
CommitSHA: repoCommit,
|
|
|
|
},
|
|
|
|
Scorecard: ScorecardInfo{
|
|
|
|
Version: scorecardVersion,
|
|
|
|
CommitSHA: scorecardCommit,
|
|
|
|
},
|
|
|
|
Date: date,
|
|
|
|
Checks: []checker.CheckResult{
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-09-28 22:50:17 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "src/file1.cpp",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-09-28 22:50:17 +03:00
|
|
|
Offset: 5,
|
|
|
|
Snippet: "if (bad) {BUG();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: 6,
|
|
|
|
Reason: "six score reason",
|
|
|
|
Name: "Check-Name",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Metadata: []string{},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "check-6",
|
|
|
|
showDetails: true,
|
|
|
|
// https://github.com/github/codeql-action/issues/754
|
|
|
|
// Disabled related locations.
|
2021-10-02 01:01:46 +03:00
|
|
|
expected: "./testdata/check6.sarif",
|
2022-01-21 02:57:39 +03:00
|
|
|
logLevel: log.WarnLevel,
|
2021-09-28 22:50:17 +03:00
|
|
|
policy: spol.ScorecardPolicy{
|
|
|
|
Version: 1,
|
|
|
|
Policies: map[string]*spol.CheckPolicy{
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name": {
|
2021-09-28 22:50:17 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
result: ScorecardResult{
|
|
|
|
Repo: RepoInfo{
|
|
|
|
Name: repoName,
|
|
|
|
CommitSHA: repoCommit,
|
|
|
|
},
|
|
|
|
Scorecard: ScorecardInfo{
|
|
|
|
Version: scorecardVersion,
|
|
|
|
CommitSHA: scorecardCommit,
|
|
|
|
},
|
|
|
|
Date: date,
|
|
|
|
Checks: []checker.CheckResult{
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-09-28 22:50:17 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "https://domain.com/something",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeURL,
|
2021-09-28 22:50:17 +03:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: 6,
|
|
|
|
Reason: "six score reason",
|
|
|
|
Name: "Check-Name",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Metadata: []string{},
|
|
|
|
},
|
|
|
|
},
|
2021-08-24 00:31:33 +03:00
|
|
|
{
|
2021-09-24 02:55:41 +03:00
|
|
|
name: "check-7",
|
2021-08-24 00:31:33 +03:00
|
|
|
showDetails: true,
|
2021-09-24 02:55:41 +03:00
|
|
|
expected: "./testdata/check7.sarif",
|
2022-01-21 02:57:39 +03:00
|
|
|
logLevel: log.DebugLevel,
|
2021-09-24 02:55:41 +03:00
|
|
|
policy: spol.ScorecardPolicy{
|
|
|
|
Version: 1,
|
|
|
|
Policies: map[string]*spol.CheckPolicy{
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name": {
|
2021-09-24 02:55:41 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
2021-08-24 00:31:33 +03:00
|
|
|
},
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name2": {
|
2021-09-24 02:55:41 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_DISABLED,
|
2021-08-24 00:31:33 +03:00
|
|
|
},
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name3": {
|
2021-09-24 02:55:41 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_DISABLED,
|
2021-08-24 00:31:33 +03:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
result: ScorecardResult{
|
2021-09-01 20:29:40 +03:00
|
|
|
Repo: RepoInfo{
|
|
|
|
Name: repoName,
|
|
|
|
CommitSHA: repoCommit,
|
|
|
|
},
|
|
|
|
Scorecard: ScorecardInfo{
|
|
|
|
Version: scorecardVersion,
|
|
|
|
CommitSHA: scorecardCommit,
|
|
|
|
},
|
|
|
|
Date: date,
|
2021-08-24 00:31:33 +03:00
|
|
|
Checks: []checker.CheckResult{
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-08-24 00:31:33 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "bin/binary.elf",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeBinary,
|
2021-08-24 00:31:33 +03:00
|
|
|
Offset: 0,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: checker.MinResultScore,
|
|
|
|
Reason: "min result reason",
|
|
|
|
Name: "Check-Name",
|
|
|
|
},
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-08-24 00:31:33 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "src/doc.txt",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeText,
|
2021-08-24 00:31:33 +03:00
|
|
|
Offset: 3,
|
|
|
|
Snippet: "some text",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: checker.MinResultScore,
|
|
|
|
Reason: "min result reason",
|
|
|
|
Name: "Check-Name2",
|
|
|
|
},
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-08-24 00:31:33 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailInfo,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "info message",
|
|
|
|
Path: "some/path.js",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-08-24 00:31:33 +03:00
|
|
|
Offset: 3,
|
|
|
|
Snippet: "if (bad) {BUG();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "some/path.py",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-08-24 00:31:33 +03:00
|
|
|
Offset: 3,
|
|
|
|
Snippet: "if (bad) {BUG2();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Type: checker.DetailDebug,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "debug message",
|
|
|
|
Path: "some/path.go",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-08-24 00:31:33 +03:00
|
|
|
Offset: 3,
|
|
|
|
Snippet: "if (bad) {BUG5();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: checker.InconclusiveResultScore,
|
|
|
|
Reason: "inconclusive reason",
|
|
|
|
Name: "Check-Name3",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Metadata: []string{},
|
|
|
|
},
|
|
|
|
},
|
2021-11-09 02:30:37 +03:00
|
|
|
{
|
|
|
|
name: "check-8",
|
|
|
|
showDetails: true,
|
|
|
|
expected: "./testdata/check8.sarif",
|
2022-01-21 02:57:39 +03:00
|
|
|
logLevel: log.DebugLevel,
|
2021-11-09 02:30:37 +03:00
|
|
|
policy: spol.ScorecardPolicy{
|
|
|
|
Version: 1,
|
|
|
|
Policies: map[string]*spol.CheckPolicy{
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name4": {
|
2021-11-09 02:30:37 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
|
|
|
},
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name": {
|
2021-11-09 02:30:37 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
|
|
|
},
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name5": {
|
2021-11-09 02:30:37 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
|
|
|
},
|
2022-05-06 22:52:30 +03:00
|
|
|
"Check-Name6": {
|
2021-11-09 02:30:37 +03:00
|
|
|
Score: checker.MaxResultScore,
|
|
|
|
Mode: spol.CheckPolicy_ENFORCED,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
result: ScorecardResult{
|
|
|
|
Repo: RepoInfo{
|
|
|
|
Name: repoName,
|
|
|
|
CommitSHA: repoCommit,
|
|
|
|
},
|
|
|
|
Scorecard: ScorecardInfo{
|
|
|
|
Version: scorecardVersion,
|
|
|
|
CommitSHA: scorecardCommit,
|
|
|
|
},
|
|
|
|
Date: date,
|
|
|
|
Checks: []checker.CheckResult{
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-11-09 02:30:37 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "src/file1.cpp",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-11-09 02:30:37 +03:00
|
|
|
Offset: 5,
|
|
|
|
Snippet: "if (bad) {BUG();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: 5,
|
|
|
|
Reason: "half score reason",
|
|
|
|
Name: "Check-Name4",
|
|
|
|
},
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-11-09 02:30:37 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "src/file1.cpp",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-11-09 02:30:37 +03:00
|
|
|
Offset: 5,
|
|
|
|
Snippet: "if (bad) {BUG();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "src/file2.cpp",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-11-09 02:30:37 +03:00
|
|
|
Offset: 5,
|
|
|
|
Snippet: "if (bad2) {BUG();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: 5,
|
|
|
|
Reason: "half score reason",
|
|
|
|
Name: "Check-Name",
|
|
|
|
},
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-11-09 02:30:37 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "src/file1.cpp",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-11-09 02:30:37 +03:00
|
|
|
Offset: 5,
|
|
|
|
Snippet: "if (bad) {BUG();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "src/file2.cpp",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-11-09 02:30:37 +03:00
|
|
|
Offset: 5,
|
|
|
|
Snippet: "if (bad2) {BUG2();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: 8,
|
|
|
|
Reason: "half score reason",
|
|
|
|
Name: "Check-Name5",
|
|
|
|
},
|
|
|
|
{
|
2022-05-12 22:58:12 +03:00
|
|
|
Details: []checker.CheckDetail{
|
2021-11-09 02:30:37 +03:00
|
|
|
{
|
|
|
|
Type: checker.DetailWarn,
|
|
|
|
Msg: checker.LogMessage{
|
|
|
|
Text: "warn message",
|
|
|
|
Path: "src/file1.cpp",
|
2023-01-31 05:41:36 +03:00
|
|
|
Type: finding.FileTypeSource,
|
2021-11-09 02:30:37 +03:00
|
|
|
Offset: 5,
|
|
|
|
Snippet: "if (bad) {BUG();}",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Score: 9,
|
|
|
|
Reason: "half score reason",
|
|
|
|
Name: "Check-Name6",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Metadata: []string{},
|
|
|
|
},
|
|
|
|
},
|
2021-08-24 00:31:33 +03:00
|
|
|
}
|
2022-02-15 21:26:06 +03:00
|
|
|
for i := range tests {
|
|
|
|
tt := &tests[i] // Re-initializing variable so it is not changed while executing the closure below
|
2021-08-24 00:31:33 +03:00
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
var content []byte
|
|
|
|
var err error
|
2021-11-12 22:34:46 +03:00
|
|
|
content, err = os.ReadFile(tt.expected)
|
2021-08-24 00:31:33 +03:00
|
|
|
if err != nil {
|
2021-09-01 20:29:40 +03:00
|
|
|
t.Fatalf("%s: cannot read file: %v", tt.name, err)
|
2021-08-24 00:31:33 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
var expected bytes.Buffer
|
|
|
|
n, err := expected.Write(content)
|
|
|
|
if err != nil {
|
2021-09-01 20:29:40 +03:00
|
|
|
t.Fatalf("%s: cannot write buffer: %v", tt.name, err)
|
2021-08-24 00:31:33 +03:00
|
|
|
}
|
|
|
|
if n != len(content) {
|
2021-09-01 20:29:40 +03:00
|
|
|
t.Fatalf("%s: write %d bytes but expected %d", tt.name, n, len(content))
|
2021-08-24 00:31:33 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
var result bytes.Buffer
|
2021-09-24 02:55:41 +03:00
|
|
|
err = tt.result.AsSARIF(tt.showDetails, tt.logLevel, &result,
|
2023-03-23 00:40:00 +03:00
|
|
|
checkDocs, &tt.policy, &options.Options{})
|
2021-08-24 00:31:33 +03:00
|
|
|
if err != nil {
|
2021-09-01 20:29:40 +03:00
|
|
|
t.Fatalf("%s: AsSARIF: %v", tt.name, err)
|
2021-08-24 00:31:33 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
r := bytes.Compare(expected.Bytes(), result.Bytes())
|
|
|
|
if r != 0 {
|
2022-02-15 21:26:06 +03:00
|
|
|
t.Fatalf("%s: invalid result: %d, %s", tt.name, r, cmp.Diff(expected.Bytes(), result.Bytes()))
|
2021-08-24 00:31:33 +03:00
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|