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

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


The following commit(s) were added to refs/heads/ignite-10372 by this push:
     new 27adcbf  IGNITE-10372 Optimize master trends page step 3: Tests fixed, 
now data is shown correctly
27adcbf is described below

commit 27adcbf17e8f7999edbed8ede96029486da6413e
Author: Dmitriy Pavlov <[email protected]>
AuthorDate: Thu Nov 22 21:46:57 2018 +0300

    IGNITE-10372 Optimize master trends page step 3: Tests fixed, now data is 
shown correctly
---
 .../ci/tcbot/trends/MasterTrendsService.java       |  8 ++-
 .../teamcity/ignited/fatbuild/TestCompacted.java   |  7 +++
 .../web/model/current/BuildStatisticsSummary.java  | 10 +++-
 .../ignite/ci/web/model/hist/BuildsHistory.java    | 43 +++++++-------
 .../src/main/webapp/comparison.html                | 68 +++++++++-------------
 5 files changed, 70 insertions(+), 66 deletions(-)

diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/trends/MasterTrendsService.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/trends/MasterTrendsService.java
index 0bad554..4eaf51a 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/trends/MasterTrendsService.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/trends/MasterTrendsService.java
@@ -42,6 +42,7 @@ import 
org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.ProblemCompacted;
 import org.apache.ignite.ci.util.FutureUtil;
 import org.apache.ignite.ci.web.model.current.BuildStatisticsSummary;
+import org.apache.ignite.internal.util.typedef.T2;
 import org.jetbrains.annotations.NotNull;
 
 /**
@@ -108,9 +109,12 @@ public class MasterTrendsService {
 
                     if (t.status() == 
BuildStatisticsSummary.getStringId(TestOccurrence.STATUS_FAILURE)
                         && !t.isIgnoredTest() && !t.isMutedTest()) {
-                        Map<Integer, Integer> btTests = 
s.failedTests.computeIfAbsent(b.buildTypeId(), k -> new HashMap<>());
+                        Map<Integer, T2<Long, Integer>> btTests = 
s.failedTests().computeIfAbsent(b.buildTypeId(), k -> new HashMap<>());
 
-                        btTests.merge(t.testName(), 1, (x, y) -> (x == null ? 
0 : x) + (y == null ? 0 : y));
+                        btTests.merge(t.testName(), new T2<>(t.getTestId(), 
1), (v, x) -> {
+                            int cnt = (x == null ? 0 : x.get2()) + (v == null 
? 0 : v.get2());
+                            return new T2<>(t.getTestId(), cnt);
+                        });
                     }
                 });
             });
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 26b64a4..7684803 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
@@ -366,4 +366,11 @@ public class TestCompacted {
             .add("details", details)
             .toString() + "\n";
     }
+
+    public Long getTestId() {
+        if (testId != 0)
+            return testId;
+
+        return null;
+    }
 }
diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/BuildStatisticsSummary.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/BuildStatisticsSummary.java
index e11bccc..1ab8cf9 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/BuildStatisticsSummary.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/BuildStatisticsSummary.java
@@ -36,6 +36,7 @@ import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.ProblemCompacted;
+import org.apache.ignite.internal.util.typedef.T2;
 
 import static org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence.*;
 
@@ -83,8 +84,9 @@ public class BuildStatisticsSummary {
     /** Is fake stub. */
     public boolean isFakeStub;
 
-    /** Failed tests: Map from build type string ID -> Map of test name (full) 
string ID -> to count of failure. */
-    public Map<Integer, Map<Integer, Integer>> failedTests = new HashMap<>();
+    /** Failed tests: Map from build type string ID ->
+     *           Map of test name (full) string ID -> (test refrenence, to 
count of failures). */
+    private Map<Integer, Map<Integer, T2<Long, Integer>>> failedTests = new 
HashMap<>();
 
     /** Is valid. */
     public boolean isValid = true;
@@ -223,4 +225,8 @@ public class BuildStatisticsSummary {
         return Objects.hash(buildId, startDate, testOccurrences,
             duration, totalProblems, isFakeStub);
     }
+
+    public Map<Integer, Map<Integer, T2<Long, Integer>>> failedTests() {
+        return failedTests;
+    }
 }
diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/hist/BuildsHistory.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/hist/BuildsHistory.java
index 0ea27cf..ed12d0e 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/hist/BuildsHistory.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/hist/BuildsHistory.java
@@ -19,6 +19,7 @@ package org.apache.ignite.ci.web.model.hist;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 import org.apache.ignite.ci.ITeamcity;
@@ -55,7 +56,9 @@ public class BuildsHistory {
     private String srvId;
 
     /** */
-    private String projectId;
+    public String projectId;
+
+    public String tcHost;
 
     /** */
     private String buildTypeId;
@@ -69,8 +72,8 @@ public class BuildsHistory {
     /** */
     private Date untilDateFilter;
 
-    /** */
-    private Map<String, Map<String, Float>> mergedTestsBySuites = new 
ConcurrentHashMap<>();
+    /** Suite name -> map of test name -> [test Name ID: String to avoid JS 
overflow, fail rate: float] */
+    public Map<String, Map<String, List<Object>>> mergedTestsBySuites = new 
ConcurrentHashMap<>();
 
     /** */
     private boolean skipTests;
@@ -79,25 +82,21 @@ public class BuildsHistory {
     public List<BuildStatisticsSummary> buildsStatistics = new ArrayList<>();
 
     /** */
-    public String mergedTestsJson;
-
-    /** */
     private static final Logger logger = 
LoggerFactory.getLogger(BuildsHistory.class);
 
     @Inject private ITeamcityIgnitedProvider tcIgnitedProv;
 
-    @Inject private ITcServerProvider tcServerProvider;
-
     @Inject private MasterTrendsService masterTrendsService;
 
     @Inject private IStringCompactor compactor;
 
+
     /** */
     public void initialize(ICredentialsProv prov) {
-        ITeamcity teamcity = tcServerProvider.server(srvId, prov);
-
         ITeamcityIgnited ignitedTeamcity = tcIgnitedProv.server(srvId, prov);
 
+        tcHost = ignitedTeamcity.host();
+
         List<Integer> finishedBuildsIds = ignitedTeamcity
             .getFinishedBuildsCompacted(buildTypeId, branchName, 
sinceDateFilter, untilDateFilter)
             .stream().mapToInt(BuildRefCompacted::id).boxed()
@@ -118,14 +117,6 @@ public class BuildsHistory {
 
         if (MasterTrendsService.DEBUG)
             System.out.println("Preparing response");
-
-        ObjectMapper objMapper = new ObjectMapper();
-
-        try {
-            mergedTestsJson = 
objMapper.writeValueAsString(mergedTestsBySuites);
-        } catch (JsonProcessingException e) {
-            throw new RuntimeException(e);
-        }
     }
 
     /** */
@@ -176,16 +167,24 @@ public class BuildsHistory {
             if(!Boolean.TRUE.equals(valid))
                 continue;
 
-            buildStat.failedTests.forEach((btId, map) -> {
+            buildStat.failedTests().forEach((btId, map) -> {
                 String configurationName = compactor.getStringFromId(btId);
-                Map<String, Float> tests = 
mergedTestsBySuites.computeIfAbsent(configurationName,
+                Map<String, List<Object>> tests = 
mergedTestsBySuites.computeIfAbsent(configurationName,
                     k -> new HashMap<>());
 
-                map.forEach((tn, cnt) -> {
+                map.forEach((tn, pair) -> {
                     String testName = compactor.getStringFromId(tn);
+                    Integer cnt = pair.get2();
                     float i = cnt != null ? cnt : 1F;
 
-                    tests.merge(testName, i / buildIds.size(), (a, b) -> a + 
b);
+                    float addForFailRate = i / buildIds.size();
+
+                    tests.merge(testName, 
Lists.newArrayList(Long.toString(pair.get1()), addForFailRate),
+                        (a, b) -> {
+                            if (a == null)
+                                return b;
+                            return Lists.newArrayList(a.get(0), 
(Float)a.get(1) + (Float)b.get(1));
+                        });
                 });
             });
         }
diff --git a/ignite-tc-helper-web/src/main/webapp/comparison.html 
b/ignite-tc-helper-web/src/main/webapp/comparison.html
index 9d97977..4b729fe 100644
--- a/ignite-tc-helper-web/src/main/webapp/comparison.html
+++ b/ignite-tc-helper-web/src/main/webapp/comparison.html
@@ -202,6 +202,9 @@
     let dateIntervals = {1: {start: moment(getDateFewWeeksAgo(1)), end: 
moment()},
         2: {start: moment(getDateFewWeeksAgo(2)), end: 
moment(getDateFewWeeksAgo(1))}};
 
+    let g_tcHost;
+    let g_projectId;
+
     function showTooltip(message) {
         $("#tooltipText").html(message);
         modal.show();
@@ -356,7 +359,7 @@
         $('*[id=' + id + ']').each(function() {
             $(this).toggle();
         });
-    }
+    };
 
     function mergeSuites(results) {
         let mergedSuites = new Set();
@@ -403,11 +406,11 @@
         for (let key of  Object.keys(results)) {
             let obj = {};
 
-            for (let suite of  Object.keys(results[key])) {
+            for (let suite of Object.keys(results[key])) {
                 let otherTests = {};
 
                 for (let otherKey of Object.keys(results)) {
-                    if (key == otherKey)
+                    if (key === otherKey)
                         continue;
 
                     otherTests = Object.assign({}, results[otherKey][suite]);
@@ -416,12 +419,15 @@
                 let newFailedTests = {};
 
                 for (let testName of Object.keys(results[key][suite])) {
-                    let failRate = results[key][suite][testName];
-                    let otherFailRate = otherTests[testName];
-
-                    if ((otherFailRate == null || failRate - otherFailRate > 
FAIL_RATE_DIFF_TRESHOLD)
-                        && failRate > $('#treshold').val()/100)
-                        newFailedTests[testName] = failRate;
+                    let failRate = results[key][suite][testName][1];
+                    let othTstDtls = otherTests[testName];
+
+                    if ((othTstDtls == null || failRate - othTstDtls[1] > 
FAIL_RATE_DIFF_TRESHOLD)
+                        && failRate > $('#treshold').val()/100) {
+                        newFailedTests[testName] = [];
+                        newFailedTests[testName][0] = 
results[key][suite][testName][0];
+                        newFailedTests[testName][1] = failRate;
+                    }
                 }
 
                 if (Object.keys(newFailedTests).length != 0)
@@ -448,14 +454,20 @@
 
             let testMethodName = list.pop();
             let testClass = list.pop();
-            let failRate = results[key][suite][testName];
-
+            let failRate = results[key][suite][testName][1];
+            let testId = results[key][suite][testName][0];
+
+            let href = g_tcHost
+                + "project.html"
+                + "?projectId=" + g_projectId
+                + "&testNameId=" +  testId
+                + "&tab=testDetails"  ;
             res += '<tr>' +
                 '<td class="innerTestName"><p title="' + testName + '">' + 
testClass + '.' + testMethodName + '</p></td>' +
                 '<td class="innerFailRate"><p title="Test\'s fail-rate for 
corresponding date period">' +
                 Number((failRate * 100).toFixed(1)) + '%</p></td>' +
-                '<td class="innerTcLink"><a href="#" onclick="getTestRef(\'' +
-                testName + '\',\'' + suite + '\'); return false;"> 
&gt&gt</a></td></tr>';
+                '<td class="innerTcLink">' +
+                '<a href="'+href+'" target="_blank"> &gt&gt</a></td></tr>';
         }
 
         res += '</table>';
@@ -463,28 +475,6 @@
         return res;
     }
 
-    function getTestRef(testName, suite) {
-        let res = null;
-
-        $.ajax({
-                async: false,
-                url: 'rest/build/testRef?testName=' + testName + '&suiteName=' 
+ suite,
-                success: function (result) {
-                    res = result;
-                },
-                error: showErrInLoadStatus
-            }
-        );
-
-        if (res == null) {
-            showTooltip('Link to TC test history is not ready yet. Try 
later.');
-
-            return;
-        }
-
-        window.open(res);
-    }
-
     function printStatistics(data) {
         clearBackgroundFromAllDataCells();
         clearGraphs(data.num);
@@ -578,15 +568,13 @@
         $.ajax({
                 url: url,
                 success: function (result) {
+                    g_tcHost = result.tcHost;
+                    g_projectId = result.projectId;
                     data[num] = new Data(num, result.buildsStatistics, 
sinceDate, untilDate);
 
                     printStatistics(data[num]);
 
-                    try {
-                        mergedTestsResults[num] = 
JSON.parse(result.mergedTestsJson);
-                    } catch (e) {
-                        printImportantMessage(num, "#ff0000", "Invalid server 
response. Unable to parse JSON");
-                    }
+                    mergedTestsResults[num] = result.mergedTestsBySuites;
 
                     
printTests(generateTestsResultsComparison(mergedTestsResults));
                 },

Reply via email to