Files
trufflehog/pkg/sources/jenkins/jenkins_integration_test.go
Dustin DeckerandJoe Leon ef410873f2
Lint / golangci-lint (push) Waiting to run
Lint / semgrep (push) Waiting to run
Release / Release (push) Waiting to run
Scan for secrets / test (push) Waiting to run
Snifftest / Run Snifftest (push) Waiting to run
Test / test (push) Waiting to run
Test / test-community (push) Waiting to run
Add Jenkins scanning (#2892)
* add jenkins

* whoops

* adding unauthenticated jenkins scanning

* update docs

---------

Co-authored-by: Joe Leon <[email protected]>
2024-06-04 07:13:14 -04:00

196 lines
5.8 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//go:build localInfra
// +build localInfra
package jenkins
import (
"fmt"
"testing"
"time"
"github.com/trufflesecurity/trufflehog/v3/pkg/context"
"github.com/kylelemons/godebug/pretty"
"google.golang.org/protobuf/types/known/anypb"
"github.com/trufflesecurity/trufflehog/v3/pkg/common"
"github.com/trufflesecurity/trufflehog/v3/pkg/pb/credentialspb"
"github.com/trufflesecurity/trufflehog/v3/pkg/pb/source_metadatapb"
"github.com/trufflesecurity/trufflehog/v3/pkg/pb/sourcespb"
"github.com/trufflesecurity/trufflehog/v3/pkg/sources"
)
// Here’s how to test against Jenkins:
// Forward port from thog-dev_us-central1_dev-c1:
// kubectl --namespace jenkins port-forward svc/jenkins 8080:8080
// go test -timeout 10s -tags localInfra -run '^TestSource_Scan$' github.com/trufflesecurity/thog/scanner/pkg/sources/jenkins
func TestSource_Scan(t *testing.T) {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
secret, err := common.GetTestSecret(ctx)
if err != nil {
t.Fatal(fmt.Errorf("failed to access secret: %v", err))
}
jenkinsToken := secret.MustGetField("JENKINS_TOKEN")
type init struct {
name string
verify bool
connection *sourcespb.Jenkins
}
tests := []struct {
name string
init init
wantSourceMetadata *source_metadatapb.MetaData
wantErr bool
}{
{
name: "get a chunk",
init: init{
name: "this repo",
connection: &sourcespb.Jenkins{
Endpoint: "http://localhost:8080",
Credential: &sourcespb.Jenkins_BasicAuth{
BasicAuth: &credentialspb.BasicAuth{
Username: "admin",
Password: jenkinsToken,
},
},
},
verify: true,
},
wantSourceMetadata: &source_metadatapb.MetaData{
Data: &source_metadatapb.MetaData_Jenkins{Jenkins: &source_metadatapb.Jenkins{
ProjectName: "within-1-subfolder",
BuildNumber: 1,
Link: "http://localhost:8080/job/folder1/job/sub-folder1/job/within-1-subfolder/1/consoleText",
}},
},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
s := Source{}
conn, err := anypb.New(tt.init.connection)
if err != nil {
t.Fatal(err)
}
err = s.Init(ctx, tt.init.name, 0, 0, tt.init.verify, conn, 5)
if (err != nil) != tt.wantErr {
t.Errorf("Source.Init() error = %v, wantErr %v", err, tt.wantErr)
return
}
chunksCh := make(chan *sources.Chunk, 1)
// TODO: this is kind of bad, if it errors right away we don't see it as a test failure.
// Debugging this usually requires setting a breakpoint on L78 and running test w/ debug.
go func() {
err = s.Chunks(ctx, chunksCh)
if (err != nil) != tt.wantErr {
t.Errorf("Source.Chunks() error = %v, wantErr %v", err, tt.wantErr)
return
}
}()
gotChunk := <-chunksCh
if diff := pretty.Compare(gotChunk.SourceMetadata, tt.wantSourceMetadata); diff != "" {
t.Errorf("Source.Chunks() %s diff: (-got +want)\n%s", tt.name, diff)
}
})
}
}
func TestSource_ExpectBuilds(t *testing.T) {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
secret, err := common.GetTestSecret(ctx)
if err != nil {
t.Fatal(fmt.Errorf("failed to access secret: %v", err))
}
jenkinsToken := secret.MustGetField("JENKINS_TOKEN")
type init struct {
name string
verify bool
connection *sourcespb.Jenkins
}
tests := []struct {
name string
init init
wantSourceMetadatas map[string]bool
wantErr bool
}{
{
name: "get a chunk",
init: init{
name: "this repo",
connection: &sourcespb.Jenkins{
Endpoint: "http://localhost:8080",
Credential: &sourcespb.Jenkins_BasicAuth{
BasicAuth: &credentialspb.BasicAuth{
Username: "admin",
Password: jenkinsToken,
},
},
},
verify: true,
},
wantSourceMetadatas: map[string]bool{
"http://localhost:8080/job/hon-test/1/consoleText": false,
"http://localhost:8080/job/steeeve-freestyle-project/6/consoleText": false,
"http://localhost:8080/job/steeeve-freestyle-project/5/consoleText": false,
// Seems to 404? I assumed it would be there.
// "http://localhost:8080/job/steeeve-freestyle-project/4/consoleText": false,
"http://localhost:8080/job/steeeve-freestyle-project/3/consoleText": false,
"http://localhost:8080/job/steeeve-freestyle-project/2/consoleText": false,
"http://localhost:8080/job/steeeve-freestyle-project/1/consoleText": false,
"http://localhost:8080/job/folder1/job/within-1-folder/1/consoleText": false,
"http://localhost:8080/job/folder1/job/sub-folder1/job/within-1-subfolder/1/consoleText": false,
},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
s := Source{}
conn, err := anypb.New(tt.init.connection)
if err != nil {
t.Fatal(err)
}
err = s.Init(ctx, tt.init.name, 0, 0, tt.init.verify, conn, 5)
if (err != nil) != tt.wantErr {
t.Fatalf("Source.Init() error = %v, wantErr %v", err, tt.wantErr)
}
chunksCh := make(chan *sources.Chunk, 100)
err = s.Chunks(ctx, chunksCh)
if (err != nil) != tt.wantErr {
t.Fatalf("Source.Chunks() error = %v, wantErr %v", err, tt.wantErr)
}
close(chunksCh)
for gotChunk := range chunksCh {
if _, ok := tt.wantSourceMetadatas[gotChunk.SourceMetadata.GetJenkins().Link]; !ok {
t.Errorf("encountered unexpected build: %s", gotChunk.SourceMetadata.GetJenkins().Link)
}
tt.wantSourceMetadatas[gotChunk.SourceMetadata.GetJenkins().Link] = true
}
for k, found := range tt.wantSourceMetadatas {
if !found {
t.Errorf("did not encounter expected build: %s", k)
}
}
})
}
}