This is an automated email from the ASF dual-hosted git repository.

dpavlov pushed a commit to branch ignite-9542-new-run-stripe
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git


The following commit(s) were added to refs/heads/ignite-9542-new-run-stripe by 
this push:
     new 50d8bf2  IGNITE-9542 Flaky detection ported and tested: provide 
separated base/current branch history for PR page
50d8bf2 is described below

commit 50d8bf260945a630d7a932fa7871f043fa7acae4
Author: Dmitriy Pavlov <[email protected]>
AuthorDate: Fri Dec 7 20:17:45 2018 +0300

    IGNITE-9542 Flaky detection ported and tested: provide separated 
base/current branch history for PR page
---
 .../ignite/ci/tcbot/chain/PrChainsProcessor.java   |   2 +-
 .../ignite/ci/teamcity/ignited/IRunHistory.java    |   2 +-
 .../ignited/fatbuild/FatBuildCompacted.java        |  14 +-
 .../teamcity/ignited/fatbuild/TestCompacted.java   |  10 +-
 .../ci/teamcity/ignited/runhist/Invocation.java    |  53 ++++++-
 .../teamcity/ignited/runhist/InvocationData.java   |  14 +-
 .../teamcity/ignited/runhist/RunHistCompacted.java |  24 +++-
 .../ci/tcbot/chain/PrChainsProcessorTest.java      | 160 +++++++++++++--------
 .../ignited/IgnitedTcInMemoryIntegrationTest.java  |   4 +-
 9 files changed, 191 insertions(+), 92 deletions(-)

diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
index 4ab79b7..f981abd 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
@@ -195,7 +195,7 @@ public class PrChainsProcessor {
 
         boolean noBuilds = summary.servers.stream().anyMatch(s -> 
s.buildNotFound);
 
-        if(noBuilds)
+        if (noBuilds)
             return null;
 
         for (ChainAtServerCurrentStatus server : summary.servers) {
diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IRunHistory.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IRunHistory.java
index 091d8f7..6ecc42d 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IRunHistory.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IRunHistory.java
@@ -41,7 +41,7 @@ public interface IRunHistory extends IRunStat {
     @Nullable
     List<Integer> getLatestRunResults();
 
-    String getFlakyComments();
+    @Nullable String getFlakyComments();
 
     public default String getCriticalFailPercentPrintable() {
         return IRunStat.getPercentPrintable(getCriticalFailRate() * 100.0f);
diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
index 31cba27..0d48b26 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
@@ -178,8 +178,10 @@ public class FatBuildCompacted extends BuildRefCompacted 
implements IVersionedEn
         name = compactor.getStringId(btName);
     }
 
-    public void snapshotDependencies(int[] arr) {
+    public FatBuildCompacted snapshotDependencies(int[] arr) {
         snapshotDeps = arr.length > 0 ? arr : null;
+
+        return this;
     }
 
     /**
@@ -481,8 +483,6 @@ public class FatBuildCompacted extends BuildRefCompacted 
implements IVersionedEn
     public Invocation toInvocation(IStringCompactor compactor) {
         boolean success = isSuccess(compactor);
 
-        final Invocation invocation = new Invocation(getId());
-
         final int failCode ;
 
         if (success)
@@ -500,10 +500,10 @@ public class FatBuildCompacted extends BuildRefCompacted 
implements IVersionedEn
 
         }
 
-        invocation.status((byte)failCode);
-        invocation.startDate(getStartDateTs());
-        invocation.changesPresent(changes().length > 0 ? 1 : 0);
-        return invocation;
+        return new Invocation(getId())
+            .withStatus((byte)failCode)
+            .withStartDate(getStartDateTs())
+            .withChanges(changes());
     }
 
     public void setVersion(short ver) {
diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java
index d03f9f1..b5a8e36 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/TestCompacted.java
@@ -379,7 +379,6 @@ public class TestCompacted {
     public Invocation toInvocation(IStringCompactor compactor, 
FatBuildCompacted build) {
         final boolean failedTest = isFailedTest(compactor);
 
-        final Invocation invocation = new Invocation(build.getId());
 
         final int failCode = failedTest
                 ? (isIgnoredTest() || isMutedTest())
@@ -387,10 +386,9 @@ public class TestCompacted {
                 : InvocationData.FAILURE
                 : InvocationData.OK;
 
-        invocation.status((byte) failCode);
-        invocation.startDate(build.getStartDateTs());
-        invocation.changesPresent(build.changes().length > 0 ? 1 : 0);
-
-        return invocation;
+        return new Invocation(build.getId())
+            .withStatus(failCode)
+            .withStartDate(build.getStartDateTs())
+            .withChanges(build.changes());
     }
 }
diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
index f540c2f..171f100 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
@@ -20,15 +20,30 @@ package org.apache.ignite.ci.teamcity.ignited.runhist;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
+import org.apache.ignite.ci.analysis.RunStat;
 
+/**
+ * Run history element: invocation of build or test.
+ */
 public class Invocation {
+    /** Change not filled. */
+    public static final int CHANGE_NOT_FILLED = 2;
+    public static final int CHANGE_PRESENT = 1;
+    public static final int NO_CHANGES = 0;
+
+    /** Build id. */
     private int buildId;
-    byte status;
+    /** Status: An integer (actually byte) code from RunStat.RunStatus */
+    private byte status;
+
+    /** Change present: 0 - no changes, 1 - changes present, 2- unknown */
     private byte changePresent;
-    long startDate;
+    /** Build Start date as timestamp. */
+    private long startDate;
 
     public Invocation(Integer buildId) {
         this.buildId = buildId;
+        this.changePresent = CHANGE_NOT_FILLED;
     }
 
     /** {@inheritDoc} */
@@ -40,18 +55,42 @@ public class Invocation {
             .toString();
     }
 
-    public void status(int failCode) {
+    public Invocation withStatus(int failCode) {
         Preconditions.checkState(failCode < 128);
+        Preconditions.checkState(failCode >= 0);
+
         this.status = (byte) failCode;
+
+        return this;
+    }
+
+    public byte status() {
+        return status;
     }
 
-    public void startDate(long startDateTs) {
+    public Invocation withStartDate(long startDateTs) {
         this.startDate = startDateTs;
+
+        return this;
+    }
+
+    public Invocation withChanges(int[] changes) {
+        int i = changes.length > 0 ? CHANGE_PRESENT : NO_CHANGES;
+
+        Preconditions.checkState(i < 128);
+
+        this.changePresent = (byte)i;
+
+        return this;
     }
 
-    public void changesPresent(int changesPresent) {
-        Preconditions.checkState(changesPresent < 128);
-        this.changePresent = (byte) changesPresent;
+    public RunStat.ChangesState changesState() {
+        if (changePresent == NO_CHANGES)
+            return RunStat.ChangesState.NONE;
+        else if (changePresent == CHANGE_PRESENT)
+            return RunStat.ChangesState.EXIST;
+        else
+            return RunStat.ChangesState.UNKNOWN;
     }
 
     public boolean isFailure() {
diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/InvocationData.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/InvocationData.java
index 7ccc0fa..ef5521f 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/InvocationData.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/InvocationData.java
@@ -75,7 +75,7 @@ public class InvocationData {
         if (invocationMap.containsKey(build))
             return false;
 
-        if (isExpired(inv.startDate))
+        if (isExpired(inv.startDate()))
             return false;
 
         Invocation prevVal = invocationMap.putIfAbsent(build, inv);
@@ -92,7 +92,7 @@ public class InvocationData {
     }
 
     void removeEldiest() {
-        invocationMap.entrySet().removeIf(entries -> 
isExpired(entries.getValue().startDate));
+        invocationMap.entrySet().removeIf(entries -> 
isExpired(entries.getValue().startDate()));
     }
 
     /**
@@ -115,7 +115,7 @@ public class InvocationData {
     public int notMutedRunsCount() {
         return (int)
                 invocations()
-                        .filter(invocation -> invocation.status != MUTED)
+                        .filter(invocation -> invocation.status() != MUTED)
                         .count();
     }
 
@@ -132,14 +132,14 @@ public class InvocationData {
      * @param invocation Invocation.
      */
     private boolean isActual(Invocation invocation) {
-        return !isExpired(invocation.startDate);
+        return !isExpired(invocation.startDate());
     }
 
     /**
      *
      */
     public int failuresCount() {
-        return (int)invocations().filter(inv -> inv.status == FAILURE || 
inv.status == CRITICAL_FAILURE).count();
+        return (int)invocations().filter(inv -> inv.status() == FAILURE || 
inv.status() == CRITICAL_FAILURE).count();
     }
 
     /** {@inheritDoc} */
@@ -173,7 +173,7 @@ public class InvocationData {
      */
     public List<Integer> getLatestRuns() {
         return invocations()
-            .map(i->(int)i.status)
+            .map(i -> (int)i.status())
             .collect(Collectors.toList());
     }
 
@@ -181,6 +181,6 @@ public class InvocationData {
      *
      */
     public int criticalFailuresCount() {
-        return (int)invocations().filter(inv -> inv.status == 
CRITICAL_FAILURE).count();
+        return (int)invocations().filter(inv -> inv.status() == 
CRITICAL_FAILURE).count();
     }
 }
diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
index 23f0fa4..6b5cd92 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
@@ -20,8 +20,10 @@ package org.apache.ignite.ci.teamcity.ignited.runhist;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import java.util.List;
+import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 import org.apache.ignite.ci.analysis.IVersionedEntity;
+import org.apache.ignite.ci.analysis.RunStat;
 import org.apache.ignite.ci.db.Persisted;
 import org.apache.ignite.ci.teamcity.ignited.IRunHistory;
 
@@ -82,7 +84,27 @@ public class RunHistCompacted implements IVersionedEntity, 
IRunHistory {
     }
 
     @Override public String getFlakyComments() {
-        return null; //todo implement
+        int statusChange = 0;
+
+        Invocation prev = null;
+
+        List<Invocation> latestRuns = 
data.invocations().collect(Collectors.toList());
+
+        for (Invocation cur : latestRuns) {
+            if (prev != null && cur != null) {
+                if (prev.status() != cur.status()
+                    && cur.changesState() == RunStat.ChangesState.NONE
+                    && prev.changesState() != RunStat.ChangesState.UNKNOWN)
+                    statusChange++;
+            }
+            prev = cur;
+        }
+
+        if (statusChange < 1)
+            return null;
+
+        return "Test seems to be flaky: " +
+            "changed its status [" + statusChange + "/" + latestRuns.size() + 
"] without code modifications";
     }
 
     @Override public int getCriticalFailuresCount() {
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 28130dc..e8b689a 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
@@ -98,9 +98,9 @@ public class PrChainsProcessorTest {
     /** Build apache ignite: contains compilation error, should became a 
blocker. */
     public static final String BUILD_APACHE_IGNITE = "Build";
 
+    /** Builds emulated storage. */
     private Map<Integer, FatBuildCompacted> apacheBuilds = new 
ConcurrentHashMap<>();
 
-
     /**
      * Injector.
      */
@@ -159,7 +159,7 @@ public class PrChainsProcessorTest {
         final String btId = "RunAll";
         final String branch = "ignite-9542";
 
-        initBuildChain(c, btId, branch);
+        initBuildChainAndMasterHistory(c, btId, branch);
 
         PrChainsProcessor prcp = injector.getInstance(PrChainsProcessor.class);
         final List<SuiteCurrentStatus> blockers = 
prcp.getBlockersSuitesStatuses(btId,
@@ -169,16 +169,16 @@ public class PrChainsProcessorTest {
         assertNotNull(blockers);
         assertFalse(blockers.isEmpty());
 
-        
assertTrue(blockers.stream().anyMatch(containsTestFail("testWithoutHistory")));
+        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(containsTestFail(TEST_WITH_HISTORY_PASSING_IN_MASTER)));
+        assertTrue(containsTestFailure(blockers, 
TEST_WITH_HISTORY_PASSING_IN_MASTER));
 
         if (SuiteCurrentStatus.NEW_RUN_STAT) {
-            
assertFalse(blockers.stream().anyMatch(containsTestFail(TEST_WITH_HISTORY_FAILING_IN_MASTER)));
-            
assertFalse(blockers.stream().anyMatch(containsTestFail(TEST_FLAKY_IN_MASTER)));
+            assertFalse(containsTestFailure(blockers, 
TEST_WITH_HISTORY_FAILING_IN_MASTER));
+            assertFalse(containsTestFailure(blockers, TEST_FLAKY_IN_MASTER));
         }
 
         Optional<TestFailure> testOpt = findBlockerTestFailure(blockers, 
TEST_WITH_HISTORY_PASSING_IN_MASTER);
@@ -192,12 +192,34 @@ public class PrChainsProcessorTest {
             assertEquals(etalon, testOpt.get().histBaseBranch.latestRuns);
         }
 
-        
assertTrue(blockers.stream().anyMatch(containsTestFail(TEST_WAS_FIXED_IN_MASTER)));
+        assertTrue(containsTestFailure(blockers, TEST_WAS_FIXED_IN_MASTER));
         if(SuiteCurrentStatus.NEW_RUN_STAT)
-            
assertFalse(blockers.stream().anyMatch(containsTestFail(TEST_WITH_HISTORY_FAILING_IN_MASTER)));
+            assertFalse(containsTestFailure(blockers, 
TEST_WITH_HISTORY_FAILING_IN_MASTER));
         // otherwise this non-blocker will not be filtered out
 
-        
assertTrue(blockers.stream().anyMatch(containsTestFail(TEST_WITH_HISTORY_PASSING_IN_MASTER)));
+        assertTrue(containsTestFailure(blockers, 
TEST_WITH_HISTORY_PASSING_IN_MASTER));
+    }
+
+    public boolean containsTestFailure(List<SuiteCurrentStatus> blockers, 
String name) {
+        return blockers.stream().anyMatch(containsTestFail(name));
+    }
+
+    @Test
+    public void testFlakyDetector() {
+        IStringCompactor c = injector.getInstance(IStringCompactor.class);
+
+        final String btId = "RunAll";
+        final String branch = "ignite-10056";
+
+        initChainForFlakyTest(c, btId, branch);
+
+        initHistory(c);
+
+        PrChainsProcessor prcp = injector.getInstance(PrChainsProcessor.class);
+        final List<SuiteCurrentStatus> blockers = 
prcp.getBlockersSuitesStatuses(btId,
+            branch, SRV_ID, mock(ICredentialsProv.class));
+
+        System.out.println(blockers);
 
         Optional<TestFailure> rareNotFlaky = findBlockerTestFailure(blockers, 
TEST_RARE_FAILED_WITH_CHANGES);
         assertTrue(rareNotFlaky.isPresent());
@@ -221,51 +243,13 @@ public class PrChainsProcessorTest {
         });
     }
 
-    public void initBuildChain(IStringCompactor c, String btId, String branch) 
{
-        final FatBuildCompacted buildBuild = createFailedBuild(c, 
BUILD_APACHE_IGNITE, branch, 1002, 100020);
-        final ProblemOccurrence compile = new ProblemOccurrence();
-        compile.setType(ProblemOccurrence.TC_COMPILATION_ERROR);
-        buildBuild.addProblems(c, Collections.singletonList(compile));
-
-        final FatBuildCompacted cache1 =
-            createFailedBuild(c, CACHE_1, branch, 1001, 100020)
-                .addTests(c,
-                    Lists.newArrayList(
-                        createFailedTest(1L, TEST_WITHOUT_HISTORY),
-                        createFailedTest(2L, 
TEST_WITH_HISTORY_FAILING_IN_MASTER),
-                        createFailedTest(3L, 
TEST_WITH_HISTORY_PASSING_IN_MASTER),
-                        createFailedTest(50L, TEST_FLAKY_IN_MASTER),
-                        createFailedTest(400L, TEST_WAS_FIXED_IN_MASTER)));
-
-        cache1.snapshotDependencies(new int[] {buildBuild.id()});
-
-
-        final FatBuildCompacted cache9 = createFailedBuild(c, CACHE_9, branch, 
9001, 100090)
-            .addTests(c,
-                Lists.newArrayList(
-                    createFailedTest(1L, TEST_RARE_FAILED_WITH_CHANGES),
-                    createFailedTest(2L, TEST_RARE_FAILED_WITHOUT_CHANGES)));
-
-        cache9.snapshotDependencies(new int[] {buildBuild.id()});
-
-        final Build build = createJaxbBuild("CancelledBuild", branch, 1003, 
100020, true);
-
-        build.status = BuildRef.STATUS_UNKNOWN;
-        build.state = BuildRef.STATE_FINISHED;
-
-        final FatBuildCompacted cancelledBuild = new FatBuildCompacted(c, 
build);
-
-        cancelledBuild.snapshotDependencies(new int[]{buildBuild.id()});
-
-        final int id = 1000;
-
-        final FatBuildCompacted chain = createFailedBuild(c, btId, branch, id, 
100000);
-
-        chain.snapshotDependencies(new int[]{cache1.id(), cancelledBuild.id(), 
cache9.id()});
+    public void initBuildChainAndMasterHistory(IStringCompactor c, String 
btId, String branch) {
+        initBuildChain(c, btId, branch);
 
-        addBuilds(chain);
-        addBuilds(buildBuild, cancelledBuild, cache1, cache9);
+        initHistory(c);
+    }
 
+    public void initHistory(IStringCompactor c) {
         for (int i = 0; i < NUM_OF_TESTS_IN_MASTER; i++) {
             FatBuildCompacted cache1InMaster = createFailedBuild(c, CACHE_1,
                 ITeamcity.DEFAULT, 500 + i, 100000 + (i * 10000))
@@ -281,13 +265,13 @@ public class PrChainsProcessorTest {
                 cache1InMaster.addProblems(c, 
Collections.singletonList(timeout));
             }
 
-            addBuilds(cache1InMaster);
+            addBuildsToEmulatedStor(cache1InMaster);
         }
 
         long ageMs = TimeUnit.DAYS.toMillis(InvocationData.MAX_DAYS);
 
         for (int i = 0; i < 134; i++) {
-            addBuilds(createFailedBuild(c, CACHE_1,
+            addBuildsToEmulatedStor(createFailedBuild(c, CACHE_1,
                 ITeamcity.DEFAULT, i, ageMs + (i * 10000))
                 .addTests(c, Lists.newArrayList(
                     createFailedTest(400L, TEST_WAS_FIXED_IN_MASTER))));
@@ -304,10 +288,9 @@ public class PrChainsProcessorTest {
                             createPassingTest(50L, TEST_FLAKY_IN_MASTER),
                             createPassingTest(400L, 
TEST_WAS_FIXED_IN_MASTER)));
 
-            addBuilds(successfull);
+            addBuildsToEmulatedStor(successfull);
         }
 
-
         for (int i = 0; i < 100; i++) {
             boolean failNoChanges = i==77;
             boolean failWithChanges = i==55;
@@ -320,15 +303,72 @@ public class PrChainsProcessorTest {
                         createTest(1L, TEST_RARE_FAILED_WITHOUT_CHANGES, 
!failNoChanges),
                         createTest(2L, TEST_RARE_FAILED_WITH_CHANGES, 
!failWithChanges)));
 
-            if (failWithChanges)
-                fatBuild.changes(new int[] {12323325, 42354326});
+            if (failWithChanges || i==56) // add change to test status change 
after failure.
+                fatBuild.changes(new int[] {1000000+i, 1000020+i});
 
-            addBuilds(fatBuild);
+            addBuildsToEmulatedStor(fatBuild);
         }
+    }
+
+    public void initBuildChain(IStringCompactor c, String btId, String branch) 
{
+        final FatBuildCompacted buildBuild = createFailedBuild(c, 
BUILD_APACHE_IGNITE, branch, 1002, 100020);
+        final ProblemOccurrence compile = new ProblemOccurrence();
+        compile.setType(ProblemOccurrence.TC_COMPILATION_ERROR);
+        buildBuild.addProblems(c, Collections.singletonList(compile));
+
+        final FatBuildCompacted cache1 =
+            createFailedBuild(c, CACHE_1, branch, 1001, 100020)
+                .addTests(c,
+                    Lists.newArrayList(
+                        createFailedTest(1L, TEST_WITHOUT_HISTORY),
+                        createFailedTest(2L, 
TEST_WITH_HISTORY_FAILING_IN_MASTER),
+                        createFailedTest(3L, 
TEST_WITH_HISTORY_PASSING_IN_MASTER),
+                        createFailedTest(50L, TEST_FLAKY_IN_MASTER),
+                        createFailedTest(400L, TEST_WAS_FIXED_IN_MASTER)));
+
+        cache1.snapshotDependencies(new int[] {buildBuild.id()});
+
+        final Build build = createJaxbBuild("CancelledBuild", branch, 1003, 
100020, true);
 
+        build.status = BuildRef.STATUS_UNKNOWN;
+        build.state = BuildRef.STATE_FINISHED;
+
+        final FatBuildCompacted cancelledBuild = new FatBuildCompacted(c, 
build);
+
+        cancelledBuild.snapshotDependencies(new int[]{buildBuild.id()});
+
+        final int id = 1000;
+
+        FatBuildCompacted runAll = createFailedBuild(c, btId, branch, id, 
100000)
+            .snapshotDependencies(new int[] {cache1.id(), 
cancelledBuild.id()});
+
+        addBuildsToEmulatedStor(buildBuild, cancelledBuild, cache1, runAll);
+    }
+
+    public void initChainForFlakyTest(IStringCompactor c, String btId, String 
branch) {
+        final FatBuildCompacted buildBuild = createFailedBuild(c, 
BUILD_APACHE_IGNITE, branch, 1002, 100020);
+
+        final FatBuildCompacted cache9 = createFailedBuild(c, CACHE_9, branch, 
9001, 100090)
+            .addTests(c,
+                Lists.newArrayList(
+                    createFailedTest(1L, TEST_RARE_FAILED_WITH_CHANGES),
+                    createFailedTest(2L, TEST_RARE_FAILED_WITHOUT_CHANGES)));
+
+        cache9.snapshotDependencies(new int[] {buildBuild.id()});
+
+        final FatBuildCompacted chain = createFailedBuild(c, btId, branch, 
1000, 100000);
+
+        chain.snapshotDependencies(new int[]{cache9.id()});
+
+        addBuildsToEmulatedStor(buildBuild, cache9, chain);
     }
 
-    private void addBuilds(FatBuildCompacted... builds) {
+    /**
+     * Adds builds into emulated storage.
+     *
+     * @param builds Builds.
+     */
+    private void addBuildsToEmulatedStor(FatBuildCompacted... builds) {
         for (FatBuildCompacted build : builds) {
             final FatBuildCompacted oldB = apacheBuilds.put(build.id(), build);
 
diff --git 
a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
 
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
index 1a7d64c..5ef838d 100644
--- 
a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
+++ 
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
@@ -491,7 +491,7 @@ public class IgnitedTcInMemoryIntegrationTest {
         final String branch = ITeamcity.DEFAULT;
 
         final PrChainsProcessorTest tst = new PrChainsProcessorTest();
-        tst.initBuildChain(c, btId, branch);
+        tst.initBuildChainAndMasterHistory(c, btId, branch);
 
         final Map<Integer, FatBuildCompacted> buildsMap = tst.apacheBuilds();
 
@@ -545,7 +545,7 @@ public class IgnitedTcInMemoryIntegrationTest {
 
 
         final PrChainsProcessorTest tst = new PrChainsProcessorTest();
-        tst.initBuildChain(c, btId, branch);
+        tst.initBuildChainAndMasterHistory(c, btId, branch);
 
         final Map<Integer, FatBuildCompacted> buildsMap = tst.apacheBuilds();
 

Reply via email to