diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/GithubActionsInfo.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/GithubActionsInfo.java index 6eb8f8c6444..7bec546bf3e 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/GithubActionsInfo.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ci/GithubActionsInfo.java @@ -94,7 +94,7 @@ public CIInfo buildCIInfo() { @Override public PullRequestInfo buildPullRequestInfo() { String baseRef = environment.get(GITHUB_BASE_REF); - if (!Strings.isNotBlank(baseRef)) { + if (Strings.isBlank(baseRef)) { return PullRequestInfo.EMPTY; } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ChangedFiles.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ChangedFiles.java deleted file mode 100644 index 3867c290d99..00000000000 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ChangedFiles.java +++ /dev/null @@ -1,28 +0,0 @@ -package datadog.trace.civisibility.config; - -import com.squareup.moshi.Json; -import java.util.Collections; -import java.util.Set; - -public class ChangedFiles { - - public static final ChangedFiles EMPTY = new ChangedFiles(null, Collections.emptySet()); - - @Json(name = "base_sha") - private final String baseSha; - - private final Set files; - - ChangedFiles(String baseSha, Set files) { - this.baseSha = baseSha; - this.files = files; - } - - public String getBaseSha() { - return baseSha; - } - - public Set getFiles() { - return files; - } -} diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/CiVisibilitySettings.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/CiVisibilitySettings.java index ceedda5b7e4..bdce3fb02b8 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/CiVisibilitySettings.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/CiVisibilitySettings.java @@ -4,6 +4,7 @@ import java.nio.file.Path; import java.util.Map; import java.util.Objects; +import javax.annotation.Nullable; public class CiVisibilitySettings { @@ -17,7 +18,8 @@ public class CiVisibilitySettings { false, false, EarlyFlakeDetectionSettings.DEFAULT, - TestManagementSettings.DEFAULT); + TestManagementSettings.DEFAULT, + null); private final boolean itrEnabled; private final boolean codeCoverage; @@ -28,6 +30,7 @@ public class CiVisibilitySettings { private final boolean knownTestsEnabled; private final EarlyFlakeDetectionSettings earlyFlakeDetectionSettings; private final TestManagementSettings testManagementSettings; + @Nullable private final String defaultBranch; CiVisibilitySettings( boolean itrEnabled, @@ -38,7 +41,8 @@ public class CiVisibilitySettings { boolean impactedTestsDetectionEnabled, boolean knownTestsEnabled, EarlyFlakeDetectionSettings earlyFlakeDetectionSettings, - TestManagementSettings testManagementSettings) { + TestManagementSettings testManagementSettings, + @Nullable String defaultBranch) { this.itrEnabled = itrEnabled; this.codeCoverage = codeCoverage; this.testsSkipping = testsSkipping; @@ -48,6 +52,7 @@ public class CiVisibilitySettings { this.knownTestsEnabled = knownTestsEnabled; this.earlyFlakeDetectionSettings = earlyFlakeDetectionSettings; this.testManagementSettings = testManagementSettings; + this.defaultBranch = defaultBranch; } public boolean isItrEnabled() { @@ -86,6 +91,11 @@ public TestManagementSettings getTestManagementSettings() { return testManagementSettings; } + @Nullable + public String getDefaultBranch() { + return defaultBranch; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -103,7 +113,8 @@ public boolean equals(Object o) { && impactedTestsDetectionEnabled == that.impactedTestsDetectionEnabled && knownTestsEnabled == that.knownTestsEnabled && Objects.equals(earlyFlakeDetectionSettings, that.earlyFlakeDetectionSettings) - && Objects.equals(testManagementSettings, that.testManagementSettings); + && Objects.equals(testManagementSettings, that.testManagementSettings) + && Objects.equals(defaultBranch, that.defaultBranch); } @Override @@ -117,7 +128,8 @@ public int hashCode() { impactedTestsDetectionEnabled, knownTestsEnabled, earlyFlakeDetectionSettings, - testManagementSettings); + testManagementSettings, + defaultBranch); } public interface Factory { @@ -145,7 +157,8 @@ public CiVisibilitySettings fromJson(Map json) { EarlyFlakeDetectionSettings.JsonAdapter.INSTANCE.fromJson( (Map) json.get("early_flake_detection")), TestManagementSettings.JsonAdapter.INSTANCE.fromJson( - (Map) json.get("test_management"))); + (Map) json.get("test_management")), + getString(json, "default_branch", null)); } private static boolean getBoolean( @@ -153,5 +166,11 @@ private static boolean getBoolean( Object value = json.get(fieldName); return value instanceof Boolean ? (Boolean) value : defaultValue; } + + private static String getString( + Map json, String fieldName, String defaultValue) { + Object value = json.get(fieldName); + return value instanceof String ? (String) value : defaultValue; + } } } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApi.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApi.java index 807663705f7..e190fedc53d 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApi.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApi.java @@ -38,11 +38,6 @@ public Map>> getTestManagementTests TracerEnvironment tracerEnvironment) { return Collections.emptyMap(); } - - @Override - public ChangedFiles getChangedFiles(TracerEnvironment tracerEnvironment) { - return ChangedFiles.EMPTY; - } }; CiVisibilitySettings getSettings(TracerEnvironment tracerEnvironment) throws IOException; @@ -58,6 +53,4 @@ Map> getKnownTestsByModule(TracerEnvironment tracerE Map>> getTestManagementTestsByModule( TracerEnvironment tracerEnvironment) throws IOException; - - ChangedFiles getChangedFiles(TracerEnvironment tracerEnvironment) throws IOException; } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApiImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApiImpl.java index ed68bd0eafd..76dcc1ece2e 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApiImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ConfigurationApiImpl.java @@ -53,7 +53,6 @@ public class ConfigurationApiImpl implements ConfigurationApi { private static final String SETTINGS_URI = "libraries/tests/services/setting"; private static final String SKIPPABLE_TESTS_URI = "ci/tests/skippable"; - private static final String CHANGED_FILES_URI = "ci/tests/diffs"; private static final String FLAKY_TESTS_URI = "ci/libraries/tests/flaky"; private static final String KNOWN_TESTS_URI = "ci/libraries/tests"; private static final String TEST_MANAGEMENT_TESTS_URI = "test/libraries/test-management/tests"; @@ -68,7 +67,6 @@ public class ConfigurationApiImpl implements ConfigurationApi { private final JsonAdapter> testFullNamesResponseAdapter; private final JsonAdapter> testManagementRequestAdapter; private final JsonAdapter> testManagementTestsResponseAdapter; - private final JsonAdapter> changedFilesResponseAdapter; public ConfigurationApiImpl(BackendApi backendApi, CiVisibilityMetricCollector metricCollector) { this(backendApi, metricCollector, () -> RandomUtils.randomUUID().toString()); @@ -119,11 +117,6 @@ public ConfigurationApiImpl(BackendApi backendApi, CiVisibilityMetricCollector m Types.newParameterizedTypeWithOwner( ConfigurationApiImpl.class, EnvelopeDto.class, TestManagementTestsDto.class); testManagementTestsResponseAdapter = moshi.adapter(testManagementTestsResponseType); - - ParameterizedType changedFilesResponseAdapterType = - Types.newParameterizedTypeWithOwner( - ConfigurationApiImpl.class, EnvelopeDto.class, ChangedFiles.class); - changedFilesResponseAdapter = moshi.adapter(changedFilesResponseAdapterType); } @Override @@ -416,37 +409,6 @@ private Map>> parseTestManagementTe return testsByTypeByModule; } - @Override - public ChangedFiles getChangedFiles(TracerEnvironment tracerEnvironment) throws IOException { - OkHttpUtils.CustomListener telemetryListener = - new TelemetryListener.Builder(metricCollector) - .requestCount(CiVisibilityCountMetric.IMPACTED_TESTS_DETECTION_REQUEST) - .requestErrors(CiVisibilityCountMetric.IMPACTED_TESTS_DETECTION_REQUEST_ERRORS) - .requestDuration(CiVisibilityDistributionMetric.IMPACTED_TESTS_DETECTION_REQUEST_MS) - .responseBytes(CiVisibilityDistributionMetric.IMPACTED_TESTS_DETECTION_RESPONSE_BYTES) - .build(); - - String uuid = uuidGenerator.get(); - EnvelopeDto request = - new EnvelopeDto<>(new DataDto<>(uuid, "ci_app_tests_diffs_request", tracerEnvironment)); - String json = requestAdapter.toJson(request); - RequestBody requestBody = RequestBody.create(JSON, json); - ChangedFiles changedFiles = - backendApi.post( - CHANGED_FILES_URI, - requestBody, - is -> - changedFilesResponseAdapter.fromJson(Okio.buffer(Okio.source(is))).data.attributes, - telemetryListener, - false); - - int filesCount = changedFiles.getFiles().size(); - LOGGER.debug("Received {} changed files", filesCount); - metricCollector.add( - CiVisibilityDistributionMetric.IMPACTED_TESTS_DETECTION_RESPONSE_FILES, filesCount); - return changedFiles; - } - private static final class EnvelopeDto { private final DataDto data; diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettingsFactoryImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettingsFactoryImpl.java index 36aae05d6fa..7d50d1a573b 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettingsFactoryImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettingsFactoryImpl.java @@ -8,7 +8,6 @@ import datadog.trace.api.git.GitInfoProvider; import datadog.trace.civisibility.ci.PullRequestInfo; import datadog.trace.civisibility.diff.Diff; -import datadog.trace.civisibility.diff.FileDiff; import datadog.trace.civisibility.diff.LineDiff; import datadog.trace.civisibility.git.tree.GitClient; import datadog.trace.civisibility.git.tree.GitDataUploader; @@ -215,7 +214,8 @@ private Map doCreate( getTestManagementTestsByModule( tracerEnvironment, testManagementSettings.isEnabled())); Future pullRequestDiffFuture = - executor.submit(() -> getPullRequestDiff(tracerEnvironment, impactedTestsEnabled)); + executor.submit( + () -> getPullRequestDiff(impactedTestsEnabled, settings.getDefaultBranch())); SkippableTests skippableTests = skippableTestsFuture.get(); Map> flakyTestsByModule = flakyTestsFuture.get(); @@ -404,8 +404,7 @@ private Map>> getTestManagementTest } @Nonnull - private Diff getPullRequestDiff( - TracerEnvironment tracerEnvironment, boolean impactedTestsDetectionEnabled) { + private Diff getPullRequestDiff(boolean impactedTestsDetectionEnabled, String defaultBranch) { if (!impactedTestsDetectionEnabled) { return LineDiff.EMPTY; } @@ -414,49 +413,25 @@ private Diff getPullRequestDiff( if (repositoryRoot != null) { // ensure repo is not shallow before attempting to get git diff gitRepoUnshallow.unshallow(); - Diff diff = - gitClient.getGitDiff( - pullRequestInfo.getPullRequestBaseBranchSha(), - pullRequestInfo.getGitCommitHeadSha()); + + String baseCommitSha = pullRequestInfo.getPullRequestBaseBranchSha(); + if (baseCommitSha == null) { + baseCommitSha = + gitClient.getBaseCommitSha(pullRequestInfo.getPullRequestBaseBranch(), defaultBranch); + } + + Diff diff = gitClient.getGitDiff(baseCommitSha, pullRequestInfo.getGitCommitHeadSha()); if (diff != null) { return diff; } } - } catch (InterruptedException e) { LOGGER.error("Interrupted while getting git diff for PR: {}", pullRequestInfo, e); Thread.currentThread().interrupt(); - } catch (Exception e) { LOGGER.error("Could not get git diff for PR: {}", pullRequestInfo, e); } - if (config.isCiVisibilityImpactedTestsBackendRequestEnabled()) { - try { - ChangedFiles changedFiles = configurationApi.getChangedFiles(tracerEnvironment); - - // attempting to use base SHA returned by the backend to calculate git diff - if (repositoryRoot != null) { - // ensure repo is not shallow before attempting to get git diff - gitRepoUnshallow.unshallow(); - Diff diff = gitClient.getGitDiff(changedFiles.getBaseSha(), tracerEnvironment.getSha()); - if (diff != null) { - return diff; - } - } - - // falling back to file-level granularity - return new FileDiff(changedFiles.getFiles()); - - } catch (InterruptedException e) { - LOGGER.error("Interrupted while getting git diff for: {}", tracerEnvironment, e); - Thread.currentThread().interrupt(); - - } catch (Exception e) { - LOGGER.error("Could not get git diff for: {}", tracerEnvironment, e); - } - } - return LineDiff.EMPTY; } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/diff/Diff.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/diff/Diff.java index dfccfa41351..eeaedcb321f 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/diff/Diff.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/diff/Diff.java @@ -5,8 +5,7 @@ public interface Diff extends SerializableType { - PolymorphicSerializer SERIALIZER = - new PolymorphicSerializer<>(LineDiff.class, FileDiff.class); + PolymorphicSerializer SERIALIZER = new PolymorphicSerializer<>(LineDiff.class); boolean contains(String relativePath, int startLine, int endLine); } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/diff/FileDiff.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/diff/FileDiff.java deleted file mode 100644 index d404aba92ea..00000000000 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/diff/FileDiff.java +++ /dev/null @@ -1,53 +0,0 @@ -package datadog.trace.civisibility.diff; - -import datadog.trace.civisibility.ipc.serialization.Serializer; -import java.nio.ByteBuffer; -import java.util.Objects; -import java.util.Set; -import javax.annotation.Nonnull; - -/** Diff data with per-file granularity. */ -public class FileDiff implements Diff { - - private final @Nonnull Set changedFiles; - - public FileDiff(@Nonnull Set changedFiles) { - this.changedFiles = changedFiles; - } - - @Override - public boolean contains(String relativePath, int startLine, int endLine) { - return changedFiles.contains(relativePath); - } - - @Override - public void serialize(Serializer s) { - s.write(changedFiles); - } - - public static FileDiff deserialize(ByteBuffer buffer) { - return new FileDiff(Serializer.readSet(buffer, Serializer::readString)); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - FileDiff diff = (FileDiff) o; - return Objects.equals(changedFiles, diff.changedFiles); - } - - @Override - public int hashCode() { - return Objects.hashCode(changedFiles); - } - - @Override - public String toString() { - return "FileDiff{changedFiles=" + changedFiles + '}'; - } -} diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitClient.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitClient.java index 41e9cc9ee10..2143fe35b4b 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitClient.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitClient.java @@ -72,6 +72,10 @@ List getObjects(Collection commitsToSkip, Collection com Path createPackFiles(List objectHashes) throws IOException, TimeoutException, InterruptedException; + @Nullable + String getBaseCommitSha(@Nullable String baseBranch, @Nullable String defaultBranch) + throws IOException, TimeoutException, InterruptedException; + @Nullable LineDiff getGitDiff(String baseCommit, String targetCommit) throws IOException, TimeoutException, InterruptedException; diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitRepoUnshallow.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitRepoUnshallow.java index bc6acd5c9ec..489e2a4d377 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitRepoUnshallow.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitRepoUnshallow.java @@ -19,7 +19,8 @@ public GitRepoUnshallow(Config config, GitClient gitClient) { this.gitClient = gitClient; } - public boolean unshallow() throws IOException, InterruptedException, TimeoutException { + public synchronized boolean unshallow() + throws IOException, InterruptedException, TimeoutException { if (!config.isCiVisibilityGitUnshallowEnabled() || !gitClient.isShallow()) { return false; } diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/NoOpGitClient.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/NoOpGitClient.java index c030fc7442f..1ec0f2ecf8a 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/NoOpGitClient.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/NoOpGitClient.java @@ -126,6 +126,12 @@ public Path createPackFiles(List objectHashes) { return null; } + @Nullable + @Override + public String getBaseCommitSha(@Nullable String baseBranch, @Nullable String defaultBranch) { + return null; + } + @Nullable @Override public LineDiff getGitDiff(String baseCommit, String targetCommit) { diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/ShellGitClient.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/ShellGitClient.java index 4d78112a646..4d1f3ce2534 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/ShellGitClient.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/ShellGitClient.java @@ -16,11 +16,16 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.concurrent.TimeoutException; +import java.util.regex.Pattern; +import java.util.stream.Collectors; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.slf4j.Logger; @@ -31,6 +36,12 @@ public class ShellGitClient implements GitClient { private static final Logger LOGGER = LoggerFactory.getLogger(ShellGitClient.class); private static final String DD_TEMP_DIRECTORY_PREFIX = "dd-ci-vis-"; + private static final List POSSIBLE_BASE_BRANCHES = + Arrays.asList("main", "master", "preprod", "prod", "dev", "development", "trunk"); + private static final List POSSIBLE_BASE_BRANCH_PREFIXES = + Arrays.asList("release/", "hotfix/"); + private static final Pattern WHITESPACE_PATTERN = Pattern.compile("\\s+"); + private static final String ORIGIN = "origin"; private final CiVisibilityMetricCollector metricCollector; private final String repoRoot; @@ -573,6 +584,363 @@ private Path createTempDirectory() throws IOException { } } + /** + * Returns best effort base commit SHA for the most likely base branch in a PR. + * + * @param baseBranch Base branch name (if available will skip all logic that evaluates branch + * candidates) + * @param settingsDefaultBranch Default branch name obtained from the settings endpoint + * @return Base branch SHA if found or {@code null} otherwise + * @throws IOException If an error was encountered while writing command input or reading output + * @throws TimeoutException If timeout was reached while waiting for Git command to finish + * @throws InterruptedException If current thread was interrupted while waiting for Git command to + * finish + */ + @Nullable + @Override + public String getBaseCommitSha( + @Nullable String baseBranch, @Nullable String settingsDefaultBranch) + throws IOException, TimeoutException, InterruptedException { + return executeCommand( + Command.BASE_COMMIT_SHA, + () -> { + String sourceBranch = getCurrentBranch(); + if (Strings.isBlank(sourceBranch)) { + return null; + } + LOGGER.debug("Source branch: {}", sourceBranch); + + String remoteName = getRemoteName(); + LOGGER.debug("Remote name: {}", remoteName); + + if (baseBranch != null) { + tryFetchingIfNotFoundLocally(baseBranch, remoteName); + String fullBaseBranchName = + remoteName + "/" + removeRemotePrefix(baseBranch, remoteName); + return getMergeBase(fullBaseBranchName, sourceBranch); + } else { + return guessBestBaseBranchSha(sourceBranch, remoteName, settingsDefaultBranch); + } + }); + } + + String getRemoteName() throws IOException, InterruptedException, TimeoutException { + try { + String remote = + commandExecutor + .executeCommand( + IOUtils::readFully, + "git", + "rev-parse", + "--abbrev-ref", + "--symbolic-full-name", + "@{upstream}") + .trim(); + + int slashIdx = remote.indexOf('/'); + return slashIdx != -1 ? remote.substring(0, slashIdx) : remote; + } catch (ShellCommandExecutor.ShellCommandFailedException e) { + LOGGER.debug("Error getting remote from upstream, falling back to first remote", e); + } + + // fallback to first remote if no upstream + try { + List remotes = commandExecutor.executeCommand(IOUtils::readLines, "git", "remote"); + return remotes.get(0); + } catch (ShellCommandExecutor.ShellCommandFailedException e) { + LOGGER.debug("Error getting remotes", e); + } + return ORIGIN; + } + + @Nullable + String guessBestBaseBranchSha( + String sourceBranch, String remoteName, @Nullable String settingsDefaultBranch) + throws IOException, InterruptedException, TimeoutException { + for (String branch : POSSIBLE_BASE_BRANCHES) { + tryFetchingIfNotFoundLocally(branch, remoteName); + } + if (settingsDefaultBranch != null) { + tryFetchingIfNotFoundLocally(settingsDefaultBranch, remoteName); + } + + List candidates = getBaseBranchCandidates(settingsDefaultBranch, remoteName); + if (candidates.isEmpty()) { + LOGGER.debug("No base branch candidates found"); + return null; + } + + List metrics = computeBranchMetrics(candidates, sourceBranch); + LOGGER.debug("Metrics found: {}", metrics); + if (metrics.isEmpty()) { + return null; + } + + String defaultBranch = + Strings.isNotBlank(settingsDefaultBranch) + ? settingsDefaultBranch + : detectDefaultBranch(remoteName); + + List sortedMetrics = + sortBaseBranchCandidates(metrics, defaultBranch, remoteName); + + for (BaseBranchMetric metric : sortedMetrics) { + String sha = getMergeBase(metric.branch, sourceBranch); + if (Strings.isNotBlank(sha)) { + return sha; + } + } + + return null; + } + + void tryFetchingIfNotFoundLocally(String branch, String remoteName) + throws IOException, InterruptedException, TimeoutException { + String shortBranchName = removeRemotePrefix(branch, remoteName); + try { + // check if branch exists locally as a remote ref + commandExecutor.executeCommand( + ShellCommandExecutor.OutputParser.IGNORE, + "git", + "show-ref", + "--verify", + "--quiet", + "refs/remotes/" + remoteName + "/" + shortBranchName); + LOGGER.debug("Branch {}/{} exists locally, skipping fetch", remoteName, shortBranchName); + return; + } catch (ShellCommandExecutor.ShellCommandFailedException e) { + LOGGER.debug( + "Branch {}/{} does not exist locally, checking remote", remoteName, shortBranchName); + } + + // check if branch exists in remote + String remoteHeads = null; + try { + remoteHeads = + commandExecutor + .executeCommand( + IOUtils::readFully, "git", "ls-remote", "--heads", remoteName, shortBranchName) + .trim(); + } catch (ShellCommandExecutor.ShellCommandFailedException ignored) { + } + + if (Strings.isBlank(remoteHeads)) { + LOGGER.debug("Branch {}/{} does not exist in remote", remoteName, shortBranchName); + return; + } + + // fetch latest commit for branch from remote + LOGGER.debug("Branch {}/{} exists in remote, fetching", remoteName, shortBranchName); + try { + commandExecutor.executeCommand( + ShellCommandExecutor.OutputParser.IGNORE, + "git", + "fetch", + "--depth", + "1", + remoteName, + shortBranchName); + } catch (ShellCommandExecutor.ShellCommandFailedException e) { + LOGGER.debug("Branch {}/{} couldn't be fetched from remote", remoteName, shortBranchName, e); + } + } + + List getBaseBranchCandidates(@Nullable String defaultBranch, String remoteName) + throws IOException, InterruptedException, TimeoutException { + List candidates = new ArrayList<>(); + try { + // only consider remote branches + List branches = + commandExecutor.executeCommand( + IOUtils::readLines, + "git", + "for-each-ref", + "--format=%(refname:short)", + "refs/remotes/" + remoteName); + for (String branch : branches) { + if (isBaseLikeBranch(branch, remoteName) + || branchesEquals(branch, defaultBranch, remoteName)) { + candidates.add(branch); + } + } + } catch (ShellCommandExecutor.ShellCommandFailedException e) { + LOGGER.debug("Error building candidate branches", e); + } + + return candidates; + } + + boolean branchesEquals(String branchA, String branchB, @Nonnull String remoteName) { + return branchA != null + && branchB != null + && removeRemotePrefix(branchA, remoteName).equals(removeRemotePrefix(branchB, remoteName)); + } + + String removeRemotePrefix(@Nonnull String branch, @Nonnull String remoteName) { + if (branch.startsWith(remoteName + "/")) { + return branch.substring(remoteName.length() + 1); + } + return branch; + } + + boolean isBaseLikeBranch(@Nonnull String branch, @Nonnull String remoteName) { + String shortBranchName = removeRemotePrefix(branch, remoteName); + if (POSSIBLE_BASE_BRANCHES.contains(shortBranchName)) { + return true; + } + + for (String prefix : POSSIBLE_BASE_BRANCH_PREFIXES) { + if (shortBranchName.startsWith(prefix)) { + return true; + } + } + + return false; + } + + @Nullable + String detectDefaultBranch(String remoteName) + throws IOException, InterruptedException, TimeoutException { + try { + String defaultRef = + commandExecutor + .executeCommand( + IOUtils::readFully, + "git", + "symbolic-ref", + "--quiet", + "--short", + "refs/remotes/" + remoteName + "/HEAD") + .trim(); + if (Strings.isNotBlank(defaultRef)) { + return removeRemotePrefix(defaultRef, remoteName); + } + } catch (ShellCommandExecutor.ShellCommandFailedException ignored) { + } + + LOGGER.debug("Could not get symbolic-ref for default branch, trying fallback"); + List fallbackBranches = Arrays.asList("main", "master"); + for (String branch : fallbackBranches) { + try { + commandExecutor.executeCommand( + ShellCommandExecutor.OutputParser.IGNORE, + "git", + "show-ref", + "--verify", + "--quiet", + "refs/remotes/" + remoteName + "/" + branch); + LOGGER.debug("Found fallback default branch: {}", branch); + return branch; + } catch (ShellCommandExecutor.ShellCommandFailedException ignored) { + } + } + + LOGGER.debug("No fallback default branch found"); + return null; + } + + static class BaseBranchMetric { + private final String branch; + private final int behind; + private final int ahead; + + BaseBranchMetric(String branch, int behind, int ahead) { + this.branch = branch; + this.behind = behind; + this.ahead = ahead; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof BaseBranchMetric)) return false; + BaseBranchMetric that = (BaseBranchMetric) o; + return behind == that.behind && ahead == that.ahead && Objects.equals(branch, that.branch); + } + + @Override + public int hashCode() { + return Objects.hash(branch, behind, ahead); + } + + @Override + public String toString() { + return "BaseBranchMetric{" + + "branch='" + + branch + + '\'' + + ", behind=" + + behind + + ", ahead=" + + ahead + + '}'; + } + } + + List computeBranchMetrics(List candidates, String sourceBranch) + throws IOException, InterruptedException, TimeoutException { + List branchMetrics = new ArrayList<>(); + + for (String candidate : candidates) { + try { + String countsResult = + commandExecutor + .executeCommand( + IOUtils::readFully, + "git", + "rev-list", + "--left-right", + "--count", + candidate + "..." + sourceBranch) + .trim(); + + String[] counts = WHITESPACE_PATTERN.split(countsResult); + int behind = Integer.parseInt(counts[0]); + int ahead = Integer.parseInt(counts[1]); + if (behind == 0 && ahead == 0) { + LOGGER.debug("Branch {} is up to date", candidate); + } else { + branchMetrics.add(new BaseBranchMetric(candidate, behind, ahead)); + } + } catch (ShellCommandExecutor.ShellCommandFailedException ignored) { + LOGGER.debug("Could not get metrics for candidate {}", candidate); + } + } + + return branchMetrics; + } + + boolean isDefaultBranch(String branch, @Nullable String defaultBranch, String remoteName) { + return defaultBranch != null && branchesEquals(branch, defaultBranch, remoteName); + } + + List sortBaseBranchCandidates( + List metrics, String defaultBranch, String remoteName) { + Comparator comparator = + Comparator.comparingInt((BaseBranchMetric b) -> b.ahead) + .thenComparing(b -> !isDefaultBranch(b.branch, defaultBranch, remoteName)); + + return metrics.stream().sorted(comparator).collect(Collectors.toList()); + } + + /** + * Returns the merge base between to branches + * + * @param baseBranch Base branch. Must be remote, i.e. "origin/master" + * @param sourceBranch Source branch + * @return Merge base between the two branches + */ + String getMergeBase(String baseBranch, String sourceBranch) + throws IOException, InterruptedException, TimeoutException { + try { + return commandExecutor + .executeCommand(IOUtils::readFully, "git", "merge-base", baseBranch, sourceBranch) + .trim(); + } catch (ShellCommandExecutor.ShellCommandFailedException e) { + LOGGER.debug("Error calculating common ancestor for {} and {}", baseBranch, sourceBranch, e); + } + return null; + } + /** * Returns Git diff between two commits. * @@ -588,7 +956,10 @@ private Path createTempDirectory() throws IOException { @Override public LineDiff getGitDiff(String baseCommit, String targetCommit) throws IOException, TimeoutException, InterruptedException { - if (Strings.isNotBlank(baseCommit) && Strings.isNotBlank(targetCommit)) { + if (Strings.isBlank(baseCommit)) { + LOGGER.debug("Base commit info is not available, returning empty git diff"); + return null; + } else if (Strings.isNotBlank(targetCommit)) { return executeCommand( Command.DIFF, () -> @@ -601,11 +972,11 @@ public LineDiff getGitDiff(String baseCommit, String targetCommit) baseCommit, targetCommit)); } else { - LOGGER.debug( - "Base commit and/or target commit info is not available, returning empty git diff: {}/{}", - baseCommit, - targetCommit); - return null; + return executeCommand( + Command.DIFF, + () -> + commandExecutor.executeCommand( + GitDiffParser::parse, "git", "diff", "-U0", "--word-diff=porcelain", baseCommit)); } } diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/config/ConfigurationApiImplTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/config/ConfigurationApiImplTest.groovy index 6afd6186b4a..4cb3ee89c5a 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/config/ConfigurationApiImplTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/config/ConfigurationApiImplTest.groovy @@ -55,10 +55,10 @@ class ConfigurationApiImplTest extends Specification { where: agentless | compression | expectedSettings - false | false | new CiVisibilitySettings(false, false, false, false, false, false, false, EarlyFlakeDetectionSettings.DEFAULT, TestManagementSettings.DEFAULT) - false | true | new CiVisibilitySettings(true, true, true, true, true, true, true, EarlyFlakeDetectionSettings.DEFAULT, TestManagementSettings.DEFAULT) - true | false | new CiVisibilitySettings(false, true, false, true, false, true, false, new EarlyFlakeDetectionSettings(true, [new ExecutionsByDuration(1000, 3)], 10), new TestManagementSettings(true, 10)) - true | true | new CiVisibilitySettings(false, false, true, true, false, false, true, new EarlyFlakeDetectionSettings(true, [new ExecutionsByDuration(5000, 3), new ExecutionsByDuration(120000, 2)], 10), new TestManagementSettings(true, 20)) + false | false | new CiVisibilitySettings(false, false, false, false, false, false, false, EarlyFlakeDetectionSettings.DEFAULT, TestManagementSettings.DEFAULT, null) + false | true | new CiVisibilitySettings(true, true, true, true, true, true, true, EarlyFlakeDetectionSettings.DEFAULT, TestManagementSettings.DEFAULT, "main") + true | false | new CiVisibilitySettings(false, true, false, true, false, true, false, new EarlyFlakeDetectionSettings(true, [new ExecutionsByDuration(1000, 3)], 10), new TestManagementSettings(true, 10), "master") + true | true | new CiVisibilitySettings(false, false, true, true, false, false, true, new EarlyFlakeDetectionSettings(true, [new ExecutionsByDuration(5000, 3), new ExecutionsByDuration(120000, 2)], 10), new TestManagementSettings(true, 20), "prod") } def "test skippable tests request"() { @@ -218,31 +218,6 @@ class ConfigurationApiImplTest extends Specification { intakeServer.close() } - def "test changed files request"() { - given: - def tracerEnvironment = givenTracerEnvironment() - - def intakeServer = givenBackendEndpoint( - "/api/v2/ci/tests/diffs", - "/datadog/trace/civisibility/config/diffs-request.ftl", - [uid: REQUEST_UID, tracerEnvironment: tracerEnvironment], - "/datadog/trace/civisibility/config/diffs-response.ftl", - [:] - ) - - def configurationApi = givenConfigurationApi(intakeServer) - - when: - def changedFiles = configurationApi.getChangedFiles(tracerEnvironment) - - then: - changedFiles.baseSha == "ef733331f7cee9b1c89d82df87942d8606edf3f7" - changedFiles.files == new HashSet([ - "domains/ci-app/apps/apis/rapid-ci-app/internal/itrapihttp/api.go", - "domains/ci-app/apps/apis/rapid-ci-app/internal/itrapihttp/api_test.go" - ]) - } - private ConfigurationApi givenConfigurationApi(TestHttpServer intakeServer, boolean agentless = true, boolean compression = true) { def api = agentless ? givenIntakeApi(intakeServer.address, compression) diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/diff/DiffTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/diff/DiffTest.groovy index 8e9c155ec71..2ee353760e9 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/diff/DiffTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/diff/DiffTest.groovy @@ -19,9 +19,6 @@ class DiffTest extends Specification { where: diff << [ - new FileDiff(Collections.emptySet()), - new FileDiff(Collections.singleton("path")), - new FileDiff(new HashSet<>(["path-a", "path-b"])), new LineDiff([:]), new LineDiff(["path": lines(10)]), new LineDiff(["path": lines(10, 11, 13)]), diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/diff/FileDiffTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/diff/FileDiffTest.groovy deleted file mode 100644 index 31bfbd1e2b2..00000000000 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/diff/FileDiffTest.groovy +++ /dev/null @@ -1,39 +0,0 @@ -package datadog.trace.civisibility.diff - -import datadog.trace.civisibility.ipc.serialization.Serializer -import spock.lang.Specification - -class FileDiffTest extends Specification { - - def "test diff contains file"() { - when: - def diff = new FileDiff(new HashSet<>(paths)) - - then: - diff.contains(path, 0, Integer.MAX_VALUE) == result - - where: - paths | path | result - ["path-a"] | "path-a" | true - ["path-a"] | "path-b" | false - ["path-a", "path-b"] | "path-a" | true - ["path-a", "path-b"] | "path-b" | true - ["path-a", "path-b"] | "path-c" | false - } - - def "test serialization: #paths"() { - given: - def diff = new FileDiff(new HashSet<>(paths)) - - when: - def serializer = new Serializer() - diff.serialize(serializer) - def buf = serializer.flush() - - then: - FileDiff.deserialize(buf) == diff - - where: - paths << [[], ["path-a"], ["path-a", "path-b"]] - } -} diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/tree/GitClientTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/tree/GitClientTest.groovy index 6dbb26c2565..7e59c128afa 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/tree/GitClientTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/tree/GitClientTest.groovy @@ -1,17 +1,17 @@ package datadog.trace.civisibility.git.tree -import datadog.trace.civisibility.telemetry.CiVisibilityMetricCollectorImpl +import static datadog.trace.civisibility.TestUtils.lines + +import datadog.communication.util.IOUtils import datadog.trace.civisibility.git.GitObject import datadog.trace.civisibility.git.pack.V2PackGitInfoExtractor -import datadog.communication.util.IOUtils -import spock.lang.Specification -import spock.lang.TempDir - +import datadog.trace.civisibility.telemetry.CiVisibilityMetricCollectorImpl import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths - -import static datadog.trace.civisibility.TestUtils.lines +import java.util.stream.Collectors +import spock.lang.Specification +import spock.lang.TempDir class GitClientTest extends Specification { @@ -166,9 +166,9 @@ class GitClientTest extends Specification { then: message == "Adding Git information to test spans (#1242)\n\n" + - "* Initial basic GitInfo implementation.\r\n\r\n" + - "* Adds Author, Committer and Message git parser.\r\n\r\n" + - "* Changes based on the review." + "* Initial basic GitInfo implementation.\r\n\r\n" + + "* Adds Author, Committer and Message git parser.\r\n\r\n" + + "* Changes based on the review." } def "test get author name"() { @@ -329,6 +329,162 @@ class GitClientTest extends Specification { ] } + def "test remove remote prefix"() { + def gitClient = givenGitClient() + + expect: + gitClient.removeRemotePrefix(branchName, remoteName) == expected + + where: + branchName | remoteName | expected + "origin/main" | "origin" | "main" + "upstream/master" | "upstream" | "master" + "origin/feature/test" | "origin" | "feature/test" + "main" | "origin" | "main" + "upstream/main" | "origin" | "upstream/main" + "upstream/bad_origin/main" | "origin" | "upstream/bad_origin/main" + "" | "origin" | "" + } + + def "test branch equals"() { + def gitClient = givenGitClient() + + expect: + gitClient.branchesEquals(branchA, branchB, remoteName) == expected + + where: + branchA | branchB | remoteName | expected + "main" | "main" | "origin" | true + "upsteam/main" | "main" | "upsteam" | true + "origin/main" | "origin/main" | "origin" | true + "main" | "master" | "origin" | false + "upsteam/main" | "origin/main" | "origin" | false + } + + def "test base like branch match"() { + def gitClient = givenGitClient() + + expect: + gitClient.isBaseLikeBranch(branchName, remoteName) == expected + + where: + branchName | remoteName | expected + "main" | "origin" | true + "master" | "origin" | true + "preprod" | "origin" | true + "prod" | "origin" | true + "dev" | "origin" | true + "development" | "origin" | true + "trunk" | "origin" | true + "release/v1.0" | "origin" | true + "release/2023.1" | "origin" | true + "hotfix/critical" | "origin" | true + "hotfix/bug-123" | "origin" | true + "origin/main" | "origin" | true + "origin/master" | "origin" | true + "upstream/main" | "upstream" | true + "feature/test" | "origin" | false + "bugfix/issue-123" | "origin" | false + "update/dependencies" | "origin" | false + "my-feature-branch" | "origin" | false + "" | "origin" | false + "main-backup" | "origin" | false + "maintenance" | "origin" | false + } + + def "test is default branch"() { + def gitClient = givenGitClient() + + expect: + gitClient.isDefaultBranch(branch, defaultBranch, remoteName) == expected + + where: + branch | defaultBranch | remoteName | expected + "main" | "main" | "origin" | true + "master" | "master" | "origin" | true + "origin/main" | "main" | "origin" | true + "upstream/master" | "master" | "upstream" | true + "feature/test" | "main" | "origin" | false + "origin/feature" | "main" | "origin" | false + "main" | "master" | "origin" | false + "main" | null | "origin" | false + } + + def "test get remote name"() { + givenGitRepo(repoPath) + def gitClient = givenGitClient() + + expect: + gitClient.getRemoteName() == remoteName + + where: + repoPath | remoteName + "ci/git/impacted/ghub_actions_clone/git" | "origin" // get remote from upstream + "ci/git/impacted/source_repo/git" | "origin" // no upstream configured for branch + "ci/git/with_pack/git" | "origin" // ambiguous '@{upstream}' argument + } + + def "test detect default branch"() { + given: + givenGitRepo("ci/git/impacted/source_repo/git") + def gitClient = givenGitClient() + + when: + def defaultBranch = gitClient.detectDefaultBranch("origin") + + then: + defaultBranch == "master" + } + + def "test compute branch metrics"() { + given: + givenGitRepo("ci/git/impacted/source_repo/git") + def gitClient = givenGitClient() + + when: + def metrics = gitClient.computeBranchMetrics(["origin/master"], "feature") + + then: + metrics == [new ShellGitClient.BaseBranchMetric("origin/master", 0, 1)] + } + + def "test sort base branches candidates"() { + def gitClient = givenGitClient() + def sortedMetrics = gitClient.sortBaseBranchCandidates(metrics, "main", "origin") + def sortedBranches = sortedMetrics.collect(m -> m.branch) + + expect: + sortedBranches == expectedOrder + + where: + metrics | expectedOrder + [ + new ShellGitClient.BaseBranchMetric("main", 10, 2), + new ShellGitClient.BaseBranchMetric("master", 15, 1), + new ShellGitClient.BaseBranchMetric("origin/main", 5, 2)] | ["master", "main", "origin/main"] + [ + new ShellGitClient.BaseBranchMetric("main", 10, 2), + new ShellGitClient.BaseBranchMetric("master", 15, 2), + new ShellGitClient.BaseBranchMetric("origin/main", 5, 2)] | ["main", "origin/main", "master"] + [] | [] + } + + def "test get base branch sha: #testcaseName"() { + givenGitRepos(["ci/git/impacted/repo_origin", "ci/git/impacted/$repoName"]) + def gitClient = givenGitClient(repoName) + + expect: + gitClient.getBaseCommitSha(baseBranch, null) == expected + + where: + testcaseName | repoName | baseBranch | expected + "base branch provided" | "source_repo" | "master" | "15567afb8426f72157c523d49dd49c24d6fe855e" + "base branch not provided" | "source_repo" | null | "15567afb8426f72157c523d49dd49c24d6fe855e" + "fresh clone with remote cloned into master" | "new_clone" | null | "15567afb8426f72157c523d49dd49c24d6fe855e" + "no remote clone" | "no_remote" | null | null + "Github Actions style clone" | "ghub_actions_clone" | null | "15567afb8426f72157c523d49dd49c24d6fe855e" + } + private void givenGitRepo() { givenGitRepo("ci/git/with_pack/git") } @@ -336,12 +492,36 @@ class GitClientTest extends Specification { private void givenGitRepo(String resourceName) { def gitFolder = Paths.get(getClass().getClassLoader().getResource(resourceName).toURI()) def tempGitFolder = tempDir.resolve(GIT_FOLDER) - Files.createDirectories(tempGitFolder) - IOUtils.copyFolder(gitFolder, tempGitFolder) + copyFolder(gitFolder, tempGitFolder) } - private givenGitClient() { + private void givenGitRepos(List resourceDirs) { + def resources = resourceDirs.stream().map(dir -> Paths.get(getClass().getClassLoader().getResource(dir).toURI())).collect(Collectors.toList()) + for (def resource : resources) { + def gitFolder = resource.resolve("git") + def destFolder = tempDir.resolve(resource.getFileName()) + if (Files.isDirectory(gitFolder)) { + // repos with git/ folder + def tempGitFolder = destFolder.resolve(GIT_FOLDER) + copyFolder(gitFolder, tempGitFolder) + } else { + // dirs with no git/ folder, i.e. a remote + copyFolder(resource, destFolder) + } + } + } + + private static void copyFolder(Path src, Path dest) { + Files.createDirectories(dest) + IOUtils.copyFolder(src, dest) + } + + private givenGitClient(String tempRelPath) { def metricCollector = Stub(CiVisibilityMetricCollectorImpl) - new ShellGitClient(metricCollector, tempDir.toString(), "25 years ago", 10, GIT_COMMAND_TIMEOUT_MILLIS) + new ShellGitClient(metricCollector, tempDir.resolve(tempRelPath).toString(), "25 years ago", 10, GIT_COMMAND_TIMEOUT_MILLIS) + } + + private givenGitClient() { + givenGitClient("") } } diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/build_script.txt b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/build_script.txt new file mode 100644 index 00000000000..05876ce5294 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/build_script.txt @@ -0,0 +1,65 @@ +#!/bin/bash + +# IMPORTANT: always use relative paths, as tests move the folders to temp dirs +base_path="/tmp/impacted/" +origin_path="repo_origin" +source_path="source_repo" +new_clone_path="new_clone" +no_remote_path="no_remote" +ghub_actions_path="ghub_actions_clone" + +base_branch="master" +feature_branch="feature" + +mkdir -p $base_path +cd $base_path + +# create origin +mkdir -p $origin_path +cd $origin_path && git init --bare +cd .. + +# create git repo +mkdir -p $source_path && cd $source_path +git init && git remote add origin "../$origin_path" +echo "Hello, world!" >>README.md && git add README.md && git commit -m "Initial commit" +echo "Hello, world!" >>README.md && git add README.md && git commit -m "Update README" +git push origin master +base_commit=$(git rev-parse HEAD) +# create feature branch +git checkout -b $feature_branch +echo "Feature branch change" >>README.md && git add README.md && git commit -m "Feature branch commit" +git push origin $feature_branch +cd .. + +# clone with remote branch cloned into master branch of local repo +mkdir -p $new_clone_path && cd $new_clone_path +git init +git remote add origin "../$origin_path" +git fetch origin $feature_branch +git reset --hard "origin/$feature_branch" +cd .. + +# remote pointing to non existing repo +mkdir -p $no_remote_path && cd $no_remote_path +git init +echo "base branch file" >>README.md && git add README.md && git commit -m "first commit" +git remote add origin "git@git.com:datadog/non_existing_repo.git" +cd .. + +# github actions style clone +mkdir -p $ghub_actions_path && cd $ghub_actions_path +git init +git remote add origin "../$origin_path" +git fetch --no-tags --prune --no-recurse-submodules origin $feature_branch +git checkout --progress --force -B $feature_branch "refs/remotes/origin/$feature_branch" +cd .. + +echo "BASE COMMIT: $base_commit" + +# cleanup +(cd $origin_path && rm -rf hooks info logs COMMIT_EDITMSG description index README.md) +(cd $source_path && rm -rf .git/hooks .git/info .git/logs .git/COMMIT_EDITMSG .git/description .git/index README.md && mv .git git) +(cd $new_clone_path && rm -rf .git/hooks .git/info .git/logs .git/COMMIT_EDITMSG .git/description .git/index README.md && mv .git git) +(cd $no_remote_path && rm -rf .git/hooks .git/info .git/logs .git/COMMIT_EDITMSG .git/description .git/index README.md && mv .git git) +(cd $ghub_actions_path && rm -rf .git/hooks .git/info .git/logs .git/COMMIT_EDITMSG .git/description .git/index README.md && mv .git git) diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/FETCH_HEAD b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/FETCH_HEAD new file mode 100644 index 00000000000..5f3b6da5777 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/FETCH_HEAD @@ -0,0 +1 @@ +260c03f5848ec8054374407916e806a80bec3729 branch 'feature' of ../repo_origin diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/HEAD b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/HEAD new file mode 100644 index 00000000000..7a3c5afe3e1 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/feature diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/config b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/config new file mode 100644 index 00000000000..275c8aa9057 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/config @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = ../repo_origin + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "feature"] + remote = origin + merge = refs/heads/feature diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/15/567afb8426f72157c523d49dd49c24d6fe855e b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/15/567afb8426f72157c523d49dd49c24d6fe855e new file mode 100644 index 00000000000..a5652bfaff0 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/15/567afb8426f72157c523d49dd49c24d6fe855e differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/26/0c03f5848ec8054374407916e806a80bec3729 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/26/0c03f5848ec8054374407916e806a80bec3729 new file mode 100644 index 00000000000..6a1524dae5b Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/26/0c03f5848ec8054374407916e806a80bec3729 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/3b/bf06262d9604dc0667c1e96b13fbf88f25a43f b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/3b/bf06262d9604dc0667c1e96b13fbf88f25a43f new file mode 100644 index 00000000000..57eb72be65a Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/3b/bf06262d9604dc0667c1e96b13fbf88f25a43f differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/82/ac08af7cb3071716559cc26257ee21dfc8e4d3 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/82/ac08af7cb3071716559cc26257ee21dfc8e4d3 new file mode 100644 index 00000000000..be32d0e3b53 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/82/ac08af7cb3071716559cc26257ee21dfc8e4d3 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/95/e75d98dbaf42c1efc9be0405e079f97aa24888 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/95/e75d98dbaf42c1efc9be0405e079f97aa24888 new file mode 100644 index 00000000000..ede3afb759c Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/95/e75d98dbaf42c1efc9be0405e079f97aa24888 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/af/5626b4a114abcb82d63db7c8082c3c4756e51b b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/af/5626b4a114abcb82d63db7c8082c3c4756e51b new file mode 100644 index 00000000000..822bc151862 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/af/5626b4a114abcb82d63db7c8082c3c4756e51b differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/da/b68487befcc4660679e7218fc5c171b32bc3c1 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/da/b68487befcc4660679e7218fc5c171b32bc3c1 new file mode 100644 index 00000000000..d25508e15c5 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/da/b68487befcc4660679e7218fc5c171b32bc3c1 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/e0/dea118958b3ce7d0b353aaf37177a4eac87d59 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/e0/dea118958b3ce7d0b353aaf37177a4eac87d59 new file mode 100644 index 00000000000..5c5ee7f4c9f Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/e0/dea118958b3ce7d0b353aaf37177a4eac87d59 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/eb/fd7499dae526dcbaf30e1250b1f875946729f8 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/eb/fd7499dae526dcbaf30e1250b1f875946729f8 new file mode 100644 index 00000000000..5d38589c034 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/objects/eb/fd7499dae526dcbaf30e1250b1f875946729f8 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/refs/heads/feature b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/refs/heads/feature new file mode 100644 index 00000000000..0d64cb911b3 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/refs/heads/feature @@ -0,0 +1 @@ +260c03f5848ec8054374407916e806a80bec3729 diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/refs/remotes/origin/feature b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/refs/remotes/origin/feature new file mode 100644 index 00000000000..0d64cb911b3 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/ghub_actions_clone/git/refs/remotes/origin/feature @@ -0,0 +1 @@ +260c03f5848ec8054374407916e806a80bec3729 diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/FETCH_HEAD b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/FETCH_HEAD new file mode 100644 index 00000000000..5f3b6da5777 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/FETCH_HEAD @@ -0,0 +1 @@ +260c03f5848ec8054374407916e806a80bec3729 branch 'feature' of ../repo_origin diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/HEAD b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/HEAD new file mode 100644 index 00000000000..cb089cd89a7 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/config b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/config new file mode 100644 index 00000000000..69520278b4d --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/config @@ -0,0 +1,10 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = ../repo_origin + fetch = +refs/heads/*:refs/remotes/origin/* diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/15/567afb8426f72157c523d49dd49c24d6fe855e b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/15/567afb8426f72157c523d49dd49c24d6fe855e new file mode 100644 index 00000000000..a5652bfaff0 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/15/567afb8426f72157c523d49dd49c24d6fe855e differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/26/0c03f5848ec8054374407916e806a80bec3729 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/26/0c03f5848ec8054374407916e806a80bec3729 new file mode 100644 index 00000000000..6a1524dae5b Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/26/0c03f5848ec8054374407916e806a80bec3729 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/3b/bf06262d9604dc0667c1e96b13fbf88f25a43f b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/3b/bf06262d9604dc0667c1e96b13fbf88f25a43f new file mode 100644 index 00000000000..57eb72be65a Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/3b/bf06262d9604dc0667c1e96b13fbf88f25a43f differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/82/ac08af7cb3071716559cc26257ee21dfc8e4d3 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/82/ac08af7cb3071716559cc26257ee21dfc8e4d3 new file mode 100644 index 00000000000..be32d0e3b53 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/82/ac08af7cb3071716559cc26257ee21dfc8e4d3 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/95/e75d98dbaf42c1efc9be0405e079f97aa24888 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/95/e75d98dbaf42c1efc9be0405e079f97aa24888 new file mode 100644 index 00000000000..ede3afb759c Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/95/e75d98dbaf42c1efc9be0405e079f97aa24888 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/af/5626b4a114abcb82d63db7c8082c3c4756e51b b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/af/5626b4a114abcb82d63db7c8082c3c4756e51b new file mode 100644 index 00000000000..822bc151862 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/af/5626b4a114abcb82d63db7c8082c3c4756e51b differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/da/b68487befcc4660679e7218fc5c171b32bc3c1 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/da/b68487befcc4660679e7218fc5c171b32bc3c1 new file mode 100644 index 00000000000..d25508e15c5 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/da/b68487befcc4660679e7218fc5c171b32bc3c1 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/e0/dea118958b3ce7d0b353aaf37177a4eac87d59 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/e0/dea118958b3ce7d0b353aaf37177a4eac87d59 new file mode 100644 index 00000000000..5c5ee7f4c9f Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/e0/dea118958b3ce7d0b353aaf37177a4eac87d59 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/eb/fd7499dae526dcbaf30e1250b1f875946729f8 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/eb/fd7499dae526dcbaf30e1250b1f875946729f8 new file mode 100644 index 00000000000..5d38589c034 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/objects/eb/fd7499dae526dcbaf30e1250b1f875946729f8 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/refs/heads/master b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/refs/heads/master new file mode 100644 index 00000000000..0d64cb911b3 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/refs/heads/master @@ -0,0 +1 @@ +260c03f5848ec8054374407916e806a80bec3729 diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/refs/remotes/origin/feature b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/refs/remotes/origin/feature new file mode 100644 index 00000000000..0d64cb911b3 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/new_clone/git/refs/remotes/origin/feature @@ -0,0 +1 @@ +260c03f5848ec8054374407916e806a80bec3729 diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/HEAD b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/HEAD new file mode 100644 index 00000000000..cb089cd89a7 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/config b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/config new file mode 100644 index 00000000000..155f4087068 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/config @@ -0,0 +1,10 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = git@git.com:datadog/non_existing_repo.git + fetch = +refs/heads/*:refs/remotes/origin/* diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/objects/12/713d09915d037135ac7a4fdc092730ee493b2f b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/objects/12/713d09915d037135ac7a4fdc092730ee493b2f new file mode 100644 index 00000000000..a869f801669 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/objects/12/713d09915d037135ac7a4fdc092730ee493b2f differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/objects/a9/d9bdb3b83442c8e55b6dfd61b0790847720ee8 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/objects/a9/d9bdb3b83442c8e55b6dfd61b0790847720ee8 new file mode 100644 index 00000000000..8ff8c7eebcb Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/objects/a9/d9bdb3b83442c8e55b6dfd61b0790847720ee8 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/objects/ad/686ebdcb37b8660171e8df4b922e018f92f508 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/objects/ad/686ebdcb37b8660171e8df4b922e018f92f508 new file mode 100644 index 00000000000..82909bfce18 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/objects/ad/686ebdcb37b8660171e8df4b922e018f92f508 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/refs/heads/master b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/refs/heads/master new file mode 100644 index 00000000000..298cf07c2cd --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/no_remote/git/refs/heads/master @@ -0,0 +1 @@ +12713d09915d037135ac7a4fdc092730ee493b2f diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/HEAD b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/HEAD new file mode 100644 index 00000000000..cb089cd89a7 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/config b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/config new file mode 100644 index 00000000000..e6da231579b --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/config @@ -0,0 +1,6 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/15/567afb8426f72157c523d49dd49c24d6fe855e b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/15/567afb8426f72157c523d49dd49c24d6fe855e new file mode 100644 index 00000000000..a5652bfaff0 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/15/567afb8426f72157c523d49dd49c24d6fe855e differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/26/0c03f5848ec8054374407916e806a80bec3729 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/26/0c03f5848ec8054374407916e806a80bec3729 new file mode 100644 index 00000000000..6a1524dae5b Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/26/0c03f5848ec8054374407916e806a80bec3729 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/3b/bf06262d9604dc0667c1e96b13fbf88f25a43f b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/3b/bf06262d9604dc0667c1e96b13fbf88f25a43f new file mode 100644 index 00000000000..57eb72be65a Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/3b/bf06262d9604dc0667c1e96b13fbf88f25a43f differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/82/ac08af7cb3071716559cc26257ee21dfc8e4d3 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/82/ac08af7cb3071716559cc26257ee21dfc8e4d3 new file mode 100644 index 00000000000..be32d0e3b53 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/82/ac08af7cb3071716559cc26257ee21dfc8e4d3 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/95/e75d98dbaf42c1efc9be0405e079f97aa24888 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/95/e75d98dbaf42c1efc9be0405e079f97aa24888 new file mode 100644 index 00000000000..ede3afb759c Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/95/e75d98dbaf42c1efc9be0405e079f97aa24888 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/af/5626b4a114abcb82d63db7c8082c3c4756e51b b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/af/5626b4a114abcb82d63db7c8082c3c4756e51b new file mode 100644 index 00000000000..822bc151862 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/af/5626b4a114abcb82d63db7c8082c3c4756e51b differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/da/b68487befcc4660679e7218fc5c171b32bc3c1 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/da/b68487befcc4660679e7218fc5c171b32bc3c1 new file mode 100644 index 00000000000..d25508e15c5 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/da/b68487befcc4660679e7218fc5c171b32bc3c1 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/e0/dea118958b3ce7d0b353aaf37177a4eac87d59 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/e0/dea118958b3ce7d0b353aaf37177a4eac87d59 new file mode 100644 index 00000000000..5c5ee7f4c9f Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/e0/dea118958b3ce7d0b353aaf37177a4eac87d59 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/eb/fd7499dae526dcbaf30e1250b1f875946729f8 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/eb/fd7499dae526dcbaf30e1250b1f875946729f8 new file mode 100644 index 00000000000..5d38589c034 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/objects/eb/fd7499dae526dcbaf30e1250b1f875946729f8 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/refs/heads/feature b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/refs/heads/feature new file mode 100644 index 00000000000..0d64cb911b3 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/refs/heads/feature @@ -0,0 +1 @@ +260c03f5848ec8054374407916e806a80bec3729 diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/refs/heads/master b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/refs/heads/master new file mode 100644 index 00000000000..690791ba203 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/repo_origin/refs/heads/master @@ -0,0 +1 @@ +15567afb8426f72157c523d49dd49c24d6fe855e diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/HEAD b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/HEAD new file mode 100644 index 00000000000..7a3c5afe3e1 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/feature diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/config b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/config new file mode 100644 index 00000000000..69520278b4d --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/config @@ -0,0 +1,10 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + ignorecase = true + precomposeunicode = true +[remote "origin"] + url = ../repo_origin + fetch = +refs/heads/*:refs/remotes/origin/* diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/15/567afb8426f72157c523d49dd49c24d6fe855e b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/15/567afb8426f72157c523d49dd49c24d6fe855e new file mode 100644 index 00000000000..a5652bfaff0 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/15/567afb8426f72157c523d49dd49c24d6fe855e differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/26/0c03f5848ec8054374407916e806a80bec3729 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/26/0c03f5848ec8054374407916e806a80bec3729 new file mode 100644 index 00000000000..6a1524dae5b Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/26/0c03f5848ec8054374407916e806a80bec3729 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/3b/bf06262d9604dc0667c1e96b13fbf88f25a43f b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/3b/bf06262d9604dc0667c1e96b13fbf88f25a43f new file mode 100644 index 00000000000..57eb72be65a Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/3b/bf06262d9604dc0667c1e96b13fbf88f25a43f differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/82/ac08af7cb3071716559cc26257ee21dfc8e4d3 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/82/ac08af7cb3071716559cc26257ee21dfc8e4d3 new file mode 100644 index 00000000000..be32d0e3b53 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/82/ac08af7cb3071716559cc26257ee21dfc8e4d3 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/95/e75d98dbaf42c1efc9be0405e079f97aa24888 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/95/e75d98dbaf42c1efc9be0405e079f97aa24888 new file mode 100644 index 00000000000..ede3afb759c Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/95/e75d98dbaf42c1efc9be0405e079f97aa24888 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/af/5626b4a114abcb82d63db7c8082c3c4756e51b b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/af/5626b4a114abcb82d63db7c8082c3c4756e51b new file mode 100644 index 00000000000..822bc151862 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/af/5626b4a114abcb82d63db7c8082c3c4756e51b differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/da/b68487befcc4660679e7218fc5c171b32bc3c1 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/da/b68487befcc4660679e7218fc5c171b32bc3c1 new file mode 100644 index 00000000000..d25508e15c5 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/da/b68487befcc4660679e7218fc5c171b32bc3c1 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/e0/dea118958b3ce7d0b353aaf37177a4eac87d59 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/e0/dea118958b3ce7d0b353aaf37177a4eac87d59 new file mode 100644 index 00000000000..5c5ee7f4c9f Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/e0/dea118958b3ce7d0b353aaf37177a4eac87d59 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/eb/fd7499dae526dcbaf30e1250b1f875946729f8 b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/eb/fd7499dae526dcbaf30e1250b1f875946729f8 new file mode 100644 index 00000000000..5d38589c034 Binary files /dev/null and b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/objects/eb/fd7499dae526dcbaf30e1250b1f875946729f8 differ diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/refs/heads/feature b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/refs/heads/feature new file mode 100644 index 00000000000..0d64cb911b3 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/refs/heads/feature @@ -0,0 +1 @@ +260c03f5848ec8054374407916e806a80bec3729 diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/refs/heads/master b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/refs/heads/master new file mode 100644 index 00000000000..690791ba203 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/refs/heads/master @@ -0,0 +1 @@ +15567afb8426f72157c523d49dd49c24d6fe855e diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/refs/remotes/origin/feature b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/refs/remotes/origin/feature new file mode 100644 index 00000000000..0d64cb911b3 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/refs/remotes/origin/feature @@ -0,0 +1 @@ +260c03f5848ec8054374407916e806a80bec3729 diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/refs/remotes/origin/master b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/refs/remotes/origin/master new file mode 100644 index 00000000000..690791ba203 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/ci/git/impacted/source_repo/git/refs/remotes/origin/master @@ -0,0 +1 @@ +15567afb8426f72157c523d49dd49c24d6fe855e diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/datadog/trace/civisibility/config/diffs-request.ftl b/dd-java-agent/agent-ci-visibility/src/test/resources/datadog/trace/civisibility/config/diffs-request.ftl deleted file mode 100644 index fc4ab315577..00000000000 --- a/dd-java-agent/agent-ci-visibility/src/test/resources/datadog/trace/civisibility/config/diffs-request.ftl +++ /dev/null @@ -1,29 +0,0 @@ -{ - "data": { - "type" : "ci_app_tests_diffs_request", - "id" : "${uid}", - "attributes": { - "service" : "${tracerEnvironment.service}", - "env" : "${tracerEnvironment.env}", - "repository_url": "${tracerEnvironment.repositoryUrl}", - "branch" : "${tracerEnvironment.branch}", - "sha" : "${tracerEnvironment.sha}", - "test_level" : "${tracerEnvironment.testLevel}", - "configurations": { - "os.platform" : "${tracerEnvironment.configurations.osPlatform}", - "os.architecture" : "${tracerEnvironment.configurations.osArchitecture}", - "os.arch" : "${tracerEnvironment.configurations.osArchitecture}", - "os.version" : "${tracerEnvironment.configurations.osVersion}", - "runtime.name" : "${tracerEnvironment.configurations.runtimeName}", - "runtime.version" : "${tracerEnvironment.configurations.runtimeVersion}", - "runtime.vendor" : "${tracerEnvironment.configurations.runtimeVendor}", - "runtime.architecture": "${tracerEnvironment.configurations.runtimeArchitecture}", - "custom" : { - <#list tracerEnvironment.configurations.custom as customTag, customValue> - "${customTag}": "${customValue}"<#if customTag?has_next>, - - } - } - } - } -} diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/datadog/trace/civisibility/config/diffs-response.ftl b/dd-java-agent/agent-ci-visibility/src/test/resources/datadog/trace/civisibility/config/diffs-response.ftl deleted file mode 100644 index fe0986ed261..00000000000 --- a/dd-java-agent/agent-ci-visibility/src/test/resources/datadog/trace/civisibility/config/diffs-response.ftl +++ /dev/null @@ -1,13 +0,0 @@ -{ - "data": { - "type": "ci_app_tests_diffs_response", - "id": "1235456", - "attributes": { - "base_sha": "ef733331f7cee9b1c89d82df87942d8606edf3f7", - "files": [ - "domains/ci-app/apps/apis/rapid-ci-app/internal/itrapihttp/api.go", - "domains/ci-app/apps/apis/rapid-ci-app/internal/itrapihttp/api_test.go" - ] - } - } -} diff --git a/dd-java-agent/agent-ci-visibility/src/test/resources/datadog/trace/civisibility/config/settings-response.ftl b/dd-java-agent/agent-ci-visibility/src/test/resources/datadog/trace/civisibility/config/settings-response.ftl index 5f5c61db670..f21b821434e 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/resources/datadog/trace/civisibility/config/settings-response.ftl +++ b/dd-java-agent/agent-ci-visibility/src/test/resources/datadog/trace/civisibility/config/settings-response.ftl @@ -10,6 +10,9 @@ "flaky_test_retries_enabled": ${settings.flakyTestRetriesEnabled?c}, "impacted_tests_enabled": ${settings.impactedTestsDetectionEnabled?c}, "known_tests_enabled": ${settings.knownTestsEnabled?c}, + <#if settings.defaultBranch??> + "default_branch": "${settings.defaultBranch}", + "early_flake_detection": { "enabled": ${settings.earlyFlakeDetectionSettings.enabled?c}, "slow_test_retries": { diff --git a/dd-java-agent/instrumentation/junit-4.10/munit-junit-4/src/test/groovy/MUnitTest.groovy b/dd-java-agent/instrumentation/junit-4.10/munit-junit-4/src/test/groovy/MUnitTest.groovy index 5df618caa3c..2c490c78046 100644 --- a/dd-java-agent/instrumentation/junit-4.10/munit-junit-4/src/test/groovy/MUnitTest.groovy +++ b/dd-java-agent/instrumentation/junit-4.10/munit-junit-4/src/test/groovy/MUnitTest.groovy @@ -2,7 +2,6 @@ import datadog.trace.api.DisableTestTrace import datadog.trace.api.civisibility.config.TestFQN import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation import datadog.trace.civisibility.CiVisibilityInstrumentationTest -import datadog.trace.civisibility.diff.FileDiff import datadog.trace.civisibility.diff.LineDiff import datadog.trace.instrumentation.junit4.MUnitTracingListener import datadog.trace.instrumentation.junit4.MUnitUtils @@ -77,8 +76,6 @@ class MUnitTest extends CiVisibilityInstrumentationTest { where: testcaseName | tests | prDiff "test-succeed" | [TestSucceedMUnit] | LineDiff.EMPTY - "test-succeed" | [TestSucceedMUnit] | new FileDiff(new HashSet()) - "test-succeed-impacted" | [TestSucceedMUnit] | new FileDiff(new HashSet([DUMMY_SOURCE_PATH])) "test-succeed" | [TestSucceedMUnit] | new LineDiff([(DUMMY_SOURCE_PATH): lines()]) "test-succeed-impacted" | [TestSucceedMUnit] | new LineDiff([(DUMMY_SOURCE_PATH): lines(DUMMY_TEST_METHOD_START)]) } diff --git a/dd-java-agent/instrumentation/junit-4.10/src/test/groovy/JUnit4Test.groovy b/dd-java-agent/instrumentation/junit-4.10/src/test/groovy/JUnit4Test.groovy index c6e438c1e3e..b6729a25612 100644 --- a/dd-java-agent/instrumentation/junit-4.10/src/test/groovy/JUnit4Test.groovy +++ b/dd-java-agent/instrumentation/junit-4.10/src/test/groovy/JUnit4Test.groovy @@ -3,7 +3,6 @@ import datadog.trace.api.civisibility.config.TestFQN import datadog.trace.api.civisibility.config.TestIdentifier import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation import datadog.trace.civisibility.CiVisibilityInstrumentationTest -import datadog.trace.civisibility.diff.FileDiff import datadog.trace.civisibility.diff.LineDiff import datadog.trace.instrumentation.junit4.JUnit4Utils import datadog.trace.instrumentation.junit4.TestEventsHandlerHolder @@ -124,8 +123,6 @@ class JUnit4Test extends CiVisibilityInstrumentationTest { where: testcaseName | tests | prDiff "test-succeed" | [TestSucceed] | LineDiff.EMPTY - "test-succeed" | [TestSucceed] | new FileDiff(new HashSet()) - "test-succeed-impacted" | [TestSucceed] | new FileDiff(new HashSet([DUMMY_SOURCE_PATH])) "test-succeed" | [TestSucceed] | new LineDiff([(DUMMY_SOURCE_PATH): lines()]) "test-succeed-impacted" | [TestSucceed] | new LineDiff([(DUMMY_SOURCE_PATH): lines(DUMMY_TEST_METHOD_START)]) } diff --git a/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/src/test/groovy/SpockTest.groovy b/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/src/test/groovy/SpockTest.groovy index fe54b7399fa..577cef7bdcf 100644 --- a/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/src/test/groovy/SpockTest.groovy +++ b/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/src/test/groovy/SpockTest.groovy @@ -1,11 +1,14 @@ +import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass + import datadog.trace.api.DisableTestTrace import datadog.trace.api.civisibility.config.TestFQN import datadog.trace.api.civisibility.config.TestIdentifier import datadog.trace.civisibility.CiVisibilityInstrumentationTest -import datadog.trace.civisibility.diff.FileDiff import datadog.trace.civisibility.diff.LineDiff import datadog.trace.instrumentation.junit5.JUnitPlatformUtils import datadog.trace.instrumentation.junit5.TestEventsHandlerHolder +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.CopyOnWriteArrayList import org.example.TestFailedParameterizedSpock import org.example.TestFailedSpock import org.example.TestFailedThenSucceedParameterizedSpock @@ -29,11 +32,6 @@ import org.junit.platform.launcher.core.LauncherFactory import org.spockframework.runtime.SpockEngine import org.spockframework.util.SpockReleaseInfo -import java.util.concurrent.ConcurrentHashMap -import java.util.concurrent.CopyOnWriteArrayList - -import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass - @DisableTestTrace(reason = "avoid self-tracing") class SpockTest extends CiVisibilityInstrumentationTest { @@ -115,7 +113,7 @@ class SpockTest extends CiVisibilityInstrumentationTest { "test-efd-new-slow-test" | true | [TestSucceedSpockSlow] | [] // is executed only twice "test-efd-new-very-slow-test" | true | [TestSucceedSpockVerySlow] | [] // is executed only once "test-efd-faulty-session-threshold" | false | [TestSucceedAndFailedSpock] | [] - "test-efd-skip-new-test" | true | [TestSucceedSpockSkipEfd] | [] + "test-efd-skip-new-test" | true | [TestSucceedSpockSkipEfd] | [] } def "test impacted tests detection #testcaseName"() { @@ -129,8 +127,6 @@ class SpockTest extends CiVisibilityInstrumentationTest { where: testcaseName | tests | prDiff "test-succeed" | [TestSucceedSpock] | LineDiff.EMPTY - "test-succeed" | [TestSucceedSpock] | new FileDiff(new HashSet()) - "test-succeed-impacted" | [TestSucceedSpock] | new FileDiff(new HashSet([DUMMY_SOURCE_PATH])) "test-succeed" | [TestSucceedSpock] | new LineDiff([(DUMMY_SOURCE_PATH): lines()]) "test-succeed-impacted" | [TestSucceedSpock] | new LineDiff([(DUMMY_SOURCE_PATH): lines(DUMMY_TEST_METHOD_START)]) } diff --git a/dd-java-agent/instrumentation/junit-5.3/src/test/groovy/JUnit5Test.groovy b/dd-java-agent/instrumentation/junit-5.3/src/test/groovy/JUnit5Test.groovy index 20e5f45aa4d..ef11eaff56c 100644 --- a/dd-java-agent/instrumentation/junit-5.3/src/test/groovy/JUnit5Test.groovy +++ b/dd-java-agent/instrumentation/junit-5.3/src/test/groovy/JUnit5Test.groovy @@ -1,15 +1,14 @@ -import datadog.trace.agent.test.asserts.ListWriterAssert -import datadog.trace.api.DDSpanTypes +import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass + import datadog.trace.api.DisableTestTrace -import datadog.trace.api.civisibility.config.LibraryCapability import datadog.trace.api.civisibility.config.TestFQN import datadog.trace.api.civisibility.config.TestIdentifier import datadog.trace.civisibility.CiVisibilityInstrumentationTest -import datadog.trace.civisibility.CiVisibilityTestUtils -import datadog.trace.civisibility.diff.FileDiff import datadog.trace.civisibility.diff.LineDiff import datadog.trace.instrumentation.junit5.JUnitPlatformUtils import datadog.trace.instrumentation.junit5.TestEventsHandlerHolder +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.CopyOnWriteArrayList import org.example.TestAssumption import org.example.TestAssumptionAndSucceed import org.example.TestAssumptionLegacy @@ -50,12 +49,6 @@ import org.junit.platform.launcher.core.LauncherConfig import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder import org.junit.platform.launcher.core.LauncherFactory -import java.util.concurrent.ConcurrentHashMap -import java.util.concurrent.CopyOnWriteArrayList -import java.util.stream.Collectors - -import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass - @DisableTestTrace(reason = "avoid self-tracing") class JUnit5Test extends CiVisibilityInstrumentationTest { @@ -168,8 +161,6 @@ class JUnit5Test extends CiVisibilityInstrumentationTest { where: testcaseName | tests | prDiff "test-succeed" | [TestSucceed] | LineDiff.EMPTY - "test-succeed" | [TestSucceed] | new FileDiff(new HashSet()) - "test-succeed-impacted" | [TestSucceed] | new FileDiff(new HashSet([DUMMY_SOURCE_PATH])) "test-succeed" | [TestSucceed] | new LineDiff([(DUMMY_SOURCE_PATH): lines()]) "test-succeed-impacted" | [TestSucceed] | new LineDiff([(DUMMY_SOURCE_PATH): lines(DUMMY_TEST_METHOD_START)]) } diff --git a/dd-java-agent/instrumentation/scalatest/src/test/groovy/ScalatestTest.groovy b/dd-java-agent/instrumentation/scalatest/src/test/groovy/ScalatestTest.groovy index f9e551788d4..7686255dcd7 100644 --- a/dd-java-agent/instrumentation/scalatest/src/test/groovy/ScalatestTest.groovy +++ b/dd-java-agent/instrumentation/scalatest/src/test/groovy/ScalatestTest.groovy @@ -1,7 +1,6 @@ import datadog.trace.api.civisibility.config.TestFQN import datadog.trace.api.civisibility.config.TestIdentifier import datadog.trace.civisibility.CiVisibilityInstrumentationTest -import datadog.trace.civisibility.diff.FileDiff import datadog.trace.civisibility.diff.LineDiff import datadog.trace.instrumentation.scalatest.ScalatestUtils import org.example.TestFailed @@ -98,8 +97,6 @@ class ScalatestTest extends CiVisibilityInstrumentationTest { where: testcaseName | tests | prDiff "test-succeed" | [TestSucceed] | LineDiff.EMPTY - "test-succeed" | [TestSucceed] | new FileDiff(new HashSet()) - "test-succeed-impacted" | [TestSucceed] | new FileDiff(new HashSet([DUMMY_SOURCE_PATH])) "test-succeed" | [TestSucceed] | new LineDiff([(DUMMY_SOURCE_PATH): lines()]) "test-succeed-impacted" | [TestSucceed] | new LineDiff([(DUMMY_SOURCE_PATH): lines(DUMMY_TEST_METHOD_START)]) } diff --git a/dd-java-agent/instrumentation/testng/src/testFixtures/groovy/datadog/trace/instrumentation/testng/TestNGTest.groovy b/dd-java-agent/instrumentation/testng/src/testFixtures/groovy/datadog/trace/instrumentation/testng/TestNGTest.groovy index f737cafd5ef..c20783d5260 100644 --- a/dd-java-agent/instrumentation/testng/src/testFixtures/groovy/datadog/trace/instrumentation/testng/TestNGTest.groovy +++ b/dd-java-agent/instrumentation/testng/src/testFixtures/groovy/datadog/trace/instrumentation/testng/TestNGTest.groovy @@ -1,10 +1,8 @@ package datadog.trace.instrumentation.testng - import datadog.trace.api.civisibility.config.TestFQN import datadog.trace.api.civisibility.config.TestIdentifier import datadog.trace.civisibility.CiVisibilityInstrumentationTest -import datadog.trace.civisibility.diff.FileDiff import datadog.trace.civisibility.diff.LineDiff import org.example.* import org.junit.jupiter.api.Assumptions @@ -149,8 +147,6 @@ abstract class TestNGTest extends CiVisibilityInstrumentationTest { where: testcaseName | tests | prDiff "test-succeed" | [TestSucceed] | LineDiff.EMPTY - "test-succeed" | [TestSucceed] | new FileDiff(new HashSet()) - "test-succeed-impacted" | [TestSucceed] | new FileDiff(new HashSet([DUMMY_SOURCE_PATH])) "test-succeed" | [TestSucceed] | new LineDiff([(DUMMY_SOURCE_PATH): lines()]) "test-succeed-impacted" | [TestSucceed] | new LineDiff([(DUMMY_SOURCE_PATH): lines(DUMMY_TEST_METHOD_START)]) } diff --git a/dd-smoke-tests/backend-mock/src/main/groovy/datadog/smoketest/MockBackend.groovy b/dd-smoke-tests/backend-mock/src/main/groovy/datadog/smoketest/MockBackend.groovy index 76ca256f6e9..e16b118f0be 100644 --- a/dd-smoke-tests/backend-mock/src/main/groovy/datadog/smoketest/MockBackend.groovy +++ b/dd-smoke-tests/backend-mock/src/main/groovy/datadog/smoketest/MockBackend.groovy @@ -1,19 +1,17 @@ package datadog.smoketest +import static datadog.trace.agent.test.server.http.TestHttpServer.httpServer + import com.fasterxml.jackson.databind.ObjectMapper import datadog.trace.agent.test.server.http.TestHttpServer import datadog.trace.test.util.MultipartRequestParser -import org.apache.commons.io.IOUtils -import org.msgpack.jackson.dataformat.MessagePackFactory -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 - -import static datadog.trace.agent.test.server.http.TestHttpServer.httpServer +import org.apache.commons.io.IOUtils +import org.msgpack.jackson.dataformat.MessagePackFactory +import spock.util.concurrent.PollingConditions class MockBackend implements AutoCloseable { @@ -33,7 +31,6 @@ class MockBackend implements AutoCloseable { private final Collection> flakyTests = new CopyOnWriteArrayList<>() private final Collection> knownTests = new CopyOnWriteArrayList<>() private final Collection> testManagement = new CopyOnWriteArrayList<>() - private final Collection changedFiles = new CopyOnWriteArrayList<>() private boolean itrEnabled = true private boolean codeCoverageEnabled = true @@ -55,7 +52,15 @@ class MockBackend implements AutoCloseable { flakyTests.clear() knownTests.clear() testManagement.clear() - changedFiles.clear() + + itrEnabled = true + codeCoverageEnabled = true + testsSkippingEnabled = true + flakyRetriesEnabled = false + impactedTestsDetectionEnabled = false + knownTestsEnabled = false + testManagementEnabled = false + attemptToFixRetries = 0 } @Override @@ -76,17 +81,13 @@ class MockBackend implements AutoCloseable { } void givenSkippableTest(String module, String suite, String name, Map coverage = null) { - skippableTests.add(["module": module, "suite": suite, "name": name, "coverage": coverage ]) + skippableTests.add(["module": module, "suite": suite, "name": name, "coverage": coverage]) } void givenImpactedTestsDetection(boolean impactedTestsDetectionEnabled) { this.impactedTestsDetectionEnabled = impactedTestsDetectionEnabled } - void givenChangedFile(String relativePath) { - changedFiles.add(relativePath) - } - void givenKnownTests(boolean knownTests) { this.knownTestsEnabled = knownTests } @@ -105,27 +106,27 @@ class MockBackend implements AutoCloseable { void givenQuarantinedTests(String module, String suite, String name) { testManagement.add([ - "module": module, - "suite": suite, - "name": name, + "module" : module, + "suite" : suite, + "name" : name, "properties": ["quarantined": true] ]) } void givenDisabledTests(String module, String suite, String name) { testManagement.add([ - "module": module, - "suite": suite, - "name": name, + "module" : module, + "suite" : suite, + "name" : name, "properties": ["disabled": true] ]) } void givenAttemptToFixTests(String module, String suite, String name) { testManagement.add([ - "module": module, - "suite": suite, - "name": name, + "module" : module, + "suite" : suite, + "name" : name, "properties": ["attempt_to_fix": true] ]) } @@ -279,7 +280,7 @@ class MockBackend implements AutoCloseable { prefix("/api/v2/ci/libraries/tests") { Map modules = [:] - for (Map test : knownTests) { + for (Map test : knownTests) { Map suites = modules.computeIfAbsent("${test.module}", k -> [:]) List tests = suites.computeIfAbsent("${test.suite}", k -> []) tests.add(test.name) @@ -331,23 +332,6 @@ 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": "", - "attributes": { - "base_sha": "ef733331f7cee9b1c89d82df87942d8606edf3f7", - "files": [ ${changedFiles.stream().map(f -> '"' + f + '"').collect(Collectors.joining(","))} ] - } - } - } - """).bytes)) - } } } diff --git a/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy b/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy index ff039e7e51e..52100d79e98 100644 --- a/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy +++ b/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy @@ -107,27 +107,6 @@ 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, - "${Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_IMPACTED_TESTS_BACKEND_REQUEST_ENABLED)}=true" 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" - } - def "test test management"() { givenWrapperPropertiesFile(mavenVersion) givenMavenProjectFiles(projectName) diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_impacted_tests/coverages.ftl b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_impacted_tests/coverages.ftl deleted file mode 100644 index cb8d26b550c..00000000000 --- a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_impacted_tests/coverages.ftl +++ /dev/null @@ -1,19 +0,0 @@ -[ { - "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} -} ] \ No newline at end of file diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_impacted_tests/events.ftl b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_impacted_tests/events.ftl deleted file mode 100644 index 6ff34b20a28..00000000000 --- a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_impacted_tests/events.ftl +++ /dev/null @@ -1,393 +0,0 @@ -[ { - "content" : { - "duration" : ${content_duration}, - "error" : 0, - "meta" : { - "_dd.p.tid" : ${content_meta__dd_p_tid}, - "_dd.test.is_user_provided_service" : "true", - "_dd.tracer_host" : ${content_meta__dd_tracer_host}, - "ci.workspace_path" : ${content_meta_ci_workspace_path}, - "component" : "maven", - "env" : "integration-test", - "language" : "jvm", - "library_version" : ${content_meta_library_version}, - "os.architecture" : ${content_meta_os_architecture}, - "os.platform" : ${content_meta_os_platform}, - "os.version" : ${content_meta_os_version}, - "runtime-id" : ${content_meta_runtime_id}, - "runtime.name" : ${content_meta_runtime_name}, - "runtime.vendor" : ${content_meta_runtime_vendor}, - "runtime.version" : ${content_meta_runtime_version}, - "span.kind" : "test_session_end", - "test.code_coverage.enabled" : "true", - "test.command" : "mvn -B test", - "test.framework" : "junit4", - "test.framework_version" : "4.13.2", - "test.itr.tests_skipping.enabled" : "true", - "test.itr.tests_skipping.type" : "test", - "test.status" : "pass", - "test.toolchain" : ${content_meta_test_toolchain}, - "test.type" : "test", - "test_session.name" : "mvn -B test" - }, - "metrics" : { - "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count}, - "_dd.profiling.enabled" : 0, - "_dd.trace_span_attribute_schema" : 0, - "process_id" : ${content_metrics_process_id}, - "test.itr.tests_skipping.count" : 0 - }, - "name" : "maven.test_session", - "resource" : "Maven Smoke Tests Project", - "service" : "test-maven-service", - "start" : ${content_start}, - "test_session_id" : ${content_test_session_id} - }, - "type" : "test_session_end", - "version" : 1 -}, { - "content" : { - "duration" : ${content_duration_2}, - "error" : 0, - "meta" : { - "_dd.p.tid" : ${content_meta__dd_p_tid_2}, - "_dd.test.is_user_provided_service" : "true", - "ci.workspace_path" : ${content_meta_ci_workspace_path}, - "component" : "maven", - "env" : "integration-test", - "language" : "jvm", - "library_version" : ${content_meta_library_version}, - "os.architecture" : ${content_meta_os_architecture}, - "os.platform" : ${content_meta_os_platform}, - "os.version" : ${content_meta_os_version}, - "runtime-id" : ${content_meta_runtime_id}, - "runtime.name" : ${content_meta_runtime_name}, - "runtime.vendor" : ${content_meta_runtime_vendor}, - "runtime.version" : ${content_meta_runtime_version}, - "span.kind" : "test_module_end", - "test.code_coverage.enabled" : "true", - "test.command" : "mvn -B test", - "test.execution" : "maven-surefire-plugin:test:default-test", - "test.framework" : "junit4", - "test.framework_version" : "4.13.2", - "test.itr.tests_skipping.enabled" : "true", - "test.itr.tests_skipping.type" : "test", - "test.module" : "Maven Smoke Tests Project maven-surefire-plugin default-test", - "test.status" : "pass", - "test.type" : "test", - "test_session.name" : "mvn -B test" - }, - "metrics" : { - "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_2}, - "test.itr.tests_skipping.count" : 0 - }, - "name" : "maven.test_module", - "resource" : "Maven Smoke Tests Project maven-surefire-plugin default-test", - "service" : "test-maven-service", - "start" : ${content_start_2}, - "test_module_id" : ${content_test_module_id}, - "test_session_id" : ${content_test_session_id} - }, - "type" : "test_module_end", - "version" : 1 -}, { - "content" : { - "duration" : ${content_duration_3}, - "error" : 0, - "meta" : { - "_dd.p.tid" : ${content_meta__dd_p_tid_3}, - "_dd.test.is_user_provided_service" : "true", - "env" : "integration-test", - "execution" : "default-compile", - "language" : "jvm", - "library_version" : ${content_meta_library_version}, - "os.architecture" : ${content_meta_os_architecture}, - "os.platform" : ${content_meta_os_platform}, - "os.version" : ${content_meta_os_version}, - "plugin" : "maven-compiler-plugin", - "project" : "Maven Smoke Tests Project", - "runtime-id" : ${content_meta_runtime_id}, - "runtime.name" : ${content_meta_runtime_name}, - "runtime.vendor" : ${content_meta_runtime_vendor}, - "runtime.version" : ${content_meta_runtime_version} - }, - "metrics" : { }, - "name" : "Maven_Smoke_Tests_Project_maven_compiler_plugin_default_compile", - "parent_id" : ${content_test_session_id}, - "resource" : "Maven_Smoke_Tests_Project_maven_compiler_plugin_default_compile", - "service" : "test-maven-service", - "span_id" : ${content_span_id}, - "start" : ${content_start_3}, - "trace_id" : ${content_test_session_id} - }, - "type" : "span", - "version" : 1 -}, { - "content" : { - "duration" : ${content_duration_4}, - "error" : 0, - "meta" : { - "_dd.p.tid" : ${content_meta__dd_p_tid_4}, - "_dd.test.is_user_provided_service" : "true", - "env" : "integration-test", - "execution" : "default-testCompile", - "language" : "jvm", - "library_version" : ${content_meta_library_version}, - "os.architecture" : ${content_meta_os_architecture}, - "os.platform" : ${content_meta_os_platform}, - "os.version" : ${content_meta_os_version}, - "plugin" : "maven-compiler-plugin", - "project" : "Maven Smoke Tests Project", - "runtime-id" : ${content_meta_runtime_id}, - "runtime.name" : ${content_meta_runtime_name}, - "runtime.vendor" : ${content_meta_runtime_vendor}, - "runtime.version" : ${content_meta_runtime_version} - }, - "metrics" : { }, - "name" : "Maven_Smoke_Tests_Project_maven_compiler_plugin_default_testCompile", - "parent_id" : ${content_test_session_id}, - "resource" : "Maven_Smoke_Tests_Project_maven_compiler_plugin_default_testCompile", - "service" : "test-maven-service", - "span_id" : ${content_span_id_2}, - "start" : ${content_start_4}, - "trace_id" : ${content_test_session_id} - }, - "type" : "span", - "version" : 1 -}, { - "content" : { - "duration" : ${content_duration_5}, - "error" : 0, - "meta" : { - "_dd.p.tid" : ${content_meta__dd_p_tid_5}, - "_dd.test.is_user_provided_service" : "true", - "env" : "integration-test", - "execution" : "default-resources", - "language" : "jvm", - "library_version" : ${content_meta_library_version}, - "os.architecture" : ${content_meta_os_architecture}, - "os.platform" : ${content_meta_os_platform}, - "os.version" : ${content_meta_os_version}, - "plugin" : "maven-resources-plugin", - "project" : "Maven Smoke Tests Project", - "runtime-id" : ${content_meta_runtime_id}, - "runtime.name" : ${content_meta_runtime_name}, - "runtime.vendor" : ${content_meta_runtime_vendor}, - "runtime.version" : ${content_meta_runtime_version} - }, - "metrics" : { }, - "name" : "Maven_Smoke_Tests_Project_maven_resources_plugin_default_resources", - "parent_id" : ${content_test_session_id}, - "resource" : "Maven_Smoke_Tests_Project_maven_resources_plugin_default_resources", - "service" : "test-maven-service", - "span_id" : ${content_span_id_3}, - "start" : ${content_start_5}, - "trace_id" : ${content_test_session_id} - }, - "type" : "span", - "version" : 1 -}, { - "content" : { - "duration" : ${content_duration_6}, - "error" : 0, - "meta" : { - "_dd.p.tid" : ${content_meta__dd_p_tid_6}, - "_dd.test.is_user_provided_service" : "true", - "env" : "integration-test", - "execution" : "default-testResources", - "language" : "jvm", - "library_version" : ${content_meta_library_version}, - "os.architecture" : ${content_meta_os_architecture}, - "os.platform" : ${content_meta_os_platform}, - "os.version" : ${content_meta_os_version}, - "plugin" : "maven-resources-plugin", - "project" : "Maven Smoke Tests Project", - "runtime-id" : ${content_meta_runtime_id}, - "runtime.name" : ${content_meta_runtime_name}, - "runtime.vendor" : ${content_meta_runtime_vendor}, - "runtime.version" : ${content_meta_runtime_version} - }, - "metrics" : { }, - "name" : "Maven_Smoke_Tests_Project_maven_resources_plugin_default_testResources", - "parent_id" : ${content_test_session_id}, - "resource" : "Maven_Smoke_Tests_Project_maven_resources_plugin_default_testResources", - "service" : "test-maven-service", - "span_id" : ${content_span_id_4}, - "start" : ${content_start_6}, - "trace_id" : ${content_test_session_id} - }, - "type" : "span", - "version" : 1 -}, { - "content" : { - "duration" : ${content_duration_7}, - "error" : 0, - "meta" : { - "_dd.p.tid" : ${content_meta__dd_p_tid_7}, - "_dd.test.is_user_provided_service" : "true", - "_dd.tracer_host" : ${content_meta__dd_tracer_host}, - "ci.workspace_path" : ${content_meta_ci_workspace_path}, - "component" : "junit4", - "env" : "integration-test", - "language" : "jvm", - "library_version" : ${content_meta_library_version}, - "os.architecture" : ${content_meta_os_architecture}, - "os.platform" : ${content_meta_os_platform}, - "os.version" : ${content_meta_os_version}, - "runtime-id" : ${content_meta_runtime_id_2}, - "runtime.name" : ${content_meta_runtime_name}, - "runtime.vendor" : ${content_meta_runtime_vendor}, - "runtime.version" : ${content_meta_runtime_version}, - "span.kind" : "test_suite_end", - "test.framework" : "junit4", - "test.framework_version" : "4.13.2", - "test.module" : "Maven Smoke Tests Project maven-surefire-plugin default-test", - "test.source.file" : "src/test/java/datadog/smoke/TestSucceed.java", - "test.status" : "pass", - "test.suite" : "datadog.smoke.TestSucceed", - "test.type" : "test", - "test_session.name" : "mvn -B test" - }, - "metrics" : { - "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_3}, - "_dd.profiling.enabled" : 0, - "_dd.trace_span_attribute_schema" : 0, - "process_id" : ${content_metrics_process_id_2}, - "test.source.end" : 18, - "test.source.start" : 7 - }, - "name" : "junit4.test_suite", - "resource" : "datadog.smoke.TestSucceed", - "service" : "test-maven-service", - "start" : ${content_start_7}, - "test_module_id" : ${content_test_module_id}, - "test_session_id" : ${content_test_session_id}, - "test_suite_id" : ${content_test_suite_id} - }, - "type" : "test_suite_end", - "version" : 1 -}, { - "content" : { - "duration" : ${content_duration_8}, - "error" : 0, - "meta" : { - "_dd.library_capabilities.auto_test_retries" : "1", - "_dd.library_capabilities.early_flake_detection" : "1", - "_dd.library_capabilities.fail_fast_test_order" : "1", - "_dd.library_capabilities.impacted_tests" : "1", - "_dd.library_capabilities.test_impact_analysis" : "1", - "_dd.library_capabilities.test_management.attempt_to_fix" : "4", - "_dd.library_capabilities.test_management.disable" : "1", - "_dd.library_capabilities.test_management.quarantine" : "1", - "_dd.p.tid" : ${content_meta__dd_p_tid_8}, - "_dd.test.is_user_provided_service" : "true", - "_dd.tracer_host" : ${content_meta__dd_tracer_host}, - "ci.workspace_path" : ${content_meta_ci_workspace_path}, - "component" : "junit4", - "env" : "integration-test", - "language" : "jvm", - "library_version" : ${content_meta_library_version}, - "os.architecture" : ${content_meta_os_architecture}, - "os.platform" : ${content_meta_os_platform}, - "os.version" : ${content_meta_os_version}, - "runtime-id" : ${content_meta_runtime_id_2}, - "runtime.name" : ${content_meta_runtime_name}, - "runtime.vendor" : ${content_meta_runtime_vendor}, - "runtime.version" : ${content_meta_runtime_version}, - "span.kind" : "test", - "test.framework" : "junit4", - "test.framework_version" : "4.13.2", - "test.is_modified" : "true", - "test.module" : "Maven Smoke Tests Project maven-surefire-plugin default-test", - "test.name" : "test_succeed", - "test.source.file" : "src/test/java/datadog/smoke/TestSucceed.java", - "test.source.method" : "test_succeed()V", - "test.status" : "pass", - "test.suite" : "datadog.smoke.TestSucceed", - "test.type" : "test", - "test_session.name" : "mvn -B test" - }, - "metrics" : { - "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_4}, - "_dd.profiling.enabled" : 0, - "_dd.trace_span_attribute_schema" : 0, - "process_id" : ${content_metrics_process_id_2}, - "test.source.end" : 12, - "test.source.start" : 9 - }, - "name" : "junit4.test", - "parent_id" : ${content_parent_id}, - "resource" : "datadog.smoke.TestSucceed.test_succeed", - "service" : "test-maven-service", - "span_id" : ${content_span_id_5}, - "start" : ${content_start_8}, - "test_module_id" : ${content_test_module_id}, - "test_session_id" : ${content_test_session_id}, - "test_suite_id" : ${content_test_suite_id}, - "trace_id" : ${content_trace_id} - }, - "type" : "test", - "version" : 2 -}, { - "content" : { - "duration" : ${content_duration_9}, - "error" : 0, - "meta" : { - "_dd.library_capabilities.auto_test_retries" : "1", - "_dd.library_capabilities.early_flake_detection" : "1", - "_dd.library_capabilities.fail_fast_test_order" : "1", - "_dd.library_capabilities.impacted_tests" : "1", - "_dd.library_capabilities.test_impact_analysis" : "1", - "_dd.library_capabilities.test_management.attempt_to_fix" : "4", - "_dd.library_capabilities.test_management.disable" : "1", - "_dd.library_capabilities.test_management.quarantine" : "1", - "_dd.p.tid" : ${content_meta__dd_p_tid_9}, - "_dd.test.is_user_provided_service" : "true", - "_dd.tracer_host" : ${content_meta__dd_tracer_host}, - "ci.workspace_path" : ${content_meta_ci_workspace_path}, - "component" : "junit4", - "env" : "integration-test", - "language" : "jvm", - "library_version" : ${content_meta_library_version}, - "os.architecture" : ${content_meta_os_architecture}, - "os.platform" : ${content_meta_os_platform}, - "os.version" : ${content_meta_os_version}, - "runtime-id" : ${content_meta_runtime_id_2}, - "runtime.name" : ${content_meta_runtime_name}, - "runtime.vendor" : ${content_meta_runtime_vendor}, - "runtime.version" : ${content_meta_runtime_version}, - "span.kind" : "test", - "test.framework" : "junit4", - "test.framework_version" : "4.13.2", - "test.is_modified" : "true", - "test.module" : "Maven Smoke Tests Project maven-surefire-plugin default-test", - "test.name" : "test_to_skip_with_itr", - "test.source.file" : "src/test/java/datadog/smoke/TestSucceed.java", - "test.source.method" : "test_to_skip_with_itr()V", - "test.status" : "pass", - "test.suite" : "datadog.smoke.TestSucceed", - "test.type" : "test", - "test_session.name" : "mvn -B test" - }, - "metrics" : { - "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_5}, - "_dd.profiling.enabled" : 0, - "_dd.trace_span_attribute_schema" : 0, - "process_id" : ${content_metrics_process_id_2}, - "test.source.end" : 17, - "test.source.start" : 14 - }, - "name" : "junit4.test", - "parent_id" : ${content_parent_id}, - "resource" : "datadog.smoke.TestSucceed.test_to_skip_with_itr", - "service" : "test-maven-service", - "span_id" : ${content_span_id_6}, - "start" : ${content_start_9}, - "test_module_id" : ${content_test_module_id}, - "test_session_id" : ${content_test_session_id}, - "test_suite_id" : ${content_test_suite_id}, - "trace_id" : ${content_trace_id_2} - }, - "type" : "test", - "version" : 2 -} ] \ No newline at end of file diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_impacted_tests/pom.xml b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_impacted_tests/pom.xml deleted file mode 100644 index 48f92df3632..00000000000 --- a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_impacted_tests/pom.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - 4.0.0 - com.datadog.ci.test - maven-smoke-test - 1.0-SNAPSHOT - Maven Smoke Tests Project - - - 8 - 8 - UTF-8 - - - - - - - false - - central - Central Repository - https://repo.maven.apache.org/maven2 - - - - - - never - - - false - - central - Central Repository - https://repo.maven.apache.org/maven2 - - - - - - junit - junit - 4.13.2 - test - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 3.0.0 - - - - - diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_impacted_tests/src/main/java/datadog/smoke/Calculator.java b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_impacted_tests/src/main/java/datadog/smoke/Calculator.java deleted file mode 100644 index 2f4461a279d..00000000000 --- a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_impacted_tests/src/main/java/datadog/smoke/Calculator.java +++ /dev/null @@ -1,11 +0,0 @@ -package datadog.smoke; - -public class Calculator { - public static int add(int a, int b) { - return a + b; - } - - public static int subtract(int a, int b) { - return a - b; - } -} diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_impacted_tests/src/test/java/datadog/smoke/TestSucceed.java b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_impacted_tests/src/test/java/datadog/smoke/TestSucceed.java deleted file mode 100644 index c9baff75d9e..00000000000 --- a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_impacted_tests/src/test/java/datadog/smoke/TestSucceed.java +++ /dev/null @@ -1,18 +0,0 @@ -package datadog.smoke; - -import static org.junit.Assert.assertTrue; - -import org.junit.Test; - -public class TestSucceed { - - @Test - public void test_succeed() { - assertTrue(Calculator.add(2, 2) == 4); - } - - @Test - public void test_to_skip_with_itr() { - assertTrue(Calculator.subtract(3, 2) == 1); - } -} diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/CiVisibilityConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/CiVisibilityConfig.java index d7ab9ad204a..ad93aa9dfc7 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/CiVisibilityConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/CiVisibilityConfig.java @@ -54,8 +54,6 @@ public final class CiVisibilityConfig { public static final String CIVISIBILITY_FLAKY_RETRY_ENABLED = "civisibility.flaky.retry.enabled"; public static final String CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED = "civisibility.impacted.tests.detection.enabled"; - public static final String CIVISIBILITY_IMPACTED_TESTS_BACKEND_REQUEST_ENABLED = - "civisibility.impacted.tests.backend.request.enabled"; public static final String CIVISIBILITY_KNOWN_TESTS_REQUEST_ENABLED = "civisibility.known.tests.request.enabled"; public static final String CIVISIBILITY_FLAKY_RETRY_ONLY_KNOWN_FLAKES = diff --git a/internal-api/src/main/java/datadog/trace/api/Config.java b/internal-api/src/main/java/datadog/trace/api/Config.java index ea43af9da0c..f7e60f2fdc5 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -374,7 +374,6 @@ public static String getHostName() { private final List ciVisibilityResourceFolderNames; private final boolean ciVisibilityFlakyRetryEnabled; private final boolean ciVisibilityImpactedTestsDetectionEnabled; - private final boolean ciVisibilityImpactedTestsBackendRequestEnabled; private final boolean ciVisibilityKnownTestsRequestEnabled; private final boolean ciVisibilityFlakyRetryOnlyKnownFlakes; private final int ciVisibilityFlakyRetryCount; @@ -1610,8 +1609,6 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) configProvider.getBoolean(CIVISIBILITY_FLAKY_RETRY_ENABLED, true); ciVisibilityImpactedTestsDetectionEnabled = configProvider.getBoolean(CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED, true); - ciVisibilityImpactedTestsBackendRequestEnabled = - configProvider.getBoolean(CIVISIBILITY_IMPACTED_TESTS_BACKEND_REQUEST_ENABLED, false); ciVisibilityKnownTestsRequestEnabled = configProvider.getBoolean(CIVISIBILITY_KNOWN_TESTS_REQUEST_ENABLED, true); ciVisibilityFlakyRetryOnlyKnownFlakes = @@ -3136,10 +3133,6 @@ public boolean isCiVisibilityImpactedTestsDetectionEnabled() { return ciVisibilityImpactedTestsDetectionEnabled; } - public boolean isCiVisibilityImpactedTestsBackendRequestEnabled() { - return ciVisibilityImpactedTestsBackendRequestEnabled; - } - public boolean isCiVisibilityKnownTestsRequestEnabled() { return ciVisibilityKnownTestsRequestEnabled; } diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityCountMetric.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityCountMetric.java index 2d8de535abe..868ecde90b8 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityCountMetric.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityCountMetric.java @@ -163,11 +163,6 @@ public enum CiVisibilityCountMetric { FLAKY_TESTS_REQUEST("flaky_tests.request", RequestCompressed.class), /** The number of tests requests sent to the flaky tests endpoint that errored */ FLAKY_TESTS_REQUEST_ERRORS("flaky_tests.request_errors", ErrorType.class, StatusCode.class), - /** The number of requests sent to the changed files endpoint */ - IMPACTED_TESTS_DETECTION_REQUEST("impacted_tests_detection.request", RequestCompressed.class), - /** The number of tests requests sent to the changed files endpoint that errored */ - IMPACTED_TESTS_DETECTION_REQUEST_ERRORS( - "impacted_tests_detection.request_errors", ErrorType.class, StatusCode.class), /** The number of requests sent to the test management tests endpoint */ TEST_MANAGEMENT_TESTS_REQUEST("test_management.request", RequestCompressed.class), /** The number of tests requests sent to the test management tests endpoint that errored */ diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityDistributionMetric.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityDistributionMetric.java index a50f2a2d61c..8dcaa6eb385 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityDistributionMetric.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/CiVisibilityDistributionMetric.java @@ -51,13 +51,6 @@ public enum CiVisibilityDistributionMetric { FLAKY_TESTS_RESPONSE_BYTES("flaky_tests.response_bytes", ResponseCompressed.class), /** The number of tests received by the flaky tests endpoint */ FLAKY_TESTS_RESPONSE_TESTS("flaky_tests.response_tests"), - /** The time it takes to get the response of the changed files endpoint request in ms */ - IMPACTED_TESTS_DETECTION_REQUEST_MS("impacted_tests_detection.request_ms"), - /** The number of bytes received by the changed files endpoint */ - IMPACTED_TESTS_DETECTION_RESPONSE_BYTES( - "impacted_tests_detection.response_bytes", ResponseCompressed.class), - /** The number of files received by the changed files endpoint */ - IMPACTED_TESTS_DETECTION_RESPONSE_FILES("impacted_tests_detection.response_files"), /** The time it takes to get the response of the test management tests endpoint request in ms */ TEST_MANAGEMENT_TESTS_REQUEST_MS("test_management.request_ms"), /** The number of bytes received by the test management tests endpoint */ diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/Command.java b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/Command.java index 7b0fa25efd3..0413066d100 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/Command.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/telemetry/tag/Command.java @@ -12,6 +12,7 @@ public enum Command implements TagValue { GET_OBJECTS, PACK_OBJECTS, DIFF, + BASE_COMMIT_SHA, OTHER; private final String s; diff --git a/internal-api/src/main/java/datadog/trace/util/Strings.java b/internal-api/src/main/java/datadog/trace/util/Strings.java index ec7cfc230a6..4a93a0c9fbf 100644 --- a/internal-api/src/main/java/datadog/trace/util/Strings.java +++ b/internal-api/src/main/java/datadog/trace/util/Strings.java @@ -194,6 +194,17 @@ public static boolean isNotBlank(String s) { return false; } + /** + * Checks that a string is blank, i.e. doest not contain characters or is null + * + * @param s The string to be checked + * @return {@code true} if string is blank (string is {@code null}, empty, or contains only + * whitespace characters), {@code false} otherwise + */ + public static boolean isBlank(String s) { + return !isNotBlank(s); + } + /** * Generates a random string of the given length from lowercase characters a-z * diff --git a/internal-api/src/test/groovy/datadog/trace/util/StringsTest.groovy b/internal-api/src/test/groovy/datadog/trace/util/StringsTest.groovy index b7958191c8d..544874c6816 100644 --- a/internal-api/src/test/groovy/datadog/trace/util/StringsTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/util/StringsTest.groovy @@ -117,12 +117,14 @@ class StringsTest extends DDSpecification { "hélló wórld" | 5 | "hélló" } - def "test isNotBlank: #input"() { + def "test isNotBlank and isBlank: #input"() { when: def notBlank = Strings.isNotBlank(input) + def isBlank = Strings.isBlank(input) then: notBlank == expected + isBlank == !notBlank where: input | expected