package docker import ( "sync" "testing" "github.com/stretchr/testify/assert" "google.golang.org/protobuf/types/known/anypb" "github.com/trufflesecurity/trufflehog/v3/pkg/context" "github.com/trufflesecurity/trufflehog/v3/pkg/pb/credentialspb" "github.com/trufflesecurity/trufflehog/v3/pkg/pb/sourcespb" "github.com/trufflesecurity/trufflehog/v3/pkg/sources" ) func TestDockerImageScan(t *testing.T) { dockerConn := &sourcespb.Docker{ Credential: &sourcespb.Docker_Unauthenticated{ Unauthenticated: &credentialspb.Unauthenticated{}, }, Images: []string{"trufflesecurity/secrets"}, } conn := &anypb.Any{} err := conn.MarshalFrom(dockerConn) assert.NoError(t, err) s := &Source{} err = s.Init(context.TODO(), "test source", 0, 0, false, conn, 1) assert.NoError(t, err) var wg sync.WaitGroup chunksChan := make(chan *sources.Chunk, 1) chunkCounter := 0 wg.Add(1) go func() { defer wg.Done() for chunk := range chunksChan { assert.NotEmpty(t, chunk) chunkCounter++ } }() err = s.Chunks(context.TODO(), chunksChan) assert.NoError(t, err) close(chunksChan) wg.Wait() assert.Equal(t, 1, chunkCounter) } func TestDockerImageScanWithDigest(t *testing.T) { dockerConn := &sourcespb.Docker{ Credential: &sourcespb.Docker_Unauthenticated{ Unauthenticated: &credentialspb.Unauthenticated{}, }, Images: []string{"trufflesecurity/secrets@sha256:864f6d41209462d8e37fc302ba1532656e265f7c361f11e29fed6ca1f4208e11"}, } conn := &anypb.Any{} err := conn.MarshalFrom(dockerConn) assert.NoError(t, err) s := &Source{} err = s.Init(context.TODO(), "test source", 0, 0, false, conn, 1) assert.NoError(t, err) var wg sync.WaitGroup chunksChan := make(chan *sources.Chunk, 1) chunkCounter := 0 wg.Add(1) go func() { defer wg.Done() for chunk := range chunksChan { assert.NotEmpty(t, chunk) chunkCounter++ } }() err = s.Chunks(context.TODO(), chunksChan) assert.NoError(t, err) close(chunksChan) wg.Wait() assert.Equal(t, 1, chunkCounter) } func TestBaseAndTagFromImage(t *testing.T) { tests := []struct { image string wantBase string wantTag string wantDigest bool }{ {"golang:1.16", "golang", "1.16", false}, {"golang@sha256:abcdef", "golang", "sha256:abcdef", true}, {"ghcr.io/golang:1.16", "ghcr.io/golang", "1.16", false}, {"ghcr.io/golang:nightly", "ghcr.io/golang", "nightly", false}, {"ghcr.io/golang", "ghcr.io/golang", "latest", false}, {"ghcr.io/trufflesecurity/secrets", "ghcr.io/trufflesecurity/secrets", "latest", false}, } for _, tt := range tests { gotBase, gotTag, gotDigest := baseAndTagFromImage(tt.image) if gotBase != tt.wantBase || gotTag != tt.wantTag || gotDigest != tt.wantDigest { t.Errorf("baseAndTagFromImage(%q) = (%q, %q, %v), want (%q, %q, %v)", tt.image, gotBase, gotTag, gotDigest, tt.wantBase, tt.wantTag, tt.wantDigest) } } }