/** We need to check that we are not pointing at testcase in original testsuite */
  public void afterCopy(WsdlTestSuite oldTestSuite, WsdlTestCase oldTestCase) {
    super.afterCopy(oldTestSuite, oldTestCase);

    if (targetTestCase != null && oldTestSuite == targetTestCase.getTestSuite()) {
      setTargetTestCase(getTestCase().getTestSuite().getTestCaseByName(targetTestCase.getName()));
    }
  }
  public WsdlRunTestCaseStepDesktopPanel(WsdlRunTestCaseTestStep modelItem) {
    super(modelItem);

    project = getModelItem().getTestCase().getTestSuite().getProject();

    getModelItem().addPropertyChangeListener(WsdlRunTestCaseTestStep.TARGET_TESTCASE, this);
    WsdlTestCase targetTestCase = getModelItem().getTargetTestCase();
    if (targetTestCase != null) {
      targetTestCase.addPropertyChangeListener(WsdlTestCase.NAME_PROPERTY, this);
      targetTestCase.getTestSuite().addPropertyChangeListener(WsdlTestCase.NAME_PROPERTY, this);
    }

    buildUI();
    setEnabledState();

    if (modelItem.getTargetTestCase() == null) {
      SwingUtilities.invokeLater(
          new Runnable() {

            public void run() {
              optionsAction.actionPerformed(null);
            }
          });
    }

    setPreferredSize(new Dimension(400, 600));
  }
 private String createTitleForBorder() {
   WsdlTestCase targetTestCase = getModelItem().getTargetTestCase();
   return "TestCase ["
       + (targetTestCase == null
           ? "- none selected -"
           : targetTestCase.getTestSuite().getName() + ":" + targetTestCase.getName())
       + "] Run Properties";
 }
  private void syncProperties() {
    for (String name : propertyHolderSupport.getPropertyNames()) {
      if (!targetTestCase.hasProperty(name)) propertyHolderSupport.removeProperty(name);
    }

    for (String name : targetTestCase.getPropertyNames()) {
      if (!propertyHolderSupport.hasProperty(name)) propertyHolderSupport.addProperty(name);
    }
  }
  @Override
  public void release() {
    if (targetTestCase != null) {
      targetTestCase.getTestSuite().removeTestSuiteListener(testSuiteListener);
      targetTestCase.removeTestPropertyListener(testPropertyListener);
    }

    super.release();
  }
 /**
  * Runs the specified TestCase
  *
  * @param testCase the testcase to run
  * @param context
  */
 protected void runTestCase(WsdlTestCase testCase) {
   try {
     log.info("Running TestCase [" + testCase.getName() + "]");
     WsdlTestCaseRunner runner = testCase.run(new StringToObjectMap(), false);
     log.info(
         "TestCase ["
             + testCase.getName()
             + "] finished with status ["
             + runner.getStatus()
             + "] in "
             + (runner.getTimeTaken())
             + "ms");
   } catch (Exception e) {
     e.printStackTrace();
   }
 }
 public void perform(ModelItem[] targets, Object param) {
   for (ModelItem target : targets) {
     if (target instanceof WsdlTestStep) ((WsdlTestStep) target).setDisabled(false);
     else if (target instanceof WsdlTestCase) ((WsdlTestCase) target).setDisabled(false);
     else if (target instanceof WsdlTestSuite) ((WsdlTestSuite) target).setDisabled(false);
   }
 }
  @Override
  public void resolve(ResolveContext<?> context) {
    super.resolve(context);

    if (targetTestCase == null) {
      if (context.hasThisModelItem(
          this, "Missing Test Case", getTestStepTitle() + "/" + stepConfig.getTargetTestCase()))
        return;
      context
          .addPathToResolve(
              this, "Missing Test Case", getTestStepTitle() + "/" + stepConfig.getTargetTestCase())
          .addResolvers(
              new RunTestCaseRemoveResolver(this),
              new ChooseAnotherTestCase(this),
              new CreateNewEmptyTestCase(this));
    } else {
      targetTestCase.resolve(context);
      if (context.hasThisModelItem(
          this, "Missing Test Case", getTestStepTitle() + "/" + stepConfig.getTargetTestCase())) {
        context
            .getPath(
                this,
                "Missing Test Case",
                getTestStepTitle() + "/" + stepConfig.getTargetTestCase())
            .setSolved(true);
      }
    }
  }
  /**
   * Creates a copy of the underlying WsdlTestCase with all LoadTests removed and configured for
   * LoadTesting
   */
  private WsdlTestCase createTestCase(WsdlTestCase testCase) {
    // clone config and remove and loadtests
    testCase.beforeSave();

    try {
      TestCaseConfig config = TestCaseConfig.Factory.parse(testCase.getConfig().xmlText());
      config.setLoadTestArray(new LoadTestConfig[0]);

      // clone entire testCase
      WsdlTestCase wsdlTestCase = testCase.getTestSuite().buildTestCase(config, true);
      wsdlTestCase.afterLoad();
      return wsdlTestCase;
    } catch (Throwable e) {
      SoapUI.logError(e);
    }

    return null;
  }
  public boolean onClose(boolean canCancel) {
    getModelItem().removePropertyChangeListener(WsdlRunTestCaseTestStep.TARGET_TESTCASE, this);

    WsdlTestCase targetTestCase = getModelItem().getTargetTestCase();
    if (targetTestCase != null) {
      targetTestCase.removePropertyChangeListener(WsdlTestCase.NAME_PROPERTY, this);
      targetTestCase.getTestSuite().removePropertyChangeListener(WsdlTestCase.NAME_PROPERTY, this);
    }

    testRunLog.release();
    if (optionsDialog != null) {
      optionsDialog.release();
      optionsDialog = null;
    }

    propertiesTable.release();
    inspectorPanel.release();

    return release();
  }
  public void setTargetTestCase(WsdlTestCase testCase) {
    if (targetTestCase != null) {
      targetTestCase.getTestSuite().removeTestSuiteListener(testSuiteListener);
      targetTestCase.removeTestPropertyListener(testPropertyListener);
    }

    WsdlTestCase oldTestCase = this.targetTestCase;
    this.targetTestCase = testCase;

    if (testCase != null) {
      stepConfig.setTargetTestCase(testCase.getId());

      targetTestCase.getTestSuite().addTestSuiteListener(testSuiteListener);
      targetTestCase.addTestPropertyListener(testPropertyListener);

      syncProperties();
    }

    notifyPropertyChanged(TARGET_TESTCASE, oldTestCase, testCase);
  }
  public void propertyChange(PropertyChangeEvent evt) {
    super.propertyChange(evt);

    if (evt.getPropertyName().equals(WsdlRunTestCaseTestStep.TARGET_TESTCASE)) {
      WsdlTestCase targetTestCase = (WsdlTestCase) evt.getOldValue();
      if (targetTestCase != null) {
        targetTestCase.removePropertyChangeListener(WsdlTestCase.NAME_PROPERTY, this);
        targetTestCase
            .getTestSuite()
            .removePropertyChangeListener(WsdlTestCase.NAME_PROPERTY, this);
      }

      targetTestCase = (WsdlTestCase) evt.getNewValue();
      if (targetTestCase != null) {
        targetTestCase.addPropertyChangeListener(WsdlTestCase.NAME_PROPERTY, this);
        targetTestCase.getTestSuite().addPropertyChangeListener(WsdlTestCase.NAME_PROPERTY, this);
      }
    }

    setEnabledState();
    titledBorder.setTitle(createTitleForBorder());
    repaint();
  }
  protected void createTransfer(StringToStringMap values) {
    String propertyTransfer = values.get(TRANSFER_STEP);

    WsdlTestCase testCase = (WsdlTestCase) request.getTestCase();
    TransferResponseValuesTestStep transferStep =
        (TransferResponseValuesTestStep) testCase.getTestStepByName(propertyTransfer);

    if (transferStep == null) {
      int index = testCase.getIndexOfTestStep(request.getRequestStep());
      transferStep =
          (TransferResponseValuesTestStep)
              testCase.insertTestStep(
                  TransferValuesStepFactory.TRANSFER_TYPE, propertyTransfer, index);
    }

    if (transferStep == null) {
      UISupport.showErrorMessage("Missing transfer step [" + propertyTransfer + "]");
      return;
    }

    PropertyTransfer transfer = transferStep.getTransferByName(values.get(TRANSFER_NAME));
    if (transfer == null) transfer = transferStep.addTransfer(values.get(TRANSFER_NAME));

    transfer.setTargetStepName(request.getRequestStep().getName());
    transfer.setTargetPropertyName("Request");
    transfer.setTargetPath(values.get(TARGET_XPATH));

    String sourceStepName = values.get(SOURCE_STEP);
    transfer.setSourceStepName(sourceStepName);

    TestStep sourceStep = testCase.getTestStepByName(sourceStepName);
    if (sourceStep == null) {
      sourceStep =
          (WsdlPropertiesTestStep)
              testCase.insertTestStep(PropertiesStepFactory.PROPERTIES_TYPE, sourceStepName, 0);
    }

    String sourcePropertyName = values.get(SOURCE_PROPERTY);

    if (sourceStep.getProperty(sourcePropertyName) == null
        && sourceStep instanceof WsdlPropertiesTestStep) {
      ((WsdlPropertiesTestStep) sourceStep).addProperty(sourcePropertyName);
    }

    transfer.setSourcePropertyName(sourcePropertyName);

    if (values.getBoolean(OPEN_EDITOR)) {
      TransferResponseValuesDesktopPanel panel =
          (TransferResponseValuesDesktopPanel) UISupport.showDesktopPanel(transferStep);

      panel.selectTransfer(transfer);
    }
  }
  public void perform(WsdlTestCase testCase, Object param) {
    String name =
        UISupport.prompt("Specify name of TestCase", "Rename TestCase", testCase.getName());
    if (name == null || name.equals(testCase.getName())) return;
    while (testCase.getTestSuite().getTestCaseByName(name.trim()) != null) {
      name =
          UISupport.prompt(
              "Specify unique name of TestCase", "Rename TestCase", testCase.getName());
      if (name == null || name.equals(testCase.getName())) return;
    }

    testCase.setName(name);
  }
