Skip to content

Commit 1f192ce

Browse files
committed
fix tests
1 parent 2dc3b75 commit 1f192ce

File tree

6 files changed

+129
-13
lines changed

6 files changed

+129
-13
lines changed

src/main/java/fr/inria/spirals/npefix/main/all/DefaultRepairStrategy.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import fr.inria.spirals.npefix.resi.CallChecker;
44
import fr.inria.spirals.npefix.resi.context.Lapse;
55
import fr.inria.spirals.npefix.resi.context.NPEOutput;
6+
import fr.inria.spirals.npefix.resi.exception.NoMoreDecision;
67
import fr.inria.spirals.npefix.resi.oracle.TestOracle;
78
import fr.inria.spirals.npefix.resi.selector.Selector;
89
import fr.inria.spirals.npefix.transformer.processors.AddImplicitCastChecker;
@@ -87,9 +88,12 @@ public NPEOutput run(Selector selector, List<String> methodTests) {
8788
}
8889
Result result = testRunner.run(request);
8990

90-
lapse.setOracle(new TestOracle(result));
91-
System.out.println(lapse);
91+
TestOracle oracle = new TestOracle(result);
92+
lapse.setOracle(oracle);
9293
if (result.getRunCount() > 0) {
94+
if (oracle.isValid() || !oracle.getError().contains(NoMoreDecision.class.getSimpleName())) {
95+
System.out.println(lapse);
96+
}
9397
output.add(lapse);
9498
try {
9599
selector.restartTest(lapse);

src/main/java/fr/inria/spirals/npefix/main/all/Launcher.java

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
import fr.inria.spirals.npefix.resi.CallChecker;
77
import fr.inria.spirals.npefix.resi.context.Lapse;
88
import fr.inria.spirals.npefix.resi.context.NPEOutput;
9+
import fr.inria.spirals.npefix.resi.exception.NoMoreDecision;
910
import fr.inria.spirals.npefix.resi.oracle.ExceptionOracle;
1011
import fr.inria.spirals.npefix.resi.selector.DomSelector;
1112
import fr.inria.spirals.npefix.resi.selector.RandomSelector;
1213
import fr.inria.spirals.npefix.resi.selector.Selector;
1314
import fr.inria.spirals.npefix.resi.strategies.Strategy;
14-
1515
import org.apache.commons.io.FileUtils;
1616
import org.junit.After;
1717
import org.junit.AfterClass;
@@ -41,6 +41,7 @@
4141
import java.util.ArrayList;
4242
import java.util.Collection;
4343
import java.util.Collections;
44+
import java.util.Date;
4445
import java.util.HashSet;
4546
import java.util.Iterator;
4647
import java.util.List;
@@ -195,6 +196,73 @@ private SpoonModelBuilder init() {
195196
return compiler;
196197
}
197198

199+
public NPEOutput run(int nbIteration, Selector selector) {
200+
NPEOutput output = new NPEOutput();
201+
202+
DecisionServer decisionServer = new DecisionServer(selector);
203+
decisionServer.startServer();
204+
List<String> tests = this.getTests();
205+
if(tests.isEmpty()) {
206+
throw new RuntimeException("No test found");
207+
}
208+
Date initEndDate = new Date();
209+
int countError = 0;
210+
while (output.size() < nbIteration) {
211+
if(countError > 5) {
212+
break;
213+
}
214+
try {
215+
List<Lapse> result = this.run(selector, tests);
216+
if(result.isEmpty()) {
217+
countError++;
218+
continue;
219+
}
220+
boolean isEnd = true;
221+
for (int i = 0; i < result.size() && isEnd; i++) {
222+
Lapse lapse = result.get(i);
223+
if (lapse.getOracle().getError() != null) {
224+
isEnd = isEnd && lapse.getOracle().getError().contains(NoMoreDecision.class.getSimpleName());
225+
} else {
226+
isEnd = false;
227+
}
228+
}
229+
if (isEnd) {
230+
// no more decision
231+
countError++;
232+
continue;
233+
}
234+
countError = 0;
235+
if(output.size() + result.size() > nbIteration) {
236+
output.addAll(result.subList(0, (nbIteration - output.size())));
237+
} else {
238+
output.addAll(result);
239+
}
240+
} catch (NoMoreDecision e) {
241+
countError++;
242+
continue;
243+
} catch (OutOfMemoryError e) {
244+
e.printStackTrace();
245+
countError++;
246+
continue;
247+
} catch (Exception e) {
248+
if(e.getCause() instanceof OutOfMemoryError) {
249+
countError++;
250+
continue;
251+
}
252+
e.printStackTrace();
253+
countError++;
254+
continue;
255+
}
256+
System.out.println("Multirun " + output.size() + "/" + nbIteration + " " + ((int)(output.size()/(double)nbIteration * 100)) + "%");
257+
}
258+
output.setStart(initEndDate);
259+
output.setEnd(new Date());
260+
261+
decisionServer.stopServer();
262+
263+
return output;
264+
}
265+
198266
public NPEOutput run() {
199267
return run(new RandomSelector());
200268
}

src/main/java/fr/inria/spirals/npefix/resi/CallChecker.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import fr.inria.spirals.npefix.resi.context.MethodContext;
88
import fr.inria.spirals.npefix.resi.context.instance.Instance;
99
import fr.inria.spirals.npefix.resi.exception.ForceReturn;
10+
import fr.inria.spirals.npefix.resi.exception.NoMoreDecision;
1011
import fr.inria.spirals.npefix.resi.selector.DomSelector;
1112
import fr.inria.spirals.npefix.resi.selector.GreedySelector;
1213
import fr.inria.spirals.npefix.resi.selector.Selector;
@@ -274,7 +275,7 @@ public static <T, E extends RuntimeException> T isToCatch(E throwable, Class<T>
274275
}
275276

276277
if(searchSpace.isEmpty()) {
277-
throw throwable;
278+
throw new NoMoreDecision();
278279
}
279280

280281
Decision<?> decision = getDecision(searchSpace);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package fr.inria.spirals.npefix.resi.exception;
2+
3+
/**
4+
* Created by thomas on 15/10/15.
5+
*/
6+
public class NoMoreDecision extends NPEFixError {
7+
public NoMoreDecision(){
8+
super();
9+
}
10+
11+
public NoMoreDecision(String string) {
12+
super(string);
13+
}
14+
}

src/main/java/fr/inria/spirals/npefix/resi/selector/ExplorerSelector.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import fr.inria.spirals.npefix.resi.context.Decision;
44
import fr.inria.spirals.npefix.resi.context.Lapse;
55
import fr.inria.spirals.npefix.resi.context.Location;
6+
import fr.inria.spirals.npefix.resi.exception.NoMoreDecision;
67
import fr.inria.spirals.npefix.resi.strategies.NoStrat;
78
import fr.inria.spirals.npefix.resi.strategies.Strategy;
89

@@ -104,9 +105,11 @@ public synchronized <T> Decision<T> select(List<Decision<T>> decisions) {
104105
}
105106
otherDecision.remove(decision);
106107
}
107-
throw new RuntimeException("No more available decision");
108+
throw new NoMoreDecision();
108109
} catch (Throwable e) {
109-
e.printStackTrace();
110+
if (!(e instanceof NoMoreDecision)) {
111+
e.printStackTrace();
112+
}
110113
throw e;
111114
}
112115
}

