You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dp...@apache.org on 2018/11/20 18:27:02 UTC

[ignite-teamcity-bot] branch master updated: IGNITE-10336 Incorrect ocurrences count reproduced in the test

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 85b3bee  IGNITE-10336 Incorrect ocurrences count reproduced in the test
85b3bee is described below

commit 85b3bee5314478edd510ea0f40f5c32db6fa6502
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Tue Nov 20 21:26:58 2018 +0300

    IGNITE-10336 Incorrect ocurrences count reproduced in the test
---
 .../ignite/ci/tcbot/chain/BuildChainProcessor.java |   2 +-
 .../ignited/fatbuild/FatBuildCompacted.java        |   6 +-
 .../ci/tcbot/chain/BuildChainProcessorTest.java    | 156 ++++++++++++++++++---
 .../teamcity/ignited/InMemoryStringCompactor.java  |  16 +++
 4 files changed, 155 insertions(+), 25 deletions(-)

diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java
index e929bb8..14d6d2e 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java
@@ -303,7 +303,7 @@ public class BuildChainProcessor {
             return hist
                 .sorted(Comparator.comparing(BuildRefCompacted::id).reversed())
                 .limit(cntLimit)
-                .filter(b -> !builds.containsKey(b.id())) // todo removing this causes incorrect count of failures (duplicated builds)
+               // .filter(b -> !builds.containsKey(b.id())) // todo removing this causes incorrect count of failures (duplicated builds)
                 .map(b -> builds.computeIfAbsent(b.id(), id -> teamcityIgnited.getFatBuild(id, syncMode)));
         }
 
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 c4f2b13..95e88ad 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
@@ -124,7 +124,7 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
         BuildType type = build.getBuildType();
         if (type != null) {
             projectId = compactor.getStringId(type.getProjectId());
-            name = compactor.getStringId(type.getName());
+            buildTypeName(type.getName(), compactor);
         }
 
         AtomicBoolean failedToStart = new AtomicBoolean();
@@ -156,6 +156,10 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
             setFlag(FAKE_BUILD_F, true);
     }
 
+    public void buildTypeName(String btName, IStringCompactor compactor) {
+        name = compactor.getStringId(btName);
+    }
+
     public void snapshotDependencies(int[] arr) {
         snapshotDeps = arr.length > 0 ? arr : null;
     }
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java
index 82ae7e8..2e2ec97 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessorTest.java
@@ -23,7 +23,7 @@ import com.google.inject.AbstractModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.internal.SingletonScope;
-import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.Map;
 import java.util.HashMap;
 import java.util.List;
@@ -31,30 +31,37 @@ import java.util.stream.Collectors;
 import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
 import org.apache.ignite.ci.ITeamcity;
 import org.apache.ignite.ci.analysis.FullChainRunCtx;
+import org.apache.ignite.ci.analysis.ITestFailures;
 import org.apache.ignite.ci.analysis.MultBuildRunCtx;
 import org.apache.ignite.ci.analysis.mode.LatestRebuildMode;
 import org.apache.ignite.ci.analysis.mode.ProcessLogsMode;
 import org.apache.ignite.ci.tcmodel.hist.BuildRef;
 import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrence;
 import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrenceFull;
