From 247bef8e1867d41b2af29766a590400e2ee10ab8 Mon Sep 17 00:00:00 2001 From: Aleksey Dobrynin Date: Wed, 14 May 2025 14:21:38 +0200 Subject: [PATCH] [junit 5] add escaping for service message IDEA-330442 GitOrigin-RevId: a31d0ad69a5ed2d9626bd2b1b55d506feec0eff5 --- .../junit5/JUnit5TestExecutionListener.java | 4 ++-- .../com/intellij/junit5/JUnit5EventsTest.java | 20 +++++++++++++++++++ .../junit5/testData/AnnotationsTestClass.java | 15 ++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 plugins/junit5_rt_tests/test/com/intellij/junit5/testData/AnnotationsTestClass.java diff --git a/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestExecutionListener.java b/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestExecutionListener.java index 101cd542bc84..441d5a2a0467 100644 --- a/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestExecutionListener.java +++ b/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestExecutionListener.java @@ -96,9 +96,9 @@ public class JUnit5TestExecutionListener implements TestExecutionListener { comment = myRootName.substring(0, lastPointIdx); } - String messageName = (myPresentableName == null || myPresentableName.isEmpty()) ? escapeName(name) : myPresentableName; + String messageName = (myPresentableName == null || myPresentableName.isEmpty()) ? name : myPresentableName; - myPrintStream.println("##teamcity[rootName name = '" + messageName + + myPrintStream.println("##teamcity[rootName name = '" + escapeName(messageName) + (comment != null ? ("' comment = '" + escapeName(comment)) : "") + "'" + " location = 'java:suite://" + escapeName(myRootName) + "']"); diff --git a/plugins/junit5_rt_tests/test/com/intellij/junit5/JUnit5EventsTest.java b/plugins/junit5_rt_tests/test/com/intellij/junit5/JUnit5EventsTest.java index 139e1b498f1e..d049d0766772 100644 --- a/plugins/junit5_rt_tests/test/com/intellij/junit5/JUnit5EventsTest.java +++ b/plugins/junit5_rt_tests/test/com/intellij/junit5/JUnit5EventsTest.java @@ -1,6 +1,7 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.junit5; +import com.intellij.junit5.testData.AnnotationsTestClass; import com.intellij.junit5.testData.MyTestClass; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -175,4 +176,23 @@ public class JUnit5EventsTest { Assertions.assertInstanceOf(ClassSelector.class, selector); Assertions.assertEquals("com.intellij.junit5.testData.InitStaticField$MyTest", ((ClassSelector)selector).getClassName()); } + + @Test + void testEscaping() throws NoSuchMethodException { + JUnit5TestRunnerBuilder builder = new JUnit5TestRunnerBuilder(); + JUnit5TestRunnerBuilder.TestDescriptorContext testContext = builder + .withRootName("testClass") + .withPresentableName("testClass") + .withTestMethod(AnnotationsTestClass.class, "test1"); + + builder.buildTestPlan().execute(); + testContext.startExecution().finish(); + + Assertions.assertEquals(""" + ##teamcity[enteredTheMatrix] + ##teamcity[rootName name = 'testClass' location = 'java:suite://testClass'] + ##teamcity[testStarted id='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' name='|[test|'s method|]' nodeId='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' parentNodeId='0' locationHint='java:test://com.intellij.junit5.testData.AnnotationsTestClass/test1' metainfo=''] + ##teamcity[testFinished id='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' name='|[test|'s method|]' nodeId='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' parentNodeId='0'] + """, builder.getFormattedOutput()); + } } diff --git a/plugins/junit5_rt_tests/test/com/intellij/junit5/testData/AnnotationsTestClass.java b/plugins/junit5_rt_tests/test/com/intellij/junit5/testData/AnnotationsTestClass.java new file mode 100644 index 000000000000..c512e637d3f7 --- /dev/null +++ b/plugins/junit5_rt_tests/test/com/intellij/junit5/testData/AnnotationsTestClass.java @@ -0,0 +1,15 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.junit5.testData; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@SuppressWarnings("NewClassNamingConvention") +@DisplayName("[test's class]") +public class AnnotationsTestClass { + @Test + @DisplayName("[test's method]") + void test1() { + } + +}