From edfee8ba8a9195d627e81eac9c20d64acfd1be44 Mon Sep 17 00:00:00 2001 From: Anton Ganhammar Date: Sun, 17 Sep 2023 11:15:02 +0200 Subject: [PATCH] feat: add option to set body size limit in code-coverage-backend Signed-off-by: Anton Ganhammar --- .../src/service/router.test.ts | 46 ++++++++++++++++++- .../src/service/router.ts | 15 +++++- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/plugins/code-coverage-backend/src/service/router.test.ts b/plugins/code-coverage-backend/src/service/router.test.ts index 4f1a9ee2e5..2032a5470d 100644 --- a/plugins/code-coverage-backend/src/service/router.test.ts +++ b/plugins/code-coverage-backend/src/service/router.test.ts @@ -41,6 +41,7 @@ CodeCoverageDatabase.create = jest.fn( }, }), getHistory: async () => ({}), + insertCodeCoverage: async () => undefined, } as any), ); @@ -50,7 +51,13 @@ jest.mock('@backstage/catalog-client', () => ({ CatalogClient: jest.fn().mockImplementation(() => ({ getEntityByRef: async (_: string, options: CatalogRequestOptions) => { catalogRequestOptions = options; - return {}; + return { + metadata: { + annotations: { + 'backstage.io/code-coverage': 'enabled', + }, + }, + }; }, })), })); @@ -129,4 +136,41 @@ describe('createRouter', () => { }); }); }); + + describe('POST /report', () => { + it('returns created when body does not exceed limit', async () => { + const response = await request(app) + .post('/report?entity=component:default/mycomponent&coverageType=lcov') + .set('Content-Type', 'text/plain') + .send( + 'TN:\nSF:/src/index.js\nFNF:0\nFNH:0\nLF:1\nLH:1\nBRF:0\nBRH:0\nend_of_record', + ); + + expect(response.status).toBe(201); + }); + + it('returns content too large when body exceeds limit', async () => { + const router = await createRouter({ + config: new ConfigReader({ + codeCoverage: { + bodySizeLimit: '1b', + }, + }), + database: createDatabase(), + discovery: testDiscovery, + urlReader: mockUrlReader, + logger: getVoidLogger(), + }); + app = express().use(router); + + const response = await request(app) + .post('/report?entity=component:default/mycomponent&coverageType=lcov') + .set('Content-Type', 'text/plain') + .send( + 'TN:\nSF:/src/index.js\nFNF:0\nFNH:0\nLF:1\nLH:1\nBRF:0\nBRH:0\nend_of_record', + ); + + expect(response.status).toBe(413); + }); + }); }); diff --git a/plugins/code-coverage-backend/src/service/router.ts b/plugins/code-coverage-backend/src/service/router.ts index 3b97f2d233..47bc285d62 100644 --- a/plugins/code-coverage-backend/src/service/router.ts +++ b/plugins/code-coverage-backend/src/service/router.ts @@ -64,10 +64,21 @@ export const makeRouter = async ( options.catalogApi ?? new CatalogClient({ discoveryApi: discovery }); const scm = ScmIntegrations.fromConfig(config); + const bodySizeLimit = + config.getOptionalString('codeCoverage.bodySizeLimit') ?? '100kb'; + bodyParserXml(BodyParser); const router = Router(); - router.use(BodyParser.xml()); - router.use(BodyParser.text()); + router.use( + BodyParser.xml({ + limit: bodySizeLimit, + }), + ); + router.use( + BodyParser.text({ + limit: bodySizeLimit, + }), + ); router.use(express.json()); const utils = new CoverageUtils(scm, urlReader);