diff --git a/test/groovy/util/StepTracker.groovy b/test/groovy/util/StepTracker.groovy new file mode 100644 index 000000000..748ad6532 --- /dev/null +++ b/test/groovy/util/StepTracker.groovy @@ -0,0 +1,69 @@ +package util + +import static com.lesfurets.jenkins.unit.MethodSignature.method +import static util.StepHelper.getSteps + +import org.codehaus.groovy.runtime.MetaClassHelper +import com.lesfurets.jenkins.unit.MethodSignature +import com.lesfurets.jenkins.unit.PipelineTestHelper +import groovy.json.JsonBuilder + +class StepTracker { + + /* + * Contains the piper steps as key (derived from the test name, so this is blurry since it might + * contains also other cases than only piper step name) and the observed calls in a collection. + */ + static Map piperStepCallMapping = [:] + static Set piperSteps = StepHelper.getSteps() + + static Set calls + + static { + initialize() + } + + final static void initialize() { + + PipelineTestHelper.metaClass.getAllowedMethodEntry = { + + // We need to be careful here, in case we switch to another + // version of the Les Furets framework we have to check if + // this here still works. + + String name, Object[] args -> + + Class[] paramTypes = MetaClassHelper.castArgumentsToClassArray(args) + MethodSignature signature = method(name, paramTypes) + def intercepted = allowedMethodCallbacks.find { k, v -> k == signature } + + if(intercepted != null) + StepTracker.add(name) + + return intercepted + } + } + + static void before(String stepName) { + + if(piperStepCallMapping[stepName] == null) + piperStepCallMapping[stepName] = (Set)[] + calls = piperStepCallMapping[stepName] + } + + static void after() { + calls = null + write() + } + static void add (String call) { + calls.add(call) + } + + static private void write() { + Map root = [ + piperSteps: piperSteps, + calls: piperStepCallMapping.sort() + ] + new File('target/trackedCalls.json').write(new JsonBuilder(root).toPrettyString()) + } +}