4d5d10d896fcf28c91e54e1613f24691c774472c
[android/platform/tools/build.git] / gradle / src / fromGradle / groovy / com / android / build / gradle / internal / test / report / CompositeTestResults.java
1 /*
2  * Copyright 2011 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.android.build.gradle.internal.test.report;
18
19 import org.gradle.api.internal.tasks.testing.junit.report.TestResultModel;
20
21 import java.math.BigDecimal;
22 import java.util.Map;
23 import java.util.Set;
24 import java.util.TreeMap;
25 import java.util.TreeSet;
26
27 import static org.gradle.api.tasks.testing.TestResult.ResultType;
28
29 /**
30  * Custom CompositeTestResults based on Gradle's CompositeTestResults
31  */
32 public abstract class CompositeTestResults extends TestResultModel {
33     private final CompositeTestResults parent;
34     private int tests;
35     private final Set<TestResult> failures = new TreeSet<TestResult>();
36     private long duration;
37
38     private final Map<String, DeviceTestResults> devices = new TreeMap<String, DeviceTestResults>();
39     private final Map<String, VariantTestResults> variants = new TreeMap<String, VariantTestResults>();
40
41
42     protected CompositeTestResults(CompositeTestResults parent) {
43         this.parent = parent;
44     }
45
46     public String getFilename(ReportType reportType) {
47         return getName();
48     }
49
50     public abstract String getName();
51
52     public int getTestCount() {
53         return tests;
54     }
55
56     public int getFailureCount() {
57         return failures.size();
58     }
59
60     @Override
61     public long getDuration() {
62         return duration;
63     }
64
65     @Override
66     public String getFormattedDuration() {
67         return getTestCount() == 0 ? "-" : super.getFormattedDuration();
68     }
69
70     public Set<TestResult> getFailures() {
71         return failures;
72     }
73
74     Map<String, DeviceTestResults> getResultsPerDevices() {
75         return devices;
76     }
77
78     Map<String, VariantTestResults> getResultsPerVariants() {
79         return variants;
80     }
81
82     @Override
83     public ResultType getResultType() {
84         return failures.isEmpty() ? ResultType.SUCCESS : ResultType.FAILURE;
85     }
86
87     public String getFormattedSuccessRate() {
88         Number successRate = getSuccessRate();
89         if (successRate == null) {
90             return "-";
91         }
92         return successRate + "%";
93     }
94
95     public Number getSuccessRate() {
96         if (getTestCount() == 0) {
97             return null;
98         }
99
100         BigDecimal tests = BigDecimal.valueOf(getTestCount());
101         BigDecimal successful = BigDecimal.valueOf(getTestCount() - getFailureCount());
102
103         return successful.divide(tests, 2,
104                 BigDecimal.ROUND_DOWN).multiply(BigDecimal.valueOf(100)).intValue();
105     }
106
107     protected void failed(TestResult failedTest,
108                           String deviceName, String projectName, String flavorName) {
109         failures.add(failedTest);
110         if (parent != null) {
111             parent.failed(failedTest, deviceName, projectName, flavorName);
112         }
113
114         DeviceTestResults deviceResults = devices.get(deviceName);
115         if (deviceResults != null) {
116             deviceResults.failed(failedTest, deviceName, projectName, flavorName);
117         }
118
119         String key = getVariantKey(projectName, flavorName);
120         VariantTestResults variantResults = variants.get(key);
121         if (variantResults != null) {
122             variantResults.failed(failedTest, deviceName, projectName, flavorName);
123         }
124     }
125
126     protected TestResult addTest(TestResult test) {
127         tests++;
128         duration += test.getDuration();
129         return test;
130     }
131
132     protected void addDevice(String deviceName, TestResult testResult) {
133         DeviceTestResults deviceResults = devices.get(deviceName);
134         if (deviceResults == null) {
135             deviceResults = new DeviceTestResults(deviceName, null);
136             devices.put(deviceName, deviceResults);
137         }
138
139         deviceResults.addTest(testResult);
140     }
141
142     protected void addVariant(String projectName, String flavorName, TestResult testResult) {
143         String key = getVariantKey(projectName, flavorName);
144         VariantTestResults variantResults = variants.get(key);
145         if (variantResults == null) {
146             variantResults = new VariantTestResults(key, null);
147             variants.put(key, variantResults);
148         }
149
150         variantResults.addTest(testResult);
151     }
152
153     private static String getVariantKey(String projectName, String flavorName) {
154         if (flavorName.equals("Main")) {
155             return projectName;
156         }
157
158         return projectName + ":" + flavorName;
159     }
160 }