Skip to content

Commit

Permalink
Add smoke test for impacted tests detection
Browse files Browse the repository at this point in the history
  • Loading branch information
nikita-tkachenko-datadog committed Jan 22, 2025
1 parent 2fda4f6 commit 9b370b2
Show file tree
Hide file tree
Showing 10 changed files with 553 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@ public class CiVisibilityServices {

private static GitClient.Factory buildGitClientFactory(
Config config, CiVisibilityMetricCollector metricCollector) {
if (!config.isCiVisibilityGitClientEnabled()) {
return r -> NoOpGitClient.INSTANCE;
}
try {
ShellCommandExecutor shellCommandExecutor =
new ShellCommandExecutor(new File("."), config.getCiVisibilityGitCommandTimeoutMillis());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import spock.util.concurrent.PollingConditions

import java.util.concurrent.ConcurrentLinkedQueue
import java.util.concurrent.CopyOnWriteArrayList
import java.util.stream.Collectors
import java.util.zip.GZIPInputStream
import java.util.zip.GZIPOutputStream

Expand All @@ -30,6 +31,7 @@ class MockBackend implements AutoCloseable {

private final Collection<Map<String, Object>> skippableTests = new CopyOnWriteArrayList<>()
private final Collection<Map<String, Object>> flakyTests = new CopyOnWriteArrayList<>()
private final Collection<String> changedFiles = new CopyOnWriteArrayList<>()

private boolean itrEnabled = true
private boolean codeCoverageEnabled = true
Expand All @@ -38,6 +40,8 @@ class MockBackend implements AutoCloseable {

private boolean flakyRetriesEnabled = false

private boolean impactedTestsDetectionEnabled = false

void reset() {
receivedTraces.clear()
receivedCoverages.clear()
Expand All @@ -47,6 +51,7 @@ class MockBackend implements AutoCloseable {

skippableTests.clear()
flakyTests.clear()
changedFiles.clear()
}

@Override
Expand All @@ -70,6 +75,14 @@ class MockBackend implements AutoCloseable {
skippableTests.add(["module": module, "suite": suite, "name": name, "coverage": coverage ])
}

void givenImpactedTestsDetection(boolean impactedTestsDetectionEnabled) {
this.impactedTestsDetectionEnabled = impactedTestsDetectionEnabled
}

void givenChangedFile(String relativePath) {
changedFiles.add(relativePath)
}

String getIntakeUrl() {
return intakeServer.address.toString()
}
Expand Down Expand Up @@ -113,7 +126,8 @@ class MockBackend implements AutoCloseable {
"itr_enabled": $itrEnabled,
"code_coverage": $codeCoverageEnabled,
"tests_skipping": $testsSkippingEnabled,
"flaky_test_retries_enabled": $flakyRetriesEnabled
"flaky_test_retries_enabled": $flakyRetriesEnabled,
"impacted_tests_enabled": $impactedTestsDetectionEnabled
}
}
}""").bytes)
Expand Down Expand Up @@ -236,6 +250,23 @@ class MockBackend implements AutoCloseable {

response.status(200).send()
}

prefix("/api/v2/ci/tests/diffs") {
response.status(200)
.addHeader("Content-Encoding", "gzip")
.send(MockBackend.compress(("""
{
"data": {
"type": "ci_app_tests_diffs_response",
"id": "<some-hash>",
"attributes": {
"base_sha": "ef733331f7cee9b1c89d82df87942d8606edf3f7",
"files": [ ${changedFiles.stream().map(f -> '"' + f + '"').collect(Collectors.joining(","))} ]
}
}
}
""").bytes))
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,12 @@ class MavenSmokeTest extends CiVisibilitySmokeTest {
mockBackend.givenTestsSkipping(testsSkipping)
mockBackend.givenSkippableTest("Maven Smoke Tests Project maven-surefire-plugin default-test", "datadog.smoke.TestSucceed", "test_to_skip_with_itr", ["src/main/java/datadog/smoke/Calculator.java": bits(9)])

def exitCode = whenRunningMavenBuild(jacocoCoverage, commandLineParams)
mockBackend.givenImpactedTestsDetection(true)

def agentArgs = jacocoCoverage ? [
"${Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_JACOCO_PLUGIN_VERSION)}=${JACOCO_PLUGIN_VERSION}" as String
] : []
def exitCode = whenRunningMavenBuild(agentArgs, commandLineParams)

if (expectSuccess) {
assert exitCode == 0
Expand Down Expand Up @@ -103,6 +108,26 @@ class MavenSmokeTest extends CiVisibilitySmokeTest {
"test_successful_maven_run_multiple_forks" | LATEST_MAVEN_VERSION | 5 | 1 | true | true | false | true | [] | 17
}

def "test impacted tests detection"() {
givenWrapperPropertiesFile(mavenVersion)
givenMavenProjectFiles(projectName)
givenMavenDependenciesAreLoaded(projectName, mavenVersion)

mockBackend.givenImpactedTestsDetection(true)
mockBackend.givenChangedFile("src/test/java/datadog/smoke/TestSucceed.java")

def exitCode = whenRunningMavenBuild([
"${Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_GIT_CLIENT_ENABLED)}=false" as String
], [])
assert exitCode == 0

verifyEventsAndCoverages(projectName, "maven", mavenVersion, mockBackend.waitForEvents(5), mockBackend.waitForCoverages(1))

where:
projectName | mavenVersion
"test_successful_maven_run_impacted_tests" | "3.9.9"
}

private void givenWrapperPropertiesFile(String mavenVersion) {
def distributionUrl = "https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/${mavenVersion}/apache-maven-${mavenVersion}-bin.zip"

Expand Down Expand Up @@ -166,7 +191,7 @@ class MavenSmokeTest extends CiVisibilitySmokeTest {
private static final Collection<String> LOADED_DEPENDENCIES = new HashSet<>()

private void retryUntilSuccessfulOrNoAttemptsLeft(List<String> mvnCommand) {
def processBuilder = createProcessBuilder(mvnCommand, false, false)
def processBuilder = createProcessBuilder(mvnCommand, false, [])
for (int attempt = 0; attempt < DEPENDENCIES_DOWNLOAD_RETRIES; attempt++) {
def exitCode = runProcess(processBuilder.start())
if (exitCode == 0) {
Expand All @@ -176,8 +201,8 @@ class MavenSmokeTest extends CiVisibilitySmokeTest {
throw new AssertionError((Object) "Tried $DEPENDENCIES_DOWNLOAD_RETRIES times to execute $mvnCommand and failed")
}

private int whenRunningMavenBuild(boolean injectJacoco, List<String> additionalCommandLineParams) {
def processBuilder = createProcessBuilder(["-B", "test"] + additionalCommandLineParams, true, injectJacoco)
private int whenRunningMavenBuild(List<String> additionalAgentArgs, List<String> additionalCommandLineParams) {
def processBuilder = createProcessBuilder(["-B", "test"] + additionalCommandLineParams, true, additionalAgentArgs)

processBuilder.environment().put("DD_API_KEY", "01234567890abcdef123456789ABCDEF")

Expand All @@ -198,13 +223,13 @@ class MavenSmokeTest extends CiVisibilitySmokeTest {
return p.exitValue()
}

ProcessBuilder createProcessBuilder(List<String> mvnCommand, boolean runWithAgent, boolean injectJacoco) {
ProcessBuilder createProcessBuilder(List<String> mvnCommand, boolean runWithAgent, List<String> additionalAgentArgs) {
String mavenRunnerShadowJar = System.getProperty("datadog.smoketest.maven.jar.path")
assert new File(mavenRunnerShadowJar).isFile()

List<String> command = new ArrayList<>()
command.add(javaPath())
command.addAll(jvmArguments(runWithAgent, injectJacoco))
command.addAll(jvmArguments(runWithAgent, additionalAgentArgs))
command.addAll((String[]) ["-jar", mavenRunnerShadowJar])
command.addAll(programArguments())
command.addAll(mvnCommand)
Expand All @@ -222,7 +247,7 @@ class MavenSmokeTest extends CiVisibilitySmokeTest {
return System.getProperty("java.home") + separator + "bin" + separator + "java"
}

List<String> jvmArguments(boolean runWithAgent, boolean injectJacoco) {
List<String> jvmArguments(boolean runWithAgent, List<String> additionalAgentArgs) {
def arguments = [
"-D${MavenWrapperMain.MVNW_VERBOSE}=true".toString(),
"-Duser.dir=${projectHome.toAbsolutePath()}".toString(),
Expand All @@ -249,9 +274,7 @@ class MavenSmokeTest extends CiVisibilitySmokeTest {
"${Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_AGENTLESS_URL)}=${mockBackend.intakeUrl}," +
"${Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_FLAKY_RETRY_ONLY_KNOWN_FLAKES)}=true,"

if (injectJacoco) {
agentArgument += "${Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_JACOCO_PLUGIN_VERSION)}=${JACOCO_PLUGIN_VERSION},"
}
agentArgument += additionalAgentArgs.join(",")

arguments += agentArgument.toString()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
[ {
"files" : [ {
"filename" : "src/test/java/datadog/smoke/TestSucceed.java"
}, {
"filename" : "src/main/java/datadog/smoke/Calculator.java"
} ],
"span_id" : ${content_span_id_6},
"test_session_id" : ${content_test_session_id},
"test_suite_id" : ${content_test_suite_id}
}, {
"files" : [ {
"filename" : "src/test/java/datadog/smoke/TestSucceed.java"
}, {
"filename" : "src/main/java/datadog/smoke/Calculator.java"
} ],
"span_id" : ${content_span_id_5},
"test_session_id" : ${content_test_session_id},
"test_suite_id" : ${content_test_suite_id}
} ]
Loading

0 comments on commit 9b370b2

Please sign in to comment.