Skip to content

Commit

Permalink
Fix several small bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
tdurieux committed Apr 8, 2016
1 parent a71b4ec commit a7a0d12
Show file tree
Hide file tree
Showing 14 changed files with 114 additions and 73 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ private void serializeResult(JSONObject results, String project, String selector
file.createNewFile();
}
FileWriter fileWriter = new FileWriter(file);
fileWriter.write(results.toString(2));
results.write(fileWriter);
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,11 @@
package fr.inria.spirals.npefix.resi.selector;

import fr.inria.spirals.npefix.config.Config;
import fr.inria.spirals.npefix.resi.CallChecker;
import fr.inria.spirals.npefix.resi.RandomGenerator;
import org.junit.Before;

public class ExplorationSelectorEvaluation extends AbstractSelectorEvaluation {

public ExplorationSelectorEvaluation () {
nbIteration = 1000000;
Config.CONFIG.setNbIteration(nbIteration);
}

@Before
public void setup() {
RandomGenerator.reset();
Expand Down
14 changes: 13 additions & 1 deletion src/main/java/fr/inria/spirals/npefix/main/all/Launcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import fr.inria.spirals.npefix.resi.CallChecker;
import fr.inria.spirals.npefix.resi.context.Laps;
import fr.inria.spirals.npefix.resi.context.NPEOutput;
import fr.inria.spirals.npefix.resi.oracle.ExceptionOracle;
import fr.inria.spirals.npefix.resi.oracle.TestOracle;
import fr.inria.spirals.npefix.resi.selector.DomSelector;
import fr.inria.spirals.npefix.resi.selector.RandomSelector;
Expand Down Expand Up @@ -316,7 +317,18 @@ public NPEOutput runCommandLine(Selector selector, List<Method> methodTests) {
// wait the end of the process
process.waitFor();
// adds all laps
output.addAll(selector.getLapses());
List<Laps> lapses = new ArrayList<>();
for (Laps laps : selector.getLapses()) {
if (laps.getOracle() instanceof ExceptionOracle) {
// removes laps that end because there is not more available decision (Full exploration strategy)
if (!laps.getOracle().isValid()
&& laps.getOracle().getError().contains("No more available decision")) {
continue;
}
}
lapses.add(laps);
}
output.addAll(lapses);
selector.getLapses().clear();
// destroy the process
process.destroy();
Expand Down
23 changes: 16 additions & 7 deletions src/main/java/fr/inria/spirals/npefix/resi/CallChecker.java
Original file line number Diff line number Diff line change
Expand Up @@ -90,14 +90,19 @@ private static <T> T called(Strategy.ACTION action, T o, Class clazz, int line,
Location location = getLocation(line, sourceStart, sourceEnd);

if(decisions.containsKey(location)) {
if(!decisions.get(location).getStrategy().isCompatibleAction(action)) {
Decision decision = decisions.get(location);
if(!decision.getStrategy().isCompatibleAction(action)) {
return o;
}
currentLaps.addApplication(decisions.get(location));
if(decisions.get(location).getStrategy() instanceof Strat4) {
throw new ForceReturn(decisions.get(location));
//System.out.println("Stack size: " + stack.size());
//System.out.println("Nb method calls" + MethodContext.idCount);
currentLaps.addApplication(decision);
decision.increaseNbUse();
decision.setUsed(true);
if(decision.getStrategy() instanceof Strat4) {
throw new ForceReturn(decision);
}
return (T) decisions.get(location).getValue();
return (T) decision.getValue();
}
if(!isEnable()) {
return o;
Expand All @@ -120,7 +125,7 @@ private static <T> T called(Strategy.ACTION action, T o, Class clazz, int line,
}

Decision<?> decision = getDecision(searchSpace);
decision.setUsed(true);

//disable();

currentLaps.addDecision(decision);
Expand All @@ -130,7 +135,11 @@ private static <T> T called(Strategy.ACTION action, T o, Class clazz, int line,
if(!decision.getStrategy().isCompatibleAction(action)) {
return o;
}
currentLaps.addApplication(decisions.get(location));
//System.out.println("Stack size: " + stack.size());
//System.out.println("Nb method calls: " + MethodContext.idCount);
currentLaps.addApplication(decision);
decision.increaseNbUse();
decision.setUsed(true);

if(decision.getStrategy() instanceof Strat4) {
throw new ForceReturn(decision);
Expand Down
42 changes: 15 additions & 27 deletions src/main/java/fr/inria/spirals/npefix/resi/context/Decision.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ public class Decision<T> implements Serializable {
private Location location;
private Instance<T> value;
private String valueType;
private String variableName;
private String decisionType;
private int nbUse = 0;
private boolean isUsed = false;
private double epsilon;

Expand All @@ -32,11 +32,6 @@ public Decision(Strategy strategy, Location location, Instance<T> value, Class<T
this.valueType = valueType.getCanonicalName();
}

public Decision(Strategy strategy, Location location, Instance<T> value, Class<T> valueType, String variableName) {
this(strategy, location, value, valueType);
this.variableName = variableName;
}

public boolean isUsed() {
return isUsed;
}
Expand Down Expand Up @@ -81,14 +76,6 @@ public void setValueType(Class<T> valueType) {
this.valueType = valueType.getCanonicalName();
}

public String getVariableName() {
return variableName;
}

public void setVariableName(String variableName) {
this.variableName = variableName;
}

public String getDecisionType() {
return decisionType;
}
Expand All @@ -105,6 +92,18 @@ public double getEpsilon() {
return epsilon;
}

public int getNbUse() {
return nbUse;
}

public void setNbUse(int nbUse) {
this.nbUse = nbUse;
}

public void increaseNbUse() {
nbUse ++;
}

@Override
public boolean equals(Object o) {
if (this == o)
Expand All @@ -124,17 +123,6 @@ public boolean equals(Object o) {
decision.valueType != null)
return false;

if (variableName != null ?
!variableName.equals(decision.variableName) :
decision.variableName != null)
return false;
else if(variableName != null){
return true;
}

if(value == decision.value) {
return true;
}
if (value != null ?
!value.equals(decision.value) :
decision.value != null)
Expand All @@ -154,15 +142,15 @@ public JSONObject toJSON() {
output.put("decisionType", decisionType);
output.put("used", isUsed);
output.put("epsilon", epsilon);
output.put("nbUse", nbUse);

JSONObject valueJSON = new JSONObject();
if(value!= null) {
if(value != null) {
valueJSON.put("value", value.toString());
} else {
valueJSON.put("value", "null");
}

valueJSON.put("variableName", variableName);
valueJSON.put("type", valueType);
output.put("value", valueJSON);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

public class MethodContext {

private static int idCount = 1;
public static int idCount = 1;
private final HashMap<String, Object> variables;
private final Class methodType;
private final String methodName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,37 @@
public class ArrayInstance<T> extends AbstractInstance<T> {

private final String clazz;
private final int level;
private List<Instance<?>> values;

public ArrayInstance(String clazz, List<Instance<?>> values) {
this.clazz = clazz;
this.values = values;
this.level = 1;
}

public ArrayInstance(Class<T> clazz, List<Instance<?>> values) {
if(!clazz.isArray()) {
throw new IllegalArgumentException(clazz + " is not an array");
}
Class<?> componentType = clazz.getComponentType();
int level = 1;
while(componentType.isArray()) {
level ++;
componentType = componentType.getComponentType();
}
this.clazz = componentType.getCanonicalName();
this.level = level;
this.values = values;
}

@Override
public T getValue() {
Class<?> aClass = getClassFromString(clazz);
T t = (T) Array.newInstance(aClass, values.size());
for (int i = 1; i< level; i++) {
t = (T) Array.newInstance(t.getClass(), values.size());
}
for (int i = 0; i < values.size(); i++) {
Instance<?> value = values.get(i);
Array.set(t, i, value.getValue());
Expand All @@ -35,32 +55,45 @@ public boolean equals(Object o) {

if (clazz != null ? !clazz.equals(that.clazz) : that.clazz != null)
return false;
if (values != null ? !values.equals(that.values) : that.values != null)
if (this.values.size() != that.values.size()) {
return false;
}
for (int i = 0; i < values.size(); i++) {
Instance<?> instance = values.get(i);
Instance<?> instanceThat = that.values.get(i);
if (!instance.equals(instanceThat)) {
return false;
}
}
if (level != that.level) {
return false;
}

return true;
}

@Override
public int hashCode() {
int result = clazz != null ? clazz.hashCode() : 0;
result = 31 * result + (values != null ? values.hashCode() : 0);
result = 31 * result + level;
return result;
}

@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(clazz);
stringBuilder.append("[");
for (int i = 0; i < values.size(); i++) {
Instance<?> instance = values.get(i);
stringBuilder.append(instance.toString());
if(i + 1 < values.size()) {
stringBuilder.append(", ");
for (int j = 0; j < level; j++) {
stringBuilder.append("[");
for (int i = 0; i < values.size(); i++) {
Instance<?> instance = values.get(i);
stringBuilder.append(instance.toString());
if (i + 1 < values.size()) {
stringBuilder.append(", ");
}
}
stringBuilder.append("]");
}
stringBuilder.append("]");
return stringBuilder.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,7 @@ public boolean equals(Object o) {
@Override
public int hashCode() {
int result = clazz != null ? clazz.hashCode() : 0;
result = 31 * result + Arrays.hashCode(parameterType);
result = 31 * result + (parameters != null ? parameters.hashCode() : 0);
result = 31 * result;
return result;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ public void setError(String error) {
this.error = error;
}

public String getError() {
return error;
}

@Override
public JSONObject toJSON() {
JSONObject resultJSON = new JSONObject();
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/fr/inria/spirals/npefix/resi/oracle/Oracle.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,7 @@
public interface Oracle extends Serializable{
boolean isValid();

String getError();

JSONObject toJSON();
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public class ExplorerSelector extends AbstractSelector {

private Set<List<Decision>> usedDecisionSeq = new HashSet<>();
private Map<Location, Set<Decision>> decisions = new HashMap<>();
private Map<String,Stack<Decision>> stackDecision = new HashMap<>();
private Map<String, Stack<Decision>> stackDecision = new HashMap<>();
private Laps currentLaps = null;
private String currentTestKey;

Expand Down Expand Up @@ -70,14 +70,11 @@ public Set<Decision> getSearchSpace() {
}

@Override
public <T> Decision<T> select(List<Decision<T>> decisions) {
public synchronized <T> Decision<T> select(List<Decision<T>> decisions) {
try {
initDecision(decisions);

for (Iterator<Decision> iterator = stackDecision.get(currentTestKey)
.iterator(); iterator
.hasNext(); ) {
Decision decision = iterator.next();
for (Decision decision : stackDecision.get(currentTestKey)) {
if (decisions.contains(decision)) {
return decision;
}
Expand All @@ -98,7 +95,7 @@ public <T> Decision<T> select(List<Decision<T>> decisions) {
}
otherDecision.remove(decision);
}
return null;
throw new RuntimeException("No more available decision");
} catch (Throwable e) {
e.printStackTrace();
throw e;
Expand All @@ -112,9 +109,14 @@ public boolean restartTest(Laps laps) {
return false;
}
getLapses().add(laps);

usedDecisionSeq.add(laps.getDecisions());

stackDecision.put(currentTestKey, new Stack<Decision>());
for (int i = 0; i < laps.getDecisions().size(); i++) {
Decision decision = laps.getDecisions().get(i);
stackDecision.get(currentTestKey).add(decision);
}

Decision lastDecision = stackDecision.get(currentTestKey).pop();

List<Decision> otherDecision = new ArrayList<>();
Expand All @@ -128,7 +130,7 @@ public boolean restartTest(Laps laps) {
}
otherDecision.remove(decision);
}
if(!stackDecision.get(currentTestKey).isEmpty()) {
if (!stackDecision.get(currentTestKey).isEmpty()) {
stackDecision.get(currentTestKey).pop();
}
return false;
Expand Down
Loading

0 comments on commit a7a0d12

Please sign in to comment.