/usr/share/doc/junit4/api/src-html/org/junit/experimental/max/MaxCore.html is in junit4-doc 4.12-6.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>package org.junit.experimental.max;<a name="line.1"></a>
<span class="sourceLineNo">002</span><a name="line.2"></a>
<span class="sourceLineNo">003</span>import java.io.File;<a name="line.3"></a>
<span class="sourceLineNo">004</span>import java.util.ArrayList;<a name="line.4"></a>
<span class="sourceLineNo">005</span>import java.util.Collections;<a name="line.5"></a>
<span class="sourceLineNo">006</span>import java.util.List;<a name="line.6"></a>
<span class="sourceLineNo">007</span><a name="line.7"></a>
<span class="sourceLineNo">008</span>import junit.framework.TestSuite;<a name="line.8"></a>
<span class="sourceLineNo">009</span>import org.junit.internal.requests.SortingRequest;<a name="line.9"></a>
<span class="sourceLineNo">010</span>import org.junit.internal.runners.ErrorReportingRunner;<a name="line.10"></a>
<span class="sourceLineNo">011</span>import org.junit.internal.runners.JUnit38ClassRunner;<a name="line.11"></a>
<span class="sourceLineNo">012</span>import org.junit.runner.Description;<a name="line.12"></a>
<span class="sourceLineNo">013</span>import org.junit.runner.JUnitCore;<a name="line.13"></a>
<span class="sourceLineNo">014</span>import org.junit.runner.Request;<a name="line.14"></a>
<span class="sourceLineNo">015</span>import org.junit.runner.Result;<a name="line.15"></a>
<span class="sourceLineNo">016</span>import org.junit.runner.Runner;<a name="line.16"></a>
<span class="sourceLineNo">017</span>import org.junit.runners.Suite;<a name="line.17"></a>
<span class="sourceLineNo">018</span>import org.junit.runners.model.InitializationError;<a name="line.18"></a>
<span class="sourceLineNo">019</span><a name="line.19"></a>
<span class="sourceLineNo">020</span>/**<a name="line.20"></a>
<span class="sourceLineNo">021</span> * A replacement for JUnitCore, which keeps track of runtime and failure history, and reorders tests<a name="line.21"></a>
<span class="sourceLineNo">022</span> * to maximize the chances that a failing test occurs early in the test run.<a name="line.22"></a>
<span class="sourceLineNo">023</span> *<a name="line.23"></a>
<span class="sourceLineNo">024</span> * The rules for sorting are:<a name="line.24"></a>
<span class="sourceLineNo">025</span> * <ol><a name="line.25"></a>
<span class="sourceLineNo">026</span> * <li> Never-run tests first, in arbitrary order<a name="line.26"></a>
<span class="sourceLineNo">027</span> * <li> Group remaining tests by the date at which they most recently failed.<a name="line.27"></a>
<span class="sourceLineNo">028</span> * <li> Sort groups such that the most recent failure date is first, and never-failing tests are at the end.<a name="line.28"></a>
<span class="sourceLineNo">029</span> * <li> Within a group, run the fastest tests first.<a name="line.29"></a>
<span class="sourceLineNo">030</span> * </ol><a name="line.30"></a>
<span class="sourceLineNo">031</span> */<a name="line.31"></a>
<span class="sourceLineNo">032</span>public class MaxCore {<a name="line.32"></a>
<span class="sourceLineNo">033</span> private static final String MALFORMED_JUNIT_3_TEST_CLASS_PREFIX = "malformed JUnit 3 test class: ";<a name="line.33"></a>
<span class="sourceLineNo">034</span><a name="line.34"></a>
<span class="sourceLineNo">035</span> /**<a name="line.35"></a>
<span class="sourceLineNo">036</span> * Create a new MaxCore from a serialized file stored at storedResults<a name="line.36"></a>
<span class="sourceLineNo">037</span> *<a name="line.37"></a>
<span class="sourceLineNo">038</span> * @deprecated use storedLocally()<a name="line.38"></a>
<span class="sourceLineNo">039</span> */<a name="line.39"></a>
<span class="sourceLineNo">040</span> @Deprecated<a name="line.40"></a>
<span class="sourceLineNo">041</span> public static MaxCore forFolder(String folderName) {<a name="line.41"></a>
<span class="sourceLineNo">042</span> return storedLocally(new File(folderName));<a name="line.42"></a>
<span class="sourceLineNo">043</span> }<a name="line.43"></a>
<span class="sourceLineNo">044</span><a name="line.44"></a>
<span class="sourceLineNo">045</span> /**<a name="line.45"></a>
<span class="sourceLineNo">046</span> * Create a new MaxCore from a serialized file stored at storedResults<a name="line.46"></a>
<span class="sourceLineNo">047</span> */<a name="line.47"></a>
<span class="sourceLineNo">048</span> public static MaxCore storedLocally(File storedResults) {<a name="line.48"></a>
<span class="sourceLineNo">049</span> return new MaxCore(storedResults);<a name="line.49"></a>
<span class="sourceLineNo">050</span> }<a name="line.50"></a>
<span class="sourceLineNo">051</span><a name="line.51"></a>
<span class="sourceLineNo">052</span> private final MaxHistory history;<a name="line.52"></a>
<span class="sourceLineNo">053</span><a name="line.53"></a>
<span class="sourceLineNo">054</span> private MaxCore(File storedResults) {<a name="line.54"></a>
<span class="sourceLineNo">055</span> history = MaxHistory.forFolder(storedResults);<a name="line.55"></a>
<span class="sourceLineNo">056</span> }<a name="line.56"></a>
<span class="sourceLineNo">057</span><a name="line.57"></a>
<span class="sourceLineNo">058</span> /**<a name="line.58"></a>
<span class="sourceLineNo">059</span> * Run all the tests in <code>class</code>.<a name="line.59"></a>
<span class="sourceLineNo">060</span> *<a name="line.60"></a>
<span class="sourceLineNo">061</span> * @return a {@link Result} describing the details of the test run and the failed tests.<a name="line.61"></a>
<span class="sourceLineNo">062</span> */<a name="line.62"></a>
<span class="sourceLineNo">063</span> public Result run(Class<?> testClass) {<a name="line.63"></a>
<span class="sourceLineNo">064</span> return run(Request.aClass(testClass));<a name="line.64"></a>
<span class="sourceLineNo">065</span> }<a name="line.65"></a>
<span class="sourceLineNo">066</span><a name="line.66"></a>
<span class="sourceLineNo">067</span> /**<a name="line.67"></a>
<span class="sourceLineNo">068</span> * Run all the tests contained in <code>request</code>.<a name="line.68"></a>
<span class="sourceLineNo">069</span> *<a name="line.69"></a>
<span class="sourceLineNo">070</span> * @param request the request describing tests<a name="line.70"></a>
<span class="sourceLineNo">071</span> * @return a {@link Result} describing the details of the test run and the failed tests.<a name="line.71"></a>
<span class="sourceLineNo">072</span> */<a name="line.72"></a>
<span class="sourceLineNo">073</span> public Result run(Request request) {<a name="line.73"></a>
<span class="sourceLineNo">074</span> return run(request, new JUnitCore());<a name="line.74"></a>
<span class="sourceLineNo">075</span> }<a name="line.75"></a>
<span class="sourceLineNo">076</span><a name="line.76"></a>
<span class="sourceLineNo">077</span> /**<a name="line.77"></a>
<span class="sourceLineNo">078</span> * Run all the tests contained in <code>request</code>.<a name="line.78"></a>
<span class="sourceLineNo">079</span> *<a name="line.79"></a>
<span class="sourceLineNo">080</span> * This variant should be used if {@code core} has attached listeners that this<a name="line.80"></a>
<span class="sourceLineNo">081</span> * run should notify.<a name="line.81"></a>
<span class="sourceLineNo">082</span> *<a name="line.82"></a>
<span class="sourceLineNo">083</span> * @param request the request describing tests<a name="line.83"></a>
<span class="sourceLineNo">084</span> * @param core a JUnitCore to delegate to.<a name="line.84"></a>
<span class="sourceLineNo">085</span> * @return a {@link Result} describing the details of the test run and the failed tests.<a name="line.85"></a>
<span class="sourceLineNo">086</span> */<a name="line.86"></a>
<span class="sourceLineNo">087</span> public Result run(Request request, JUnitCore core) {<a name="line.87"></a>
<span class="sourceLineNo">088</span> core.addListener(history.listener());<a name="line.88"></a>
<span class="sourceLineNo">089</span> return core.run(sortRequest(request).getRunner());<a name="line.89"></a>
<span class="sourceLineNo">090</span> }<a name="line.90"></a>
<span class="sourceLineNo">091</span><a name="line.91"></a>
<span class="sourceLineNo">092</span> /**<a name="line.92"></a>
<span class="sourceLineNo">093</span> * @return a new Request, which contains all of the same tests, but in a new order.<a name="line.93"></a>
<span class="sourceLineNo">094</span> */<a name="line.94"></a>
<span class="sourceLineNo">095</span> public Request sortRequest(Request request) {<a name="line.95"></a>
<span class="sourceLineNo">096</span> if (request instanceof SortingRequest) {<a name="line.96"></a>
<span class="sourceLineNo">097</span> // We'll pay big karma points for this<a name="line.97"></a>
<span class="sourceLineNo">098</span> return request;<a name="line.98"></a>
<span class="sourceLineNo">099</span> }<a name="line.99"></a>
<span class="sourceLineNo">100</span> List<Description> leaves = findLeaves(request);<a name="line.100"></a>
<span class="sourceLineNo">101</span> Collections.sort(leaves, history.testComparator());<a name="line.101"></a>
<span class="sourceLineNo">102</span> return constructLeafRequest(leaves);<a name="line.102"></a>
<span class="sourceLineNo">103</span> }<a name="line.103"></a>
<span class="sourceLineNo">104</span><a name="line.104"></a>
<span class="sourceLineNo">105</span> private Request constructLeafRequest(List<Description> leaves) {<a name="line.105"></a>
<span class="sourceLineNo">106</span> final List<Runner> runners = new ArrayList<Runner>();<a name="line.106"></a>
<span class="sourceLineNo">107</span> for (Description each : leaves) {<a name="line.107"></a>
<span class="sourceLineNo">108</span> runners.add(buildRunner(each));<a name="line.108"></a>
<span class="sourceLineNo">109</span> }<a name="line.109"></a>
<span class="sourceLineNo">110</span> return new Request() {<a name="line.110"></a>
<span class="sourceLineNo">111</span> @Override<a name="line.111"></a>
<span class="sourceLineNo">112</span> public Runner getRunner() {<a name="line.112"></a>
<span class="sourceLineNo">113</span> try {<a name="line.113"></a>
<span class="sourceLineNo">114</span> return new Suite((Class<?>) null, runners) {<a name="line.114"></a>
<span class="sourceLineNo">115</span> };<a name="line.115"></a>
<span class="sourceLineNo">116</span> } catch (InitializationError e) {<a name="line.116"></a>
<span class="sourceLineNo">117</span> return new ErrorReportingRunner(null, e);<a name="line.117"></a>
<span class="sourceLineNo">118</span> }<a name="line.118"></a>
<span class="sourceLineNo">119</span> }<a name="line.119"></a>
<span class="sourceLineNo">120</span> };<a name="line.120"></a>
<span class="sourceLineNo">121</span> }<a name="line.121"></a>
<span class="sourceLineNo">122</span><a name="line.122"></a>
<span class="sourceLineNo">123</span> private Runner buildRunner(Description each) {<a name="line.123"></a>
<span class="sourceLineNo">124</span> if (each.toString().equals("TestSuite with 0 tests")) {<a name="line.124"></a>
<span class="sourceLineNo">125</span> return Suite.emptySuite();<a name="line.125"></a>
<span class="sourceLineNo">126</span> }<a name="line.126"></a>
<span class="sourceLineNo">127</span> if (each.toString().startsWith(MALFORMED_JUNIT_3_TEST_CLASS_PREFIX)) {<a name="line.127"></a>
<span class="sourceLineNo">128</span> // This is cheating, because it runs the whole class<a name="line.128"></a>
<span class="sourceLineNo">129</span> // to get the warning for this method, but we can't do better,<a name="line.129"></a>
<span class="sourceLineNo">130</span> // because JUnit 3.8's<a name="line.130"></a>
<span class="sourceLineNo">131</span> // thrown away which method the warning is for.<a name="line.131"></a>
<span class="sourceLineNo">132</span> return new JUnit38ClassRunner(new TestSuite(getMalformedTestClass(each)));<a name="line.132"></a>
<span class="sourceLineNo">133</span> }<a name="line.133"></a>
<span class="sourceLineNo">134</span> Class<?> type = each.getTestClass();<a name="line.134"></a>
<span class="sourceLineNo">135</span> if (type == null) {<a name="line.135"></a>
<span class="sourceLineNo">136</span> throw new RuntimeException("Can't build a runner from description [" + each + "]");<a name="line.136"></a>
<span class="sourceLineNo">137</span> }<a name="line.137"></a>
<span class="sourceLineNo">138</span> String methodName = each.getMethodName();<a name="line.138"></a>
<span class="sourceLineNo">139</span> if (methodName == null) {<a name="line.139"></a>
<span class="sourceLineNo">140</span> return Request.aClass(type).getRunner();<a name="line.140"></a>
<span class="sourceLineNo">141</span> }<a name="line.141"></a>
<span class="sourceLineNo">142</span> return Request.method(type, methodName).getRunner();<a name="line.142"></a>
<span class="sourceLineNo">143</span> }<a name="line.143"></a>
<span class="sourceLineNo">144</span><a name="line.144"></a>
<span class="sourceLineNo">145</span> private Class<?> getMalformedTestClass(Description each) {<a name="line.145"></a>
<span class="sourceLineNo">146</span> try {<a name="line.146"></a>
<span class="sourceLineNo">147</span> return Class.forName(each.toString().replace(MALFORMED_JUNIT_3_TEST_CLASS_PREFIX, ""));<a name="line.147"></a>
<span class="sourceLineNo">148</span> } catch (ClassNotFoundException e) {<a name="line.148"></a>
<span class="sourceLineNo">149</span> return null;<a name="line.149"></a>
<span class="sourceLineNo">150</span> }<a name="line.150"></a>
<span class="sourceLineNo">151</span> }<a name="line.151"></a>
<span class="sourceLineNo">152</span><a name="line.152"></a>
<span class="sourceLineNo">153</span> /**<a name="line.153"></a>
<span class="sourceLineNo">154</span> * @param request a request to run<a name="line.154"></a>
<span class="sourceLineNo">155</span> * @return a list of method-level tests to run, sorted in the order<a name="line.155"></a>
<span class="sourceLineNo">156</span> * specified in the class comment.<a name="line.156"></a>
<span class="sourceLineNo">157</span> */<a name="line.157"></a>
<span class="sourceLineNo">158</span> public List<Description> sortedLeavesForTest(Request request) {<a name="line.158"></a>
<span class="sourceLineNo">159</span> return findLeaves(sortRequest(request));<a name="line.159"></a>
<span class="sourceLineNo">160</span> }<a name="line.160"></a>
<span class="sourceLineNo">161</span><a name="line.161"></a>
<span class="sourceLineNo">162</span> private List<Description> findLeaves(Request request) {<a name="line.162"></a>
<span class="sourceLineNo">163</span> List<Description> results = new ArrayList<Description>();<a name="line.163"></a>
<span class="sourceLineNo">164</span> findLeaves(null, request.getRunner().getDescription(), results);<a name="line.164"></a>
<span class="sourceLineNo">165</span> return results;<a name="line.165"></a>
<span class="sourceLineNo">166</span> }<a name="line.166"></a>
<span class="sourceLineNo">167</span><a name="line.167"></a>
<span class="sourceLineNo">168</span> private void findLeaves(Description parent, Description description, List<Description> results) {<a name="line.168"></a>
<span class="sourceLineNo">169</span> if (description.getChildren().isEmpty()) {<a name="line.169"></a>
<span class="sourceLineNo">170</span> if (description.toString().equals("warning(junit.framework.TestSuite$1)")) {<a name="line.170"></a>
<span class="sourceLineNo">171</span> results.add(Description.createSuiteDescription(MALFORMED_JUNIT_3_TEST_CLASS_PREFIX + parent));<a name="line.171"></a>
<span class="sourceLineNo">172</span> } else {<a name="line.172"></a>
<span class="sourceLineNo">173</span> results.add(description);<a name="line.173"></a>
<span class="sourceLineNo">174</span> }<a name="line.174"></a>
<span class="sourceLineNo">175</span> } else {<a name="line.175"></a>
<span class="sourceLineNo">176</span> for (Description each : description.getChildren()) {<a name="line.176"></a>
<span class="sourceLineNo">177</span> findLeaves(description, each, results);<a name="line.177"></a>
<span class="sourceLineNo">178</span> }<a name="line.178"></a>
<span class="sourceLineNo">179</span> }<a name="line.179"></a>
<span class="sourceLineNo">180</span> }<a name="line.180"></a>
<span class="sourceLineNo">181</span>}<a name="line.181"></a>
</pre>
</div>
</body>
</html>
|