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;">
>></a></td></tr>';
+ '<td class="innerTcLink">' +
+ '<a href="'+href+'" target="_blank"> >></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));
},