View Javadoc
1   package org.junit.tests.experimental.max;
2   
3   import static org.hamcrest.CoreMatchers.containsString;
4   import static org.hamcrest.CoreMatchers.is;
5   import static org.junit.Assert.assertEquals;
6   import static org.junit.Assert.assertThat;
7   import static org.junit.Assert.assertTrue;
8   import static org.junit.Assert.fail;
9   
10  import java.io.File;
11  import java.util.ArrayList;
12  import java.util.List;
13  
14  import junit.framework.TestCase;
15  import org.junit.After;
16  import org.junit.Before;
17  import org.junit.Test;
18  import org.junit.experimental.max.MaxCore;
19  import org.junit.internal.runners.JUnit38ClassRunner;
20  import org.junit.runner.Computer;
21  import org.junit.runner.Description;
22  import org.junit.runner.JUnitCore;
23  import org.junit.runner.Request;
24  import org.junit.runner.Result;
25  import org.junit.runner.Runner;
26  import org.junit.runner.manipulation.Filter;
27  import org.junit.runner.notification.Failure;
28  import org.junit.runner.notification.RunListener;
29  import org.junit.tests.AllTests;
30  
31  public class MaxStarterTest {
32      private MaxCore fMax;
33  
34      private File fMaxFile;
35  
36      @Before
37      public void createMax() {
38          fMaxFile = new File("MaxCore.ser");
39          if (fMaxFile.exists()) {
40              fMaxFile.delete();
41          }
42          fMax = MaxCore.storedLocally(fMaxFile);
43      }
44  
45      @After
46      public void forgetMax() {
47          fMaxFile.delete();
48      }
49  
50      public static class TwoTests {
51          @Test
52          public void succeed() {
53          }
54  
55          @Test
56          public void dontSucceed() {
57              fail();
58          }
59      }
60  
61      @Test
62      public void twoTestsNotRunComeBackInRandomOrder() {
63          Request request = Request.aClass(TwoTests.class);
64          List<Description> things = fMax.sortedLeavesForTest(request);
65          Description succeed = Description.createTestDescription(TwoTests.class,
66                  "succeed");
67          Description dontSucceed = Description.createTestDescription(
68                  TwoTests.class, "dontSucceed");
69          assertTrue(things.contains(succeed));
70          assertTrue(things.contains(dontSucceed));
71          assertEquals(2, things.size());
72      }
73  
74      @Test
75      public void preferNewTests() {
76          Request one = Request.method(TwoTests.class, "succeed");
77          fMax.run(one);
78          Request two = Request.aClass(TwoTests.class);
79          List<Description> things = fMax.sortedLeavesForTest(two);
80          Description dontSucceed = Description.createTestDescription(
81                  TwoTests.class, "dontSucceed");
82          assertEquals(dontSucceed, things.get(0));
83          assertEquals(2, things.size());
84      }
85  
86      // This covers a seemingly-unlikely case, where you had a test that failed
87      // on the
88      // last run and you also introduced new tests. In such a case it pretty much
89      // doesn't matter
90      // which order they run, you just want them both to be early in the sequence
91      @Test
92      public void preferNewTestsOverTestsThatFailed() {
93          Request one = Request.method(TwoTests.class, "dontSucceed");
94          fMax.run(one);
95          Request two = Request.aClass(TwoTests.class);
96          List<Description> things = fMax.sortedLeavesForTest(two);
97          Description succeed = Description.createTestDescription(TwoTests.class,
98                  "succeed");
99          assertEquals(succeed, things.get(0));
100         assertEquals(2, things.size());
101     }
102 
103     @Test
104     public void preferRecentlyFailed() {
105         Request request = Request.aClass(TwoTests.class);
106         fMax.run(request);
107         List<Description> tests = fMax.sortedLeavesForTest(request);
108         Description dontSucceed = Description.createTestDescription(
109                 TwoTests.class, "dontSucceed");
110         assertEquals(dontSucceed, tests.get(0));
111     }
112 
113     @Test
114     public void sortTestsInMultipleClasses() {
115         Request request = Request.classes(Computer.serial(), TwoTests.class,
116                 TwoTests.class);
117         fMax.run(request);
118         List<Description> tests = fMax.sortedLeavesForTest(request);
119         Description dontSucceed = Description.createTestDescription(
120                 TwoTests.class, "dontSucceed");
121         assertEquals(dontSucceed, tests.get(0));
122         assertEquals(dontSucceed, tests.get(1));
123     }
124 
125     public static class TwoUnEqualTests {
126         @Test
127         public void slow() throws InterruptedException {
128             Thread.sleep(100);
129             fail();
130         }
131 
132         @Test
133         public void fast() {
134             fail();
135         }
136 
137     }
138 
139     @Test
140     public void rememberOldRuns() {
141         fMax.run(TwoUnEqualTests.class);
142 
143         MaxCore reincarnation = MaxCore.storedLocally(fMaxFile);
144         List<Failure> failures = reincarnation.run(TwoUnEqualTests.class)
145                 .getFailures();
146         assertEquals("fast", failures.get(0).getDescription().getMethodName());
147         assertEquals("slow", failures.get(1).getDescription().getMethodName());
148     }
149 
150     @Test
151     public void preferFast() {
152         Request request = Request.aClass(TwoUnEqualTests.class);
153         fMax.run(request);
154         Description thing = fMax.sortedLeavesForTest(request).get(1);
155         assertEquals(Description.createTestDescription(TwoUnEqualTests.class,
156                 "slow"), thing);
157     }
158 
159     @Test
160     public void listenersAreCalledCorrectlyInTheFaceOfFailures()
161             throws Exception {
162         JUnitCore core = new JUnitCore();
163         final List<Failure> failures = new ArrayList<Failure>();
164         core.addListener(new RunListener() {
165             @Override
166             public void testRunFinished(Result result) throws Exception {
167                 failures.addAll(result.getFailures());
168             }
169         });
170         fMax.run(Request.aClass(TwoTests.class), core);
171         assertEquals(1, failures.size());
172     }
173 
174     @Test
175     public void testsAreOnlyIncludedOnceWhenExpandingForSorting()
176             throws Exception {
177         Result result = fMax.run(Request.aClass(TwoTests.class));
178         assertEquals(2, result.getRunCount());
179     }
180 
181     public static class TwoOldTests extends TestCase {
182         public void testOne() {
183         }
184 
185         public void testTwo() {
186         }
187     }
188 
189     @Test
190     public void junit3TestsAreRunOnce() throws Exception {
191         Result result = fMax.run(Request.aClass(TwoOldTests.class),
192                 new JUnitCore());
193         assertEquals(2, result.getRunCount());
194     }
195 
196     @Test
197     public void filterSingleMethodFromOldTestClass() throws Exception {
198         final Description method = Description.createTestDescription(
199                 TwoOldTests.class, "testOne");
200         Filter filter = Filter.matchMethodDescription(method);
201         JUnit38ClassRunner child = new JUnit38ClassRunner(TwoOldTests.class);
202         child.filter(filter);
203         assertEquals(1, child.testCount());
204     }
205 
206     @Test
207     public void testCountsStandUpToFiltration() {
208         assertFilterLeavesTestUnscathed(AllTests.class);
209     }
210 
211     private void assertFilterLeavesTestUnscathed(Class<?> testClass) {
212         Request oneClass = Request.aClass(testClass);
213         Request filtered = oneClass.filterWith(new Filter() {
214             @Override
215             public boolean shouldRun(Description description) {
216                 return true;
217             }
218 
219             @Override
220             public String describe() {
221                 return "Everything";
222             }
223         });
224 
225         int filterCount = filtered.getRunner().testCount();
226         int coreCount = oneClass.getRunner().testCount();
227         assertEquals("Counts match up in " + testClass, coreCount, filterCount);
228     }
229 
230     private static class MalformedJUnit38Test {
231         private MalformedJUnit38Test() {
232         }
233 
234         @SuppressWarnings("unused")
235         public void testSucceeds() {
236         }
237     }
238 
239     @Test
240     public void maxShouldSkipMalformedJUnit38Classes() {
241         Request request = Request.aClass(MalformedJUnit38Test.class);
242         fMax.run(request);
243     }
244 
245     public static class MalformedJUnit38TestMethod extends TestCase {
246         @SuppressWarnings("unused")
247         private void testNothing() {
248         }
249     }
250 
251     String fMessage = null;
252 
253     @Test
254     public void correctErrorFromMalformedTest() {
255         Request request = Request.aClass(MalformedJUnit38TestMethod.class);
256         JUnitCore core = new JUnitCore();
257         Request sorted = fMax.sortRequest(request);
258         Runner runner = sorted.getRunner();
259         Result result = core.run(runner);
260         Failure failure = result.getFailures().get(0);
261         assertThat(failure.toString(), containsString("MalformedJUnit38TestMethod"));
262         assertThat(failure.toString(), containsString("testNothing"));
263         assertThat(failure.toString(), containsString("isn't public"));
264     }
265 
266     public static class HalfMalformedJUnit38TestMethod extends TestCase {
267         public void testSomething() {
268         }
269 
270         @SuppressWarnings("unused")
271         private void testNothing() {
272         }
273     }
274 
275     @Test
276     public void halfMalformed() {
277         assertThat(JUnitCore.runClasses(HalfMalformedJUnit38TestMethod.class)
278                 .getFailureCount(), is(1));
279     }
280 
281 
282     @Test
283     public void correctErrorFromHalfMalformedTest() {
284         Request request = Request.aClass(HalfMalformedJUnit38TestMethod.class);
285         JUnitCore core = new JUnitCore();
286         Request sorted = fMax.sortRequest(request);
287         Runner runner = sorted.getRunner();
288         Result result = core.run(runner);
289         Failure failure = result.getFailures().get(0);
290         assertThat(failure.toString(), containsString("MalformedJUnit38TestMethod"));
291         assertThat(failure.toString(), containsString("testNothing"));
292         assertThat(failure.toString(), containsString("isn't public"));
293     }
294 }