From e5edb614dd907808b3ca9fb02002c097c9f12e8b Mon Sep 17 00:00:00 2001 From: Ats Uiboupin Date: Fri, 18 Nov 2022 20:27:44 +0200 Subject: [PATCH] refactor: extract parsing java StackTraceElement to allow improving --- .../java-stack-trace-element-parser.test.ts | 40 +++++++++++++++++++ src/parsers/java-junit/java-junit-parser.ts | 8 ++-- .../java-stack-trace-element-parser.ts | 22 ++++++++++ 3 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 __tests__/java-stack-trace-element-parser.test.ts create mode 100644 src/parsers/java-junit/java-stack-trace-element-parser.ts diff --git a/__tests__/java-stack-trace-element-parser.test.ts b/__tests__/java-stack-trace-element-parser.test.ts new file mode 100644 index 0000000..48a6be5 --- /dev/null +++ b/__tests__/java-stack-trace-element-parser.test.ts @@ -0,0 +1,40 @@ +import {parseStackTraceElement} from '../src/parsers/java-junit/java-stack-trace-element-parser' + +describe('parseStackTraceLine tests', () => { + it('empty line is not parsed', async () => { + const line = '' + expect(parseStackTraceElement(line)).toBe(undefined) + }) + + describe('java class', () => { + it('simple', async () => { + const line = + 'at org.apache.pulsar.AddMissingPatchVersionTest.testVersionStrings(AddMissingPatchVersionTest.java:29)' + expect(parseStackTraceElement(line)).toEqual({ + tracePath: 'org.apache.pulsar.AddMissingPatchVersionTest.testVersionStrings', + fileName: 'AddMissingPatchVersionTest.java', + lineStr: '29' + }) + }) + + it('inner class', async () => { + const line = 'at com.foo.Main$Inner.run(Main.java:29)' + expect(parseStackTraceElement(line)).toEqual({ + tracePath: 'com.foo.Main$Inner.run', + fileName: 'Main.java', + lineStr: '29' + }) + }) + }) + + describe('Kotlin class', () => { + it('method name containing whitespaces', async () => { + const line = 'at com.foo.Main.method with whitespaces(Main.kt:18)' + expect(parseStackTraceElement(line)).toEqual({ + tracePath: 'com.foo.Main.method with whitespaces', + fileName: 'Main.kt', + lineStr: '18' + }) + }) + }) +}) diff --git a/src/parsers/java-junit/java-junit-parser.ts b/src/parsers/java-junit/java-junit-parser.ts index a4df6a3..51a0b7f 100644 --- a/src/parsers/java-junit/java-junit-parser.ts +++ b/src/parsers/java-junit/java-junit-parser.ts @@ -3,6 +3,7 @@ import {ParseOptions, TestParser} from '../../test-parser' import {parseStringPromise} from 'xml2js' import {JunitReport, SingleSuiteReport, TestCase, TestSuite} from './java-junit-types' +import {parseStackTraceElement} from './java-stack-trace-element-parser' import {normalizeFilePath} from '../../utils/path-utils' import { @@ -144,12 +145,11 @@ export class JavaJunitParser implements TestParser { private exceptionThrowSource(stackTrace: string): {filePath: string; line: number} | undefined { const lines = stackTrace.split(/\r?\n/) - const re = /^at (.*)\((.*):(\d+)\)$/ for (const str of lines) { - const match = str.match(re) - if (match !== null) { - const [_, tracePath, fileName, lineStr] = match + const stackTraceElement = parseStackTraceElement(str) + if (stackTraceElement) { + const {tracePath, fileName, lineStr} = stackTraceElement const filePath = this.getFilePath(tracePath, fileName) if (filePath !== undefined) { const line = parseInt(lineStr) diff --git a/src/parsers/java-junit/java-stack-trace-element-parser.ts b/src/parsers/java-junit/java-stack-trace-element-parser.ts new file mode 100644 index 0000000..3694993 --- /dev/null +++ b/src/parsers/java-junit/java-stack-trace-element-parser.ts @@ -0,0 +1,22 @@ +export interface StackTraceElement { + tracePath: string + fileName: string + lineStr: string +} + +// simple format: +// at (:) +const re = /^at (.*)\((.*):(\d+)\)$/ + +export function parseStackTraceElement(stackTraceLine: string): StackTraceElement | undefined { + const match = stackTraceLine.match(re) + if (match !== null) { + const [_, tracePath, fileName, lineStr] = match + return { + tracePath, + fileName, + lineStr + } + } + return undefined +}