Skip to content

Commit

Permalink
fix: differentiate between absence of attestations and unawareness
Browse files Browse the repository at this point in the history
Signed-off-by: felipecruz91 <[email protected]>
  • Loading branch information
felipecruz91 committed Feb 16, 2024
1 parent 6d82dd4 commit db880f8
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 7 deletions.
82 changes: 82 additions & 0 deletions policy/policy_handler/local_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package policy_handler

import (
"os"
"testing"

"github.com/atomist-skills/go-skill"
"olympos.io/encoding/edn"
)

func Test_parseMetadata_NullAttestations(t *testing.T) {
req, err := createSyncReqFromFile("./test_data/payload_attest_null.edn")
if err != nil {
t.Fatal(err)
}

_, got, err := parseMetadata(*req)
if err != nil {
t.Fatalf("parseMetadata() error = %v, want nil", err)
return
}

if got.Attestations != nil {
t.Fatalf("parseMetadata() got.Attestations = %+v, want nil", got.Attestations)
}
}

func Test_parseMetadata_NoAttestations(t *testing.T) {
req, err := createSyncReqFromFile("./test_data/payload_attest_empty.edn")
if err != nil {
t.Fatal(err)
}

_, got, err := parseMetadata(*req)
if err != nil {
t.Fatalf("parseMetadata() error = %v, want nil", err)
return
}

if got.Attestations == nil || len(got.Attestations) != 0 {
t.Fatalf("parseMetadata() got.Attestations = %+v, want empty slice", got.Attestations)
}
}

func Test_parseMetadata_Attestations(t *testing.T) {
req, err := createSyncReqFromFile("./test_data/payload_attest.edn")
if err != nil {
t.Fatal(err)
}

_, got, err := parseMetadata(*req)
if err != nil {
t.Fatalf("parseMetadata() error = %v, want nil", err)
return
}

if len(got.Attestations) != 2 {
t.Fatalf("parseMetadata() got.Attestations = %+v, want 2", got.Attestations)
}
}

// createSyncReqFromFile creates a skill.RequestContext from a file.
// The file represents the sync-request payload which contains the base64-encoded and gzipped SBOM from a local evaluation.
func createSyncReqFromFile(filename string) (*skill.RequestContext, error) {
f, err := os.ReadFile(filename)
if err != nil {
return nil, err
}

var syncReq skill.EventContextSyncRequest
if err := edn.Unmarshal(f, &syncReq); err != nil {
return nil, err
}

return &skill.RequestContext{
Event: skill.EventIncoming{
Context: skill.EventContext{
SyncRequest: syncReq,
},
},
}, nil
}
16 changes: 10 additions & 6 deletions policy/policy_handler/mocks/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,16 @@ func BuildLocalEvalMocks(ctx context.Context, req skill.RequestContext, sb *type
}

// Attestations
req.Log.Infof("SBOM has %d attestations", len(sb.Attestations))
if len(sb.Attestations) > 0 {
attestMock := MockGetInTotoAttestations(sb, req.Log)
m[GetInTotoAttestationsQueryName], err = edn.Marshal(attestMock)
if err != nil {
return m, fmt.Errorf("failed to marshal attestations mock: %w", err)
if sb.Attestations == nil {
req.Log.Info("No attestations found in SBOM (nil)")
} else {
req.Log.Infof("SBOM has %d attestations", len(sb.Attestations))
if len(sb.Attestations) > 0 {
attestMock := MockGetInTotoAttestations(sb, req.Log)
m[GetInTotoAttestationsQueryName], err = edn.Marshal(attestMock)
if err != nil {
return m, fmt.Errorf("failed to marshal attestations mock: %w", err)
}
}
}

Expand Down
1 change: 1 addition & 0 deletions policy/policy_handler/test_data/payload_attest.edn

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions policy/policy_handler/test_data/payload_attest_empty.edn
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{:name "evaluate_goals_locally" :metadata {:contentType "application/json" :encoding "base64+gzip" :sbom "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"} :configuration {:eTag "" :name "" :displayName "" :updatedAt "" :parameters nil :enabled false :author {:email "" :name ""}}}
Loading

0 comments on commit db880f8

Please sign in to comment.