This is an automated email from the ASF dual-hosted git repository. dpavlov pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git
The following commit(s) were added to refs/heads/master by this push: new 8c1af84 Blockers short models created to reduce GC; Full Test Ocurrence convert removed (#141) 8c1af84 is described below commit 8c1af8473a1d4367bc72f6f1797e36ef6d26309f Author: Dmitriy Pavlov <dpav...@apache.org> AuthorDate: Wed Jul 31 19:58:59 2019 +0300 Blockers short models created to reduce GC; Full Test Ocurrence convert removed (#141) --- .../tcbot/visa/TcBotTriggerAndSignOffService.java | 18 ++--- .../ci/tcbot/chain/PrChainsProcessorTest.java | 32 ++++----- .../tcbot/engine/chain/SingleBuildRunCtx.java | 7 -- .../tcbot/engine/chain/TestCompactedMult.java | 13 ++-- .../ignite/tcbot/engine/pr/PrChainsProcessor.java | 32 +++------ .../apache/ignite/tcbot/engine/ui/DsSuiteUi.java | 64 +++++++---------- .../ignite/tcbot/engine/ui/DsTestFailureUi.java | 74 +++++++------------ .../ignite/tcbot/engine/ui/ShortSuiteUi.java | 84 ++++++++++++++++++++++ .../ignite/tcbot/engine/ui/ShortTestFailureUi.java | 69 ++++++++++++++++++ .../teamcity/ignited/fatbuild/TestCompacted.java | 1 - 10 files changed, 244 insertions(+), 150 deletions(-) diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java index 3a11a14..b6272c1 100644 --- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java +++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java @@ -67,6 +67,8 @@ import org.apache.ignite.tcbot.engine.pr.BranchTicketMatcher; import org.apache.ignite.tcbot.engine.pr.PrChainsProcessor; import org.apache.ignite.tcbot.engine.ui.DsSuiteUi; import org.apache.ignite.tcbot.engine.ui.DsTestFailureUi; +import org.apache.ignite.tcbot.engine.ui.ShortSuiteUi; +import org.apache.ignite.tcbot.engine.ui.ShortTestFailureUi; import org.apache.ignite.tcbot.persistence.IStringCompactor; import org.apache.ignite.tcignited.ITeamcityIgnited; import org.apache.ignite.tcignited.ITeamcityIgnitedProvider; @@ -753,13 +755,13 @@ public class TcBotTriggerAndSignOffService { String tcBranch) { CurrentVisaStatus status = new CurrentVisaStatus(); - List<DsSuiteUi> suitesStatuses + List<ShortSuiteUi> suitesStatuses = prChainsProcessor.getBlockersSuitesStatuses(buildTypeId, tcBranch, srvCode, prov, SyncMode.NONE, null); if (suitesStatuses == null) return status; - status.blockers = suitesStatuses.stream().mapToInt(DsSuiteUi::totalBlockers).sum(); + status.blockers = suitesStatuses.stream().mapToInt(ShortSuiteUi::totalBlockers).sum(); return status; } @@ -806,7 +808,7 @@ public class TcBotTriggerAndSignOffService { try { String baseBranch = Strings.isNullOrEmpty(baseBranchForTc) ? prChainsProcessor.dfltBaseTcBranch(srvCodeOrAlias) : baseBranchForTc; - List<DsSuiteUi> suitesStatuses = prChainsProcessor.getBlockersSuitesStatuses(buildTypeId, build.branchName, srvCodeOrAlias, prov, + List<ShortSuiteUi> suitesStatuses = prChainsProcessor.getBlockersSuitesStatuses(buildTypeId, build.branchName, srvCodeOrAlias, prov, SyncMode.RELOAD_QUEUED, baseBranch); @@ -814,7 +816,7 @@ public class TcBotTriggerAndSignOffService { return new Visa("JIRA wasn't commented - no finished builds to analyze." + " Check builds availabiliy for branch: " + build.branchName + "/" + baseBranch); - blockers = suitesStatuses.stream().mapToInt(DsSuiteUi::totalBlockers).sum(); + blockers = suitesStatuses.stream().mapToInt(ShortSuiteUi::totalBlockers).sum(); String comment = generateJiraComment(suitesStatuses, build.webUrl, buildTypeId, tcIgnited, blockers, build.branchName, baseBranch); @@ -843,7 +845,7 @@ public class TcBotTriggerAndSignOffService { * @param baseBranch TC Base branch used for comment * @return Comment, which should be sent to the JIRA ticket. */ - private String generateJiraComment(List<DsSuiteUi> suites, String webUrl, String buildTypeId, + private String generateJiraComment(List<ShortSuiteUi> suites, String webUrl, String buildTypeId, ITeamcityIgnited tcIgnited, int blockers, String branchName, String baseBranch) { BuildTypeRefCompacted bt = tcIgnited.getBuildTypeRef(buildTypeId); @@ -853,12 +855,12 @@ public class TcBotTriggerAndSignOffService { String baseBranchDisp = (Strings.isNullOrEmpty(baseBranch) || ITeamcity.DEFAULT.equals(baseBranch)) ? "master" : baseBranch ; - for (DsSuiteUi suite : suites) { + for (ShortSuiteUi suite : suites) { res.append("{color:#d04437}"); res.append(jiraEscText(suite.name)).append("{color}"); - int totalBlockerTests = suite.testFailures.size(); + int totalBlockerTests = suite.testFailures().size(); res.append(" [[tests ").append(totalBlockerTests); if (suite.result != null && !suite.result.isEmpty()) @@ -868,7 +870,7 @@ public class TcBotTriggerAndSignOffService { int cnt = 0; - for (DsTestFailureUi failure : suite.testFailures) { + for (ShortTestFailureUi failure : suite.testFailures()) { res.append("* "); if (failure.suiteName != null && failure.testName != null) diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java index 23c69fe..65e61ff 100644 --- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java +++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java @@ -30,6 +30,8 @@ import java.util.function.Predicate; import org.apache.ignite.tcbot.common.TcBotConst; import org.apache.ignite.tcbot.engine.pr.PrChainsProcessor; +import org.apache.ignite.tcbot.engine.ui.ShortSuiteUi; +import org.apache.ignite.tcbot.engine.ui.ShortTestFailureUi; import org.apache.ignite.tcignited.SyncMode; import org.apache.ignite.tcservice.ITeamcity; import org.apache.ignite.tcservice.model.conf.BuildType; @@ -117,7 +119,7 @@ public class PrChainsProcessorTest { initBuildChainAndMasterHistory(c, btId, branch); PrChainsProcessor prcp = injector.getInstance(PrChainsProcessor.class); - final List<DsSuiteUi> blockers = prcp.getBlockersSuitesStatuses(btId, branch, SRV_ID, mock(ITcBotUserCreds.class), SyncMode.RELOAD_QUEUED, null); + final List<ShortSuiteUi> blockers = prcp.getBlockersSuitesStatuses(btId, branch, SRV_ID, mock(ITcBotUserCreds.class), SyncMode.RELOAD_QUEUED, null); System.out.println(blockers); assertNotNull(blockers); @@ -125,15 +127,15 @@ public class PrChainsProcessorTest { assertTrue(containsTestFailure(blockers, TEST_WITHOUT_HISTORY)); - assertTrue(blockers.stream().anyMatch(s -> BUILD_APACHE_IGNITE.equals(s.suiteId))); - assertTrue(blockers.stream().anyMatch(s -> "CancelledBuild".equals(s.suiteId))); + assertTrue(blockers.stream().anyMatch(s -> BUILD_APACHE_IGNITE.equals(s.name))); + assertTrue(blockers.stream().anyMatch(s -> "CancelledBuild".equals(s.name))); assertTrue(containsTestFailure(blockers, TEST_WITH_HISTORY_PASSING_IN_MASTER)); assertFalse(containsTestFailure(blockers, TEST_WITH_HISTORY_FAILING_IN_MASTER)); assertFalse(containsTestFailure(blockers, TEST_FLAKY_IN_MASTER)); - Optional<DsTestFailureUi> testOpt = findBlockerTestFailure(blockers, TEST_WITH_HISTORY_PASSING_IN_MASTER); + Optional<? extends ShortTestFailureUi> testOpt = findBlockerTestFailure(blockers, TEST_WITH_HISTORY_PASSING_IN_MASTER); assertTrue(testOpt.isPresent()); assertTrue(containsTestFailure(blockers, TEST_WAS_FIXED_IN_MASTER)); @@ -143,7 +145,7 @@ public class PrChainsProcessorTest { assertTrue(containsTestFailure(blockers, TEST_WITH_HISTORY_PASSING_IN_MASTER)); } - public boolean containsTestFailure(List<DsSuiteUi> blockers, String name) { + public boolean containsTestFailure(List<ShortSuiteUi> blockers, String name) { return blockers.stream().anyMatch(containsTestFail(name)); } @@ -163,30 +165,28 @@ public class PrChainsProcessorTest { initHistory(c); PrChainsProcessor prcp = injector.getInstance(PrChainsProcessor.class); - final List<DsSuiteUi> blockers = prcp.getBlockersSuitesStatuses(btId, branch, SRV_ID, mock(ITcBotUserCreds.class), SyncMode.RELOAD_QUEUED, null); + final List<ShortSuiteUi> blockers = prcp.getBlockersSuitesStatuses(btId, branch, SRV_ID, mock(ITcBotUserCreds.class), SyncMode.RELOAD_QUEUED, null); System.out.println(blockers); - Optional<DsTestFailureUi> rareNotFlaky = findBlockerTestFailure(blockers, TEST_RARE_FAILED_WITH_CHANGES); + Optional<? extends ShortTestFailureUi> rareNotFlaky = findBlockerTestFailure(blockers, TEST_RARE_FAILED_WITH_CHANGES); assertTrue(rareNotFlaky.isPresent()); - assertNull(rareNotFlaky.get().histBaseBranch.flakyComments); - assertFalse(findBlockerTestFailure(blockers, TEST_RARE_FAILED_WITHOUT_CHANGES).isPresent()); } - public Optional<DsTestFailureUi> findBlockerTestFailure(List<DsSuiteUi> blockers, String name) { - Optional<DsSuiteUi> suiteOpt = blockers.stream().filter(containsTestFail(name)).findAny(); + public Optional<? extends ShortTestFailureUi> findBlockerTestFailure(List<ShortSuiteUi> blockers, String name) { + Optional<ShortSuiteUi> suiteOpt = blockers.stream().filter(containsTestFail(name)).findAny(); - return suiteOpt.flatMap(suite -> suite.testFailures.stream().filter(tf -> name.equals(tf.name)).findAny()); + return suiteOpt.flatMap(suite -> suite.testFailures().stream().filter(tf -> name.equals(tf.name)).findAny()); } /** * @param name Test failure Name to find. */ @NotNull - private Predicate<DsSuiteUi> containsTestFail(String name) { - return s -> s.testFailures.stream().anyMatch(testFailure -> { + private Predicate<ShortSuiteUi> containsTestFail(String name) { + return s -> s.testFailures().stream().anyMatch(testFailure -> { return name.equals(testFailure.name); }); } @@ -440,11 +440,11 @@ public class PrChainsProcessorTest { PrChainsProcessor prcp = injector.getInstance(PrChainsProcessor.class); - final List<DsSuiteUi> blockers = prcp.getBlockersSuitesStatuses(btId, branch, SRV_ID, mock(ITcBotUserCreds.class), SyncMode.RELOAD_QUEUED, null); + final List<ShortSuiteUi> blockers = prcp.getBlockersSuitesStatuses(btId, branch, SRV_ID, mock(ITcBotUserCreds.class), SyncMode.RELOAD_QUEUED, null); System.out.println(blockers); - Optional<DsTestFailureUi> testBecameFailed = findBlockerTestFailure(blockers, TEST_BECAME_FAILED_IN_BRANCH); + Optional<? extends ShortTestFailureUi> testBecameFailed = findBlockerTestFailure(blockers, TEST_BECAME_FAILED_IN_BRANCH); assertTrue(testBecameFailed.isPresent()); } } diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/SingleBuildRunCtx.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/SingleBuildRunCtx.java index e41d65f..59a7567 100644 --- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/SingleBuildRunCtx.java +++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/SingleBuildRunCtx.java @@ -177,13 +177,6 @@ public class SingleBuildRunCtx implements ISuiteResults { return Collections.unmodifiableList(changes); } - public List<TestOccurrenceFull> getTests() { - if (isComposite()) - return Collections.emptyList(); - - return buildCompacted.getTestOcurrences(compactor).getTests(); - } - @Nonnull Stream<? extends Future<?>> getFutures() { return logCheckResFut == null ? Stream.empty() : Stream.of((Future<?>)logCheckResFut); } diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/TestCompactedMult.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/TestCompactedMult.java index 3c2cab5..9aa450e 100644 --- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/TestCompactedMult.java +++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/TestCompactedMult.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.annotation.Nullable; import org.apache.ignite.ci.teamcity.ignited.fatbuild.TestCompacted; import org.apache.ignite.tcbot.common.TcBotConst; @@ -91,14 +92,14 @@ public class TestCompactedMult { return avgDuration; } - - public Iterable<TestOccurrenceFull> getOccurrences() { - return occurrences.stream() - .map(testCompacted -> testCompacted.toTestOccurrence(compactor, 0)) - .collect(Collectors.toList()); + /** + * + */ + public Stream<TestCompacted> getInvocationsStream() { + return occurrences.stream(); } - /** + /** * @param baseBranchStat Base branch statistics. * @return non null comment in case test failure is a blocker for merge into base branch. */ diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/pr/PrChainsProcessor.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/pr/PrChainsProcessor.java index 0f084e7..a307f2a 100644 --- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/pr/PrChainsProcessor.java +++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/pr/PrChainsProcessor.java @@ -42,9 +42,9 @@ import org.apache.ignite.tcbot.engine.conf.ITcBotConfig; import org.apache.ignite.tcbot.engine.conf.ITrackedBranch; import org.apache.ignite.tcbot.engine.conf.ITrackedChain; import org.apache.ignite.tcbot.engine.ui.DsChainUi; -import org.apache.ignite.tcbot.engine.ui.DsSuiteUi; import org.apache.ignite.tcbot.engine.ui.DsSummaryUi; -import org.apache.ignite.tcbot.engine.ui.DsTestFailureUi; +import org.apache.ignite.tcbot.engine.ui.ShortSuiteUi; +import org.apache.ignite.tcbot.engine.ui.ShortTestFailureUi; import org.apache.ignite.tcbot.persistence.IStringCompactor; import org.apache.ignite.tcignited.ITeamcityIgnited; import org.apache.ignite.tcignited.ITeamcityIgnitedProvider; @@ -254,7 +254,7 @@ public class PrChainsProcessor { * @return List of suites with possible blockers. */ @Nullable - public List<DsSuiteUi> getBlockersSuitesStatuses( + public List<ShortSuiteUi> getBlockersSuitesStatuses( String buildTypeId, String branchForTc, String srvCodeOrAlias, @@ -290,7 +290,7 @@ public class PrChainsProcessor { * @param baseBranch */ //todo may avoid creation of UI model for simple comment. - private List<DsSuiteUi> findBlockerFailures(FullChainRunCtx fullChainRunCtx, + private List<ShortSuiteUi> findBlockerFailures(FullChainRunCtx fullChainRunCtx, ITeamcityIgnited tcIgnited, String baseBranch) { String normalizedBaseBranch = RunHistSync.normalizeBranch(baseBranch); @@ -306,32 +306,20 @@ public class PrChainsProcessor { String suiteComment = ctx.getPossibleBlockerComment(compactor, statInBaseBranch, tcIgnited.config()); - List<DsTestFailureUi> failures = ctx.getFilteredTests(test -> test.includeIntoReport(tcIgnited, baseBranchId)) + List<ShortTestFailureUi> failures = ctx.getFilteredTests(test -> test.includeIntoReport(tcIgnited, baseBranchId)) .stream() .map(occurrence -> { - IRunHistory stat = occurrence.history(tcIgnited, baseBranchId); - String testBlockerComment = occurrence.getPossibleBlockerComment(stat); + ShortTestFailureUi tst = new ShortTestFailureUi().initFrom(occurrence, tcIgnited, baseBranchId); - if (!Strings.isNullOrEmpty(testBlockerComment)) { - final DsTestFailureUi failure = new DsTestFailureUi(); - - failure.initFromOccurrence(occurrence, tcIgnited, ctx.projectId(), ctx.branchName(), baseBranch, baseBranchId); - - return failure; - } - return null; + return tst.isPossibleBlocker() ? tst : null; }).filter(Objects::nonNull).collect(Collectors.toList()); // test failure based blockers and/or blocker found by suite results if (!failures.isEmpty() || !Strings.isNullOrEmpty(suiteComment)) { - - DsSuiteUi suiteUi = new DsSuiteUi(); - suiteUi.testFailures = failures; - - suiteUi.initFromContext(tcIgnited, ctx, baseBranch, compactor, false, false, -1); - - return suiteUi; + return new ShortSuiteUi() + .testShortFailures(failures) + .initFrom(ctx, tcIgnited, compactor, statInBaseBranch); } return null; diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsSuiteUi.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsSuiteUi.java index 0f7b059..ab99a53 100644 --- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsSuiteUi.java +++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsSuiteUi.java @@ -17,8 +17,8 @@ package org.apache.ignite.tcbot.engine.ui; -import com.google.common.base.Strings; import java.util.ArrayList; +import java.util.Collection; import java.util.Comparator; import java.util.HashSet; import java.util.List; @@ -50,12 +50,7 @@ import static org.apache.ignite.tcignited.history.RunHistSync.normalizeBranch; * Represent Suite result, UI class for REST responses, so it contains public fields */ @SuppressWarnings({"WeakerAccess", "PublicField"}) -public class DsSuiteUi extends DsHistoryStatUi { - /** Suite Name */ - public String name; - - /** Suite Run Result (filled if failed): Summary of build problems, count of tests, etc. */ - public String result; +public class DsSuiteUi extends ShortSuiteUi { /** Has critical problem: Timeout, JMV Crash, Compilation Error or Failure on Metric */ @Nullable public Boolean hasCriticalProblem; @@ -66,9 +61,6 @@ public class DsSuiteUi extends DsHistoryStatUi { /** Web Href. to suite runs history in base branch */ public String webToHistBaseBranch = ""; - /** Web Href. to suite particular run */ - public String webToBuild = ""; - public List<DsTestFailureUi> testFailures = new ArrayList<>(); public List<DsTestFailureUi> topLongRunning = new ArrayList<>(); public List<DsTestFailureUi> warnOnly = new ArrayList<>(); @@ -140,11 +132,6 @@ public class DsSuiteUi extends DsHistoryStatUi { /** Tags for build. */ @Nonnull public Set<String> tags = new HashSet<>(); - /** - * Possible blocker comment: filled for PR and builds checks, non null value contains problem explanation - * displayable. - */ - @Nullable public String blockerComment; public boolean success = false; @@ -164,23 +151,21 @@ public class DsSuiteUi extends DsHistoryStatUi { boolean includeTests, boolean calcTrustedTests, int maxDurationSec) { - - name = suite.suiteName(); - String failRateNormalizedBranch = normalizeBranch(baseBranch); Integer baseBranchId = compactor.getStringIdIfPresent(failRateNormalizedBranch); + IRunHistory baseBranchHist = suite.history(tcIgnited, baseBranchId); + initFrom(suite, tcIgnited, compactor, baseBranchHist); String curBranchNormalized = normalizeBranch(suite.branchName()); Integer curBranchId = compactor.getStringIdIfPresent(curBranchNormalized); - IRunHistory baseBranchHist = initSuiteStat(tcIgnited, baseBranchId, curBranchId, suite); + initSuiteStat(tcIgnited, baseBranchId, curBranchId, suite, baseBranchHist); Set<String> collect = suite.lastChangeUsers().collect(Collectors.toSet()); if (!collect.isEmpty()) userCommits = collect.toString(); - result = suite.getResult(); hasCriticalProblem = suite.hasCriticalProblem(); failedTests = suite.failedTests(); durationPrintable = millisToDurationPrintable(suite.buildDuration()); @@ -189,9 +174,8 @@ public class DsSuiteUi extends DsHistoryStatUi { artifcactPublishingDurationPrintable = millisToDurationPrintable(suite.artifcactPublishingDuration()); dependeciesResolvingDurationPrintable = millisToDurationPrintable(suite.dependeciesResolvingDuration()); testsDurationPrintable = millisToDurationPrintable(suite.getAvgTestsDuration()); - webToHist = buildWebLink(tcIgnited, suite); - webToHistBaseBranch = buildWebLink(tcIgnited, suite, baseBranch); - webToBuild = buildWebLinkToBuild(tcIgnited, suite); + webToHist = buildWebLinkToHist(tcIgnited, suite); + webToHistBaseBranch = buildWebLinkToHist(tcIgnited, suite, baseBranch); Integer buildTypeIdId = suite.buildTypeIdId(); if (includeTests) { @@ -269,18 +253,17 @@ public class DsSuiteUi extends DsHistoryStatUi { tags = suite.tags(); - blockerComment = suite.getPossibleBlockerComment(compactor, baseBranchHist, tcIgnited.config()); - success = !suite.isFailed(); return this; } + private IRunHistory initSuiteStat(ITeamcityIgnited tcIgnited, Integer failRateNormalizedBranch, Integer curBranchNormalized, - MultBuildRunCtx suite) { - IRunHistory statInBaseBranch = suite.history(tcIgnited, failRateNormalizedBranch); + MultBuildRunCtx suite, IRunHistory referenceStat) { + IRunHistory statInBaseBranch = referenceStat; if (statInBaseBranch != null) { failures = statInBaseBranch.getFailuresCount(); @@ -360,17 +343,24 @@ public class DsSuiteUi extends DsHistoryStatUi { failure.warnings.addAll(logCheckRes.getWarns()); } - private static String buildWebLinkToBuild(ITeamcityIgnited teamcity, MultBuildRunCtx suite) { - return teamcity.host() + "viewLog.html?buildId=" + Integer.toString(suite.getBuildId()); + public static String buildWebLinkToBuild(ITeamcityIgnited teamcity, MultBuildRunCtx suite) { + return teamcity.host() + "viewLog.html?buildId=" + suite.getBuildId(); } - private static String buildWebLink(ITeamcityIgnited teamcity, MultBuildRunCtx suite) { + private static String buildWebLinkToHist(ITeamcityIgnited teamcity, MultBuildRunCtx suite) { String branchName = suite.branchName(); - return buildWebLink(teamcity, suite, branchName); + return buildWebLinkToHist(teamcity, suite, branchName); } - @Nonnull private static String buildWebLink(ITeamcityIgnited teamcity, MultBuildRunCtx suite, String branchName) { + + @Nonnull private static String buildWebLinkToHist(ITeamcityIgnited teamcity, MultBuildRunCtx suite, String branchName) { + final String branch = branchForLink(branchName); + return teamcity.host() + "buildConfiguration/" + suite.suiteId() + + "?branch" + UrlUtil.escape(branch) ; + } + + @Nonnull private static String buildWebLinkToHistOldUi(ITeamcityIgnited teamcity, MultBuildRunCtx suite, String branchName) { final String branch = branchForLink(branchName); return teamcity.host() + "viewType.html?buildTypeId=" + suite.suiteId() + "&branch=" + UrlUtil.escape(branch) @@ -450,13 +440,7 @@ public class DsSuiteUi extends DsHistoryStatUi { return branchName; } - public int totalBlockers() { - int res = 0; - if (!Strings.isNullOrEmpty(blockerComment)) - res++; - - res += (int)testFailures.stream().filter(DsTestFailureUi::isPossibleBlocker).count(); - - return res; + public Collection<? extends ShortTestFailureUi> testFailures() { + return testFailures; } } diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsTestFailureUi.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsTestFailureUi.java index bf61f2a..307ec58 100644 --- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsTestFailureUi.java +++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/DsTestFailureUi.java @@ -17,7 +17,6 @@ package org.apache.ignite.tcbot.engine.ui; -import com.google.common.base.Strings; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -25,6 +24,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import org.apache.ignite.ci.teamcity.ignited.fatbuild.TestCompacted; import org.apache.ignite.tcbot.common.util.UrlUtil; import org.apache.ignite.tcbot.engine.chain.TestCompactedMult; import org.apache.ignite.tcbot.engine.issue.EventTemplates; @@ -40,16 +40,7 @@ import static org.apache.ignite.tcignited.history.RunHistSync.normalizeBranch; * Detailed status of failures: UI model for test failure, probably merged with its history */ @SuppressWarnings({"WeakerAccess", "PublicField"}) -public class DsTestFailureUi { - /** Test full Name */ - public String name; - - /** suite (in code) short name */ - @Nullable public String suiteName; - - /** test short name with class and method */ - @Nullable public String testName; - +public class DsTestFailureUi extends ShortTestFailureUi { /** * Current filtered failures count, Usually 1 for get current (latest), may indicate several failures for history * (merged recent runs). @@ -85,9 +76,6 @@ public class DsTestFailureUi { /** Link to test history for current branch. */ @Nullable public String webUrlBaseBranch; - /** Blocker comment: indicates test seems to be introduced failure. */ - @Nullable public String blockerComment; - public boolean success = false; /** @@ -105,28 +93,17 @@ public class DsTestFailureUi { @Nullable final String baseBranchName, Integer baseBranchId) { success = !failure.isFailedButNotMuted(); - name = failure.getName(); + investigated = failure.isInvestigated(); curFailures = failure.failuresCount(); durationPrintable = millisToDurationPrintable(failure.getAvgDurationMs()); - String[] split = Strings.nullToEmpty(name).split("\\:"); - if (split.length >= 2) { - String suiteShort = split[0].trim(); - String[] suiteComps = suiteShort.split("\\."); - if (suiteComps.length > 1) - suiteName = suiteComps[suiteComps.length - 1]; - - String testShort = split[1].trim(); - String[] testComps = testShort.split("\\."); - if (testComps.length > 2) - testName = testComps[testComps.length - 2] + "." + testComps[testComps.length - 1]; - } - - failure.getOccurrences().forEach(full -> { - String details = full.details; + initFrom(failure, tcIgn, baseBranchId); - if (details != null) { + failure.getInvocationsStream() + .map(TestCompacted::getDetailsText) + .filter(Objects::nonNull) + .forEach(details -> { if (webIssueUrl == null) checkAndFillByPrefix(details, "https://issues.apache.org/jira/browse/"); @@ -137,19 +114,21 @@ public class DsTestFailureUi { if (LogMsgToWarn.needWarn(s)) warnings.add(s); } - } - if (webUrl == null) - if (full.test != null && full.test.id != null) - webUrl = buildWebLink(tcIgn, full.test.id, projectId, branchName); + }); + + failure.getInvocationsStream() + .map(TestCompacted::getTestId) + .filter(Objects::nonNull) + .forEach(testNameId -> { + if (webUrl == null && testNameId != null) + webUrl = buildWebLink(tcIgn, testNameId, projectId, branchName); + + if (webUrlBaseBranch == null && testNameId != null) + webUrlBaseBranch = buildWebLink(tcIgn, testNameId, projectId, baseBranchName); + }); + } - if (webUrlBaseBranch == null) - if (full.test != null && full.test.id != null) - webUrlBaseBranch = buildWebLink(tcIgn, full.test.id, projectId, baseBranchName); - }); - final IRunHistory stat = failure.history(tcIgn, baseBranchId); - blockerComment = failure.getPossibleBlockerComment(stat); - } /** * @param details Details full text with error. @@ -178,7 +157,7 @@ public class DsTestFailureUi { } } - private static String buildWebLink(ITeamcityIgnited tcIgn, String id, + private static String buildWebLink(ITeamcityIgnited tcIgn, Long testNameId, @Nullable String projectId, @Nullable String branchName) { if (projectId == null) return null; @@ -187,7 +166,7 @@ public class DsTestFailureUi { return tcIgn.host() + "project.html" + "?projectId=" + projectId - + "&testNameId=" + id + + "&testNameId=" + testNameId + "&branch=" + UrlUtil.escape(branch) + "&tab=testDetails"; } @@ -264,10 +243,5 @@ public class DsTestFailureUi { return "\t" + name + "\n"; } - /** - * - */ - public boolean isPossibleBlocker() { - return !Strings.isNullOrEmpty(blockerComment); - } + } diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/ShortSuiteUi.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/ShortSuiteUi.java new file mode 100644 index 0000000..8f042a7 --- /dev/null +++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/ShortSuiteUi.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ignite.tcbot.engine.ui; + +import com.google.common.base.Strings; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.apache.ignite.tcbot.engine.chain.MultBuildRunCtx; +import org.apache.ignite.tcbot.persistence.IStringCompactor; +import org.apache.ignite.tcignited.ITeamcityIgnited; +import org.apache.ignite.tcignited.history.IRunHistory; + +import static org.apache.ignite.tcbot.engine.ui.DsSuiteUi.buildWebLinkToBuild; + +public class ShortSuiteUi extends DsHistoryStatUi { + /** Suite Name */ + public String name; + + /** Suite Run Result (filled if failed): Summary of build problems, count of tests, etc. */ + public String result; + + /** + * Possible blocker comment: filled for PR and builds checks, non null value contains problem explanation + * displayable. + */ + @Nullable public String blockerComment; + + public List<ShortTestFailureUi> testShortFailures = new ArrayList<>(); + + + /** Web Href. to suite particular run */ + public String webToBuild = ""; + + public int totalBlockers() { + int res = 0; + if (!Strings.isNullOrEmpty(blockerComment)) + res++; + + res += (int)testFailures().stream().filter(ShortTestFailureUi::isPossibleBlocker).count(); + + return res; + } + + public Collection<? extends ShortTestFailureUi> testFailures() { + return testShortFailures; + } + + + public ShortSuiteUi initFrom(@Nonnull MultBuildRunCtx suite, + ITeamcityIgnited tcIgnited, + IStringCompactor compactor, + IRunHistory baseBranchHist) { + name = suite.suiteName(); + result = suite.getResult(); + webToBuild = buildWebLinkToBuild(tcIgnited, suite); + + blockerComment = suite.getPossibleBlockerComment(compactor, baseBranchHist, tcIgnited.config()); + + return this; + } + + public ShortSuiteUi testShortFailures(List<ShortTestFailureUi> failures) { + this.testShortFailures = failures; + + return this; + } +} diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/ShortTestFailureUi.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/ShortTestFailureUi.java new file mode 100644 index 0000000..b702274 --- /dev/null +++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/ShortTestFailureUi.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ignite.tcbot.engine.ui; + +import com.google.common.base.Strings; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.apache.ignite.tcbot.engine.chain.TestCompactedMult; +import org.apache.ignite.tcignited.ITeamcityIgnited; +import org.apache.ignite.tcignited.history.IRunHistory; + +public class ShortTestFailureUi { + /** Test full Name */ + public String name; + + /** suite (in code) short name */ + @Nullable public String suiteName; + + /** test short name with class and method */ + @Nullable public String testName; + + + /** Blocker comment: indicates test seems to be introduced failure. */ + @Nullable public String blockerComment; + + /** + * + */ + public boolean isPossibleBlocker() { + return !Strings.isNullOrEmpty(blockerComment); + } + + public ShortTestFailureUi initFrom(@Nonnull TestCompactedMult failure, + ITeamcityIgnited tcIgn, Integer baseBranchId) { + name = failure.getName(); + + String[] split = Strings.nullToEmpty(name).split("\\:"); + if (split.length >= 2) { + String suiteShort = split[0].trim(); + String[] suiteComps = suiteShort.split("\\."); + if (suiteComps.length > 1) + suiteName = suiteComps[suiteComps.length - 1]; + + String testShort = split[1].trim(); + String[] testComps = testShort.split("\\."); + if (testComps.length > 2) + testName = testComps[testComps.length - 2] + "." + testComps[testComps.length - 1]; + } + + final IRunHistory stat = failure.history(tcIgn, baseBranchId); + blockerComment = failure.getPossibleBlockerComment(stat); + + return this; + } +} diff --git a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java index 1eeb543..3570dac 100644 --- a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java +++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java @@ -256,7 +256,6 @@ public class TestCompacted { return; } - byte[] uncompressed; byte[] snappy = null; byte[] gzip = null;