mirror of
https://github.com/anchore/syft.git
synced 2025-11-18 00:43:20 +01:00
* add support to upload results to enterprise Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * add package sbom upload Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * add dockerfile support Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * add manifest, index, and dockerfile import functions Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * schema version to json output + enhance json schema generation Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * modify package SBOM shape to be entire syft document + add etui updates Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * add import image config and manifest support Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * add config options for import to enterprise Signed-off-by: Alex Goodman <alex.goodman@anchore.com> * incorporate final stereoscope and client-go deps Signed-off-by: Alex Goodman <alex.goodman@anchore.com>
125 lines
3.0 KiB
Go
125 lines
3.0 KiB
Go
package anchore
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/wagoodman/go-progress"
|
|
|
|
"github.com/docker/docker/pkg/ioutils"
|
|
|
|
"github.com/anchore/client-go/pkg/external"
|
|
"github.com/go-test/deep"
|
|
)
|
|
|
|
type mockDockerfileImportAPI struct {
|
|
sessionID string
|
|
model string
|
|
httpResponse *http.Response
|
|
err error
|
|
ctx context.Context
|
|
responseDigest string
|
|
wasCalled bool
|
|
}
|
|
|
|
func (m *mockDockerfileImportAPI) ImportImageDockerfile(ctx context.Context, sessionID string, contents string) (external.ImageImportContentResponse, *http.Response, error) {
|
|
m.wasCalled = true
|
|
m.model = contents
|
|
m.sessionID = sessionID
|
|
m.ctx = ctx
|
|
if m.httpResponse == nil {
|
|
m.httpResponse = &http.Response{}
|
|
}
|
|
m.httpResponse.Body = ioutils.NewReadCloserWrapper(strings.NewReader(""), func() error { return nil })
|
|
return external.ImageImportContentResponse{Digest: m.responseDigest}, m.httpResponse, m.err
|
|
}
|
|
|
|
func TestDockerfileImport(t *testing.T) {
|
|
|
|
sessionID := "my-session"
|
|
|
|
tests := []struct {
|
|
name string
|
|
dockerfile string
|
|
api *mockDockerfileImportAPI
|
|
expectsError bool
|
|
expectsCall bool
|
|
}{
|
|
|
|
{
|
|
name: "Go case: import works",
|
|
dockerfile: "the-manifest-contents!",
|
|
api: &mockDockerfileImportAPI{
|
|
httpResponse: &http.Response{StatusCode: 200},
|
|
responseDigest: "digest!",
|
|
},
|
|
expectsCall: true,
|
|
},
|
|
{
|
|
name: "No manifest provided",
|
|
dockerfile: "",
|
|
api: &mockDockerfileImportAPI{},
|
|
expectsCall: false,
|
|
},
|
|
{
|
|
name: "API returns an error",
|
|
dockerfile: "the-manifest-contents!",
|
|
api: &mockDockerfileImportAPI{
|
|
err: fmt.Errorf("api error, something went wrong"),
|
|
},
|
|
expectsError: true,
|
|
expectsCall: true,
|
|
},
|
|
{
|
|
name: "API HTTP-level error",
|
|
dockerfile: "the-manifest-contents!",
|
|
api: &mockDockerfileImportAPI{
|
|
httpResponse: &http.Response{StatusCode: 404},
|
|
},
|
|
expectsError: true,
|
|
expectsCall: true,
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
|
|
digest, err := importDockerfile(context.TODO(), test.api, sessionID, []byte(test.dockerfile), &progress.Stage{})
|
|
|
|
// validate error handling
|
|
if err != nil && !test.expectsError {
|
|
t.Fatalf("did not expect an error, but got: %+v", err)
|
|
} else if err == nil && test.expectsError {
|
|
t.Fatalf("did expect an error, but got none")
|
|
}
|
|
|
|
if !test.api.wasCalled && test.expectsCall {
|
|
t.Fatalf("was not called!")
|
|
} else if test.api.wasCalled && !test.expectsCall {
|
|
t.Fatalf("should not have been called")
|
|
}
|
|
|
|
if !test.expectsCall {
|
|
return
|
|
}
|
|
|
|
if digest != test.api.responseDigest {
|
|
t.Errorf("unexpected content digest: %q != %q", digest, test.api.responseDigest)
|
|
}
|
|
|
|
// validating that the mock got the right parameters
|
|
if test.api.sessionID != sessionID {
|
|
t.Errorf("different session ID: %s != %s", test.api.sessionID, sessionID)
|
|
}
|
|
|
|
for _, d := range deep.Equal(test.api.model, test.dockerfile) {
|
|
t.Errorf("model difference: %s", d)
|
|
}
|
|
|
|
})
|
|
}
|
|
}
|