+import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
 import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
 import org.apache.ignite.ci.teamcity.ignited.InMemoryStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.SyncMode;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.jetbrains.annotations.NotNull;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import static junit.framework.TestCase.assertEquals;
 import static junit.framework.TestCase.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.when;
 
 /**
  * Test for chain processor
  */
 public class BuildChainProcessorTest {
+    public static final String UNIQUE_FAILED_TEST = "uniqueFailedTest";
+    public static final String TEST_FAILING_EVERY_TIME = "testFailingEveryTime";
     /** Injector. */
     private Injector injector = Guice.createInjector(new AbstractModule() {
         @Override protected void configure() {
@@ -66,34 +73,110 @@ public class BuildChainProcessorTest {
     /**
      *
      */
+    @Ignore
     @Test
     public void testAllBuildsArePresentInMergedBuilds() {
         IStringCompactor c = injector.getInstance(IStringCompactor.class);
         BuildChainProcessor bcp = injector.getInstance(BuildChainProcessor.class);
-        IAnalyticsEnabledTeamcity teamcity = Mockito.mock(IAnalyticsEnabledTeamcity.class);
-        when(teamcity.getBuildFailureRunStatProvider()).thenReturn(Mockito.mock(Function.class));
-        when(teamcity.getTestRunStatProvider()).thenReturn(Mockito.mock(Function.class));
 
         Map<Integer, FatBuildCompacted> builds = new HashMap<>();
 
         List<Integer> entry = Lists.newArrayList();
-        for (int i = 0; i < 10; i++) {
-            FatBuildCompacted root = testFatBuild(c, i, "RunAll");
-            entry.add(root.id());
-
-            root.snapshotDependencies(new int[] {100 + i});
+        for (int i = 0; i < 10; i++)
+            addTestBuild(c, builds, entry, i);
 
-            builds.put(root.id(), root);
+        ITeamcityIgnited tcIgnited = tcIgnitedMock(builds);
 
-            FatBuildCompacted pds1 = testFatBuild(c, 100 + i, "PDS 1");
+        FullChainRunCtx ctx = bcp.loadFullChainContext(tcOldMock(), tcIgnited,
+            entry,
+            LatestRebuildMode.ALL, ProcessLogsMode.SUITE_NOT_COMPLETE, false, ITeamcity.DEFAULT, SyncMode.NONE);
+        List<MultBuildRunCtx> suites = ctx.failedChildSuites().collect(Collectors.toList());
 
-            TestOccurrenceFull t1 = new TestOccurrenceFull();
-            t1.name = "test" + i;
-            t1.status = TestOccurrence.STATUS_FAILURE;
-            pds1.addTests(c, Lists.newArrayList(t1));
+        assertTrue(!suites.isEmpty());
 
-            builds.put(pds1.id(), pds1);
+        for (MultBuildRunCtx suite : suites) {
+            System.out.println(suite.getFailedTestsNames().collect(Collectors.toList()));
+
+            if (suite.suiteName() != null && suite.suiteName().startsWith(UNIQUE_FAILED_TEST))
+                assertTrue(suite.failedTests() >= 10);
+            else
+                assertTrue(suite.failedTests() >= 1);
+
+            List<ITestFailures> tests = suite.getFailedTests();
+            for (ITestFailures test : tests) {
+                if (test.getName().startsWith(UNIQUE_FAILED_TEST))
+                    assertEquals(1, test.failuresCount());
+                else if (test.getName().equals(TEST_FAILING_EVERY_TIME))
+                    assertEquals(10, test.failuresCount());
+            }
         }
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testAllBuildsArePresentInSingleuilds() {
+        IStringCompactor c = injector.getInstance(IStringCompactor.class);
+        BuildChainProcessor bcp = injector.getInstance(BuildChainProcessor.class);
+
+        Map<Integer, FatBuildCompacted> builds = new HashMap<>();
+
+        List<Integer> entry = Lists.newArrayList();
+        addTestBuild(c, builds, entry, 0);
+
+        FullChainRunCtx ctx = bcp.loadFullChainContext(tcOldMock(), tcIgnitedMock(builds),
+            entry,
+            LatestRebuildMode.LATEST, ProcessLogsMode.SUITE_NOT_COMPLETE, false, ITeamcity.DEFAULT, SyncMode.NONE);
+        List<MultBuildRunCtx> suites = ctx.failedChildSuites().collect(Collectors.toList());
+
+        assertTrue(!suites.isEmpty());
+
+        MultBuildRunCtx suiteMultCtx = suites.get(0);
+        assertTrue(suiteMultCtx.failedTests() >= 1);
+    }
+
+    public void addTestBuild(IStringCompactor c, Map<Integer, FatBuildCompacted> builds, List<Integer> entry, int i) {
+        FatBuildCompacted root = testFatBuild(c, i, "RunAll");
+        entry.add(root.id());
+
+        root.snapshotDependencies(new int[] {100 + i, 200 + i});
+
+        builds.put(root.id(), root);
+
+        FatBuildCompacted pds1 = testFatBuild(c, 100 + i, "Pds1");
+        pds1.buildTypeName(UNIQUE_FAILED_TEST, c);
+
+        TestOccurrenceFull t1 = new TestOccurrenceFull();
+        t1.name = UNIQUE_FAILED_TEST + i;
+        t1.status = TestOccurrence.STATUS_FAILURE;
+        pds1.addTests(c, Lists.newArrayList(t1));
+
+        builds.put(pds1.id(), pds1);
+
+        FatBuildCompacted pds2 = testFatBuild(c, 200 + i, "Pds2");
+
+        TestOccurrenceFull t2 = new TestOccurrenceFull();
+        t2.name = "testPds2" + i;
+        t2.status = TestOccurrence.STATUS_SUCCESS;
+
+        TestOccurrenceFull t3 = new TestOccurrenceFull();
+        t3.name = TEST_FAILING_EVERY_TIME;
+        t3.status = TestOccurrence.STATUS_FAILURE;
+        pds2.addTests(c, Lists.newArrayList(t2, t3));
+
+        builds.put(pds2.id(), pds2);
+    }
+
+    @NotNull public IAnalyticsEnabledTeamcity tcOldMock() {
+        IAnalyticsEnabledTeamcity teamcity = Mockito.mock(IAnalyticsEnabledTeamcity.class);
+        when(teamcity.getBuildFailureRunStatProvider()).thenReturn(Mockito.mock(Function.class));
+        when(teamcity.getTestRunStatProvider()).thenReturn(Mockito.mock(Function.class));
+        return teamcity;
+    }
+
+    @NotNull public ITeamcityIgnited tcIgnitedMock(Map<Integer, FatBuildCompacted> builds) {
+        IStringCompactor c = injector.getInstance(IStringCompactor.class);
 
         ITeamcityIgnited tcIgnited = Mockito.mock(ITeamcityIgnited.class);
         when(tcIgnited.getFatBuild(anyInt(), any(SyncMode.class)))
@@ -104,15 +187,39 @@ public class BuildChainProcessorTest {
                 return Preconditions.checkNotNull(builds.get(arg), "Can't find build in map [" + arg + "]");
             });
 
-        FullChainRunCtx ctx = bcp.loadFullChainContext(teamcity, tcIgnited,
-            entry,
-            LatestRebuildMode.LATEST, ProcessLogsMode.SUITE_NOT_COMPLETE, false, ITeamcity.DEFAULT, SyncMode.NONE);
-        List<MultBuildRunCtx> suites = ctx.failedChildSuites().collect(Collectors.toList());
+        when(tcIgnited.getAllBuildsCompacted(anyString(), anyString()))
+            .thenAnswer(inv -> {
+                String btId = inv.getArgument(0);
 
-        assertTrue(!suites.isEmpty());
+                String branch = inv.getArgument(1);
 
-        MultBuildRunCtx suiteMultCtx = suites.get(0);
-        assertTrue(suiteMultCtx.failedTests() >= 1);
+                return builds.values()
+                    .stream()
+                    .filter(fb -> btId.equals(fb.buildTypeId(c)))
+                    //  .filter(fb -> branch.equals(fb.branchName(c)))
+                    .sorted(Comparator.comparing(BuildRefCompacted::id).reversed())
+                    .collect(Collectors.toList());
+            });
+
+        when(tcIgnited.getLastNBuildsFromHistory(anyString(), anyString(), anyInt()))
+            .thenAnswer(inv -> {
+                String btId = inv.getArgument(0);
+
+                String branch = inv.getArgument(1);
+
+                Integer cnt = inv.getArgument(2);
+
+                return builds.values()
+                    .stream()
+                    .filter(fb -> btId.equals(fb.buildTypeId(c)))
+                    // .filter(fb -> branch.equals(fb.branchName(c)))
+                    .sorted(Comparator.comparing(BuildRefCompacted::id).reversed())
+                    .limit(cnt)
+                    .map(BuildRefCompacted::id)
+                    .collect(Collectors.toList());
+            });
+
+        return tcIgnited;
     }
 
     @NotNull public FatBuildCompacted testFatBuild(IStringCompactor c, int id, String bt) {
@@ -123,6 +230,9 @@ public class BuildChainProcessorTest {
         ref.state = BuildRef.STATE_FINISHED;
         ref.status = BuildRef.STATUS_FAILURE;
         root.fillFieldsFromBuildRef(c, ref);
+
+        assertEquals(root.buildTypeId(c), bt);
+
         return root;
     }
 }
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/InMemoryStringCompactor.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/InMemoryStringCompactor.java
index 9c0ec07..629bebc 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/InMemoryStringCompactor.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/InMemoryStringCompactor.java
@@ -1,3 +1,19 @@
+/*
+ * 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.ci.teamcity.ignited;
 
 import java.util.Map;