diff --git a/bundle/bundle.go b/internal/bundle/bundle.go similarity index 83% rename from bundle/bundle.go rename to internal/bundle/bundle.go index ebff8c2a..7d1edbfb 100644 --- a/bundle/bundle.go +++ b/internal/bundle/bundle.go @@ -18,18 +18,17 @@ package bundle import ( "context" + "github.com/rs/zerolog" - "github.com/snyk/code-client-go/deepcode" + "github.com/snyk/code-client-go/internal/deepcode" "github.com/snyk/code-client-go/observability" ) //go:generate mockgen -destination=mocks/bundle.go -source=bundle.go -package mocks type Bundle interface { - UploadBatch(ctx context.Context, batch *Batch) error + UploadBatch(ctx context.Context, requestId string, batch *Batch) error GetBundleHash() string - GetRootPath() string - GetRequestId() string GetFiles() map[string]deepcode.BundleFile GetMissingFiles() []string } @@ -39,8 +38,6 @@ type deepCodeBundle struct { instrumentor observability.Instrumentor errorReporter observability.ErrorReporter logger *zerolog.Logger - requestId string - rootPath string files map[string]deepcode.BundleFile bundleHash string batches []*Batch @@ -54,8 +51,6 @@ func NewBundle( errorReporter observability.ErrorReporter, logger *zerolog.Logger, bundleHash string, - requestId string, - rootPath string, files map[string]deepcode.BundleFile, limitToFiles []string, missingFiles []string, @@ -66,8 +61,6 @@ func NewBundle( errorReporter: errorReporter, logger: logger, bundleHash: bundleHash, - requestId: requestId, - rootPath: rootPath, batches: []*Batch{}, files: files, limitToFiles: limitToFiles, @@ -79,14 +72,6 @@ func (b *deepCodeBundle) GetBundleHash() string { return b.bundleHash } -func (b *deepCodeBundle) GetRootPath() string { - return b.rootPath -} - -func (b *deepCodeBundle) GetRequestId() string { - return b.requestId -} - func (b *deepCodeBundle) GetFiles() map[string]deepcode.BundleFile { return b.files } @@ -95,8 +80,8 @@ func (b *deepCodeBundle) GetMissingFiles() []string { return b.missingFiles } -func (b *deepCodeBundle) UploadBatch(ctx context.Context, batch *Batch) error { - err := b.extendBundle(ctx, batch) +func (b *deepCodeBundle) UploadBatch(ctx context.Context, requestId string, batch *Batch) error { + err := b.extendBundle(ctx, requestId, batch) if err != nil { return err } @@ -104,11 +89,11 @@ func (b *deepCodeBundle) UploadBatch(ctx context.Context, batch *Batch) error { return nil } -func (b *deepCodeBundle) extendBundle(ctx context.Context, uploadBatch *Batch) error { +func (b *deepCodeBundle) extendBundle(ctx context.Context, requestId string, uploadBatch *Batch) error { var err error if uploadBatch.hasContent() { b.bundleHash, b.missingFiles, err = b.SnykCode.ExtendBundle(ctx, b.bundleHash, uploadBatch.documents, []string{}) - b.logger.Debug().Str("requestId", b.requestId).Interface("MissingFiles", b.missingFiles).Msg("extended deepCodeBundle on backend") + b.logger.Debug().Str("requestId", requestId).Interface("MissingFiles", b.missingFiles).Msg("extended deepCodeBundle on backend") } return err diff --git a/bundle/bundle_manager.go b/internal/bundle/bundle_manager.go similarity index 91% rename from bundle/bundle_manager.go rename to internal/bundle/bundle_manager.go index 45f54196..755cb885 100644 --- a/bundle/bundle_manager.go +++ b/internal/bundle/bundle_manager.go @@ -18,20 +18,20 @@ package bundle import ( "context" + deepcode2 "github.com/snyk/code-client-go/internal/deepcode" "os" "path/filepath" "github.com/puzpuzpuz/xsync" "github.com/rs/zerolog" - "github.com/snyk/code-client-go/deepcode" "github.com/snyk/code-client-go/internal/util" "github.com/snyk/code-client-go/observability" ) // TODO: add progress tracker for percentage progress type bundleManager struct { - SnykCode deepcode.SnykCodeClient + SnykCode deepcode2.SnykCodeClient instrumentor observability.Instrumentor errorReporter observability.ErrorReporter logger *zerolog.Logger @@ -50,14 +50,15 @@ type BundleManager interface { Upload( ctx context.Context, + requestId string, originalBundle Bundle, - files map[string]deepcode.BundleFile, + files map[string]deepcode2.BundleFile, ) (Bundle, error) } func NewBundleManager( logger *zerolog.Logger, - SnykCode deepcode.SnykCodeClient, + SnykCode deepcode2.SnykCodeClient, instrumentor observability.Instrumentor, errorReporter observability.ErrorReporter, ) *bundleManager { @@ -82,7 +83,7 @@ func (b *bundleManager) Create(ctx context.Context, var limitToFiles []string fileHashes := make(map[string]string) - bundleFiles := make(map[string]deepcode.BundleFile) + bundleFiles := make(map[string]deepcode2.BundleFile) noFiles := true for absoluteFilePath := range filePaths { noFiles = false @@ -115,7 +116,7 @@ func (b *bundleManager) Create(ctx context.Context, } relativePath = util.EncodePath(relativePath) - bundleFile := deepcode.BundleFileFrom(absoluteFilePath, fileContent) + bundleFile := deepcode2.BundleFileFrom(absoluteFilePath, fileContent) bundleFiles[relativePath] = bundleFile fileHashes[relativePath] = bundleFile.Hash @@ -139,8 +140,6 @@ func (b *bundleManager) Create(ctx context.Context, b.errorReporter, b.logger, bundleHash, - requestId, - rootPath, bundleFiles, limitToFiles, missingFiles, @@ -150,8 +149,9 @@ func (b *bundleManager) Create(ctx context.Context, func (b *bundleManager) Upload( ctx context.Context, + requestId string, bundle Bundle, - files map[string]deepcode.BundleFile, + files map[string]deepcode2.BundleFile, ) (Bundle, error) { method := "code.Batch" s := b.instrumentor.StartSpan(ctx, method) @@ -168,7 +168,7 @@ func (b *bundleManager) Upload( if err := ctx.Err(); err != nil { return bundle, err } - err := bundle.UploadBatch(s.Context(), batch) + err := bundle.UploadBatch(s.Context(), requestId, batch) if err != nil { return bundle, err } @@ -181,14 +181,14 @@ func (b *bundleManager) Upload( func (b *bundleManager) groupInBatches( ctx context.Context, bundle Bundle, - files map[string]deepcode.BundleFile, + files map[string]deepcode2.BundleFile, ) []*Batch { method := "code.groupInBatches" s := b.instrumentor.StartSpan(ctx, method) defer b.instrumentor.Finish(s) var batches []*Batch - batch := NewBatch(map[string]deepcode.BundleFile{}) + batch := NewBatch(map[string]deepcode2.BundleFile{}) for _, filePath := range bundle.GetMissingFiles() { if len(batches) == 0 { // first batch added after first file found batches = append(batches, batch) @@ -201,7 +201,7 @@ func (b *bundleManager) groupInBatches( batch.documents[filePath] = file } else { b.logger.Trace().Str("path", filePath).Int("size", len(fileContent)).Msgf("created new deepCodeBundle - %v bundles in this upload so far", len(batches)) - newUploadBatch := NewBatch(map[string]deepcode.BundleFile{}) + newUploadBatch := NewBatch(map[string]deepcode2.BundleFile{}) newUploadBatch.documents[filePath] = file batches = append(batches, newUploadBatch) batch = newUploadBatch diff --git a/bundle/bundle_manager_test.go b/internal/bundle/bundle_manager_test.go similarity index 90% rename from bundle/bundle_manager_test.go rename to internal/bundle/bundle_manager_test.go index c7d21564..2116e26f 100644 --- a/bundle/bundle_manager_test.go +++ b/internal/bundle/bundle_manager_test.go @@ -29,9 +29,9 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/snyk/code-client-go/bundle" - deepcode2 "github.com/snyk/code-client-go/deepcode" - mocks2 "github.com/snyk/code-client-go/deepcode/mocks" + "github.com/snyk/code-client-go/internal/bundle" + "github.com/snyk/code-client-go/internal/deepcode" + deepcodeMocks "github.com/snyk/code-client-go/internal/deepcode/mocks" "github.com/snyk/code-client-go/internal/util" "github.com/snyk/code-client-go/observability/mocks" ) @@ -42,8 +42,8 @@ func Test_Create(t *testing.T) { ctrl := gomock.NewController(t) mockSpan := mocks.NewMockSpan(ctrl) mockSpan.EXPECT().Context().AnyTimes() - mockSnykCodeClient := mocks2.NewMockSnykCodeClient(ctrl) - mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode2.FiltersResponse{ + mockSnykCodeClient := deepcodeMocks.NewMockSnykCodeClient(ctrl) + mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode.FiltersResponse{ ConfigFiles: []string{}, Extensions: []string{".java"}, }, nil) @@ -77,8 +77,8 @@ func Test_Create(t *testing.T) { ctrl := gomock.NewController(t) mockSpan := mocks.NewMockSpan(ctrl) mockSpan.EXPECT().Context().AnyTimes() - mockSnykCodeClient := mocks2.NewMockSnykCodeClient(ctrl) - mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode2.FiltersResponse{ + mockSnykCodeClient := deepcodeMocks.NewMockSnykCodeClient(ctrl) + mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode.FiltersResponse{ ConfigFiles: []string{}, Extensions: []string{".java"}, }, nil) @@ -110,8 +110,8 @@ func Test_Create(t *testing.T) { ctrl := gomock.NewController(t) mockSpan := mocks.NewMockSpan(ctrl) mockSpan.EXPECT().Context().AnyTimes() - mockSnykCodeClient := mocks2.NewMockSnykCodeClient(ctrl) - mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode2.FiltersResponse{ + mockSnykCodeClient := deepcodeMocks.NewMockSnykCodeClient(ctrl) + mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode.FiltersResponse{ ConfigFiles: []string{}, Extensions: []string{".java"}, }, nil) @@ -147,8 +147,8 @@ func Test_Create(t *testing.T) { ctrl := gomock.NewController(t) mockSpan := mocks.NewMockSpan(ctrl) mockSpan.EXPECT().Context().AnyTimes() - mockSnykCodeClient := mocks2.NewMockSnykCodeClient(ctrl) - mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode2.FiltersResponse{ + mockSnykCodeClient := deepcodeMocks.NewMockSnykCodeClient(ctrl) + mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode.FiltersResponse{ ConfigFiles: []string{}, Extensions: []string{".java"}, }, nil) @@ -181,8 +181,8 @@ func Test_Create(t *testing.T) { ctrl := gomock.NewController(t) mockSpan := mocks.NewMockSpan(ctrl) mockSpan.EXPECT().Context().AnyTimes() - mockSnykCodeClient := mocks2.NewMockSnykCodeClient(ctrl) - mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode2.FiltersResponse{ + mockSnykCodeClient := deepcodeMocks.NewMockSnykCodeClient(ctrl) + mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode.FiltersResponse{ ConfigFiles: []string{".test"}, Extensions: []string{}, }, nil) @@ -214,8 +214,8 @@ func Test_Create(t *testing.T) { ctrl := gomock.NewController(t) mockSpan := mocks.NewMockSpan(ctrl) mockSpan.EXPECT().Context().AnyTimes() - mockSnykCodeClient := mocks2.NewMockSnykCodeClient(ctrl) - mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode2.FiltersResponse{ + mockSnykCodeClient := deepcodeMocks.NewMockSnykCodeClient(ctrl) + mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode.FiltersResponse{ ConfigFiles: []string{}, Extensions: []string{".java"}, }, nil) @@ -272,7 +272,7 @@ func Test_Upload(t *testing.T) { ctrl := gomock.NewController(t) mockSpan := mocks.NewMockSpan(ctrl) mockSpan.EXPECT().Context().AnyTimes() - mockSnykCodeClient := mocks2.NewMockSnykCodeClient(ctrl) + mockSnykCodeClient := deepcodeMocks.NewMockSnykCodeClient(ctrl) mockSnykCodeClient.EXPECT().ExtendBundle(gomock.Any(), "bundleHash", gomock.Len(1), []string{}).Times(1) mockInstrumentor := mocks.NewMockInstrumentor(ctrl) mockInstrumentor.EXPECT().StartSpan(gomock.Any(), gomock.Any()).Return(mockSpan).Times(2) @@ -281,11 +281,13 @@ func Test_Upload(t *testing.T) { var bundleManager = bundle.NewBundleManager(newLogger(t), mockSnykCodeClient, mockInstrumentor, mockErrorReporter) documentURI, bundleFile := createTempFileInDir(t, "bundleDoc.java", 10, temporaryDir) - bundleFileMap := map[string]deepcode2.BundleFile{} + bundleFileMap := map[string]deepcode.BundleFile{} bundleFileMap[documentURI] = bundleFile - _, err := bundleManager.Upload(context.Background(), - bundle.NewBundle(mockSnykCodeClient, mockInstrumentor, mockErrorReporter, &logger, "bundleHash", "testRequestId", "", bundleFileMap, []string{}, []string{documentURI}), + _, err := bundleManager.Upload( + context.Background(), + "testRequestId", + bundle.NewBundle(mockSnykCodeClient, mockInstrumentor, mockErrorReporter, &logger, "bundleHash", bundleFileMap, []string{}, []string{documentURI}), bundleFileMap) assert.NoError(t, err) }) @@ -294,7 +296,7 @@ func Test_Upload(t *testing.T) { ctrl := gomock.NewController(t) mockSpan := mocks.NewMockSpan(ctrl) mockSpan.EXPECT().Context().AnyTimes() - mockSnykCodeClient := mocks2.NewMockSnykCodeClient(ctrl) + mockSnykCodeClient := deepcodeMocks.NewMockSnykCodeClient(ctrl) mockSnykCodeClient.EXPECT().ExtendBundle(gomock.Any(), "bundleHash", gomock.Len(3), []string{}).Return("newBundleHash", []string{}, nil).Times(1) mockSnykCodeClient.EXPECT().ExtendBundle(gomock.Any(), "newBundleHash", gomock.Len(2), []string{}).Return("newerBundleHash", []string{}, nil).Times(1) mockInstrumentor := mocks.NewMockInstrumentor(ctrl) @@ -303,7 +305,7 @@ func Test_Upload(t *testing.T) { mockErrorReporter := mocks.NewMockErrorReporter(ctrl) var bundleManager = bundle.NewBundleManager(newLogger(t), mockSnykCodeClient, mockInstrumentor, mockErrorReporter) - bundleFileMap := map[string]deepcode2.BundleFile{} + bundleFileMap := map[string]deepcode.BundleFile{} var missingFiles []string path, bundleFile := createTempFileInDir(t, "bundleDoc1.java", (1024*1024)-1, temporaryDir) bundleFileMap[path] = bundleFile @@ -321,24 +323,26 @@ func Test_Upload(t *testing.T) { bundleFileMap[path] = bundleFile missingFiles = append(missingFiles, path) - _, err := bundleManager.Upload(context.Background(), - bundle.NewBundle(mockSnykCodeClient, mockInstrumentor, mockErrorReporter, &logger, "bundleHash", "testRequestId", "", bundleFileMap, []string{}, missingFiles), + _, err := bundleManager.Upload( + context.Background(), + "testRequestId", + bundle.NewBundle(mockSnykCodeClient, mockInstrumentor, mockErrorReporter, &logger, "bundleHash", bundleFileMap, []string{}, missingFiles), bundleFileMap) assert.Nil(t, err) }) } -func createTempFileInDir(t *testing.T, name string, size int, temporaryDir string) (string, deepcode2.BundleFile) { +func createTempFileInDir(t *testing.T, name string, size int, temporaryDir string) (string, deepcode.BundleFile) { t.Helper() documentURI, fileContent := createFileOfSize(t, name, size, temporaryDir) - return documentURI, deepcode2.BundleFile{Hash: util.Hash(fileContent), Content: string(fileContent)} + return documentURI, deepcode.BundleFile{Hash: util.Hash(fileContent), Content: string(fileContent)} } func Test_IsSupported_Extensions(t *testing.T) { ctrl := gomock.NewController(t) - mockSnykCodeClient := mocks2.NewMockSnykCodeClient(ctrl) - mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode2.FiltersResponse{ + mockSnykCodeClient := deepcodeMocks.NewMockSnykCodeClient(ctrl) + mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode.FiltersResponse{ ConfigFiles: []string{}, Extensions: []string{".java"}, }, nil) @@ -376,8 +380,8 @@ func Test_IsSupported_ConfigFiles(t *testing.T) { } ctrl := gomock.NewController(t) - mockSnykCodeClient := mocks2.NewMockSnykCodeClient(ctrl) - mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode2.FiltersResponse{ + mockSnykCodeClient := deepcodeMocks.NewMockSnykCodeClient(ctrl) + mockSnykCodeClient.EXPECT().GetFilters(gomock.Any()).Return(deepcode.FiltersResponse{ ConfigFiles: configFilesFromFiltersEndpoint, Extensions: []string{}, }, nil) diff --git a/bundle/bundle_test.go b/internal/bundle/bundle_test.go similarity index 82% rename from bundle/bundle_test.go rename to internal/bundle/bundle_test.go index bb539543..d2de6c5b 100644 --- a/bundle/bundle_test.go +++ b/internal/bundle/bundle_test.go @@ -18,16 +18,16 @@ package bundle_test import ( "context" - "github.com/rs/zerolog" "testing" "github.com/golang/mock/gomock" + "github.com/rs/zerolog" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/snyk/code-client-go/bundle" - "github.com/snyk/code-client-go/deepcode" - deepcodeMocks "github.com/snyk/code-client-go/deepcode/mocks" + "github.com/snyk/code-client-go/internal/bundle" + "github.com/snyk/code-client-go/internal/deepcode" + deepcodeMocks "github.com/snyk/code-client-go/internal/deepcode/mocks" "github.com/snyk/code-client-go/observability/mocks" ) @@ -50,10 +50,10 @@ func Test_UploadBatch(t *testing.T) { mockInstrumentor.EXPECT().StartSpan(gomock.Any(), gomock.Any()).Return(mockSpan).AnyTimes() mockInstrumentor.EXPECT().Finish(gomock.Any()).AnyTimes() mockErrorReporter := mocks.NewMockErrorReporter(ctrl) - b := bundle.NewBundle(mockSnykCodeClient, mockInstrumentor, mockErrorReporter, &testLogger, "testBundleHash", "testRequestId", "", map[string]deepcode.BundleFile{}, []string{}, []string{}) + b := bundle.NewBundle(mockSnykCodeClient, mockInstrumentor, mockErrorReporter, &testLogger, "testBundleHash", map[string]deepcode.BundleFile{}, []string{}, []string{}) emptyBundle := &bundle.Batch{} - err := b.UploadBatch(context.Background(), emptyBundle) + err := b.UploadBatch(context.Background(), "testRequestId", emptyBundle) assert.NoError(t, err) }) @@ -70,9 +70,9 @@ func Test_UploadBatch(t *testing.T) { mockInstrumentor.EXPECT().StartSpan(gomock.Any(), gomock.Any()).Return(mockSpan).AnyTimes() mockInstrumentor.EXPECT().Finish(gomock.Any()).AnyTimes() mockErrorReporter := mocks.NewMockErrorReporter(ctrl) - b := bundle.NewBundle(mockSnykCodeClient, mockInstrumentor, mockErrorReporter, &testLogger, "testBundleHash", "testRequestId", "", map[string]deepcode.BundleFile{}, []string{}, []string{}) + b := bundle.NewBundle(mockSnykCodeClient, mockInstrumentor, mockErrorReporter, &testLogger, "testBundleHash", map[string]deepcode.BundleFile{}, []string{}, []string{}) - err := b.UploadBatch(context.Background(), bundleWithFiles) + err := b.UploadBatch(context.Background(), "testRequestId", bundleWithFiles) assert.NoError(t, err) }) @@ -93,12 +93,12 @@ func Test_UploadBatch(t *testing.T) { mockInstrumentor.EXPECT().StartSpan(gomock.Any(), gomock.Any()).Return(mockSpan).AnyTimes() mockInstrumentor.EXPECT().Finish(gomock.Any()).AnyTimes() mockErrorReporter := mocks.NewMockErrorReporter(ctrl) - b := bundle.NewBundle(mockSnykCodeClient, mockInstrumentor, mockErrorReporter, &testLogger, "testBundleHash", "testRequestId", "", map[string]deepcode.BundleFile{}, []string{}, []string{}) + b := bundle.NewBundle(mockSnykCodeClient, mockInstrumentor, mockErrorReporter, &testLogger, "testBundleHash", map[string]deepcode.BundleFile{}, []string{}, []string{}) - err := b.UploadBatch(context.Background(), bundleWithFiles) + err := b.UploadBatch(context.Background(), "testRequestId", bundleWithFiles) require.NoError(t, err) oldHash := b.GetBundleHash() - err = b.UploadBatch(context.Background(), bundleWithMultipleFiles) + err = b.UploadBatch(context.Background(), "testRequestId", bundleWithMultipleFiles) require.NoError(t, err) newHash := b.GetBundleHash() assert.NotEqual(t, oldHash, newHash) diff --git a/bundle/errors.go b/internal/bundle/errors.go similarity index 100% rename from bundle/errors.go rename to internal/bundle/errors.go diff --git a/bundle/mocks/bundle.go b/internal/bundle/mocks/bundle.go similarity index 65% rename from bundle/mocks/bundle.go rename to internal/bundle/mocks/bundle.go index cd49881b..e10f76fe 100644 --- a/bundle/mocks/bundle.go +++ b/internal/bundle/mocks/bundle.go @@ -9,8 +9,8 @@ import ( reflect "reflect" gomock "github.com/golang/mock/gomock" - bundle "github.com/snyk/code-client-go/bundle" - deepcode "github.com/snyk/code-client-go/deepcode" + bundle "github.com/snyk/code-client-go/internal/bundle" + deepcode "github.com/snyk/code-client-go/internal/deepcode" ) // MockBundle is a mock of Bundle interface. @@ -78,44 +78,16 @@ func (mr *MockBundleMockRecorder) GetMissingFiles() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMissingFiles", reflect.TypeOf((*MockBundle)(nil).GetMissingFiles)) } -// GetRequestId mocks base method. -func (m *MockBundle) GetRequestId() string { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetRequestId") - ret0, _ := ret[0].(string) - return ret0 -} - -// GetRequestId indicates an expected call of GetRequestId. -func (mr *MockBundleMockRecorder) GetRequestId() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRequestId", reflect.TypeOf((*MockBundle)(nil).GetRequestId)) -} - -// GetRootPath mocks base method. -func (m *MockBundle) GetRootPath() string { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetRootPath") - ret0, _ := ret[0].(string) - return ret0 -} - -// GetRootPath indicates an expected call of GetRootPath. -func (mr *MockBundleMockRecorder) GetRootPath() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRootPath", reflect.TypeOf((*MockBundle)(nil).GetRootPath)) -} - // UploadBatch mocks base method. -func (m *MockBundle) UploadBatch(ctx context.Context, batch *bundle.Batch) error { +func (m *MockBundle) UploadBatch(ctx context.Context, requestId string, batch *bundle.Batch) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UploadBatch", ctx, batch) + ret := m.ctrl.Call(m, "UploadBatch", ctx, requestId, batch) ret0, _ := ret[0].(error) return ret0 } // UploadBatch indicates an expected call of UploadBatch. -func (mr *MockBundleMockRecorder) UploadBatch(ctx, batch interface{}) *gomock.Call { +func (mr *MockBundleMockRecorder) UploadBatch(ctx, requestId, batch interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UploadBatch", reflect.TypeOf((*MockBundle)(nil).UploadBatch), ctx, batch) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UploadBatch", reflect.TypeOf((*MockBundle)(nil).UploadBatch), ctx, requestId, batch) } diff --git a/bundle/mocks/bundle_manager.go b/internal/bundle/mocks/bundle_manager.go similarity index 77% rename from bundle/mocks/bundle_manager.go rename to internal/bundle/mocks/bundle_manager.go index bdd82031..1aaf47d8 100644 --- a/bundle/mocks/bundle_manager.go +++ b/internal/bundle/mocks/bundle_manager.go @@ -9,8 +9,8 @@ import ( reflect "reflect" gomock "github.com/golang/mock/gomock" - bundle "github.com/snyk/code-client-go/bundle" - deepcode "github.com/snyk/code-client-go/deepcode" + bundle "github.com/snyk/code-client-go/internal/bundle" + deepcode "github.com/snyk/code-client-go/internal/deepcode" ) // MockBundleManager is a mock of BundleManager interface. @@ -52,16 +52,16 @@ func (mr *MockBundleManagerMockRecorder) Create(ctx, requestId, rootPath, filePa } // Upload mocks base method. -func (m *MockBundleManager) Upload(ctx context.Context, originalBundle bundle.Bundle, files map[string]deepcode.BundleFile) (bundle.Bundle, error) { +func (m *MockBundleManager) Upload(ctx context.Context, requestId string, originalBundle bundle.Bundle, files map[string]deepcode.BundleFile) (bundle.Bundle, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Upload", ctx, originalBundle, files) + ret := m.ctrl.Call(m, "Upload", ctx, requestId, originalBundle, files) ret0, _ := ret[0].(bundle.Bundle) ret1, _ := ret[1].(error) return ret0, ret1 } // Upload indicates an expected call of Upload. -func (mr *MockBundleManagerMockRecorder) Upload(ctx, originalBundle, files interface{}) *gomock.Call { +func (mr *MockBundleManagerMockRecorder) Upload(ctx, requestId, originalBundle, files interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Upload", reflect.TypeOf((*MockBundleManager)(nil).Upload), ctx, originalBundle, files) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Upload", reflect.TypeOf((*MockBundleManager)(nil).Upload), ctx, requestId, originalBundle, files) } diff --git a/deepcode/client.go b/internal/deepcode/client.go similarity index 100% rename from deepcode/client.go rename to internal/deepcode/client.go diff --git a/deepcode/client_pact_test.go b/internal/deepcode/client_pact_test.go similarity index 99% rename from deepcode/client_pact_test.go rename to internal/deepcode/client_pact_test.go index fe8d8e76..deefc8b6 100644 --- a/deepcode/client_pact_test.go +++ b/internal/deepcode/client_pact_test.go @@ -27,8 +27,8 @@ import ( "github.com/stretchr/testify/assert" confMocks "github.com/snyk/code-client-go/config/mocks" - "github.com/snyk/code-client-go/deepcode" codeClientHTTP "github.com/snyk/code-client-go/http" + "github.com/snyk/code-client-go/internal/deepcode" "github.com/snyk/code-client-go/internal/util" "github.com/snyk/code-client-go/internal/util/testutil" ) diff --git a/deepcode/client_test.go b/internal/deepcode/client_test.go similarity index 99% rename from deepcode/client_test.go rename to internal/deepcode/client_test.go index 7ef54183..b921b338 100644 --- a/deepcode/client_test.go +++ b/internal/deepcode/client_test.go @@ -30,8 +30,8 @@ import ( "github.com/stretchr/testify/mock" confMocks "github.com/snyk/code-client-go/config/mocks" - "github.com/snyk/code-client-go/deepcode" httpmocks "github.com/snyk/code-client-go/http/mocks" + "github.com/snyk/code-client-go/internal/deepcode" "github.com/snyk/code-client-go/internal/util" "github.com/snyk/code-client-go/observability/mocks" ) @@ -125,6 +125,7 @@ func TestSnykCodeBackendService_CreateBundle(t *testing.T) { mockErrorReporter := mocks.NewMockErrorReporter(ctrl) s := deepcode.NewSnykCodeClient(newLogger(t), mockHTTPClient, mockInstrumentor, mockErrorReporter, mockConfig) + files := map[string]string{} randomAddition := fmt.Sprintf("\n public void random() { System.out.println(\"%d\") }", time.Now().UnixMicro()) files[path1] = util.Hash([]byte(content + randomAddition)) diff --git a/deepcode/helpers.go b/internal/deepcode/helpers.go similarity index 100% rename from deepcode/helpers.go rename to internal/deepcode/helpers.go diff --git a/deepcode/mocks/client.go b/internal/deepcode/mocks/client.go similarity index 97% rename from deepcode/mocks/client.go rename to internal/deepcode/mocks/client.go index 2ea33e80..03914bb8 100644 --- a/deepcode/mocks/client.go +++ b/internal/deepcode/mocks/client.go @@ -9,7 +9,7 @@ import ( reflect "reflect" gomock "github.com/golang/mock/gomock" - deepcode "github.com/snyk/code-client-go/deepcode" + deepcode "github.com/snyk/code-client-go/internal/deepcode" ) // MockSnykCodeClient is a mock of SnykCodeClient interface. diff --git a/deepcode/pacts/snykls-snykcodeapi.json b/internal/deepcode/pacts/snykls-snykcodeapi.json similarity index 100% rename from deepcode/pacts/snykls-snykcodeapi.json rename to internal/deepcode/pacts/snykls-snykcodeapi.json diff --git a/scan.go b/scan.go index db7841bf..c39e5f2b 100644 --- a/scan.go +++ b/scan.go @@ -19,19 +19,22 @@ package codeclient import ( "context" + "github.com/pkg/errors" "github.com/rs/zerolog" "github.com/rs/zerolog/log" - "github.com/snyk/code-client-go/bundle" + "github.com/snyk/code-client-go/config" + codeClientHTTP "github.com/snyk/code-client-go/http" "github.com/snyk/code-client-go/internal/analysis" + "github.com/snyk/code-client-go/internal/bundle" + "github.com/snyk/code-client-go/internal/deepcode" "github.com/snyk/code-client-go/observability" "github.com/snyk/code-client-go/sarif" ) type codeScanner struct { bundleManager bundle.BundleManager - instrumentor observability.Instrumentor errorReporter observability.ErrorReporter logger *zerolog.Logger } @@ -39,84 +42,97 @@ type codeScanner struct { type CodeScanner interface { UploadAndAnalyze( ctx context.Context, + requestId string, path string, files <-chan string, changedFiles map[string]bool, - ) (*sarif.SarifResponse, bundle.Bundle, error) + ) (*sarif.SarifResponse, string, error) } // NewCodeScanner creates a Code Scanner which can be used to trigger Snyk Code on a folder. func NewCodeScanner( - bundleManager bundle.BundleManager, + httpClient codeClientHTTP.HTTPClient, + config config.Config, instrumentor observability.Instrumentor, errorReporter observability.ErrorReporter, logger *zerolog.Logger, ) *codeScanner { + snykCode := deepcode.NewSnykCodeClient(logger, httpClient, instrumentor, errorReporter, config) + bundleManager := bundle.NewBundleManager(logger, snykCode, instrumentor, errorReporter) return &codeScanner{ bundleManager: bundleManager, - instrumentor: instrumentor, errorReporter: errorReporter, logger: logger, } } +// WithBundleManager creates a new Code Scanner from the current one and replaces the bundle manager. +// It can be used to replace the bundle manager in tests. +func (c *codeScanner) WithBundleManager(bundleManager bundle.BundleManager) *codeScanner { + return &codeScanner{ + bundleManager: bundleManager, + errorReporter: c.errorReporter, + logger: c.logger, + } +} + // UploadAndAnalyze returns a fake SARIF response for testing. Use target-service to run analysis on. func (c *codeScanner) UploadAndAnalyze( ctx context.Context, + requestId string, path string, files <-chan string, changedFiles map[string]bool, -) (*sarif.SarifResponse, bundle.Bundle, error) { +) (*sarif.SarifResponse, string, error) { if ctx.Err() != nil { c.logger.Info().Msg("Canceling Code scan - Code scanner received cancellation signal") - return nil, nil, nil + return nil, "", nil } - span := c.instrumentor.StartSpan(ctx, "code.uploadAndAnalyze") - defer c.instrumentor.Finish(span) - - requestId := span.GetTraceId() // use span trace id as code-request-id - c.logger.Info().Str("requestId", requestId).Msg("Starting Code analysis.") - - b, err := c.bundleManager.Create(span.Context(), requestId, path, files, changedFiles) + if ctx.Err() != nil { + c.logger.Info().Msg("Canceling Code scan - Code scanner received cancellation signal") + return nil, "", nil + } + b, err := c.bundleManager.Create(ctx, requestId, path, files, changedFiles) if err != nil { if bundle.IsNoFilesError(err) { - return nil, nil, nil + return nil, "", nil } if ctx.Err() == nil { // Only report errors that are not intentional cancellations msg := "error creating bundle..." c.errorReporter.CaptureError(errors.Wrap(err, msg), observability.ErrorReporterOptions{ErrorDiagnosticPath: path}) - return nil, nil, err + return nil, "", err } else { c.logger.Info().Msg("Canceling Code scan - Code scanner received cancellation signal") - return nil, nil, nil + return nil, "", nil } } uploadedFiles := b.GetFiles() - b, err = c.bundleManager.Upload(span.Context(), b, uploadedFiles) + b, err = c.bundleManager.Upload(ctx, requestId, b, uploadedFiles) + bundleHash := b.GetBundleHash() if err != nil { if ctx.Err() != nil { // Only handle errors that are not intentional cancellations msg := "error uploading files..." c.errorReporter.CaptureError(errors.Wrap(err, msg), observability.ErrorReporterOptions{ErrorDiagnosticPath: path}) - return nil, b, err + return nil, bundleHash, err } else { log.Info().Msg("Canceling Code scan - Code scanner received cancellation signal") - return nil, b, nil + return nil, bundleHash, nil } } - if b.GetBundleHash() == "" { + if bundleHash == "" { c.logger.Info().Msg("empty bundle, no Snyk Code analysis") - return nil, b, nil + return nil, bundleHash, nil } response, err := analysis.RunAnalysis() if ctx.Err() != nil { c.logger.Info().Msg("Canceling Code scan - Code scanner received cancellation signal") - return nil, nil, nil + return nil, bundleHash, nil } - return response, b, err + return response, bundleHash, err } diff --git a/scan_test.go b/scan_test.go index 47dfdde2..c387b461 100644 --- a/scan_test.go +++ b/scan_test.go @@ -17,6 +17,10 @@ package codeclient_test import ( "context" + "github.com/snyk/code-client-go/internal/bundle" + bundleMocks "github.com/snyk/code-client-go/internal/bundle/mocks" + "github.com/snyk/code-client-go/internal/deepcode" + deepcodeMocks "github.com/snyk/code-client-go/internal/deepcode/mocks" "os" "path/filepath" "testing" @@ -27,10 +31,8 @@ import ( "github.com/stretchr/testify/require" codeclient "github.com/snyk/code-client-go" - "github.com/snyk/code-client-go/bundle" - mocks2 "github.com/snyk/code-client-go/bundle/mocks" - "github.com/snyk/code-client-go/deepcode" - mocks3 "github.com/snyk/code-client-go/deepcode/mocks" + confMocks "github.com/snyk/code-client-go/config/mocks" + httpmocks "github.com/snyk/code-client-go/http/mocks" "github.com/snyk/code-client-go/observability/mocks" ) @@ -44,52 +46,49 @@ func Test_UploadAndAnalyze(t *testing.T) { logger := zerolog.Nop() + ctrl := gomock.NewController(t) + mockHTTPClient := httpmocks.NewMockHTTPClient(ctrl) + mockConfig := confMocks.NewMockConfig(ctrl) + mockConfig.EXPECT().SnykCodeApi().AnyTimes().Return("") + mockConfig.EXPECT().IsFedramp().AnyTimes().Return(false) + mockConfig.EXPECT().Organization().AnyTimes().Return("") + mockSpan := mocks.NewMockSpan(ctrl) + mockSpan.EXPECT().GetTraceId().Return("testRequestId").AnyTimes() + mockSpan.EXPECT().Context().Return(context.Background()).AnyTimes() + mockInstrumentor := mocks.NewMockInstrumentor(ctrl) + mockInstrumentor.EXPECT().StartSpan(gomock.Any(), gomock.Any()).Return(mockSpan).AnyTimes() + mockInstrumentor.EXPECT().Finish(gomock.Any()).AnyTimes() + mockErrorReporter := mocks.NewMockErrorReporter(ctrl) + t.Run( "should create bundle when hash empty", func(t *testing.T) { - ctrl := gomock.NewController(t) - mockSpan := mocks.NewMockSpan(ctrl) - mockSpan.EXPECT().GetTraceId().Return("testRequestId").AnyTimes() - mockSpan.EXPECT().Context().Return(context.Background()).AnyTimes() - mockInstrumentor := mocks.NewMockInstrumentor(ctrl) - mockInstrumentor.EXPECT().StartSpan(gomock.Any(), gomock.Any()).Return(mockSpan).AnyTimes() - mockInstrumentor.EXPECT().Finish(gomock.Any()).AnyTimes() - mockErrorReporter := mocks.NewMockErrorReporter(ctrl) - mockBundle := bundle.NewBundle(mocks3.NewMockSnykCodeClient(ctrl), mockInstrumentor, mockErrorReporter, &logger, "", "testRequestId", baseDir, files, []string{}, []string{}) - mockBundleManager := mocks2.NewMockBundleManager(ctrl) + mockBundle := bundle.NewBundle(deepcodeMocks.NewMockSnykCodeClient(ctrl), mockInstrumentor, mockErrorReporter, &logger, "", files, []string{}, []string{}) + mockBundleManager := bundleMocks.NewMockBundleManager(ctrl) mockBundleManager.EXPECT().Create(gomock.Any(), "testRequestId", baseDir, gomock.Any(), map[string]bool{}).Return(mockBundle, nil) - mockBundleManager.EXPECT().Upload(gomock.Any(), mockBundle, files).Return(mockBundle, nil) + mockBundleManager.EXPECT().Upload(gomock.Any(), "testRequestId", mockBundle, files).Return(mockBundle, nil) - codeScanner := codeclient.NewCodeScanner(mockBundleManager, mockInstrumentor, mockErrorReporter, &logger) + codeScanner := codeclient.NewCodeScanner(mockHTTPClient, mockConfig, mockInstrumentor, mockErrorReporter, &logger) - response, bundle, err := codeScanner.UploadAndAnalyze(context.Background(), baseDir, docs, map[string]bool{}) + response, bundleHash, err := codeScanner.WithBundleManager(mockBundleManager).UploadAndAnalyze(context.Background(), "testRequestId", baseDir, docs, map[string]bool{}) require.NoError(t, err) - assert.Equal(t, "", bundle.GetBundleHash()) - assert.Equal(t, files, bundle.GetFiles()) + assert.Equal(t, "", bundleHash) assert.Nil(t, response) }, ) t.Run( "should retrieve from backend", func(t *testing.T) { - ctrl := gomock.NewController(t) - mockSpan := mocks.NewMockSpan(ctrl) - mockSpan.EXPECT().GetTraceId().Return("testRequestId").AnyTimes() - mockSpan.EXPECT().Context().Return(context.Background()).AnyTimes() - mockInstrumentor := mocks.NewMockInstrumentor(ctrl) - mockInstrumentor.EXPECT().StartSpan(gomock.Any(), gomock.Any()).Return(mockSpan).AnyTimes() - mockInstrumentor.EXPECT().Finish(gomock.Any()).AnyTimes() - mockErrorReporter := mocks.NewMockErrorReporter(ctrl) - mockBundle := bundle.NewBundle(mocks3.NewMockSnykCodeClient(ctrl), mockInstrumentor, mockErrorReporter, &logger, "testBundleHash", "testRequestId", baseDir, files, []string{}, []string{}) - mockBundleManager := mocks2.NewMockBundleManager(ctrl) + mockBundle := bundle.NewBundle(deepcodeMocks.NewMockSnykCodeClient(ctrl), mockInstrumentor, mockErrorReporter, &logger, "testBundleHash", files, []string{}, []string{}) + mockBundleManager := bundleMocks.NewMockBundleManager(ctrl) mockBundleManager.EXPECT().Create(gomock.Any(), "testRequestId", baseDir, gomock.Any(), map[string]bool{}).Return(mockBundle, nil) - mockBundleManager.EXPECT().Upload(gomock.Any(), mockBundle, files).Return(mockBundle, nil) + mockBundleManager.EXPECT().Upload(gomock.Any(), "testRequestId", mockBundle, files).Return(mockBundle, nil) - codeScanner := codeclient.NewCodeScanner(mockBundleManager, mockInstrumentor, mockErrorReporter, &logger) + codeScanner := codeclient.NewCodeScanner(mockHTTPClient, mockConfig, mockInstrumentor, mockErrorReporter, &logger) - response, bundle, err := codeScanner.UploadAndAnalyze(context.Background(), baseDir, docs, map[string]bool{}) + response, bundleHash, err := codeScanner.WithBundleManager(mockBundleManager).UploadAndAnalyze(context.Background(), "testRequestId", baseDir, docs, map[string]bool{}) require.NoError(t, err) assert.Equal(t, "COMPLETE", response.Status) - assert.Equal(t, "testBundleHash", bundle.GetBundleHash()) + assert.Equal(t, "testBundleHash", bundleHash) }, ) }