Beispiel #15
0
  public void perform(WsdlTestCase testCase, Object param) {
    if (dialog == null) {
      dialog = ADialogBuilder.buildDialog(Form.class);
      dialog
          .getFormField(Form.PROJECT)
          .addFormFieldListener(
              new XFormFieldListener() {

                public void valueChanged(XFormField sourceField, String newValue, String oldValue) {
                  if (newValue.equals(CREATE_NEW_OPTION))
                    dialog.setOptions(Form.TESTSUITE, new String[] {CREATE_NEW_OPTION});
                  else {
                    Project project = SoapUI.getWorkspace().getProjectByName(newValue);
                    dialog.setOptions(
                        Form.TESTSUITE,
                        ModelSupport.getNames(
                            project.getTestSuiteList(), new String[] {CREATE_NEW_OPTION}));
                  }
                }
              });
      dialog
          .getFormField(Form.CLONE_DESCRIPTION)
          .addFormFieldListener(
              new XFormFieldListener() {

                public void valueChanged(XFormField sourceField, String newValue, String oldValue) {
                  if (dialog.getBooleanValue(Form.CLONE_DESCRIPTION)) {
                    dialog.getFormField(Form.DESCRIPTION).setEnabled(false);
                  } else {
                    dialog.getFormField(Form.DESCRIPTION).setEnabled(true);
                  }
                }
              });
    }

    dialog.setBooleanValue(Form.MOVE, false);
    dialog.setBooleanValue(Form.CLONE_DESCRIPTION, true);
    dialog.getFormField(Form.DESCRIPTION).setEnabled(false);
    dialog.setValue(Form.DESCRIPTION, testCase.getDescription());
    dialog.setValue(Form.NAME, "Copy of " + testCase.getName());
    WorkspaceImpl workspace = testCase.getTestSuite().getProject().getWorkspace();
    dialog.setOptions(
        Form.PROJECT,
        ModelSupport.getNames(workspace.getOpenProjectList(), new String[] {CREATE_NEW_OPTION}));

    dialog.setValue(Form.PROJECT, testCase.getTestSuite().getProject().getName());

    dialog.setOptions(
        Form.TESTSUITE,
        ModelSupport.getNames(
            testCase.getTestSuite().getProject().getTestSuiteList(),
            new String[] {CREATE_NEW_OPTION}));

    dialog.setValue(Form.TESTSUITE, testCase.getTestSuite().getName());
    boolean hasLoadTests = testCase.getLoadTestCount() > 0;
    dialog.setBooleanValue(Form.CLONE_LOADTESTS, hasLoadTests);
    dialog.getFormField(Form.CLONE_LOADTESTS).setEnabled(hasLoadTests);

    if (dialog.show()) {
      String targetProjectName = dialog.getValue(Form.PROJECT);
      String targetTestSuiteName = dialog.getValue(Form.TESTSUITE);
      String name = dialog.getValue(Form.NAME);

      WsdlProject project = testCase.getTestSuite().getProject();
      WsdlTestSuite targetTestSuite = null;
      Set<Interface> requiredInterfaces = new HashSet<Interface>();

      // to another project project?
      if (!targetProjectName.equals(project.getName())) {
        // get required interfaces
        for (int y = 0; y < testCase.getTestStepCount(); y++) {
          WsdlTestStep testStep = testCase.getTestStepAt(y);
          requiredInterfaces.addAll(testStep.getRequiredInterfaces());
        }

        project = (WsdlProject) workspace.getProjectByName(targetProjectName);
        if (project == null) {
          targetProjectName = UISupport.prompt("Enter name for new Project", "Clone TestCase", "");
          if (targetProjectName == null) return;

          try {
            project = workspace.createProject(targetProjectName, null);
          } catch (SoapUIException e) {
            UISupport.showErrorMessage(e);
          }

          if (project == null) return;
        }

        if (requiredInterfaces.size() > 0 && project.getInterfaceCount() > 0) {
          Map<String, Interface> bindings = new HashMap<String, Interface>();
          for (Interface iface : requiredInterfaces) {
            bindings.put(iface.getTechnicalId(), iface);
          }

          for (Interface iface : project.getInterfaceList()) {
            bindings.remove(iface.getTechnicalId());
          }

          requiredInterfaces.retainAll(bindings.values());
        }

        if (requiredInterfaces.size() > 0) {
          String msg =
              "Target project [" + targetProjectName + "] is missing required Interfaces;\r\n\r\n";
          for (Interface iface : requiredInterfaces) {
            msg += iface.getName() + " [" + iface.getTechnicalId() + "]\r\n";
          }
          msg += "\r\nThese will be cloned to the targetProject as well";

          if (!UISupport.confirm(msg, "Clone TestCase")) return;

          for (Interface iface : requiredInterfaces) {
            project.importInterface((AbstractInterface<?>) iface, true, true);
          }
        }
      }

      targetTestSuite = project.getTestSuiteByName(targetTestSuiteName);
      if (targetTestSuite == null) {
        targetTestSuiteName =
            UISupport.prompt(
                "Specify name for new TestSuite",
                "Clone TestCase",
                "Copy of " + testCase.getTestSuite().getName());
        if (targetTestSuiteName == null) return;

        targetTestSuite = project.addNewTestSuite(targetTestSuiteName);
      }

      boolean move = dialog.getBooleanValue(Form.MOVE);
      WsdlTestCase newTestCase =
          targetTestSuite.importTestCase(
              testCase, name, -1, dialog.getBooleanValue(Form.CLONE_LOADTESTS), !move);
      UISupport.select(newTestCase);

      if (move) {
        testCase.getTestSuite().removeTestCase(testCase);
      }
      boolean cloneDescription = dialog.getBooleanValue(Form.CLONE_DESCRIPTION);
      if (!cloneDescription) {
        newTestCase.setDescription(dialog.getValue(Form.DESCRIPTION));
      }
    }
  }
 @Override
 String getCopyAfterInfo(WsdlMockResponse source, WsdlTestCase target) {
   return "Add MockResponse TestStep to TestCase [" + target.getName() + "]";
 }
 @Override
 boolean canCopyAfter(WsdlMockResponse source, WsdlTestCase target) {
   return source.getMockOperation().getMockService().getProject()
       == target.getTestSuite().getProject();
 }
  public TestStepResult run(TestCaseRunner testRunner, TestCaseRunContext testRunContext) {
    WsdlMessageExchangeTestStepResult result = new WsdlMessageExchangeTestStepResult(this);

    testCaseRunner = null;

    if (targetTestCase != null) {
      Enum runMode = getRunMode();

      if (runMode == RunTestCaseRunModeTypeConfig.PARALLELL) {
        runningTestCase = createTestCase(targetTestCase);
      } else {
        runningTestCase = targetTestCase;

        TestCaseRunner targetTestRunner = SoapUI.getTestMonitor().getTestRunner(targetTestCase);
        if (targetTestRunner != null && targetTestRunner.getStatus() == TestRunner.Status.RUNNING) {
          if (runMode == RunTestCaseRunModeTypeConfig.SINGLETON_AND_FAIL) {
            result.setStatus(TestStepStatus.FAILED);
            result.addMessage("Target TestCase is already running");
            result.stopTimer();
            runningTestCase = null;
          } else {
            targetTestRunner.waitUntilFinished();
          }
        }
      }

      if (runningTestCase != null) {
        synchronized (runningTestCase) {
          for (TestRunListener listener : testRunListeners)
            runningTestCase.addTestRunListener(listener);

          StringList returnProperties = getReturnProperties();
          Map<String, TestProperty> props = getProperties();
          for (String key : props.keySet()) {
            if (runningTestCase.hasProperty(key) && !returnProperties.contains(key)) {
              String value = props.get(key).getValue();
              runningTestCase.setPropertyValue(
                  key, PropertyExpander.expandProperties(testRunContext, value));
            }
          }

          currentLabel = getLabel();
          runningTestCase.addTestRunListener(testRunListener);

          // StringToObjectMap properties = new StringToObjectMap();
          // for( String name : testRunContext.getPropertyNames() )
          // properties.put( name, testRunContext.getProperty( name ));

          result.startTimer();
          testCaseRunner = runningTestCase.run(new StringToObjectMap(), true);
          testCaseRunner.waitUntilFinished();
          result.stopTimer();

          for (String key : returnProperties) {
            if (runningTestCase.hasProperty(key))
              setPropertyValue(key, runningTestCase.getPropertyValue(key));
          }

          // aggregate results
          for (TestStepResult testStepResult : testCaseRunner.getResults()) {
            result.addMessage(
                testStepResult.getTestStep().getName()
                    + " - "
                    + testStepResult.getStatus()
                    + " - "
                    + testStepResult.getTimeTaken());
            for (String msg : testStepResult.getMessages()) {
              result.addMessage("- " + msg);
            }

            if (testStepResult instanceof MessageExchangeTestStepResult) {
              result.addMessages(
                  ((MessageExchangeTestStepResult) testStepResult).getMessageExchanges());
            }
          }

          switch (testCaseRunner.getStatus()) {
            case CANCELED:
              result.setStatus(TestStepStatus.CANCELED);
              break;
            case FAILED:
              result.setStatus(TestStepStatus.FAILED);
              break;
            case FINISHED:
              result.setStatus(TestStepStatus.OK);
              break;
            default:
              result.setStatus(TestStepStatus.UNKNOWN);
              break;
          }

          for (TestRunListener listener : testRunListeners)
            runningTestCase.removeTestRunListener(listener);

          if (runMode == RunTestCaseRunModeTypeConfig.PARALLELL) runningTestCase.release();

          runningTestCase = null;
          testCaseRunner = null;
        }
      }
    } else {
      result.setStatus(TestStepStatus.FAILED);
      result.addMessage("Missing testCase in project");
      result.stopTimer();
    }

    return result;
  }
    public void actionPerformed(ActionEvent e) {
      if (optionsDialog == null) {
        optionsDialog = ADialogBuilder.buildDialog(OptionsForm.class);
        optionsDialog
            .getFormField(OptionsForm.TESTSUITE)
            .addFormFieldListener(
                new XFormFieldListener() {

                  public void valueChanged(
                      XFormField sourceField, String newValue, String oldValue) {
                    List<TestCase> testCaseList =
                        project.getTestSuiteByName(newValue).getTestCaseList();
                    testCaseList.remove(getModelItem().getTestCase());
                    optionsDialog.setOptions(
                        OptionsForm.TESTCASE, ModelSupport.getNames(testCaseList));

                    if (testCaseList.size() > 0) {
                      WsdlTestCase testCase = project.getTestSuiteByName(newValue).getTestCaseAt(0);
                      optionsDialog.setOptions(
                          OptionsForm.RETURN_PROPERTIES, testCase.getPropertyNames());
                      ((XFormMultiSelectList)
                              optionsDialog.getFormField(OptionsForm.RETURN_PROPERTIES))
                          .setSelectedOptions(getModelItem().getReturnProperties().toStringArray());
                    }
                  }
                });
        optionsDialog
            .getFormField(OptionsForm.TESTCASE)
            .addFormFieldListener(
                new XFormFieldListener() {

                  public void valueChanged(
                      XFormField sourceField, String newValue, String oldValue) {
                    WsdlTestSuite testSuite =
                        project.getTestSuiteByName(optionsDialog.getValue(OptionsForm.TESTSUITE));
                    WsdlTestCase testCase = testSuite.getTestCaseByName(newValue);
                    optionsDialog.setOptions(
                        OptionsForm.RETURN_PROPERTIES, testCase.getPropertyNames());
                    ((XFormMultiSelectList)
                            optionsDialog.getFormField(OptionsForm.RETURN_PROPERTIES))
                        .setSelectedOptions(getModelItem().getReturnProperties().toStringArray());
                  }
                });
      }

      WsdlTestCase targetTestCase = getModelItem().getTargetTestCase();

      optionsDialog.setOptions(
          OptionsForm.TESTSUITE, ModelSupport.getNames(project.getTestSuiteList()));
      if (targetTestCase != null) {
        optionsDialog.setValue(OptionsForm.TESTSUITE, targetTestCase.getTestSuite().getName());

        List<TestCase> testCaseList = targetTestCase.getTestSuite().getTestCaseList();
        testCaseList.remove(getModelItem().getTestCase());

        optionsDialog.setOptions(OptionsForm.TESTCASE, ModelSupport.getNames(testCaseList));
        optionsDialog.setValue(OptionsForm.TESTCASE, targetTestCase.getName());

        optionsDialog.setOptions(OptionsForm.RETURN_PROPERTIES, targetTestCase.getPropertyNames());
        ((XFormMultiSelectList) optionsDialog.getFormField(OptionsForm.RETURN_PROPERTIES))
            .setSelectedOptions(getModelItem().getReturnProperties().toStringArray());
      } else {
        if (project.getTestSuiteCount() == 0) {
          optionsDialog.setOptions(OptionsForm.TESTCASE, new String[0]);
          optionsDialog.setOptions(OptionsForm.RETURN_PROPERTIES, new String[0]);
        } else {
          List<TestCase> testCaseList = project.getTestSuiteAt(0).getTestCaseList();
          testCaseList.remove(getModelItem().getTestCase());
          optionsDialog.setOptions(OptionsForm.TESTCASE, ModelSupport.getNames(testCaseList));

          if (testCaseList.isEmpty())
            optionsDialog.setOptions(OptionsForm.RETURN_PROPERTIES, new String[0]);
          else
            optionsDialog.setOptions(
                OptionsForm.RETURN_PROPERTIES, testCaseList.get(0).getPropertyNames());
        }
      }

      switch (getModelItem().getRunMode().intValue()) {
        case RunTestCaseRunModeTypeConfig.INT_PARALLELL:
          optionsDialog.setValue(
              OptionsForm.RUN_MODE, OptionsForm.CREATE_ISOLATED_COPY_FOR_EACH_RUN);
          break;
        case RunTestCaseRunModeTypeConfig.INT_SINGLETON_AND_FAIL:
          optionsDialog.setValue(OptionsForm.RUN_MODE, OptionsForm.RUN_PRIMARY_TEST_CASE);
          break;
        case RunTestCaseRunModeTypeConfig.INT_SINGLETON_AND_WAIT:
          optionsDialog.setValue(OptionsForm.RUN_MODE, OptionsForm.RUN_SYNCHRONIZED_TESTCASE);
          break;
      }

      optionsDialog.setBooleanValue(
          OptionsForm.COPY_HTTP_SESSION, getModelItem().isCopyHttpSession());
      optionsDialog.setBooleanValue(
          OptionsForm.COPY_LOADTEST_PROPERTIES, getModelItem().isCopyLoadTestProperties());
      optionsDialog.setBooleanValue(
          OptionsForm.IGNORE_EMPTY_PROPERTIES, getModelItem().isIgnoreEmptyProperties());

      if (optionsDialog.show()) {
        WsdlTestSuite testSuite =
            project.getTestSuiteByName(optionsDialog.getValue(OptionsForm.TESTSUITE));
        getModelItem()
            .setTargetTestCase(
                testSuite == null
                    ? null
                    : testSuite.getTestCaseByName(optionsDialog.getValue(OptionsForm.TESTCASE)));
        getModelItem()
            .setReturnProperties(
                new StringList(
                    ((XFormMultiSelectList)
                            optionsDialog.getFormField(OptionsForm.RETURN_PROPERTIES))
                        .getSelectedOptions()));

        switch (optionsDialog.getValueIndex(OptionsForm.RUN_MODE)) {
          case 0:
            getModelItem().setRunMode(RunTestCaseRunModeTypeConfig.PARALLELL);
            break;
          case 1:
            getModelItem().setRunMode(RunTestCaseRunModeTypeConfig.SINGLETON_AND_FAIL);
            break;
          case 2:
            getModelItem().setRunMode(RunTestCaseRunModeTypeConfig.SINGLETON_AND_WAIT);
            break;
        }

        getModelItem()
            .setCopyHttpSession(optionsDialog.getBooleanValue(OptionsForm.COPY_HTTP_SESSION));
        getModelItem()
            .setCopyLoadTestProperties(
                optionsDialog.getBooleanValue(OptionsForm.COPY_LOADTEST_PROPERTIES));
        getModelItem()
            .setIgnoreEmptyProperties(
                optionsDialog.getBooleanValue(OptionsForm.IGNORE_EMPTY_PROPERTIES));

        titledBorder.setTitle(createTitleForBorder());
      }
    }
  @Override
  public void afterStep(
      TestCaseRunner testRunner, TestCaseRunContext runContext, TestStepResult result) {
    super.afterStep(testRunner, runContext, result);
    TestStep currentStep = runContext.getCurrentStep();

    if (currentStep instanceof Assertable) {
      Assertable requestStep = (Assertable) currentStep;
      for (int c = 0; c < requestStep.getAssertionCount(); c++) {
        TestAssertion assertion = requestStep.getAssertionAt(c);
        log.info("Assertion [" + assertion.getName() + "] has status " + assertion.getStatus());
        if (assertion.getStatus() == AssertionStatus.FAILED) {
          for (AssertionError error : assertion.getErrors()) {
            log.error("ASSERTION FAILED -> " + error.getMessage());
          }

          assertions.add(assertion);
          assertionResults.put(assertion, (WsdlTestStepResult) result);
        }

        testAssertionCount++;
      }
    }

    String countPropertyName = currentStep.getName() + " run count";
    Long count = (Long) runContext.getProperty(countPropertyName);
    if (count == null) {
      count = new Long(0);
    }

    runContext.setProperty(countPropertyName, new Long(count.longValue() + 1));

    if (result.getStatus() == TestStepStatus.FAILED || exportAll) {
      try {
        String exportSeparator = System.getProperty(SOAPUI_EXPORT_SEPARATOR, "-");

        TestCase tc = currentStep.getTestCase();
        String nameBase =
            StringUtils.createFileName(tc.getTestSuite().getName(), '_')
                + exportSeparator
                + StringUtils.createFileName(tc.getName(), '_')
                + exportSeparator
                + StringUtils.createFileName(currentStep.getName(), '_')
                + "-"
                + count.longValue()
                + "-"
                + result.getStatus();

        WsdlTestCaseRunner callingTestCaseRunner =
            (WsdlTestCaseRunner) runContext.getProperty("#CallingTestCaseRunner#");

        if (callingTestCaseRunner != null) {
          WsdlTestCase ctc = callingTestCaseRunner.getTestCase();
          WsdlRunTestCaseTestStep runTestCaseTestStep =
              (WsdlRunTestCaseTestStep) runContext.getProperty("#CallingRunTestCaseStep#");

          nameBase =
              StringUtils.createFileName(ctc.getTestSuite().getName(), '_')
                  + exportSeparator
                  + StringUtils.createFileName(ctc.getName(), '_')
                  + exportSeparator
                  + StringUtils.createFileName(runTestCaseTestStep.getName(), '_')
                  + exportSeparator
                  + StringUtils.createFileName(tc.getTestSuite().getName(), '_')
                  + exportSeparator
                  + StringUtils.createFileName(tc.getName(), '_')
                  + exportSeparator
                  + StringUtils.createFileName(currentStep.getName(), '_')
                  + "-"
                  + count.longValue()
                  + "-"
                  + result.getStatus();
        }

        String absoluteOutputFolder = getAbsoluteOutputFolder(ModelSupport.getModelItemProject(tc));
        String fileName = absoluteOutputFolder + File.separator + nameBase + ".txt";

        if (result.getStatus() == TestStepStatus.FAILED) {
          log.error(currentStep.getName() + " failed, exporting to [" + fileName + "]");
        }

        new File(fileName).getParentFile().mkdirs();

        PrintWriter writer = new PrintWriter(fileName);
        result.writeTo(writer);
        writer.close();

        // write attachments
        if (result instanceof MessageExchange) {
          Attachment[] attachments = ((MessageExchange) result).getResponseAttachments();
          if (attachments != null && attachments.length > 0) {
            for (int c = 0; c < attachments.length; c++) {
              fileName = nameBase + "-attachment-" + (c + 1) + ".";

              Attachment attachment = attachments[c];
              String contentType = attachment.getContentType();
              if (!"application/octet-stream".equals(contentType)
                  && contentType != null
                  && contentType.indexOf('/') != -1) {
                fileName += contentType.substring(contentType.lastIndexOf('/') + 1);
              } else {
                fileName += "dat";
              }

              fileName = absoluteOutputFolder + File.separator + fileName;

              FileOutputStream outFile = new FileOutputStream(fileName);
              Tools.writeAll(outFile, attachment.getInputStream());
              outFile.close();
            }
          }
        }

        exportCount++;
      } catch (Exception e) {
        log.error("Error saving failed result: " + e, e);
      }
    }

    testStepCount++;
  }