public static void main(String[] args) {
    if (args.length < 1) {
      logger.error("Error [Missing Argument]: Use java -jar KITE.jar <absolute path/config.json>");
      return;
    }

    for (String configFile : getConfigfilesFromParameters(args)) {
      Configurator configurator = new Configurator();
      buildConfig(configurator, configFile);

      for (TestConfig testConfig : configurator.getConfigHandler().getTestList()) {
        List<Tuple> tupleList = new ArrayList<>();
        testConfig.setPathToConfigFile(configurator.getConfigFilePath());
        testConfig.setReportPath(configurator.getReportPath());
        ExecutorService service = Executors.newSingleThreadExecutor();
        try {
          if (testConfig.isLoadTest()) {
            testConfig.setIncrement(testConfig.getTupleSize());
            for (Client client : configurator.getConfigHandler().getClientList()) {
              client.setCount(testConfig.getTupleSize());
            }
            List<Future<List<Future<Object>>>> ramUpResults = runRampUp(service, configurator.getName() ,testConfig,
                configurator.getRemoteList(), configurator.getConfigHandler().getClientList());
            List<List<TestManager>> secondPhase = processRamUpResults(ramUpResults);
            runLoadReached(service, configurator.getName(), secondPhase);
          } else {
            List<List<Integer>> matrix = configurator.getMatrix();
            if (matrix != null && !matrix.isEmpty()) {
              for (List<Integer> indexList : matrix) {
                Tuple tuple = new Tuple();
                for (int index : indexList) {
                  tuple.add(configurator.getConfigHandler().getClientList().get(index));
                }
                tupleList.add(tuple);
              }
            } else {
              tupleList = configurator.buildTuples(testConfig.getTupleSize(), testConfig.isPermute(),
                  testConfig.isRegression());
            }
            distributeRemote(configurator, tupleList);
            List<Future<Object>> interopResult = runInterop(service, configurator.getName(), testConfig, tupleList);
          }

          if(testConfig.getCallbackUrl() != null) {
            upload(testConfig.getReporter().getReportPath() + "../" + testConfig.getName() + "-allure." + System.currentTimeMillis() + ".zip",
                    testConfig.getReporter().getReportPath(), testConfig.getCallbackUrl(), testConfig.getCallbackPort(), testConfig.getCallbackUsername(), testConfig.getCallbackPassword());
          }

        } catch (Exception e) {
          e.printStackTrace();
        } finally {
          service.shutdown();
        }
      }
    }
  }
main method.

@param args relative or absolute path of the configuration file.
KITE-Engine/src/main/java/org/webrtc/kite/Engine.java