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;

Reply via email to