/**
* Copyright (C) 2010-2017 Gordon Fraser, Andrea Arcuri and EvoSuite
* contributors
*
* This file is part of EvoSuite.
*
* EvoSuite is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3.0 of the License, or
* (at your option) any later version.
*
* EvoSuite is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with EvoSuite. If not, see <http://www.gnu.org/licenses/>.
*/
/**
*
*/
package org.evosuite.testcase.execution;
import java.util.*;
import org.evosuite.coverage.dataflow.DefUse;
import org.evosuite.setup.CallContext;
import org.evosuite.testcase.execution.ExecutionTraceImpl.BranchEval;
/**
* This interface defines the trace data that is collected during execution.
*
* @author Gordon Fraser
*/
public interface ExecutionTrace {
/**
* Add branch to currently active method call
*
* @param branch
* a int.
* @param true_distance
* a double.
* @param false_distance
* a double.
* @param bytecode_id
* a int.
*/
public void branchPassed(int branch, int bytecode_id, double true_distance, double false_distance);
/**
* Retrieve minimum branch distance to false branch
*
* @param branchId
* a int.
* @return a double.
*/
public double getFalseDistance(int branchId);
/**
* Retrieve minimum branch distance to true branch
*
* @param branchId
* a int.
* @return a double.
*/
public double getTrueDistance(int branchId);
/**
* Retrieve set of branches that evaluated to true
*
* @return a {@link java.util.Set} object.
*/
public Set<Integer> getCoveredTrueBranches();
/**
* Retrieve set of branches that evaluated to false
*
* @return a {@link java.util.Set} object.
*/
public Set<Integer> getCoveredFalseBranches();
/**
* Retrieve set of branches that were executed
*
* @return a {@link java.util.Set} object.
*/
public Set<Integer> getCoveredPredicates();
/**
* Retrieve set of definitions that were executed
*
* @return a {@link java.util.Set} object.
*/
public Set<Integer> getCoveredDefinitions();
/**
* Retrieve execution counts for branches
*
* @return a {@link java.util.Map} object.
*/
public Map<Integer, Integer> getPredicateExecutionCount();
/**
* Retrieve execution counts for methods
*
* @return a {@link java.util.Map} object.
*/
public Map<String, Integer> getMethodExecutionCount();
/**
* Retrieve execution counts for definitions
*
* @return a {@link java.util.Map} object.
*/
public Map<Integer, Integer> getDefinitionExecutionCount();
/**
* Determine if a branch has a true distance stored
*
* @param predicateId
* a int.
* @return a boolean.
*/
public boolean hasTrueDistance(int predicateId);
/**
* Determine if a branch has a false distance stored
*
* @param predicateId
* a int.
* @return a boolean.
*/
public boolean hasFalseDistance(int predicateId);
/**
* Retrieve map of all minimal true distances
*
* @return a {@link java.util.Map} object.
*/
public Map<Integer, Double> getTrueDistances();
/**
* Retrieve map of all minimal false distances
*
* @return a {@link java.util.Map} object.
*/
public Map<Integer, Double> getFalseDistances();
/**
* Retrieve map of all minimal true distances
*
* @return a {@link java.util.Map} object.
*/
public Map<Integer, Map<CallContext, Double>> getTrueDistancesContext();
/**
* Retrieve map of all minimal false distances
*
* @return a {@link java.util.Map} object.
*/
public Map<Integer, Map<CallContext, Double>> getFalseDistancesContext();
/**
* Retrieve map of all context method counts
*
* @return a {@link java.util.Map} object.
*/
public Map<String, Map<CallContext, Integer>> getMethodContextCount();
/**
* Retrieve number of predicate executions
*
* @return a {@link java.util.Map} object.
*/
public Map<Integer, Map<CallContext, Integer>> getPredicateContextExecutionCount();
/**
* Retrieve the set of line numbers covered
*
* @param className
* a {@link java.lang.String} object.
* @return a {@link java.util.Set} object.
*/
public Set<Integer> getCoveredLines(String className);
/**
* Retrieve the set of line numbers covered of
* {@link org.evosuite.Properties.TARGET_CLASS} class
*
* @return a {@link java.util.Set} object.
*/
public Set<Integer> getCoveredLines();
/**
* Retrieve the set of all line numbers covered
*
* @return
*/
public Set<Integer> getAllCoveredLines();
/**
* Retrieve detailed line coverage count
*
* @return a {@link java.util.Map} object.
*/
public Map<String, Map<String, Map<Integer, Integer>>> getCoverageData();
/**
* Retrieve return value data
*
* @return a {@link java.util.Map} object.
*/
public Map<String, Map<String, Map<Integer, Integer>>> getReturnData();
/**
* Retrieve data definitions
*
* @return a {@link java.util.Map} object.
*/
public Map<String, HashMap<Integer, HashMap<Integer, Integer>>> getDefinitionData();
/**
* Retrieve data definitions
*
* @return a {@link java.util.Map} object.
*/
public Map<String, HashMap<Integer, HashMap<Integer, Object>>> getDefinitionDataObjects();
/**
* Retrieve data uses
*
* @return a {@link java.util.Map} object.
*/
public Map<String, HashMap<Integer, HashMap<Integer, Integer>>> getUseData();
/**
* Retrieve data uses
*
* @return a {@link java.util.Map} object.
*/
public Map<String, HashMap<Integer, HashMap<Integer, Object>>> getUseDataObjects();
/**
* Retrieve the data definitions for a given variable
*
* @param variableName
* a {@link java.lang.String} object.
* @return a {@link java.util.Map} object.
*/
public Map<Integer, HashMap<Integer, Integer>> getPassedDefinitions(String variableName);
/**
* Retrieve the data uses for a given variable
*
* @param variableName
* a {@link java.lang.String} object.
* @return a {@link java.util.Map} object.
*/
public Map<Integer, HashMap<Integer, Integer>> getPassedUses(String variableName);
/**
* Retrieve the exception thrown in this trace
*
* @return a {@link java.lang.Throwable} object.
*/
public Throwable getExplicitException();
/**
* Retrieve all traced method calls
*
* @return a {@link java.util.List} object.
*/
public List<MethodCall> getMethodCalls();
/**
* Retrieve the names of all called methods
*
* @return a {@link java.util.Set} object.
*/
public Set<String> getCoveredMethods();
/**
* Retrieve the names of all covered branchless methods
*
* @return a {@link java.util.Set} object.
*/
public Set<String> getCoveredBranchlessMethods();
/**
* Retrieve the minimum infection distance for a mutant
*
* @param mutationId
* a int.
* @return a double.
*/
public double getMutationDistance(int mutationId);
/**
* Retrieve all minimal infection distances
*
* @return a {@link java.util.Map} object.
*/
public Map<Integer, Double> getMutationDistances();
/**
* Determine is a mutant was executed
*
* @param mutationId
* a int.
* @return a boolean.
*/
public boolean wasMutationTouched(int mutationId);
/**
* Retrieve IDs of all executed mutants
*
* @return a {@link java.util.Set} object.
*/
public Set<Integer> getTouchedMutants();
/**
* Retrieve IDs of all executed mutants with an infection distance == 0.0
*
* @return a {@link java.util.Set} object.
*/
public Set<Integer> getInfectedMutants();
/**
* Reset to 0
*/
public void clear();
/**
* Adds Definition-Use-Coverage trace information for the given definition.
*
* Registers the given caller-Object Traces the occurrence of the given
* definition in the passedDefs-field Sets the given definition as the
* currently active one for the definitionVariable in the
* activeDefinitions-field Adds fake trace information to the currently
* active MethodCall in this.stack
*
* @param caller
* a {@link java.lang.Object} object.
* @param defID
* a int.
*/
public void definitionPassed(Object object, Object caller, int defID);
/**
* Add a new method call to stack
*
* @param className
* a {@link java.lang.String} object.
* @param methodName
* a {@link java.lang.String} object.
* @param caller
* a {@link java.lang.Object} object.
*/
public void enteredMethod(String className, String methodName, Object caller);
/**
* Pop last method call from stack
*
* @param classname
* a {@link java.lang.String} object.
* @param methodname
* a {@link java.lang.String} object.
*/
public void exitMethod(String classname, String methodname);
/**
* Finish all method calls. This is called when a method is not exited
* regularly, but through an exception
*/
public void finishCalls();
/**
* Returns a copy of this trace where all MethodCall-information traced from
* objects other then the one identified by the given objectID is removed
* from the finished_calls-field
*
* WARNING: this will not affect this.true_distances and other fields of
* ExecutionTrace this only affects the finished_calls field (which should
* suffice for BranchCoverageFitness-calculation)
*
* @param objectId
* a int.
* @return a {@link org.evosuite.testcase.execution.ExecutionTrace} object.
*/
public ExecutionTrace getTraceForObject(int objectId);
/**
* Returns a copy of this trace where all MethodCall-information associated
* with duCounters outside the range of the given duCounter-Start and -End
* is removed from the finished_calls-traces
*
* finished_calls without any point in the trace at which the given
* duCounter range is hit are removed completely
*
* Also traces for methods other then the one that holds the given targetDU
* are removed as well as trace information that would pass the branch of
* the given targetDU If wantToCoverTargetDU is false instead those
* targetDUBranch information is removed that would pass the alternative
* branch of targetDU
*
* The latter is because this method only gets called when the given
* targetDU was not active in the given duCounter-range if and only if
* wantToCoverTargetDU is set, and since useFitness calculation is on branch
* level and the branch of the targetDU can be passed before the targetDU is
* passed this can lead to a flawed branchFitness.
*
*
* WARNING: this will not affect this.true_distances and other fields of
* ExecutionTrace this only affects the finished_calls field (which should
* suffice for BranchCoverageFitness-calculation)
*
* @param targetDU
* a {@link org.evosuite.coverage.dataflow.DefUse} object.
* @param wantToCoverTargetDU
* a boolean.
* @param duCounterStart
* a int.
* @param duCounterEnd
* a int.
* @return a {@link org.evosuite.testcase.execution.ExecutionTrace} object.
*/
public ExecutionTrace getTraceInDUCounterRange(DefUse targetDU, boolean wantToCoverTargetDU, int duCounterStart,
int duCounterEnd);
/**
* Add line to currently active method call
*
* @param line
* a int.
* @param className
* a {@link java.lang.String} object.
* @param methodName
* a {@link java.lang.String} object.
*/
public void linePassed(String className, String methodName, int line);
/**
* Record a mutant execution
*
* @param mutationId
* a int.
* @param distance
* a double.
*/
public void mutationPassed(int mutationId, double distance);
/**
* Record a return value
*
* @param className
* a {@link java.lang.String} object.
* @param methodName
* a {@link java.lang.String} object.
* @param value
* a int.
*/
public void returnValue(String className, String methodName, int value);
/**
* Returns a String containing the information in passedDefs and passedUses
*
* Used for Definition-Use-Coverage-debugging
*
* @return a {@link java.lang.String} object.
*/
public String toDefUseTraceInformation();
/**
* Returns a String containing the information in passedDefs and passedUses
* filtered for a specific variable
*
* Used for Definition-Use-Coverage-debugging
*
* @param targetVar
* a {@link java.lang.String} object.
* @return a {@link java.lang.String} object.
*/
public String toDefUseTraceInformation(String targetVar);
/**
* Returns a String containing the information in passedDefs and passedUses
* for the given variable
*
* Used for Definition-Use-Coverage-debugging
*
* @param var
* a {@link java.lang.String} object.
* @param objectId
* a int.
* @return a {@link java.lang.String} object.
*/
public String toDefUseTraceInformation(String var, int objectId);
/**
* Adds Definition-Use-Coverage trace information for the given use.
*
* Registers the given caller-Object Traces the occurrence of the given use
* in the passedUses-field
*
* @param caller
* a {@link java.lang.Object} object.
* @param useID
* a int.
*/
public void usePassed(Object object, Object caller, int useID);
/**
* Set the exception thrown in this trace
*
* @param explicitException
* a {@link java.lang.Throwable} object.
*/
public void setExplicitException(Throwable explicitException);
/**
* Create a lazy copy
*
* @return a {@link org.evosuite.testcase.execution.ExecutionTrace} object.
*/
public ExecutionTrace lazyClone();
/**
* <p>
* getBranchesTrace
* </p>
*
* @return a {@link java.util.List} object.
*/
List<BranchEval> getBranchesTrace();
/**
* <p>
* getFalseDistancesSum
* </p>
*
* @return a {@link java.util.Map} object.
*/
Map<Integer, Double> getFalseDistancesSum();
/**
* <p>
* getTrueDistancesSum
* </p>
*
* @return a {@link java.util.Map} object.
*/
Map<Integer, Double> getTrueDistancesSum();
/**
* <p>
* getPassedUses
* </p>
*
* @return a {@link java.util.Map} object.
*/
Map<String, HashMap<Integer, HashMap<Integer, Integer>>> getPassedUses();
/**
* Retrieve the set of all uses by id
*
* @return
*/
public Set<Integer> getPassedUseIDs();
/**
* Retrieve the set of all definitions by id
*
* @return
*/
@Deprecated
public Set<Integer> getPassedDefIDs();
/**
* Record a PUTSTATIC statement
*
* @param classNameWithDots
* @param fieldName
*/
public void putStaticPassed(String classNameWithDots, String fieldName);
/**
* Record a GETSTATIC statement
*
* @param classNameWithDots
* @param fieldName
*/
public void getStaticPassed(String classNameWithDots, String fieldName);
/**
* Retrieve a list of those classes that were affected by a PUTSTATIC.
*
* @return
*/
public Set<String> getClassesWithStaticWrites();
/**
* Retrieve a list of those classes that were affected by a GETSTATIC.
*
* @return
*/
public Set<String> getClassesWithStaticReads();
/**
* Logs that a <clinit> was completed during this test execution
*
* @param classNameWithDots
*/
public void classInitialized(String classNameWithDots);
/**
* Returns the list (with no repetitions) following the order in which the
* <clinit> method was finished during this test execution
*
* @return
*/
public List<String> getInitializedClasses();
}