@Override
  public void runTestOn(final String sdkHome) throws Exception {
    final Project project = getProject();

    final Sdk sdk = createTempSdk(sdkHome, SdkCreationType.EMPTY_SDK);

    setProcessCanTerminate(false);

    PydevConsoleRunner consoleRunner =
        new PydevConsoleRunner(
            project,
            sdk,
            PyConsoleType.PYTHON,
            myFixture.getTempDirPath(),
            Maps.<String, String>newHashMap(),
            PyConsoleOptions.getInstance(project).getPythonConsoleSettings(),
            new String[] {}) {
          @Override
          protected void showConsole(
              Executor defaultExecutor, @NotNull RunContentDescriptor contentDescriptor) {
            myContentDescriptorRef.set(contentDescriptor);
            super.showConsole(defaultExecutor, contentDescriptor);
          }
        };

    before();

    myConsoleInitSemaphore = new Semaphore(0);

    consoleRunner.addConsoleListener(
        new PydevConsoleRunner.ConsoleListener() {
          @Override
          public void handleConsoleInitialized(LanguageConsoleView consoleView) {
            myConsoleInitSemaphore.release();
          }
        });

    consoleRunner.run();

    waitFor(myConsoleInitSemaphore);

    myCommandSemaphore = new Semaphore(1);

    myConsoleView = consoleRunner.getConsoleView();
    myProcessHandler = (PyConsoleProcessHandler) consoleRunner.getProcessHandler();

    myExecuteHandler =
        (PydevConsoleExecuteActionHandler) consoleRunner.getConsoleExecuteActionHandler();

    myCommunication = consoleRunner.getPydevConsoleCommunication();

    myCommunication.addCommunicationListener(
        new ConsoleCommunicationListener() {
          @Override
          public void commandExecuted(boolean more) {
            myCommandSemaphore.release();
          }

          @Override
          public void inputRequested() {}
        });

    myProcessHandler.addProcessListener(
        new ProcessAdapter() {
          @Override
          public void processTerminated(ProcessEvent event) {
            if (event.getExitCode() != 0 && !myProcessCanTerminate) {
              Assert.fail("Process terminated unexpectedly\n" + output());
            }
          }
        });

    OutputPrinter myOutputPrinter = null;
    if (shouldPrintOutput) {
      myOutputPrinter = new OutputPrinter();
      myOutputPrinter.start();
    }

    waitForOutput("PyDev console");

    try {
      testing();
      after();
    } finally {
      setProcessCanTerminate(true);

      if (myOutputPrinter != null) {
        myOutputPrinter.stop();
      }

      disposeConsole();
    }
  }