From aebbb4d7c4ec38d046918bf812bbcbff3d7fef78 Mon Sep 17 00:00:00 2001 From: Ats Uiboupin Date: Sat, 19 Nov 2022 21:00:04 +0200 Subject: [PATCH] fix(java-junit): parse StackTraceElement with custom classloader Fixes #208 --- .../java-stack-trace-element-parser.test.ts | 34 ++++++++++++++++--- .../java-stack-trace-element-parser.ts | 30 +++++++++++++--- 2 files changed, 56 insertions(+), 8 deletions(-) diff --git a/__tests__/java-stack-trace-element-parser.test.ts b/__tests__/java-stack-trace-element-parser.test.ts index 6b0582c..6fe1ac2 100644 --- a/__tests__/java-stack-trace-element-parser.test.ts +++ b/__tests__/java-stack-trace-element-parser.test.ts @@ -27,11 +27,37 @@ describe('parseStackTraceLine tests', () => { }) it('starts with whitespaces', async () => { - const line = " \tat org.apache.pulsar.AddMissingPatchVersionTest.testVersionStrings(AddMissingPatchVersionTest.java:29)" + const line = + ' \tat org.apache.pulsar.AddMissingPatchVersionTest.testVersionStrings(AddMissingPatchVersionTest.java:29)' expect(parseStackTraceElement(line)).toEqual({ - tracePath: "org.apache.pulsar.AddMissingPatchVersionTest.testVersionStrings", - fileName: "AddMissingPatchVersionTest.java", - lineStr: "29" + tracePath: 'org.apache.pulsar.AddMissingPatchVersionTest.testVersionStrings', + fileName: 'AddMissingPatchVersionTest.java', + lineStr: '29' + }) + }) + + describe('since Java 9', () => { + it('with classloader and module', async () => { + // Based on Java 9 StackTraceElement.toString() Doc: https://docs.oracle.com/javase/9/docs/api/java/lang/StackTraceElement.html#toString-- + const line = 'at com.foo.loader/foo@9.0/com.foo.Main.run(Main.java:101)' + expect(parseStackTraceElement(line)).toEqual({ + classLoader: 'com.foo.loader', + moduleNameAndVersion: 'foo@9.0', + tracePath: 'com.foo.Main.run', + fileName: 'Main.java', + lineStr: '101' + }) + }) + + it('with classloader', async () => { + const line = 'at com.foo.loader//com.foo.Main.run(Main.java:101)' + expect(parseStackTraceElement(line)).toEqual({ + classLoader: 'com.foo.loader', + moduleNameAndVersion: undefined, + tracePath: 'com.foo.Main.run', + fileName: 'Main.java', + lineStr: '101' + }) }) }) }) diff --git a/src/parsers/java-junit/java-stack-trace-element-parser.ts b/src/parsers/java-junit/java-stack-trace-element-parser.ts index 81b9de6..894dd42 100644 --- a/src/parsers/java-junit/java-stack-trace-element-parser.ts +++ b/src/parsers/java-junit/java-stack-trace-element-parser.ts @@ -1,18 +1,24 @@ export interface StackTraceElement { + classLoader: string | undefined + moduleNameAndVersion: string | undefined tracePath: string fileName: string lineStr: string } -// simple format: -// at (:) -const re = /^\s*at (.*)\((.*):(\d+)\)$/ +// classloader and module name are optional: +// at //(:) +// https://github.com/eclipse-openj9/openj9/issues/11452#issuecomment-754946992 +const re = /^\s*at (\S+\/\S*\/)?(.*)\((.*):(\d+)\)$/ export function parseStackTraceElement(stackTraceLine: string): StackTraceElement | undefined { const match = stackTraceLine.match(re) if (match !== null) { - const [_, tracePath, fileName, lineStr] = match + const [_, maybeClassLoaderAndModuleNameAndVersion, tracePath, fileName, lineStr] = match + const {classLoader, moduleNameAndVersion} = parseClassLoaderAndModule(maybeClassLoaderAndModuleNameAndVersion) return { + classLoader, + moduleNameAndVersion, tracePath, fileName, lineStr @@ -20,3 +26,19 @@ export function parseStackTraceElement(stackTraceLine: string): StackTraceElemen } return undefined } + +function parseClassLoaderAndModule(maybeClassLoaderAndModuleNameAndVersion?: string): { + classLoader?: string + moduleNameAndVersion?: string +} { + if (maybeClassLoaderAndModuleNameAndVersion) { + const res = maybeClassLoaderAndModuleNameAndVersion.split('/') + const classLoader = res[0] + let moduleNameAndVersion: string | undefined = res[1] + if (moduleNameAndVersion === '') { + moduleNameAndVersion = undefined + } + return {classLoader, moduleNameAndVersion} + } + return {classLoader: undefined, moduleNameAndVersion: undefined} +}