diff --git a/cmd/symbols/internal/api/handler_test.go b/cmd/symbols/internal/api/handler_test.go index e0db571570c..eb4d7415ab2 100644 --- a/cmd/symbols/internal/api/handler_test.go +++ b/cmd/symbols/internal/api/handler_test.go @@ -3,10 +3,11 @@ package api import ( "context" "net/http/httptest" - "reflect" "testing" "time" + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" "github.com/sourcegraph/go-ctags" "github.com/sourcegraph/sourcegraph/cmd/symbols/fetcher" "github.com/sourcegraph/sourcegraph/cmd/symbols/gitserver" @@ -135,8 +136,8 @@ func TestHandler(t *testing.T) { if testCase.expected != nil { t.Errorf("unexpected search result. want=%+v, have=nil", testCase.expected) } - } else if !reflect.DeepEqual(resultSymbols, testCase.expected) { - t.Errorf("unexpected search result. want=%+v, have=%+v", testCase.expected, resultSymbols) + } else if diff := cmp.Diff(resultSymbols, testCase.expected, cmpopts.EquateEmpty()); diff != "" { + t.Errorf("unexpected search result. diff: %s", diff) } }) } diff --git a/dev/run-server-image.sh b/dev/run-server-image.sh index 420ef2bb703..3501e99a274 100755 --- a/dev/run-server-image.sh +++ b/dev/run-server-image.sh @@ -6,6 +6,7 @@ PORT=${PORT:-"7080"} URL="http://localhost:$PORT" DATA=${DATA:-"/tmp/sourcegraph-data"} SOURCEGRAPH_LICENSE_GENERATION_KEY=${SOURCEGRAPH_LICENSE_GENERATION_KEY:-""} +SG_FEATURE_FLAG_GRPC=${SG_FEATURE_FLAG_GRPC:-"false"} echo "--- Checking for existing Sourcegraph instance at $URL" if curl --output /dev/null --silent --head --fail "$URL"; then @@ -40,6 +41,7 @@ docker run "$@" \ -e DEBUG=t \ -e ALLOW_SINGLE_DOCKER_CODE_INSIGHTS=t \ -e SOURCEGRAPH_LICENSE_GENERATION_KEY="$SOURCEGRAPH_LICENSE_GENERATION_KEY" \ + -e SG_FEATURE_FLAG_GRPC="$SG_FEATURE_FLAG_GRPC" \ --volume "$DATA/config:/etc/sourcegraph" \ --volume "$DATA/data:/var/opt/sourcegraph" \ "$IMAGE" diff --git a/doc/dev/background-information/ci/reference.md b/doc/dev/background-information/ci/reference.md index 9cd8b542955..6557f65b406 100644 --- a/doc/dev/background-information/ci/reference.md +++ b/doc/dev/background-information/ci/reference.md @@ -17,7 +17,7 @@ The default run type. - Pipeline for `Go` changes: - **Metadata**: Pipeline metadata - **Linters and static analysis**: Run sg lint - - **Go checks**: Test (all), Test (enterprise/internal/insights), Test (internal/database), Test (internal/repos), Test (enterprise/internal/batches), Test (cmd/frontend), Test (enterprise/internal/database), Test (enterprise/cmd/frontend/internal/batches/resolvers), Test (dev/sg), Build + - **Go checks**: Test (all), Test (all (gRPC)), Test (enterprise/internal/insights), Test (enterprise/internal/insights (gRPC)), Test (internal/repos), Test (internal/repos (gRPC)), Test (enterprise/internal/batches), Test (enterprise/internal/batches (gRPC)), Test (cmd/frontend), Test (cmd/frontend (gRPC)), Test (enterprise/cmd/frontend/internal/batches/resolvers), Test (enterprise/cmd/frontend/internal/batches/resolvers (gRPC)), Test (dev/sg), Test (dev/sg (gRPC)), Test (internal/database), Test (enterprise/internal/database), Build - Upload build trace - Pipeline for `Client` changes: @@ -32,12 +32,12 @@ The default run type. - **Metadata**: Pipeline metadata - **Linters and static analysis**: GraphQL lint - **Client checks**: Puppeteer tests prep, Puppeteer tests for chrome extension, Puppeteer tests chunk #1, Puppeteer tests chunk #2, Puppeteer tests chunk #3, Puppeteer tests chunk #4, Puppeteer tests chunk #5, Puppeteer tests chunk #6, Puppeteer tests chunk #7, Puppeteer tests chunk #8, Puppeteer tests chunk #9, Puppeteer tests chunk #10, Puppeteer tests chunk #11, Puppeteer tests chunk #12, Puppeteer tests chunk #13, Puppeteer tests chunk #14, Upload Storybook to Chromatic, Test (all), Build, Enterprise build, Test (client/web), Test (client/browser), Test (client/jetbrains), Build TS, ESLint (all), Stylelint (all) - - **Go checks**: Test (all), Test (enterprise/internal/insights), Test (internal/database), Test (internal/repos), Test (enterprise/internal/batches), Test (cmd/frontend), Test (enterprise/internal/database), Test (enterprise/cmd/frontend/internal/batches/resolvers), Test (dev/sg), Build + - **Go checks**: Test (all), Test (all (gRPC)), Test (enterprise/internal/insights), Test (enterprise/internal/insights (gRPC)), Test (internal/repos), Test (internal/repos (gRPC)), Test (enterprise/internal/batches), Test (enterprise/internal/batches (gRPC)), Test (cmd/frontend), Test (cmd/frontend (gRPC)), Test (enterprise/cmd/frontend/internal/batches/resolvers), Test (enterprise/cmd/frontend/internal/batches/resolvers (gRPC)), Test (dev/sg), Test (dev/sg (gRPC)), Test (internal/database), Test (enterprise/internal/database), Build - Upload build trace - Pipeline for `DatabaseSchema` changes: - **Metadata**: Pipeline metadata - - **DB backcompat tests**: Backcompat test (all), Backcompat test (enterprise/internal/insights), Backcompat test (internal/database), Backcompat test (internal/repos), Backcompat test (enterprise/internal/batches), Backcompat test (cmd/frontend), Backcompat test (enterprise/internal/database), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers), Backcompat test (dev/sg) + - **DB backcompat tests**: Backcompat test (all), Backcompat test (all (gRPC)), Backcompat test (enterprise/internal/insights), Backcompat test (enterprise/internal/insights (gRPC)), Backcompat test (internal/repos), Backcompat test (internal/repos (gRPC)), Backcompat test (enterprise/internal/batches), Backcompat test (enterprise/internal/batches (gRPC)), Backcompat test (cmd/frontend), Backcompat test (cmd/frontend (gRPC)), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers (gRPC)), Backcompat test (dev/sg), Backcompat test (dev/sg (gRPC)), Backcompat test (internal/database), Backcompat test (enterprise/internal/database) - Upload build trace - Pipeline for `Docs` changes: @@ -182,10 +182,10 @@ Base pipeline (more steps might be included based on branch changes): - **Image security scans**: Scan alpine-3.14, Scan cadvisor, Scan codeinsights-db, Scan codeintel-db, Scan frontend, Scan github-proxy, Scan gitserver, Scan grafana, Scan indexed-searcher, Scan jaeger-agent, Scan jaeger-all-in-one, Scan blobstore2, Scan node-exporter, Scan postgres-12-alpine, Scan postgres_exporter, Scan precise-code-intel-worker, Scan prometheus, Scan prometheus-gcp, Scan redis-cache, Scan redis-store, Scan redis_exporter, Scan repo-updater, Scan search-indexer, Scan searcher, Scan symbols, Scan syntax-highlighter, Scan worker, Scan migrator, Scan executor, Scan executor-vm, Scan batcheshelper, Scan opentelemetry-collector, Scan sg - **Linters and static analysis**: GraphQL lint, Run sg lint - **Client checks**: Puppeteer tests prep, Puppeteer tests for chrome extension, Puppeteer tests chunk #1, Puppeteer tests chunk #2, Puppeteer tests chunk #3, Puppeteer tests chunk #4, Puppeteer tests chunk #5, Puppeteer tests chunk #6, Puppeteer tests chunk #7, Puppeteer tests chunk #8, Puppeteer tests chunk #9, Puppeteer tests chunk #10, Puppeteer tests chunk #11, Puppeteer tests chunk #12, Puppeteer tests chunk #13, Puppeteer tests chunk #14, Upload Storybook to Chromatic, Test (all), Build, Enterprise build, Test (client/web), Test (client/browser), Test (client/jetbrains), Build TS, ESLint (all), Stylelint (all) -- **Go checks**: Test (all), Test (enterprise/internal/insights), Test (internal/database), Test (internal/repos), Test (enterprise/internal/batches), Test (cmd/frontend), Test (enterprise/internal/database), Test (enterprise/cmd/frontend/internal/batches/resolvers), Test (dev/sg), Build -- **DB backcompat tests**: Backcompat test (all), Backcompat test (enterprise/internal/insights), Backcompat test (internal/database), Backcompat test (internal/repos), Backcompat test (enterprise/internal/batches), Backcompat test (cmd/frontend), Backcompat test (enterprise/internal/database), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers), Backcompat test (dev/sg) +- **Go checks**: Test (all), Test (all (gRPC)), Test (enterprise/internal/insights), Test (enterprise/internal/insights (gRPC)), Test (internal/repos), Test (internal/repos (gRPC)), Test (enterprise/internal/batches), Test (enterprise/internal/batches (gRPC)), Test (cmd/frontend), Test (cmd/frontend (gRPC)), Test (enterprise/cmd/frontend/internal/batches/resolvers), Test (enterprise/cmd/frontend/internal/batches/resolvers (gRPC)), Test (dev/sg), Test (dev/sg (gRPC)), Test (internal/database), Test (enterprise/internal/database), Build +- **DB backcompat tests**: Backcompat test (all), Backcompat test (all (gRPC)), Backcompat test (enterprise/internal/insights), Backcompat test (enterprise/internal/insights (gRPC)), Backcompat test (internal/repos), Backcompat test (internal/repos (gRPC)), Backcompat test (enterprise/internal/batches), Backcompat test (enterprise/internal/batches (gRPC)), Backcompat test (cmd/frontend), Backcompat test (cmd/frontend (gRPC)), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers (gRPC)), Backcompat test (dev/sg), Backcompat test (dev/sg (gRPC)), Backcompat test (internal/database), Backcompat test (enterprise/internal/database) - **CI script tests**: test-trace-command.sh -- **Integration tests**: Backend integration tests, Code Intel QA +- **Integration tests**: Backend integration tests (gRPC), Backend integration tests, Code Intel QA - **End-to-end tests**: Executors E2E, Sourcegraph E2E, Sourcegraph QA, Sourcegraph Cluster (deploy-sourcegraph) QA, Sourcegraph Upgrade - **Publish images**: alpine-3.14, cadvisor, codeinsights-db, codeintel-db, frontend, github-proxy, gitserver, grafana, indexed-searcher, jaeger-agent, jaeger-all-in-one, blobstore, blobstore2, node-exporter, postgres-12-alpine, postgres_exporter, precise-code-intel-worker, prometheus, prometheus-gcp, redis-cache, redis-store, redis_exporter, repo-updater, search-indexer, searcher, symbols, syntax-highlighter, worker, migrator, executor, executor-vm, batcheshelper, opentelemetry-collector, server, sg, Publish executor image, Publish executor binary, Publish docker registry mirror image - Upload build trace @@ -202,10 +202,10 @@ Base pipeline (more steps might be included based on branch changes): - **Image security scans**: Scan alpine-3.14, Scan cadvisor, Scan codeinsights-db, Scan codeintel-db, Scan frontend, Scan github-proxy, Scan gitserver, Scan grafana, Scan indexed-searcher, Scan jaeger-agent, Scan jaeger-all-in-one, Scan blobstore2, Scan node-exporter, Scan postgres-12-alpine, Scan postgres_exporter, Scan precise-code-intel-worker, Scan prometheus, Scan prometheus-gcp, Scan redis-cache, Scan redis-store, Scan redis_exporter, Scan repo-updater, Scan search-indexer, Scan searcher, Scan symbols, Scan syntax-highlighter, Scan worker, Scan migrator, Scan executor, Scan executor-vm, Scan batcheshelper, Scan opentelemetry-collector, Scan sg - **Linters and static analysis**: GraphQL lint, Run sg lint - **Client checks**: Puppeteer tests prep, Puppeteer tests for chrome extension, Puppeteer tests chunk #1, Puppeteer tests chunk #2, Puppeteer tests chunk #3, Puppeteer tests chunk #4, Puppeteer tests chunk #5, Puppeteer tests chunk #6, Puppeteer tests chunk #7, Puppeteer tests chunk #8, Puppeteer tests chunk #9, Puppeteer tests chunk #10, Puppeteer tests chunk #11, Puppeteer tests chunk #12, Puppeteer tests chunk #13, Puppeteer tests chunk #14, Upload Storybook to Chromatic, Test (all), Build, Enterprise build, Test (client/web), Test (client/browser), Test (client/jetbrains), Build TS, ESLint (all), Stylelint (all) -- **Go checks**: Test (all), Test (enterprise/internal/insights), Test (internal/database), Test (internal/repos), Test (enterprise/internal/batches), Test (cmd/frontend), Test (enterprise/internal/database), Test (enterprise/cmd/frontend/internal/batches/resolvers), Test (dev/sg), Build -- **DB backcompat tests**: Backcompat test (all), Backcompat test (enterprise/internal/insights), Backcompat test (internal/database), Backcompat test (internal/repos), Backcompat test (enterprise/internal/batches), Backcompat test (cmd/frontend), Backcompat test (enterprise/internal/database), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers), Backcompat test (dev/sg) +- **Go checks**: Test (all), Test (all (gRPC)), Test (enterprise/internal/insights), Test (enterprise/internal/insights (gRPC)), Test (internal/repos), Test (internal/repos (gRPC)), Test (enterprise/internal/batches), Test (enterprise/internal/batches (gRPC)), Test (cmd/frontend), Test (cmd/frontend (gRPC)), Test (enterprise/cmd/frontend/internal/batches/resolvers), Test (enterprise/cmd/frontend/internal/batches/resolvers (gRPC)), Test (dev/sg), Test (dev/sg (gRPC)), Test (internal/database), Test (enterprise/internal/database), Build +- **DB backcompat tests**: Backcompat test (all), Backcompat test (all (gRPC)), Backcompat test (enterprise/internal/insights), Backcompat test (enterprise/internal/insights (gRPC)), Backcompat test (internal/repos), Backcompat test (internal/repos (gRPC)), Backcompat test (enterprise/internal/batches), Backcompat test (enterprise/internal/batches (gRPC)), Backcompat test (cmd/frontend), Backcompat test (cmd/frontend (gRPC)), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers (gRPC)), Backcompat test (dev/sg), Backcompat test (dev/sg (gRPC)), Backcompat test (internal/database), Backcompat test (enterprise/internal/database) - **CI script tests**: test-trace-command.sh -- **Integration tests**: Backend integration tests, Code Intel QA +- **Integration tests**: Backend integration tests (gRPC), Backend integration tests, Code Intel QA - **End-to-end tests**: Executors E2E, Sourcegraph E2E, Sourcegraph QA, Sourcegraph Cluster (deploy-sourcegraph) QA, Sourcegraph Upgrade - **Publish images**: alpine-3.14, cadvisor, codeinsights-db, codeintel-db, frontend, github-proxy, gitserver, grafana, indexed-searcher, jaeger-agent, jaeger-all-in-one, blobstore, blobstore2, node-exporter, postgres-12-alpine, postgres_exporter, precise-code-intel-worker, prometheus, prometheus-gcp, redis-cache, redis-store, redis_exporter, repo-updater, search-indexer, searcher, symbols, syntax-highlighter, worker, migrator, executor, executor-vm, batcheshelper, opentelemetry-collector, server, sg - Upload build trace @@ -251,10 +251,10 @@ Base pipeline (more steps might be included based on branch changes): - **Image security scans**: Scan alpine-3.14, Scan cadvisor, Scan codeinsights-db, Scan codeintel-db, Scan frontend, Scan github-proxy, Scan gitserver, Scan grafana, Scan indexed-searcher, Scan jaeger-agent, Scan jaeger-all-in-one, Scan blobstore2, Scan node-exporter, Scan postgres-12-alpine, Scan postgres_exporter, Scan precise-code-intel-worker, Scan prometheus, Scan prometheus-gcp, Scan redis-cache, Scan redis-store, Scan redis_exporter, Scan repo-updater, Scan search-indexer, Scan searcher, Scan symbols, Scan syntax-highlighter, Scan worker, Scan migrator, Scan executor, Scan executor-vm, Scan batcheshelper, Scan opentelemetry-collector, Scan sg - **Linters and static analysis**: GraphQL lint, Run sg lint - **Client checks**: Puppeteer tests prep, Puppeteer tests for chrome extension, Puppeteer tests chunk #1, Puppeteer tests chunk #2, Puppeteer tests chunk #3, Puppeteer tests chunk #4, Puppeteer tests chunk #5, Puppeteer tests chunk #6, Puppeteer tests chunk #7, Puppeteer tests chunk #8, Puppeteer tests chunk #9, Puppeteer tests chunk #10, Puppeteer tests chunk #11, Puppeteer tests chunk #12, Puppeteer tests chunk #13, Puppeteer tests chunk #14, Upload Storybook to Chromatic, Test (all), Build, Enterprise build, Test (client/web), Test (client/browser), Test (client/jetbrains), Build TS, ESLint (all), Stylelint (all) -- **Go checks**: Test (all), Test (enterprise/internal/insights), Test (internal/database), Test (internal/repos), Test (enterprise/internal/batches), Test (cmd/frontend), Test (enterprise/internal/database), Test (enterprise/cmd/frontend/internal/batches/resolvers), Test (dev/sg), Build -- **DB backcompat tests**: Backcompat test (all), Backcompat test (enterprise/internal/insights), Backcompat test (internal/database), Backcompat test (internal/repos), Backcompat test (enterprise/internal/batches), Backcompat test (cmd/frontend), Backcompat test (enterprise/internal/database), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers), Backcompat test (dev/sg) +- **Go checks**: Test (all), Test (all (gRPC)), Test (enterprise/internal/insights), Test (enterprise/internal/insights (gRPC)), Test (internal/repos), Test (internal/repos (gRPC)), Test (enterprise/internal/batches), Test (enterprise/internal/batches (gRPC)), Test (cmd/frontend), Test (cmd/frontend (gRPC)), Test (enterprise/cmd/frontend/internal/batches/resolvers), Test (enterprise/cmd/frontend/internal/batches/resolvers (gRPC)), Test (dev/sg), Test (dev/sg (gRPC)), Test (internal/database), Test (enterprise/internal/database), Build +- **DB backcompat tests**: Backcompat test (all), Backcompat test (all (gRPC)), Backcompat test (enterprise/internal/insights), Backcompat test (enterprise/internal/insights (gRPC)), Backcompat test (internal/repos), Backcompat test (internal/repos (gRPC)), Backcompat test (enterprise/internal/batches), Backcompat test (enterprise/internal/batches (gRPC)), Backcompat test (cmd/frontend), Backcompat test (cmd/frontend (gRPC)), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers (gRPC)), Backcompat test (dev/sg), Backcompat test (dev/sg (gRPC)), Backcompat test (internal/database), Backcompat test (enterprise/internal/database) - **CI script tests**: test-trace-command.sh -- **Integration tests**: Backend integration tests, Code Intel QA +- **Integration tests**: Backend integration tests (gRPC), Backend integration tests, Code Intel QA - **End-to-end tests**: Executors E2E, Sourcegraph E2E, Sourcegraph QA, Sourcegraph Cluster (deploy-sourcegraph) QA, Sourcegraph Upgrade - **Publish images**: alpine-3.14, cadvisor, codeinsights-db, codeintel-db, frontend, github-proxy, gitserver, grafana, indexed-searcher, jaeger-agent, jaeger-all-in-one, blobstore, blobstore2, node-exporter, postgres-12-alpine, postgres_exporter, precise-code-intel-worker, prometheus, prometheus-gcp, redis-cache, redis-store, redis_exporter, repo-updater, search-indexer, searcher, symbols, syntax-highlighter, worker, migrator, executor, executor-vm, batcheshelper, opentelemetry-collector, server, sg, Publish executor image, Publish executor binary - Upload build trace @@ -276,10 +276,10 @@ Base pipeline (more steps might be included based on branch changes): - **Image security scans**: Scan alpine-3.14, Scan cadvisor, Scan codeinsights-db, Scan codeintel-db, Scan frontend, Scan github-proxy, Scan gitserver, Scan grafana, Scan indexed-searcher, Scan jaeger-agent, Scan jaeger-all-in-one, Scan blobstore2, Scan node-exporter, Scan postgres-12-alpine, Scan postgres_exporter, Scan precise-code-intel-worker, Scan prometheus, Scan prometheus-gcp, Scan redis-cache, Scan redis-store, Scan redis_exporter, Scan repo-updater, Scan search-indexer, Scan searcher, Scan symbols, Scan syntax-highlighter, Scan worker, Scan migrator, Scan executor, Scan executor-vm, Scan batcheshelper, Scan opentelemetry-collector, Scan sg - **Linters and static analysis**: GraphQL lint, Run sg lint - **Client checks**: Puppeteer tests prep, Puppeteer tests for chrome extension, Puppeteer tests chunk #1, Puppeteer tests chunk #2, Puppeteer tests chunk #3, Puppeteer tests chunk #4, Puppeteer tests chunk #5, Puppeteer tests chunk #6, Puppeteer tests chunk #7, Puppeteer tests chunk #8, Puppeteer tests chunk #9, Puppeteer tests chunk #10, Puppeteer tests chunk #11, Puppeteer tests chunk #12, Puppeteer tests chunk #13, Puppeteer tests chunk #14, Upload Storybook to Chromatic, Test (all), Build, Enterprise build, Test (client/web), Test (client/browser), Test (client/jetbrains), Build TS, ESLint (all), Stylelint (all) -- **Go checks**: Test (all), Test (enterprise/internal/insights), Test (internal/database), Test (internal/repos), Test (enterprise/internal/batches), Test (cmd/frontend), Test (enterprise/internal/database), Test (enterprise/cmd/frontend/internal/batches/resolvers), Test (dev/sg), Build -- **DB backcompat tests**: Backcompat test (all), Backcompat test (enterprise/internal/insights), Backcompat test (internal/database), Backcompat test (internal/repos), Backcompat test (enterprise/internal/batches), Backcompat test (cmd/frontend), Backcompat test (enterprise/internal/database), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers), Backcompat test (dev/sg) +- **Go checks**: Test (all), Test (all (gRPC)), Test (enterprise/internal/insights), Test (enterprise/internal/insights (gRPC)), Test (internal/repos), Test (internal/repos (gRPC)), Test (enterprise/internal/batches), Test (enterprise/internal/batches (gRPC)), Test (cmd/frontend), Test (cmd/frontend (gRPC)), Test (enterprise/cmd/frontend/internal/batches/resolvers), Test (enterprise/cmd/frontend/internal/batches/resolvers (gRPC)), Test (dev/sg), Test (dev/sg (gRPC)), Test (internal/database), Test (enterprise/internal/database), Build +- **DB backcompat tests**: Backcompat test (all), Backcompat test (all (gRPC)), Backcompat test (enterprise/internal/insights), Backcompat test (enterprise/internal/insights (gRPC)), Backcompat test (internal/repos), Backcompat test (internal/repos (gRPC)), Backcompat test (enterprise/internal/batches), Backcompat test (enterprise/internal/batches (gRPC)), Backcompat test (cmd/frontend), Backcompat test (cmd/frontend (gRPC)), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers (gRPC)), Backcompat test (dev/sg), Backcompat test (dev/sg (gRPC)), Backcompat test (internal/database), Backcompat test (enterprise/internal/database) - **CI script tests**: test-trace-command.sh -- **Integration tests**: Backend integration tests, Code Intel QA +- **Integration tests**: Backend integration tests (gRPC), Backend integration tests, Code Intel QA - **End-to-end tests**: Executors E2E, Sourcegraph E2E, Sourcegraph QA, Sourcegraph Cluster (deploy-sourcegraph) QA, Sourcegraph Upgrade - **Publish images**: alpine-3.14, cadvisor, codeinsights-db, codeintel-db, frontend, github-proxy, gitserver, grafana, indexed-searcher, jaeger-agent, jaeger-all-in-one, blobstore, blobstore2, node-exporter, postgres-12-alpine, postgres_exporter, precise-code-intel-worker, prometheus, prometheus-gcp, redis-cache, redis-store, redis_exporter, repo-updater, search-indexer, searcher, symbols, syntax-highlighter, worker, migrator, executor, executor-vm, batcheshelper, opentelemetry-collector, server, sg - Upload build trace @@ -353,8 +353,9 @@ Base pipeline (more steps might be included based on branch changes): - **Metadata**: Pipeline metadata - Build server +- Backend integration tests (gRPC) - Backend integration tests - **Linters and static analysis**: Run sg lint -- **Go checks**: Test (all), Test (enterprise/internal/insights), Test (internal/database), Test (internal/repos), Test (enterprise/internal/batches), Test (cmd/frontend), Test (enterprise/internal/database), Test (enterprise/cmd/frontend/internal/batches/resolvers), Test (dev/sg), Build -- **DB backcompat tests**: Backcompat test (all), Backcompat test (enterprise/internal/insights), Backcompat test (internal/database), Backcompat test (internal/repos), Backcompat test (enterprise/internal/batches), Backcompat test (cmd/frontend), Backcompat test (enterprise/internal/database), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers), Backcompat test (dev/sg) +- **Go checks**: Test (all), Test (all (gRPC)), Test (enterprise/internal/insights), Test (enterprise/internal/insights (gRPC)), Test (internal/repos), Test (internal/repos (gRPC)), Test (enterprise/internal/batches), Test (enterprise/internal/batches (gRPC)), Test (cmd/frontend), Test (cmd/frontend (gRPC)), Test (enterprise/cmd/frontend/internal/batches/resolvers), Test (enterprise/cmd/frontend/internal/batches/resolvers (gRPC)), Test (dev/sg), Test (dev/sg (gRPC)), Test (internal/database), Test (enterprise/internal/database), Build +- **DB backcompat tests**: Backcompat test (all), Backcompat test (all (gRPC)), Backcompat test (enterprise/internal/insights), Backcompat test (enterprise/internal/insights (gRPC)), Backcompat test (internal/repos), Backcompat test (internal/repos (gRPC)), Backcompat test (enterprise/internal/batches), Backcompat test (enterprise/internal/batches (gRPC)), Backcompat test (cmd/frontend), Backcompat test (cmd/frontend (gRPC)), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers), Backcompat test (enterprise/cmd/frontend/internal/batches/resolvers (gRPC)), Backcompat test (dev/sg), Backcompat test (dev/sg (gRPC)), Backcompat test (internal/database), Backcompat test (enterprise/internal/database) - Upload build trace diff --git a/enterprise/dev/ci/internal/ci/operations.go b/enterprise/dev/ci/internal/ci/operations.go index 828f8523358..e860d58c6fe 100644 --- a/enterprise/dev/ci/internal/ci/operations.go +++ b/enterprise/dev/ci/internal/ci/operations.go @@ -436,9 +436,8 @@ func frontendTests(pipeline *bk.Pipeline) { // Adds the Go test step. func addGoTests(pipeline *bk.Pipeline) { - buildGoTests(func(description, testSuffix string) { - pipeline.AddStep( - fmt.Sprintf(":go: Test (%s)", description), + buildGoTests(func(description, testSuffix string, additionalOpts ...bk.StepOpt) { + opts := []bk.StepOpt{ // Max DB connections is set to 200: https://github.com/sourcegraph/infrastructure/blob/main/docker-images/buildkite-agent-stateless/postgresql.conf // Because we run tests concurrently, the following must hold to avoid connection issues: // @@ -451,6 +450,12 @@ func addGoTests(pipeline *bk.Pipeline) { Annotations: &bk.AnnotationOpts{}, }), bk.Cmd("./dev/ci/codecov.sh -c -F go"), + } + opts = append(opts, additionalOpts...) + + pipeline.AddStep( + fmt.Sprintf(":go: Test (%s)", description), + opts..., ) }) } @@ -458,7 +463,7 @@ func addGoTests(pipeline *bk.Pipeline) { // Adds the Go backcompat test step. func addGoTestsBackcompat(minimumUpgradeableVersion string) func(pipeline *bk.Pipeline) { return func(pipeline *bk.Pipeline) { - buildGoTests(func(description, testSuffix string) { + buildGoTests(func(description, testSuffix string, additionalOpts ...bk.StepOpt) { pipeline.AddStep( fmt.Sprintf(":go::postgres: Backcompat test (%s)", description), bk.Env("MINIMUM_UPGRADEABLE_VERSION", minimumUpgradeableVersion), @@ -474,23 +479,41 @@ func addGoTestsBackcompat(minimumUpgradeableVersion string) func(pipeline *bk.Pi // be run as part of complete coverage. The description will be the specific test path // broken out to be run independently (or "all"), and the testSuffix will be the string // to pass to go test to filter test packaes (e.g., "only " or "exclude "). -func buildGoTests(f func(description, testSuffix string)) { +func buildGoTests(f func(description, testSuffix string, additionalOpts ...bk.StepOpt)) { // This is a bandage solution to speed up the go tests by running the slowest ones // concurrently. As a results, the PR time affecting only Go code is divided by two. - slowGoTestPackages := []string{ + + // These are the slow packages that we do not want to run twice (once with gRPC, once without). + slowGoTestPackagesNonGRPC := []string{ + "github.com/sourcegraph/sourcegraph/internal/database", // 253s + "github.com/sourcegraph/sourcegraph/enterprise/internal/database", // 94s + } + + // These are the slow packages that we _do_ want to run twice (once with gRPC, once without). + slowGoTestPackagesGRPC := []string{ "github.com/sourcegraph/sourcegraph/enterprise/internal/insights", // 82+162s - "github.com/sourcegraph/sourcegraph/internal/database", // 253s "github.com/sourcegraph/sourcegraph/internal/repos", // 106s "github.com/sourcegraph/sourcegraph/enterprise/internal/batches", // 52 + 60 "github.com/sourcegraph/sourcegraph/cmd/frontend", // 100s - "github.com/sourcegraph/sourcegraph/enterprise/internal/database", // 94s "github.com/sourcegraph/sourcegraph/enterprise/cmd/frontend/internal/batches/resolvers", // 152s "github.com/sourcegraph/sourcegraph/dev/sg", // small, but much more practical to have it in its own job } - f("all", "exclude "+strings.Join(slowGoTestPackages, " ")) + allSlowPackages := append(slowGoTestPackagesGRPC, slowGoTestPackagesGRPC...) + enableGRPCEnvOpt := bk.Env("SG_FEATURE_FLAG_GRPC", "true") - for _, slowPkg := range slowGoTestPackages { + // Run all tests that aren't slow both with and without gRPC enabled + f("all", fmt.Sprintf("exclude %s", strings.Join(allSlowPackages, " "))) + f("all (gRPC)", fmt.Sprintf("exclude %s", strings.Join(allSlowPackages, " ")), enableGRPCEnvOpt) + + // Run most slow packages both with and without gRPC + for _, slowPkg := range slowGoTestPackagesGRPC { + f(strings.ReplaceAll(slowPkg, "github.com/sourcegraph/sourcegraph/", ""), "only "+slowPkg) + f(strings.ReplaceAll(slowPkg, "github.com/sourcegraph/sourcegraph/", "")+" (gRPC)", "only "+slowPkg, enableGRPCEnvOpt) + } + + // These packages won't benefit from duplicating the tests with gRPC enabled, so only run them once. + for _, slowPkg := range slowGoTestPackagesNonGRPC { f(strings.ReplaceAll(slowPkg, "github.com/sourcegraph/sourcegraph/", ""), "only "+slowPkg) } } @@ -507,13 +530,21 @@ func addGoBuild(pipeline *bk.Pipeline) { // Runtime: ~11m func backendIntegrationTests(candidateImageTag string) operations.Operation { return func(pipeline *bk.Pipeline) { - pipeline.AddStep(":chains: Backend integration tests", - // Run tests against the candidate server image - bk.DependsOn(candidateImageStepKey("server")), - bk.Env("IMAGE", - images.DevRegistryImage("server", candidateImageTag)), - bk.Cmd("dev/ci/integration/backend/run.sh"), - bk.ArtifactPaths("./*.log")) + for _, enableGRPC := range []bool{true, false} { + description := ":chains: Backend integration tests" + if enableGRPC { + description += " (gRPC)" + } + pipeline.AddStep( + description, + // Run tests against the candidate server image + bk.DependsOn(candidateImageStepKey("server")), + bk.Env("IMAGE", + images.DevRegistryImage("server", candidateImageTag)), + bk.Env("SG_FEATURE_FLAG_GRPC", strconv.FormatBool(enableGRPC)), + bk.Cmd("dev/ci/integration/backend/run.sh"), + bk.ArtifactPaths("./*.log")) + } } } diff --git a/internal/gitserver/client.go b/internal/gitserver/client.go index 19f37e90a6b..2588da9d480 100644 --- a/internal/gitserver/client.go +++ b/internal/gitserver/client.go @@ -31,18 +31,17 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - sglog "github.com/sourcegraph/log" - "github.com/sourcegraph/go-diff/diff" + sglog "github.com/sourcegraph/log" "github.com/sourcegraph/sourcegraph/internal/actor" "github.com/sourcegraph/sourcegraph/internal/api" "github.com/sourcegraph/sourcegraph/internal/authz" "github.com/sourcegraph/sourcegraph/internal/conf" - "github.com/sourcegraph/sourcegraph/internal/featureflag" "github.com/sourcegraph/sourcegraph/internal/gitserver/gitdomain" "github.com/sourcegraph/sourcegraph/internal/gitserver/protocol" proto "github.com/sourcegraph/sourcegraph/internal/gitserver/v1" + internalgrpc "github.com/sourcegraph/sourcegraph/internal/grpc" "github.com/sourcegraph/sourcegraph/internal/grpc/defaults" "github.com/sourcegraph/sourcegraph/internal/grpc/streamio" "github.com/sourcegraph/sourcegraph/internal/httpcli" @@ -586,7 +585,7 @@ func (c *RemoteGitCommand) sendExec(ctx context.Context) (_ io.ReadCloser, errRe return nil, err } - if featureflag.FromContext(ctx).GetBoolOr("grpc", false) { + if internalgrpc.IsGRPCEnabled(ctx) { req := &proto.ExecRequest{ Repo: string(repoName), EnsureRevision: c.EnsureRevision(), @@ -613,7 +612,6 @@ func (c *RemoteGitCommand) sendExec(ctx context.Context) (_ io.ReadCloser, errRe r := streamio.NewReader(func() ([]byte, error) { msg, err := stream.Recv() if err != nil { - return nil, err } return msg.GetData(), nil diff --git a/internal/grpc/grpc.go b/internal/grpc/grpc.go index 595f2c6d79a..a348a2f5c71 100644 --- a/internal/grpc/grpc.go +++ b/internal/grpc/grpc.go @@ -2,12 +2,17 @@ package grpc import ( + "context" "net/http" + "os" + "strconv" "strings" "golang.org/x/net/http2" "golang.org/x/net/http2/h2c" "google.golang.org/grpc" + + "github.com/sourcegraph/sourcegraph/internal/featureflag" ) // MultiplexHandlers takes a gRPC server and a plain HTTP handler and multiplexes the @@ -27,3 +32,12 @@ func MultiplexHandlers(grpcServer *grpc.Server, httpHandler http.Handler) http.H // h2s protocol, so this hijacks h2s requests and handles them correctly. return h2c.NewHandler(newHandler, &http2.Server{}) } + +const envGRPCEnabled = "SG_FEATURE_FLAG_GRPC" + +func IsGRPCEnabled(ctx context.Context) bool { + if val, err := strconv.ParseBool(os.Getenv(envGRPCEnabled)); err == nil { + return val + } + return featureflag.FromContext(ctx).GetBoolOr("grpc", false) +} diff --git a/internal/grpc/grpc_test.go b/internal/grpc/grpc_test.go index 8367e6558b2..5dae4a333ff 100644 --- a/internal/grpc/grpc_test.go +++ b/internal/grpc/grpc_test.go @@ -2,6 +2,7 @@ package grpc import ( "bytes" + "context" "net/http" "net/http/httptest" "testing" @@ -37,3 +38,20 @@ func TestMultiplexHandlers(t *testing.T) { require.False(t, called) } } + +func TestIsGRPCEnabled(t *testing.T) { + t.Setenv(envGRPCEnabled, "true") + if !IsGRPCEnabled(context.Background()) { + t.Fatal("expected grpc to be enabled") + } + + t.Setenv(envGRPCEnabled, "false") + if IsGRPCEnabled(context.Background()) { + t.Fatal("expected grpc to not be enabled") + } + + t.Setenv(envGRPCEnabled, "") + if IsGRPCEnabled(context.Background()) { + t.Fatal("expected grpc to not be enabled") + } +} diff --git a/internal/search/searcher/search.go b/internal/search/searcher/search.go index c642b358023..50b8b8e6226 100644 --- a/internal/search/searcher/search.go +++ b/internal/search/searcher/search.go @@ -15,8 +15,8 @@ import ( "github.com/sourcegraph/sourcegraph/internal/api" "github.com/sourcegraph/sourcegraph/internal/endpoint" "github.com/sourcegraph/sourcegraph/internal/errcode" - "github.com/sourcegraph/sourcegraph/internal/featureflag" "github.com/sourcegraph/sourcegraph/internal/gitserver" + internalgrpc "github.com/sourcegraph/sourcegraph/internal/grpc" "github.com/sourcegraph/sourcegraph/internal/mutablelimiter" "github.com/sourcegraph/sourcegraph/internal/search" "github.com/sourcegraph/sourcegraph/internal/search/job" @@ -197,7 +197,7 @@ func (s *TextSearchJob) searchFilesInRepo( return false, err } - if featureflag.FromContext(ctx).GetBoolOr("grpc", false) { + if internalgrpc.IsGRPCEnabled(ctx) { onMatches := func(searcherMatch *proto.FileMatch) { stream.Send(streaming.SearchEvent{ Results: []result.Match{convertProtoMatch(repo, commit, &rev, searcherMatch, s.PathRegexps)}, @@ -219,7 +219,7 @@ func (s *TextSearchJob) searchFilesInRepo( }) } - if featureflag.FromContext(ctx).GetBoolOr("grpc", false) { + if internalgrpc.IsGRPCEnabled(ctx) { return SearchGRPC(ctx, searcherURLs, gitserverRepo, repo.ID, rev, commit, index, info, fetchTimeout, s.Features, onMatchGRPC) } else { return Search(ctx, searcherURLs, gitserverRepo, repo.ID, rev, commit, index, info, fetchTimeout, s.Features, onMatches) diff --git a/internal/symbols/client.go b/internal/symbols/client.go index 38f4a64ff15..031125d0a7a 100644 --- a/internal/symbols/client.go +++ b/internal/symbols/client.go @@ -23,7 +23,7 @@ import ( "github.com/sourcegraph/sourcegraph/internal/authz" "github.com/sourcegraph/sourcegraph/internal/conf/conftypes" "github.com/sourcegraph/sourcegraph/internal/endpoint" - "github.com/sourcegraph/sourcegraph/internal/featureflag" + internalgrpc "github.com/sourcegraph/sourcegraph/internal/grpc" "github.com/sourcegraph/sourcegraph/internal/grpc/defaults" "github.com/sourcegraph/sourcegraph/internal/httpcli" "github.com/sourcegraph/sourcegraph/internal/resetonce" @@ -93,7 +93,7 @@ func (c *Client) ListLanguageMappings(ctx context.Context, repo api.RepoName) (_ c.langMappingOnce.Do(func() { var mappings map[string][]string - if c.isGRPCEnabled(ctx) { + if internalgrpc.IsGRPCEnabled(ctx) { mappings, err = c.listLanguageMappingsGRPC(ctx, repo) } else { mappings, err = c.listLanguageMappingsJSON(ctx, repo) @@ -192,7 +192,7 @@ func (c *Client) Search(ctx context.Context, args search.SymbolsParameters) (sym var response search.SymbolsResponse - if c.isGRPCEnabled(ctx) { + if internalgrpc.IsGRPCEnabled(ctx) { response, err = c.searchGRPC(ctx, args) } else { response, err = c.searchJSON(ctx, args) @@ -298,7 +298,7 @@ func (c *Client) LocalCodeIntel(ctx context.Context, args types.RepoCommitPath) span.SetTag("Repo", args.Repo) span.SetTag("CommitID", args.Commit) - if c.isGRPCEnabled(ctx) { + if internalgrpc.IsGRPCEnabled(ctx) { return c.localCodeIntelGRPC(ctx, args) } @@ -365,7 +365,7 @@ func (c *Client) SymbolInfo(ctx context.Context, args types.RepoCommitPathPoint) span.SetTag("Repo", args.Repo) span.SetTag("CommitID", args.Commit) - if c.isGRPCEnabled(ctx) { + if internalgrpc.IsGRPCEnabled(ctx) { result, err = c.symbolInfoGRPC(ctx, args) } else { result, err = c.symbolInfoJSON(ctx, args) @@ -528,7 +528,3 @@ func (c *Client) dialGRPC(ctx context.Context, repository api.RepoName) (*grpc.C return conn, nil } - -func (c *Client) isGRPCEnabled(ctx context.Context) bool { - return featureflag.FromContext(ctx).GetBoolOr("grpc", false) -} diff --git a/internal/symbols/client_test.go b/internal/symbols/client_test.go index c24ff1038ff..935ccd89813 100644 --- a/internal/symbols/client_test.go +++ b/internal/symbols/client_test.go @@ -7,12 +7,21 @@ import ( "net/http/httptest" "testing" + "github.com/sourcegraph/log" + "github.com/sourcegraph/log/logtest" + "google.golang.org/grpc" + "github.com/sourcegraph/sourcegraph/internal/actor" "github.com/sourcegraph/sourcegraph/internal/authz" "github.com/sourcegraph/sourcegraph/internal/endpoint" + internalgrpc "github.com/sourcegraph/sourcegraph/internal/grpc" + "github.com/sourcegraph/sourcegraph/internal/grpc/defaults" "github.com/sourcegraph/sourcegraph/internal/search" "github.com/sourcegraph/sourcegraph/internal/search/result" "github.com/sourcegraph/sourcegraph/internal/types" + "github.com/sourcegraph/sourcegraph/lib/errors" + + proto "github.com/sourcegraph/sourcegraph/internal/symbols/v1" ) func init() { @@ -32,12 +41,27 @@ func TestSearchWithFiltering(t *testing.T) { Path: "file2", }, }} - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - json.NewEncoder(w).Encode(fixture) - })) + + mockServer := &mockSymbolsServer{ + mockSearchGRPC: func(_ context.Context, _ *proto.SearchRequest) (*proto.SearchResponse, error) { + var response proto.SearchResponse + response.FromInternal(&fixture) + + return &response, nil + }, + + restHandler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + json.NewEncoder(w).Encode(fixture) + }), + } + + handler, cleanup := mockServer.NewHandler(logtest.Scoped(t)) + srv := httptest.NewServer(handler) t.Cleanup(func() { srv.Close() + cleanup() }) + DefaultClient.Endpoints = endpoint.Static(srv.URL) results, err := DefaultClient.Search(ctx, search.SymbolsParameters{ @@ -111,16 +135,34 @@ func TestDefinitionWithFiltering(t *testing.T) { Point: types.Point{Row: 0, Column: 0}, } - // Start an HTTP server that responds with path1. - ctx := context.Background() - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - json.NewEncoder(w).Encode(path1) - })) + mockServer := &mockSymbolsServer{ + mockSymbolInfoGRPC: func(_ context.Context, _ *proto.SymbolInfoRequest) (*proto.SymbolInfoResponse, error) { + var info types.SymbolInfo + info.Definition.RepoCommitPath = path1.RepoCommitPath + + var response proto.SymbolInfoResponse + response.FromInternal(&info) + + return &response, nil + }, + + restHandler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + json.NewEncoder(w).Encode(path1) + }), + } + + // Create a new HTTP server that response with path1. + handler, cleanup := mockServer.NewHandler(logtest.Scoped(t)) + srv := httptest.NewServer(handler) t.Cleanup(func() { srv.Close() + cleanup() }) + DefaultClient.Endpoints = endpoint.Static(srv.URL) + ctx := context.Background() + // Request path1. results, err := DefaultClient.SymbolInfo(ctx, path2) if err != nil { @@ -152,3 +194,81 @@ func TestDefinitionWithFiltering(t *testing.T) { t.Fatal("expected nil result when getting a definition for an unauthorized path") } } + +type mockSymbolsServer struct { + mockSearchGRPC func(ctx context.Context, request *proto.SearchRequest) (*proto.SearchResponse, error) + mockLocalCodeIntelGRPC func(ctx context.Context, request *proto.LocalCodeIntelRequest) (*proto.LocalCodeIntelResponse, error) + mockListLanguagesGRPC func(ctx context.Context, request *proto.ListLanguagesRequest) (*proto.ListLanguagesResponse, error) + mockSymbolInfoGRPC func(ctx context.Context, request *proto.SymbolInfoRequest) (*proto.SymbolInfoResponse, error) + mockHealthzGRPC func(ctx context.Context, request *proto.HealthzRequest) (*proto.HealthzResponse, error) + + restHandler http.Handler + + proto.UnimplementedSymbolsServiceServer +} + +func (m *mockSymbolsServer) NewHandler(l log.Logger) (handler http.Handler, cleanup func()) { + grpcServer := grpc.NewServer( + defaults.ServerOptions(l)..., + ) + + grpcServer.RegisterService(&proto.SymbolsService_ServiceDesc, m) + + handler = internalgrpc.MultiplexHandlers(grpcServer, http.HandlerFunc(m.serveRestHandler)) + cleanup = func() { + grpcServer.Stop() + } + + return handler, cleanup +} + +func (m *mockSymbolsServer) serveRestHandler(w http.ResponseWriter, r *http.Request) { + if m.restHandler != nil { + m.restHandler.ServeHTTP(w, r) + return + } + + http.Error(w, "not implemented", http.StatusNotImplemented) +} + +func (m *mockSymbolsServer) Search(ctx context.Context, r *proto.SearchRequest) (*proto.SearchResponse, error) { + if m.mockSearchGRPC != nil { + return m.mockSearchGRPC(ctx, r) + } + + return nil, errors.Newf("grpc: method %q not implemented", "Search") +} + +func (m *mockSymbolsServer) LocalCodeIntel(ctx context.Context, r *proto.LocalCodeIntelRequest) (*proto.LocalCodeIntelResponse, error) { + if m.mockLocalCodeIntelGRPC != nil { + return m.LocalCodeIntel(ctx, r) + } + + return nil, errors.Newf("grpc: method %q not implemented", "LocalCodeIntel") +} + +func (m *mockSymbolsServer) ListLanguages(ctx context.Context, r *proto.ListLanguagesRequest) (*proto.ListLanguagesResponse, error) { + if m.mockListLanguagesGRPC != nil { + return m.mockListLanguagesGRPC(ctx, r) + } + + return nil, errors.Newf("grpc: method %q not implemented", "ListLanguages") +} + +func (m *mockSymbolsServer) SymbolInfo(ctx context.Context, r *proto.SymbolInfoRequest) (*proto.SymbolInfoResponse, error) { + if m.mockSymbolInfoGRPC != nil { + return m.mockSymbolInfoGRPC(ctx, r) + } + + return nil, errors.Newf("grpc: method %q not implemented", "SymbolInfo") +} + +func (m *mockSymbolsServer) Healthz(ctx context.Context, r *proto.HealthzRequest) (*proto.HealthzResponse, error) { + if m.mockHealthzGRPC != nil { + return m.mockHealthzGRPC(ctx, r) + } + + return nil, errors.Newf("grpc: method %q not implemented", "Healthz") +} + +var _ proto.SymbolsServiceServer = &mockSymbolsServer{}