show stacktraces in ui
authorLukas Jungmann <jungi@netbeans.org>
Thu, 22 Dec 2011 01:37:54 +0100
changeset 177072af2ee6076a7
parent 17706 a8a086cbfe5e
child 17708 80d577510857
show stacktraces in ui
testng/src/org/netbeans/modules/contrib/testng/output/TestNGOutputReader.java
testng/src/org/netbeans/modules/contrib/testng/output/TestNGTestcase.java
     1.1 --- a/testng/src/org/netbeans/modules/contrib/testng/output/TestNGOutputReader.java	Wed Dec 21 12:03:19 2011 +0100
     1.2 +++ b/testng/src/org/netbeans/modules/contrib/testng/output/TestNGOutputReader.java	Thu Dec 22 01:37:54 2011 +0100
     1.3 @@ -180,22 +180,24 @@
     1.4          private int confSkip = 0;
     1.5      }
     1.6      private SuiteStats suiteStat;
     1.7 +    private List<String> txt = new ArrayList<String>();
     1.8  
     1.9      /**
    1.10       */
    1.11      synchronized void verboseMessageLogged(String msg) {
    1.12 +        String in = getMessage(msg);
    1.13          //suite starting
    1.14 -        if (getMessage(msg).startsWith("RUNNING: ")) {
    1.15 -            Matcher m = Pattern.compile(RegexpUtils.RUNNING_SUITE_REGEX).matcher(msg);
    1.16 +        if (in.startsWith("RUNNING: ")) {
    1.17 +            Matcher m = Pattern.compile(RegexpUtils.RUNNING_SUITE_REGEX).matcher(in);
    1.18              if (m.matches()) {
    1.19                  suiteStarted(m.group(1), Integer.valueOf(m.group(2)), m.group(3));
    1.20              } else {
    1.21 -                assert false : "Cannot match: '" + msg + "'.";
    1.22 +                assert false : "Cannot match: '" + in + "'.";
    1.23              }
    1.24              return;
    1.25          }
    1.26          //suite finishing
    1.27 -        if (getMessage(msg).equals("===============================================")) {
    1.28 +        if (in.equals("===============================================")) {
    1.29              suiteSummary = !suiteSummary;
    1.30              if (suiteSummary) {
    1.31                  suiteStat = new SuiteStats();
    1.32 @@ -206,7 +208,7 @@
    1.33              return;
    1.34          } else if (suiteSummary) {
    1.35              if (suiteStat.name != null) {
    1.36 -                Matcher m = Pattern.compile(RegexpUtils.STATS_REGEX).matcher(msg);
    1.37 +                Matcher m = Pattern.compile(RegexpUtils.STATS_REGEX).matcher(in);
    1.38                  if (suiteStat.testRun < 0) {
    1.39                      //Tests run/fail/skip
    1.40                      if (m.matches()) {
    1.41 @@ -214,7 +216,7 @@
    1.42                          suiteStat.testFail = Integer.valueOf(m.group(2));
    1.43                          suiteStat.testSkip = Integer.valueOf(m.group(4));
    1.44                      } else {
    1.45 -                        assert false : "Cannot match: '" + msg + "'.";
    1.46 +                        assert false : "Cannot match: '" + in + "'.";
    1.47                      }
    1.48                  } else {
    1.49                      //Configuration fail/skip
    1.50 @@ -222,65 +224,86 @@
    1.51                          suiteStat.confFail = Integer.valueOf(m.group(1));
    1.52                          suiteStat.confSkip = Integer.valueOf(m.group(2));
    1.53                      } else {
    1.54 -                        assert false : "Cannot match: '" + msg + "'.";
    1.55 +                        assert false : "Cannot match: '" + in + "'.";
    1.56                      }
    1.57                  }
    1.58              } else {
    1.59 -                suiteStat.name = getMessage(msg).trim();
    1.60 +                suiteStat.name = in.trim();
    1.61              }
    1.62              return;
    1.63          }
    1.64          //test
    1.65 -        if (getMessage(msg).startsWith("INVOKING: ")) {
    1.66 -            Matcher m = Pattern.compile(RegexpUtils.TEST_REGEX).matcher(msg);
    1.67 +        if (in.startsWith("INVOKING: ")) {
    1.68 +            Matcher m = Pattern.compile(RegexpUtils.TEST_REGEX).matcher(in);
    1.69              if (m.matches()) {
    1.70                  testStarted(m.group(1), m.group(2), m.group(4), m.group(6));
    1.71              } else {
    1.72 -                assert false : "Cannot match: '" + msg + "'.";
    1.73 +                assert false : "Cannot match: '" + in + "'.";
    1.74 +            }
    1.75 +            if (txt.size() > 0) {
    1.76 +                addStackTrace(txt);
    1.77 +                txt.clear();
    1.78 +            }
    1.79 +            last = null;
    1.80 +            return;
    1.81 +        }
    1.82 +
    1.83 +        Matcher m = Pattern.compile(RegexpUtils.TEST_REGEX).matcher(in);
    1.84 +        if (in.startsWith("PASSED: ")) {
    1.85 +            if (m.matches()) {
    1.86 +                testFinished("PASSED", m.group(1), m.group(2), m.group(4), m.group(6), m.group(8));
    1.87 +            } else {
    1.88 +                assert false : "Cannot match: '" + in + "'.";
    1.89              }
    1.90              return;
    1.91          }
    1.92  
    1.93 -        Matcher m = Pattern.compile(RegexpUtils.TEST_REGEX).matcher(msg);
    1.94 -        if (getMessage(msg).startsWith("PASSED: ")) {
    1.95 +        if (in.startsWith("PASSED with failures: ")) {
    1.96 +        }
    1.97 +
    1.98 +        if (in.startsWith("SKIPPED: ")) {
    1.99              if (m.matches()) {
   1.100 -                testFinished("PASSED", m.group(1), m.group(2), m.group(4), m.group(6), m.group(8));
   1.101 +                testFinished("SKIPPED", m.group(1), m.group(2), m.group(4), m.group(6), m.group(8));
   1.102              } else {
   1.103 -                assert false : "Cannot match: '" + msg + "'.";
   1.104 +                assert false : "Cannot match: '" + in + "'.";
   1.105              }
   1.106              return;
   1.107          }
   1.108  
   1.109 -        if (getMessage(msg).startsWith("PASSED with failures: ")) {
   1.110 -        }
   1.111 -
   1.112 -        if (getMessage(msg).startsWith("SKIPPED: ")) {
   1.113 -            if (m.matches()) {
   1.114 -                testFinished("SKIPPED", m.group(1), m.group(2), m.group(4), m.group(6), m.group(8));
   1.115 -            } else {
   1.116 -                assert false : "Cannot match: '" + msg + "'.";
   1.117 -            }
   1.118 -            return;
   1.119 -        }
   1.120 -
   1.121 -        if (getMessage(msg).startsWith("FAILED: ")) {
   1.122 +        if (in.startsWith("FAILED: ")) {
   1.123              if (m.matches()) {
   1.124                  testFinished("FAILED", m.group(1), m.group(2), m.group(4), m.group(6), m.group(8));
   1.125              } else {
   1.126 -                assert false : "Cannot match: '" + msg + "'.";
   1.127 +                assert false : "Cannot match: '" + in + "'.";
   1.128              }
   1.129              return;
   1.130          }
   1.131  
   1.132          //configuration methods
   1.133 -//        Matcher matcher = RegexpUtils.JAVA_EXECUTABLE.matcher(msg);
   1.134 -//        if (matcher.find()) {
   1.135 -//            String executable = matcher.group(1);
   1.136 -//            ClassPath platformSrcs = findPlatformSources(executable);
   1.137 -//            if (platformSrcs != null) {
   1.138 -//                this.platformSources = platformSrcs;
   1.139 -//            }
   1.140 -//        }
   1.141 +        if (in.contains(" CONFIGURATION: ")) {
   1.142 +            if (txt.size() > 0) {
   1.143 +                addStackTrace(txt);
   1.144 +                txt.clear();
   1.145 +            }
   1.146 +            return;
   1.147 +        }
   1.148 +
   1.149 +        Matcher m1 = Pattern.compile(RegexpUtils.RUNNING_SUITE_REGEX).matcher(in);
   1.150 +        if ((m.matches() || m1.matches()) && last != null) {
   1.151 +            //update last testcase with the stacktrace
   1.152 +            if (txt.size() > 0) {
   1.153 +                addStackTrace(txt);
   1.154 +                txt.clear();
   1.155 +            }
   1.156 +        } else {
   1.157 +            if (txt.isEmpty() && in.startsWith("       ")) {
   1.158 +                //we received test description
   1.159 +                addDescription(in.trim());
   1.160 +            } else {
   1.161 +                //we have a stacktrace
   1.162 +                txt.add(in);
   1.163 +            }
   1.164 +        }
   1.165      }
   1.166  
   1.167      synchronized void messageLogged(final AntEvent event) {
   1.168 @@ -635,6 +658,8 @@
   1.169          }
   1.170      }
   1.171  
   1.172 +    private TestNGTestcase last = null;
   1.173 +
   1.174      private void testFinished(String st, String suiteName, String testCase, String parameters, String values, String duration) {
   1.175          testSession.setCurrentSuite(suiteName);
   1.176          TestNGTestcase tc = ((TestNGTestSuite) ((TestNGTestSession) testSession).getCurrentSuite()).getTestCase(testCase, values);
   1.177 @@ -661,10 +686,21 @@
   1.178          Report r = reports.get(suiteName);
   1.179          r.update(testSession.getReport(dur));
   1.180          manager.displayReport(testSession, r, false);
   1.181 +        last = tc;
   1.182      }
   1.183  
   1.184      private String getMessage(String msg) {
   1.185          int prefixLength = RegexpUtils.TEST_LISTENER_PREFIX.length();
   1.186          return msg.substring(prefixLength);
   1.187      }
   1.188 +
   1.189 +    private void addDescription(String in) {
   1.190 +        last.setDescription(in);
   1.191 +    }
   1.192 +
   1.193 +    private void addStackTrace(List<String> txt) {
   1.194 +        Trouble t = new Trouble(false);
   1.195 +        t.setStackTrace(txt.toArray(new String[txt.size()]));
   1.196 +        last.setTrouble(t);
   1.197 +    }
   1.198  }
     2.1 --- a/testng/src/org/netbeans/modules/contrib/testng/output/TestNGTestcase.java	Wed Dec 21 12:03:19 2011 +0100
     2.2 +++ b/testng/src/org/netbeans/modules/contrib/testng/output/TestNGTestcase.java	Thu Dec 22 01:37:54 2011 +0100
     2.3 @@ -56,6 +56,7 @@
     2.4      private boolean confMethod = false;
     2.5      private String parameters;
     2.6      private List<String> values = new ArrayList<String>();
     2.7 +    private String description;
     2.8  
     2.9      //TODO: there should be subnode for each value instead
    2.10      public TestNGTestcase(String name, String params, String values, TestSession session) {
    2.11 @@ -92,4 +93,12 @@
    2.12      public void setConfigMethod(boolean isConfigMethod) {
    2.13          confMethod = isConfigMethod;
    2.14      }
    2.15 +
    2.16 +    public void setDescription(String description) {
    2.17 +        this.description = description;
    2.18 +    }
    2.19 +
    2.20 +    public String getDescription() {
    2.21 +        return description;
    2.22 +    }
    2.23  }