src/test/java/fr/inria/spirals/npefix/transformer/TryCatchRepairModelTest.java

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import fr.inria.spirals.npefix.main.all.Launcher;
44
import fr.inria.spirals.npefix.main.all.TryCatchRepairStrategy;
55
import fr.inria.spirals.npefix.resi.CallChecker;
6+
import fr.inria.spirals.npefix.resi.context.Lapse;
67
import fr.inria.spirals.npefix.resi.context.NPEOutput;
78
import fr.inria.spirals.npefix.resi.selector.ExplorerSelector;
9+
import fr.inria.spirals.npefix.resi.strategies.NoStrat;
810
import fr.inria.spirals.npefix.resi.strategies.ReturnType;
911
import fr.inria.spirals.npefix.resi.strategies.Strat4;
1012
import org.apache.commons.io.FileUtils;
@@ -14,6 +16,9 @@
1416

1517
import java.io.File;
1618
import java.net.URL;
19+
import java.util.Arrays;
20+
import java.util.HashSet;
21+
import java.util.Set;
1722

1823
/**
1924
* Created by Benjamin DANGLOT
@@ -57,16 +62,37 @@ public void testRepairWithTryCatch() throws Exception {
5762

5863
launcher.instrument();
5964

60-
NPEOutput results = launcher.run(new ExplorerSelector(new Strat4(ReturnType.NULL)));
61-
Assert.assertEquals("Strat4 Null failing", 4, results.getFailureCount());
65+
NPEOutput results = launcher.run(new ExplorerSelector(new NoStrat()));
66+
Assert.assertEquals(new HashSet<>(), getPassingTest(results));
67+
Assert.assertEquals("NoStrat failing", results.size(), results.getFailureCount());
6268

63-
results = launcher.run(new ExplorerSelector(new Strat4(ReturnType.VAR)));
69+
results = launcher.run(1500, new ExplorerSelector(new Strat4(ReturnType.NULL)));
70+
Assert.assertEquals(new HashSet<String>(), getPassingTest(results));
71+
Assert.assertTrue(results.size() > 0);
72+
Assert.assertEquals("Strat4 Null failing", results.size(), results.getFailureCount());
73+
74+
results = launcher.run(1500, new ExplorerSelector(new Strat4(ReturnType.VAR)));
75+
Assert.assertEquals(new HashSet<String>(Arrays.asList("ConeflowerTest#testThrowException")), getPassingTest(results));
76+
Assert.assertTrue(results.size() > 0);
77+
Assert.assertEquals("Strat4 var passing", 1, results.size() - results.getFailureCount());
6478
Assert.assertEquals("Strat4 var failing", 3, results.getFailureCount());
6579

66-
results = launcher.run(new ExplorerSelector(new Strat4(ReturnType.NEW)));
67-
Assert.assertEquals("Strat4 new failing", 0, results.getFailureCount());
80+
results = launcher.run(1500, new ExplorerSelector(new Strat4(ReturnType.NEW)));
81+
Assert.assertTrue(results.size() > 0);
82+
Assert.assertEquals("Strat4 new failing", 8, results.getFailureCount());
83+
84+
results = launcher.run(1500, new ExplorerSelector(new Strat4(ReturnType.VOID)));
85+
Assert.assertTrue(results.size() == 0);
86+
Assert.assertEquals("Strat4 void failing", results.size(), results.getFailureCount());
87+
}
6888

69-
results = launcher.run(new ExplorerSelector(new Strat4(ReturnType.VOID)));
70-
Assert.assertEquals("Strat4 void failing", 4, results.getFailureCount());
89+
private Set<String> getPassingTest(NPEOutput output) {
90+
Set<String> passingTests = new HashSet<>();
91+
for (Lapse lapse : output) {
92+
if (lapse.getOracle().isValid()) {
93+
passingTests.add(lapse.getTestClassName() + "#" + lapse.getTestName());
94+
}
95+
}
96+
return passingTests;
7197
}
7298
}

0 commit comments

Comments
 (0)