From 0c6e13614957a5fa0497b491205559f9678f5c41 Mon Sep 17 00:00:00 2001 From: Stefan Brand Date: Tue, 12 Dec 2023 18:07:27 +0100 Subject: [PATCH 1/8] TS-36706 Refactoring: Use constants for the paths that must match between methods and for the coverage strings --- .../tia/TiaMavenCucumberSystemTest.java | 57 +++++++++++-------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java b/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java index 490aeeaf2..5e86ddf6c 100644 --- a/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java +++ b/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java @@ -8,6 +8,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.util.Arrays; + import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; @@ -24,16 +26,23 @@ public class TiaMavenCucumberSystemTest { private static final int FAKE_TEAMSCALE_PORT = 63800; private static TeamscaleMockServer teamscaleMockServer = null; + private static final String[] TEST_PATHS = { + "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #1", + "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #2", + "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #3", + "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #4", + "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Subtract two numbers 99 & 99 #1" + }; + + private static final String COVERAGE_ADD = "Calculator.java:3,5;StepDefinitions.java:12,24-25,29-30,39-40"; + private static final String COVERAGE_SUBTRACT = "Calculator.java:3,9;StepDefinitions.java:12,24-25,34-35,39-40"; + @BeforeEach public void startFakeTeamscaleServer() throws Exception { if (teamscaleMockServer == null) { - teamscaleMockServer = new TeamscaleMockServer(FAKE_TEAMSCALE_PORT).acceptingReportUploads() - .withImpactedTests( - "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #1", - "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #2", - "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #3", - "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #4", - "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Subtract two numbers 99 & 99 #1"); + teamscaleMockServer = new TeamscaleMockServer(FAKE_TEAMSCALE_PORT) + .acceptingReportUploads() + .withImpactedTests(TEST_PATHS); } teamscaleMockServer.uploadedReports.clear(); } @@ -52,26 +61,24 @@ public void testMavenTia() throws Exception { assertThat(teamscaleMockServer.uploadedReports).hasSize(1); TestwiseCoverageReport unitTestReport = teamscaleMockServer.parseUploadedTestwiseCoverageReport(0); - assertThat(unitTestReport.tests).hasSize(5); + assertThat(unitTestReport.tests).hasSize(TEST_PATHS.length); assertThat(unitTestReport.partial).isTrue(); assertAll(() -> { - assertThat(unitTestReport.tests).extracting(test -> test.uniformPath) - .containsExactlyInAnyOrder( - "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #1", - "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #2", - "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #3", - "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #4", - "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Subtract two numbers 99 & 99 #1"); - assertThat(unitTestReport.tests).extracting(test -> test.result) - .containsExactlyInAnyOrder(ETestExecutionResult.PASSED, ETestExecutionResult.PASSED, - ETestExecutionResult.PASSED, ETestExecutionResult.PASSED, ETestExecutionResult.PASSED); - assertThat(unitTestReport.tests).extracting(SystemTestUtils::getCoverageString) - .containsExactly( - "Calculator.java:3,5;StepDefinitions.java:12,24-25,29-30,39-40", - "Calculator.java:3,5;StepDefinitions.java:12,24-25,29-30,39-40", - "Calculator.java:3,5;StepDefinitions.java:12,24-25,29-30,39-40", - "Calculator.java:3,5;StepDefinitions.java:12,24-25,29-30,39-40", - "Calculator.java:3,9;StepDefinitions.java:12,24-25,34-35,39-40"); + assertThat(unitTestReport.tests) + .extracting(test -> test.uniformPath) + .containsExactlyInAnyOrder(TEST_PATHS); + assertThat(unitTestReport.tests) + .extracting(test -> test.result) + .containsExactlyInAnyOrder(Arrays.stream(TEST_PATHS) + .map(s -> ETestExecutionResult.PASSED) + .toArray(ETestExecutionResult[]::new)); + assertThat(unitTestReport.tests) + .extracting(SystemTestUtils::getCoverageString) + .containsExactly(COVERAGE_ADD, // must match TEST_PATHS + COVERAGE_ADD, + COVERAGE_ADD, + COVERAGE_ADD, + COVERAGE_SUBTRACT); }); } From d8f1b5f42b8577a9436baffb58a651b40957337a Mon Sep 17 00:00:00 2001 From: Stefan Brand Date: Tue, 12 Dec 2023 18:33:29 +0100 Subject: [PATCH 2/8] TS-36706 Fix: Add missing test cases --- .../com/teamscale/tia/TiaMavenCucumberSystemTest.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java b/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java index 5e86ddf6c..057dfc9f8 100644 --- a/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java +++ b/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java @@ -31,7 +31,10 @@ public class TiaMavenCucumberSystemTest { "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #2", "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #3", "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #4", - "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Subtract two numbers 99 & 99 #1" + "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #5", + "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Subtract two numbers 99 & 99 #1", + "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Subtract two numbers 10 & -1 #1" + }; private static final String COVERAGE_ADD = "Calculator.java:3,5;StepDefinitions.java:12,24-25,29-30,39-40"; @@ -78,7 +81,10 @@ public void testMavenTia() throws Exception { COVERAGE_ADD, COVERAGE_ADD, COVERAGE_ADD, - COVERAGE_SUBTRACT); + COVERAGE_ADD, + COVERAGE_SUBTRACT, + COVERAGE_SUBTRACT + ); }); } From 25c4bcb691676066e87ee21dcef58c9a0656483d Mon Sep 17 00:00:00 2001 From: Stefan Brand Date: Tue, 12 Dec 2023 20:30:45 +0100 Subject: [PATCH 3/8] TS-36706 Escape slashes in names of cucumber scenarios since they are used a path separators. --- .../CucumberPickleDescriptorResolver.java | 18 +++++++++++- .../CucumberPickleDescriptorResolverTest.java | 29 +++++++++++++++++++ .../hellocucumber/calculator.feature | 5 ++++ .../tia/TiaMavenCucumberSystemTest.java | 4 ++- 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 impacted-test-engine/src/test/java/com/teamscale/test_impacted/test_descriptor/CucumberPickleDescriptorResolverTest.java diff --git a/impacted-test-engine/src/main/java/com/teamscale/test_impacted/test_descriptor/CucumberPickleDescriptorResolver.java b/impacted-test-engine/src/main/java/com/teamscale/test_impacted/test_descriptor/CucumberPickleDescriptorResolver.java index cde1eb161..bd76acca1 100644 --- a/impacted-test-engine/src/main/java/com/teamscale/test_impacted/test_descriptor/CucumberPickleDescriptorResolver.java +++ b/impacted-test-engine/src/main/java/com/teamscale/test_impacted/test_descriptor/CucumberPickleDescriptorResolver.java @@ -115,12 +115,28 @@ private Optional getPickleName(TestDescriptor testDescriptor) { Method getNameMethod = pickle.getClass().getDeclaredMethod("getName"); getNameMethod.setAccessible(true); String name = getNameMethod.invoke(pickle).toString(); - return Optional.of(name); + + return Optional + .of(name) + .map(CucumberPickleDescriptorResolver::escapeSlashes); } catch (NoSuchFieldException | InvocationTargetException | IllegalAccessException | NoSuchMethodException e) { return Optional.empty(); } } + /** + * Escapes slashes (/) in a given input (usually a scenario name) with a backslash (\). + *

+ * If a slash is already escaped, no additional escaping is done. + *
    + *
  • {@code / -> \/}
  • + *
  • {@code \/ -> \/}
  • + *
+ */ + static String escapeSlashes(String input) { + return input.replaceAll("(? getFeatureFileTestDescriptor(TestDescriptor testDescriptor) { if (!isFeatureFileTestDescriptor(testDescriptor)) { if (!testDescriptor.getParent().isPresent()) { diff --git a/impacted-test-engine/src/test/java/com/teamscale/test_impacted/test_descriptor/CucumberPickleDescriptorResolverTest.java b/impacted-test-engine/src/test/java/com/teamscale/test_impacted/test_descriptor/CucumberPickleDescriptorResolverTest.java new file mode 100644 index 000000000..b7cd00a51 --- /dev/null +++ b/impacted-test-engine/src/test/java/com/teamscale/test_impacted/test_descriptor/CucumberPickleDescriptorResolverTest.java @@ -0,0 +1,29 @@ +package com.teamscale.test_impacted.test_descriptor; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.LinkedHashMap; + +class CucumberPickleDescriptorResolverTest { + + @Test + void escapeSlashes() { + LinkedHashMap expectedByInput = new LinkedHashMap<>(); + expectedByInput.put("abc", "abc"); + expectedByInput.put("ab/c", "ab\\/c"); + expectedByInput.put("ab\\/c", "ab\\/c"); // don't escape what is already escaped + expectedByInput.put("/abc", "\\/abc"); + expectedByInput.put("/abc/", "\\/abc\\/"); + expectedByInput.put("/", "\\/"); + expectedByInput.put("/a/", "\\/a\\/"); + expectedByInput.put("a//", "a\\/\\/"); + expectedByInput.put("//a", "\\/\\/a"); + expectedByInput.put("//", "\\/\\/"); + expectedByInput.put("\\", "\\"); + expectedByInput.put("http://link", "http:\\/\\/link"); + + expectedByInput.forEach((input, expected) -> Assertions.assertEquals(expected, + CucumberPickleDescriptorResolver.escapeSlashes(input))); + } +} \ No newline at end of file diff --git a/system-tests/cucumber-maven-tia/maven-project/src/test/resources/hellocucumber/calculator.feature b/system-tests/cucumber-maven-tia/maven-project/src/test/resources/hellocucumber/calculator.feature index 08c70c25c..1eb616a6f 100644 --- a/system-tests/cucumber-maven-tia/maven-project/src/test/resources/hellocucumber/calculator.feature +++ b/system-tests/cucumber-maven-tia/maven-project/src/test/resources/hellocucumber/calculator.feature @@ -34,3 +34,8 @@ Feature: Calculator | num1 | num2 | difference | | 99 | 99 | 0 | | 10 | -1 | 11 | + + Scenario: Actually we just want to test a http://link + Given I have a calculator + When I add 0 and 1 + Then the result should be 1 \ No newline at end of file diff --git a/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java b/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java index 057dfc9f8..2f975c855 100644 --- a/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java +++ b/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java @@ -26,7 +26,8 @@ public class TiaMavenCucumberSystemTest { private static final int FAKE_TEAMSCALE_PORT = 63800; private static TeamscaleMockServer teamscaleMockServer = null; - private static final String[] TEST_PATHS = { + private static final String[] TEST_PATHS = { // sorted alphabetically + "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Actually we just want to test a http:\\/\\/link #1", // also tests addition, escaped / "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #1", "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #2", "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #3", @@ -82,6 +83,7 @@ public void testMavenTia() throws Exception { COVERAGE_ADD, COVERAGE_ADD, COVERAGE_ADD, + COVERAGE_ADD, COVERAGE_SUBTRACT, COVERAGE_SUBTRACT ); From 9ab938161c3ca54599dbc05f51c60af970b68fc6 Mon Sep 17 00:00:00 2001 From: Thomas Pettinger Date: Thu, 14 Dec 2023 14:29:40 +0100 Subject: [PATCH 4/8] TS-36706 Fix deserialization of impacted test list from Teamscale --- .../jacoco/agent/testimpact/CoverageToJsonStrategyBase.java | 2 +- .../jacoco/agent/testimpact/TestExecutionWriter.java | 2 +- .../com/teamscale/test/commons/TeamscaleMockServer.java | 2 +- .../src/main/java/com/teamscale/report/ReportUtils.java | 2 +- .../report/testwise/TestwiseCoverageReportWriter.java | 2 +- .../com/teamscale/tia/TiaMavenDumpToFileSystemTest.java | 2 +- .../src/main/java/com/teamscale/client}/JsonUtils.java | 6 ++++-- .../com/teamscale/client/TeamscaleServiceGenerator.java | 6 ++++-- .../src/test/kotlin/com/teamscale/TeamscalePluginTest.kt | 2 +- .../java/com/teamscale/tia.client/CommandLineInterface.java | 2 +- .../src/main/java/com/teamscale/tia.client/RunningTest.java | 2 +- 11 files changed, 17 insertions(+), 13 deletions(-) rename {report-generator/src/main/java/com/teamscale/report/util => teamscale-client/src/main/java/com/teamscale/client}/JsonUtils.java (91%) diff --git a/agent/src/main/java/com/teamscale/jacoco/agent/testimpact/CoverageToJsonStrategyBase.java b/agent/src/main/java/com/teamscale/jacoco/agent/testimpact/CoverageToJsonStrategyBase.java index e635ba91b..8eb7376ce 100644 --- a/agent/src/main/java/com/teamscale/jacoco/agent/testimpact/CoverageToJsonStrategyBase.java +++ b/agent/src/main/java/com/teamscale/jacoco/agent/testimpact/CoverageToJsonStrategyBase.java @@ -1,6 +1,7 @@ package com.teamscale.jacoco.agent.testimpact; import com.teamscale.client.ClusteredTestDetails; +import com.teamscale.client.JsonUtils; import com.teamscale.client.PrioritizableTestCluster; import com.teamscale.jacoco.agent.JacocoRuntimeController; import com.teamscale.jacoco.agent.options.AgentOptions; @@ -13,7 +14,6 @@ import com.teamscale.report.testwise.model.TestwiseCoverageReport; import com.teamscale.report.testwise.model.builder.TestCoverageBuilder; import com.teamscale.report.testwise.model.builder.TestwiseCoverageReportBuilder; -import com.teamscale.report.util.JsonUtils; import org.slf4j.Logger; import java.io.File; diff --git a/agent/src/main/java/com/teamscale/jacoco/agent/testimpact/TestExecutionWriter.java b/agent/src/main/java/com/teamscale/jacoco/agent/testimpact/TestExecutionWriter.java index 24682f1f8..fbbb36b32 100644 --- a/agent/src/main/java/com/teamscale/jacoco/agent/testimpact/TestExecutionWriter.java +++ b/agent/src/main/java/com/teamscale/jacoco/agent/testimpact/TestExecutionWriter.java @@ -1,8 +1,8 @@ package com.teamscale.jacoco.agent.testimpact; +import com.teamscale.client.JsonUtils; import com.teamscale.jacoco.agent.util.LoggingUtils; import com.teamscale.report.testwise.model.TestExecution; -import com.teamscale.report.util.JsonUtils; import org.slf4j.Logger; import java.io.File; diff --git a/common-system-test/src/main/java/com/teamscale/test/commons/TeamscaleMockServer.java b/common-system-test/src/main/java/com/teamscale/test/commons/TeamscaleMockServer.java index 6cadb9ffc..62e4f514c 100644 --- a/common-system-test/src/main/java/com/teamscale/test/commons/TeamscaleMockServer.java +++ b/common-system-test/src/main/java/com/teamscale/test/commons/TeamscaleMockServer.java @@ -1,10 +1,10 @@ package com.teamscale.test.commons; +import com.teamscale.client.JsonUtils; import com.teamscale.client.PrioritizableTest; import com.teamscale.client.PrioritizableTestCluster; import com.teamscale.client.TestWithClusterId; import com.teamscale.report.testwise.model.TestwiseCoverageReport; -import com.teamscale.report.util.JsonUtils; import spark.Request; import spark.Response; import spark.Service; diff --git a/report-generator/src/main/java/com/teamscale/report/ReportUtils.java b/report-generator/src/main/java/com/teamscale/report/ReportUtils.java index ebc234d38..c5513dd6f 100644 --- a/report-generator/src/main/java/com/teamscale/report/ReportUtils.java +++ b/report-generator/src/main/java/com/teamscale/report/ReportUtils.java @@ -2,11 +2,11 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.teamscale.client.FileSystemUtils; +import com.teamscale.client.JsonUtils; import com.teamscale.client.TestDetails; import com.teamscale.report.testwise.ETestArtifactFormat; import com.teamscale.report.testwise.model.TestExecution; import com.teamscale.report.testwise.model.TestwiseCoverageReport; -import com.teamscale.report.util.JsonUtils; import java.io.File; import java.io.IOException; diff --git a/report-generator/src/main/java/com/teamscale/report/testwise/TestwiseCoverageReportWriter.java b/report-generator/src/main/java/com/teamscale/report/testwise/TestwiseCoverageReportWriter.java index 867ba1458..d43af754b 100644 --- a/report-generator/src/main/java/com/teamscale/report/testwise/TestwiseCoverageReportWriter.java +++ b/report-generator/src/main/java/com/teamscale/report/testwise/TestwiseCoverageReportWriter.java @@ -2,11 +2,11 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; +import com.teamscale.client.JsonUtils; import com.teamscale.client.StringUtils; import com.teamscale.report.testwise.model.TestInfo; import com.teamscale.report.testwise.model.builder.TestCoverageBuilder; import com.teamscale.report.testwise.model.factory.TestInfoFactory; -import com.teamscale.report.util.JsonUtils; import java.io.File; import java.io.IOException; diff --git a/system-tests/tia-maven/src/test/java/com/teamscale/tia/TiaMavenDumpToFileSystemTest.java b/system-tests/tia-maven/src/test/java/com/teamscale/tia/TiaMavenDumpToFileSystemTest.java index 43ab0b3e2..98e9beda0 100644 --- a/system-tests/tia-maven/src/test/java/com/teamscale/tia/TiaMavenDumpToFileSystemTest.java +++ b/system-tests/tia-maven/src/test/java/com/teamscale/tia/TiaMavenDumpToFileSystemTest.java @@ -1,8 +1,8 @@ package com.teamscale.tia; +import com.teamscale.client.JsonUtils; import com.teamscale.report.testwise.model.ETestExecutionResult; import com.teamscale.report.testwise.model.TestwiseCoverageReport; -import com.teamscale.report.util.JsonUtils; import com.teamscale.test.commons.SystemTestUtils; import com.teamscale.test.commons.TeamscaleMockServer; import org.junit.jupiter.api.AfterEach; diff --git a/report-generator/src/main/java/com/teamscale/report/util/JsonUtils.java b/teamscale-client/src/main/java/com/teamscale/client/JsonUtils.java similarity index 91% rename from report-generator/src/main/java/com/teamscale/report/util/JsonUtils.java rename to teamscale-client/src/main/java/com/teamscale/client/JsonUtils.java index 750a36101..d08a3c463 100644 --- a/report-generator/src/main/java/com/teamscale/report/util/JsonUtils.java +++ b/teamscale-client/src/main/java/com/teamscale/client/JsonUtils.java @@ -1,10 +1,11 @@ -package com.teamscale.report.util; +package com.teamscale.client; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; @@ -22,9 +23,10 @@ public class JsonUtils { * OBJECT_MAPPER are configured to include all fields when serializing or deserializing objects, regardless of their * visibility modifiers (public, private, etc.). */ - private static final ObjectMapper OBJECT_MAPPER = JsonMapper.builder() + public static final ObjectMapper OBJECT_MAPPER = JsonMapper.builder() .visibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE) .visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY) + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) .serializationInclusion(JsonInclude.Include.NON_NULL) .build(); diff --git a/teamscale-client/src/main/java/com/teamscale/client/TeamscaleServiceGenerator.java b/teamscale-client/src/main/java/com/teamscale/client/TeamscaleServiceGenerator.java index 9d20ec64d..c24fd6f0f 100644 --- a/teamscale-client/src/main/java/com/teamscale/client/TeamscaleServiceGenerator.java +++ b/teamscale-client/src/main/java/com/teamscale/client/TeamscaleServiceGenerator.java @@ -24,7 +24,8 @@ public class TeamscaleServiceGenerator { public static S createService(Class serviceClass, HttpUrl baseUrl, String username, String accessToken, int readTimeout, int writeTimeout, Interceptor... interceptors) { Retrofit retrofit = HttpUtils.createRetrofit( - retrofitBuilder -> retrofitBuilder.baseUrl(baseUrl).addConverterFactory(JacksonConverterFactory.create()), + retrofitBuilder -> retrofitBuilder.baseUrl(baseUrl) + .addConverterFactory(JacksonConverterFactory.create(JsonUtils.OBJECT_MAPPER)), okHttpBuilder -> addInterceptors(okHttpBuilder, interceptors) .addInterceptor(HttpUtils.getBasicAuthInterceptor(username, accessToken)) .addInterceptor(new AcceptJsonInterceptor()) @@ -42,7 +43,8 @@ public static S createServiceWithRequestLogging(Class serviceClass, HttpU String accessToken, File logfile, int readTimeout, int writeTimeout, Interceptor... interceptors) { Retrofit retrofit = HttpUtils.createRetrofit( - retrofitBuilder -> retrofitBuilder.baseUrl(baseUrl).addConverterFactory(JacksonConverterFactory.create()), + retrofitBuilder -> retrofitBuilder.baseUrl(baseUrl) + .addConverterFactory(JacksonConverterFactory.create(JsonUtils.OBJECT_MAPPER)), okHttpBuilder -> addInterceptors(okHttpBuilder, interceptors) .addInterceptor(HttpUtils.getBasicAuthInterceptor(username, accessToken)) .addInterceptor(new AcceptJsonInterceptor()) diff --git a/teamscale-gradle-plugin/src/test/kotlin/com/teamscale/TeamscalePluginTest.kt b/teamscale-gradle-plugin/src/test/kotlin/com/teamscale/TeamscalePluginTest.kt index 8a7bfa5cb..31710249b 100644 --- a/teamscale-gradle-plugin/src/test/kotlin/com/teamscale/TeamscalePluginTest.kt +++ b/teamscale-gradle-plugin/src/test/kotlin/com/teamscale/TeamscalePluginTest.kt @@ -1,9 +1,9 @@ package com.teamscale import com.teamscale.TestwiseCoverageReportAssert.Companion.assertThat +import com.teamscale.client.JsonUtils import com.teamscale.report.testwise.model.ETestExecutionResult import com.teamscale.report.testwise.model.TestwiseCoverageReport -import com.teamscale.report.util.JsonUtils import com.teamscale.test.commons.TeamscaleMockServer import org.assertj.core.api.Assertions.assertThat import org.gradle.testkit.runner.BuildResult diff --git a/tia-client/src/main/java/com/teamscale/tia.client/CommandLineInterface.java b/tia-client/src/main/java/com/teamscale/tia.client/CommandLineInterface.java index 5d696cfb2..c1ee38dfc 100644 --- a/tia-client/src/main/java/com/teamscale/tia.client/CommandLineInterface.java +++ b/tia-client/src/main/java/com/teamscale/tia.client/CommandLineInterface.java @@ -1,11 +1,11 @@ package com.teamscale.tia.client; import com.teamscale.client.ClusteredTestDetails; +import com.teamscale.client.JsonUtils; import com.teamscale.client.PrioritizableTestCluster; import com.teamscale.client.StringUtils; import com.teamscale.report.testwise.model.ETestExecutionResult; import com.teamscale.report.testwise.model.TestExecution; -import com.teamscale.report.util.JsonUtils; import okhttp3.HttpUrl; import java.io.BufferedReader; diff --git a/tia-client/src/main/java/com/teamscale/tia.client/RunningTest.java b/tia-client/src/main/java/com/teamscale/tia.client/RunningTest.java index a1a6a643a..fe991f39a 100644 --- a/tia-client/src/main/java/com/teamscale/tia.client/RunningTest.java +++ b/tia-client/src/main/java/com/teamscale/tia.client/RunningTest.java @@ -1,9 +1,9 @@ package com.teamscale.tia.client; +import com.teamscale.client.JsonUtils; import com.teamscale.client.StringUtils; import com.teamscale.report.testwise.model.TestExecution; import com.teamscale.report.testwise.model.TestInfo; -import com.teamscale.report.util.JsonUtils; import okhttp3.ResponseBody; import java.io.IOException; From 8333ddc624da4e7dc8d8387c7200c89bc0db312c Mon Sep 17 00:00:00 2001 From: Stefan Brand Date: Thu, 14 Dec 2023 14:34:47 +0100 Subject: [PATCH 5/8] Revert "TS-36706 Fix: Add missing test cases" This reverts commit d8f1b5f4 --- .../com/teamscale/tia/TiaMavenCucumberSystemTest.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java b/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java index 2f975c855..efb4ee67a 100644 --- a/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java +++ b/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java @@ -32,10 +32,7 @@ public class TiaMavenCucumberSystemTest { "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #2", "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #3", "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #4", - "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #5", - "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Subtract two numbers 99 & 99 #1", - "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Subtract two numbers 10 & -1 #1" - + "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Subtract two numbers 99 & 99 #1" }; private static final String COVERAGE_ADD = "Calculator.java:3,5;StepDefinitions.java:12,24-25,29-30,39-40"; @@ -83,10 +80,7 @@ public void testMavenTia() throws Exception { COVERAGE_ADD, COVERAGE_ADD, COVERAGE_ADD, - COVERAGE_ADD, - COVERAGE_SUBTRACT, - COVERAGE_SUBTRACT - ); + COVERAGE_SUBTRACT); }); } From 63e0898c2bb6e43d3f2af9accfa346ff23063027 Mon Sep 17 00:00:00 2001 From: Stefan Brand Date: Thu, 14 Dec 2023 14:43:19 +0100 Subject: [PATCH 6/8] TS-36706 Refactoring: Rename constant --- .../com/teamscale/tia/TiaMavenCucumberSystemTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java b/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java index efb4ee67a..62b67d065 100644 --- a/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java +++ b/system-tests/cucumber-maven-tia/src/test/java/com/teamscale/tia/TiaMavenCucumberSystemTest.java @@ -26,7 +26,7 @@ public class TiaMavenCucumberSystemTest { private static final int FAKE_TEAMSCALE_PORT = 63800; private static TeamscaleMockServer teamscaleMockServer = null; - private static final String[] TEST_PATHS = { // sorted alphabetically + private static final String[] IMPACTED_TEST_PATHS = { // sorted alphabetically "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Actually we just want to test a http:\\/\\/link #1", // also tests addition, escaped / "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #1", "hellocucumber/RunCucumberTest/hellocucumber/calculator.feature/Add two numbers #2", @@ -43,7 +43,7 @@ public void startFakeTeamscaleServer() throws Exception { if (teamscaleMockServer == null) { teamscaleMockServer = new TeamscaleMockServer(FAKE_TEAMSCALE_PORT) .acceptingReportUploads() - .withImpactedTests(TEST_PATHS); + .withImpactedTests(IMPACTED_TEST_PATHS); } teamscaleMockServer.uploadedReports.clear(); } @@ -62,15 +62,15 @@ public void testMavenTia() throws Exception { assertThat(teamscaleMockServer.uploadedReports).hasSize(1); TestwiseCoverageReport unitTestReport = teamscaleMockServer.parseUploadedTestwiseCoverageReport(0); - assertThat(unitTestReport.tests).hasSize(TEST_PATHS.length); + assertThat(unitTestReport.tests).hasSize(IMPACTED_TEST_PATHS.length); assertThat(unitTestReport.partial).isTrue(); assertAll(() -> { assertThat(unitTestReport.tests) .extracting(test -> test.uniformPath) - .containsExactlyInAnyOrder(TEST_PATHS); + .containsExactlyInAnyOrder(IMPACTED_TEST_PATHS); assertThat(unitTestReport.tests) .extracting(test -> test.result) - .containsExactlyInAnyOrder(Arrays.stream(TEST_PATHS) + .containsExactlyInAnyOrder(Arrays.stream(IMPACTED_TEST_PATHS) .map(s -> ETestExecutionResult.PASSED) .toArray(ETestExecutionResult[]::new)); assertThat(unitTestReport.tests) From 21ee712316ed780f6bafaadb70baa6c8a2e5c56e Mon Sep 17 00:00:00 2001 From: Stefan Brand Date: Thu, 14 Dec 2023 14:52:22 +0100 Subject: [PATCH 7/8] TS-36706 Add Unit-Test for /// --- .../test_descriptor/CucumberPickleDescriptorResolverTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/impacted-test-engine/src/test/java/com/teamscale/test_impacted/test_descriptor/CucumberPickleDescriptorResolverTest.java b/impacted-test-engine/src/test/java/com/teamscale/test_impacted/test_descriptor/CucumberPickleDescriptorResolverTest.java index b7cd00a51..7ea90f0a6 100644 --- a/impacted-test-engine/src/test/java/com/teamscale/test_impacted/test_descriptor/CucumberPickleDescriptorResolverTest.java +++ b/impacted-test-engine/src/test/java/com/teamscale/test_impacted/test_descriptor/CucumberPickleDescriptorResolverTest.java @@ -20,6 +20,7 @@ void escapeSlashes() { expectedByInput.put("a//", "a\\/\\/"); expectedByInput.put("//a", "\\/\\/a"); expectedByInput.put("//", "\\/\\/"); + expectedByInput.put("///", "\\/\\/\\/"); expectedByInput.put("\\", "\\"); expectedByInput.put("http://link", "http:\\/\\/link"); From 5d98470598feaab2d19544e24ea8e0f89caa4bd2 Mon Sep 17 00:00:00 2001 From: Stefan Brand Date: Thu, 14 Dec 2023 14:53:08 +0100 Subject: [PATCH 8/8] TS-36706 Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5893597e..9914666b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ We use [semantic versioning](http://semver.org/): - PATCH version when you make backwards compatible bug fixes. # Next Release +- [fix] _teamscale-maven-plugin_ Test names containing slashes could not be uploaded +- [fix] _tia-client_ Impacted test retrieval failed due to JSON parsing error # 32.6.0 - [feature] Profiler logs its version on startup