@Override
  public Object call() throws Exception {
    JsonObjectBuilder builder = Json.createObjectBuilder();
    if (!currentPhase.equals(StepPhase.LOADREACHED)) {
      startTime = System.currentTimeMillis();
      if (this.id == 1) { // not zero ?
        this.testConfig.getReporter().setStartTime(startTime);
      }
      test = buildTest();
    }
    Object phaseResult;
    if (!testConfig.isLoadTest()) {
      String ETA = "Estimating..";
      long elapsedSecond = (int)(System.currentTimeMillis() - testConfig.getReporter().getStartTime())/1000;
      int currentTestCount = testConfig.getReporter().numberOfRegisteredTest();
      long avgTimeForOneTest = currentTestCount == 1 ? 0 : elapsedSecond/(currentTestCount - 1);
      if (avgTimeForOneTest != 0) {
        long ETASeconds = avgTimeForOneTest*(total - id + 1);
        ETA = ETASeconds/60 + "m" + ETASeconds%60 + "s";
      }
      logger.info("\n"
          + "           |--------------------------------------------------\n"
          + "           | Number of registered tests: " + currentTestCount + "\n"
          + "           | Elapsed time: " + elapsedSecond/60 + "m" + (elapsedSecond%60)  + "s (avg:"
                        + avgTimeForOneTest/60 + "m" + avgTimeForOneTest%60 + "s" + ")\n"
          + "           | Running test case with ID: " + this.id + "/" + (total == 0 ? "N/A" : total) + "\n"
          + "           | ETA (for " + this.testConfig.getName() + "): " + ETA + "\n"
          + "           |--------------------------------------------------");
      // if there will be more phase to interop test in the future, we'll deal with it in the future
      phaseResult = test.execute(currentPhase);
    } else {
      if (currentPhase.equals(StepPhase.RAMPUP)) {
        logger.debug("Delayed " + this.delay + "ms before starting!");
        waitAround(this.delay);
        phaseResult = test.execute(currentPhase);
        logger.info("RAM UP phase finished, return test manager object for LOAD REACHED execution..");
        if (phaseResult != null) {
          builder.add(currentPhase.getName(), (JsonObject) phaseResult);
        }
        this.currentPhase = StepPhase.LOADREACHED;
        return this;
      } else {
        phaseResult = test.execute(currentPhase);
        logger.info("LOAD REACHED phase finished, finishing the test ..");
      }
    }

    if (phaseResult != null) {
      builder.add(currentPhase.getName(), (JsonObject) phaseResult); 
    }
    JsonObject jsonTestResult = developResult(builder.build());

    sendEmail(jsonTestResult);
    test = null;
    finished = true;
    return jsonTestResult;
  }
Builds the test.

@return the kite base test
@throws ClassNotFoundException the class not found exception
@throws IllegalAccessException the illegal access exception
@throws InstantiationException the instantiation exception
@throws IOException Signals that an I/O exception has occurred.
KITE-Engine/src/main/java/org/webrtc/kite/TestManager.java