diff -r 5dddac867eb4 nbjunit/apichanges.xml --- a/nbjunit/apichanges.xml Thu Mar 12 13:00:34 2009 +0100 +++ b/nbjunit/apichanges.xml Thu Mar 12 13:59:27 2009 +0100 @@ -55,6 +55,26 @@ + + + Easy way to fail the test on error or warning + + + + + +

+ Do you need to fail the test when some wrong message or + exception is logged? Easy now with + + Configuration.failOnMessage(Level.WARNING) and + + Configuration.failOnException(Level.INFO). +

+
+ + +
Leave autoloads as autoloads and eagers as eager diff -r 5dddac867eb4 nbjunit/manifest.mf --- a/nbjunit/manifest.mf Thu Mar 12 13:00:34 2009 +0100 +++ b/nbjunit/manifest.mf Thu Mar 12 13:59:27 2009 +0100 @@ -1,5 +1,5 @@ Manifest-Version: 1.0 OpenIDE-Module: org.netbeans.modules.nbjunit/1 OpenIDE-Module-Localizing-Bundle: org/netbeans/junit/Bundle.properties -OpenIDE-Module-Specification-Version: 1.57 +OpenIDE-Module-Specification-Version: 1.58 diff -r 5dddac867eb4 nbjunit/src/org/netbeans/junit/Log.java --- a/nbjunit/src/org/netbeans/junit/Log.java Thu Mar 12 13:00:34 2009 +0100 +++ b/nbjunit/src/org/netbeans/junit/Log.java Thu Mar 12 13:59:27 2009 +0100 @@ -281,40 +281,12 @@ if (record.getLevel().intValue() < getLevel().intValue()) { return; } - - StringBuffer sb = new StringBuffer(); - sb.append('['); - sb.append(record.getLoggerName()); - sb.append("] THREAD: "); - sb.append(Thread.currentThread().getName()); - sb.append(" MSG: "); - String msg = record.getMessage(); - ResourceBundle b = record.getResourceBundle(); - if (b != null) { - try { - msg = b.getString(msg); - } catch (MissingResourceException ex) { - // ignore - } - } - - if (msg != null && record.getParameters() != null) { - msg = MessageFormat.format(msg, record.getParameters()); - } - sb.append(msg); - - Throwable t = record.getThrown(); - if (t != null) { - for (StackTraceElement s : t.getStackTrace()) { - sb.append("\n ").append(s.toString()); - } - } + StringBuffer sb = toString(record); try { getLog(record).println(sb.toString()); } catch (LinkageError err) { // prevent circular references } - messages.append(sb.toString()); messages.append ('\n'); @@ -448,4 +420,33 @@ } } // end of InstancesHandler + + static StringBuffer toString(LogRecord record) { + StringBuffer sb = new StringBuffer(); + sb.append('['); + sb.append(record.getLoggerName()); + sb.append("] THREAD: "); + sb.append(Thread.currentThread().getName()); + sb.append(" MSG: "); + String msg = record.getMessage(); + ResourceBundle b = record.getResourceBundle(); + if (b != null) { + try { + msg = b.getString(msg); + } catch (MissingResourceException ex) { + // ignore + } + } + if (msg != null && record.getParameters() != null) { + msg = MessageFormat.format(msg, record.getParameters()); + } + sb.append(msg); + Throwable t = record.getThrown(); + if (t != null) { + for (StackTraceElement s : t.getStackTrace()) { + sb.append("\n ").append(s.toString()); + } + } + return sb; + } } diff -r 5dddac867eb4 nbjunit/src/org/netbeans/junit/NbModuleSuite.java --- a/nbjunit/src/org/netbeans/junit/NbModuleSuite.java Thu Mar 12 13:00:34 2009 +0100 +++ b/nbjunit/src/org/netbeans/junit/NbModuleSuite.java Thu Mar 12 13:59:27 2009 +0100 @@ -59,10 +59,16 @@ import java.util.Properties; import java.util.Set; import java.util.TreeSet; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.SwingUtilities; import junit.framework.Assert; +import junit.framework.AssertionFailedError; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestResult; @@ -114,6 +120,8 @@ final boolean gui; final boolean enableClasspathModules; final boolean honorAutoEager; + final Level failOnMessage; + final Level failOnException; private Configuration( List clusterRegExp, @@ -124,7 +132,9 @@ boolean reuseUserDir, boolean gui, boolean enableCPModules, - boolean honorAutoEager + boolean honorAutoEager, + Level failOnMessage, + Level failOnException ) { this.clusterRegExp = clusterRegExp; this.moduleRegExp = moduleRegExp; @@ -135,13 +145,15 @@ this.gui = gui; this.enableClasspathModules = enableCPModules; this.honorAutoEager = honorAutoEager; + this.failOnException = failOnException; + this.failOnMessage = failOnMessage; } static Configuration create(Class clazz) { return new Configuration( null, null, ClassLoader.getSystemClassLoader().getParent(), Collections.emptyList(), clazz, false, true, true, false - ); + , null, null); } /** Regular expression to match clusters that shall be enabled. @@ -170,7 +182,7 @@ list, moduleRegExp, parentClassLoader, tests, latestTestCaseClass, reuseUserDir, gui, enableClasspathModules, honorAutoEager - ); + , failOnMessage, failOnException); } /** By default only modules on classpath of the test are enabled, @@ -210,7 +222,7 @@ return new Configuration( this.clusterRegExp, arr, parentClassLoader, tests, latestTestCaseClass, reuseUserDir, gui, - enableClasspathModules, honorAutoEager); + enableClasspathModules, honorAutoEager, failOnMessage, failOnException); } Configuration classLoader(ClassLoader parent) { @@ -218,7 +230,7 @@ clusterRegExp, moduleRegExp, parent, tests, latestTestCaseClass, reuseUserDir, gui, enableClasspathModules, honorAutoEager - ); + , failOnMessage, failOnException); } /** Adds new test name, or array of names into the configuration. By @@ -241,7 +253,7 @@ return new Configuration( clusterRegExp, moduleRegExp, parentClassLoader, newTests, latestTestCaseClass, reuseUserDir, gui, - enableClasspathModules, honorAutoEager); + enableClasspathModules, honorAutoEager, failOnMessage, failOnException); } /** Adds new test class to run, together with a list of its methods @@ -268,7 +280,7 @@ clusterRegExp, moduleRegExp, parentClassLoader, newTests, test, reuseUserDir, gui, enableClasspathModules, honorAutoEager - ); + , failOnMessage, failOnException); } /** @@ -293,7 +305,7 @@ clusterRegExp, moduleRegExp, parentClassLoader, newTests, latestTestCaseClass, reuseUserDir, gui, enableClasspathModules, honorAutoEager - ); + , failOnMessage, failOnException); } /** By default all modules on classpath are enabled (so you can link @@ -309,7 +321,7 @@ return new Configuration( clusterRegExp, moduleRegExp, parentClassLoader, tests, latestTestCaseClass, reuseUserDir, - gui, enable, honorAutoEager); + gui, enable, honorAutoEager, failOnMessage, failOnException); } /** By default the {@link #enableModules(java.lang.String)} method @@ -328,7 +340,37 @@ clusterRegExp, moduleRegExp, parentClassLoader, tests, latestTestCaseClass, reuseUserDir, gui, enableClasspathModules, honor - ); + , failOnMessage, failOnException); + } + + /** Fails if there is a message sent to {@link Logger} with appropriate + * level or higher during the test run execution. + * + * @param level the minimal level of the message + * @return new configuration filled with this data + * @since 1.58 + */ + public Configuration failOnMessage(Level level) { + return new Configuration( + clusterRegExp, moduleRegExp, parentClassLoader, + tests, latestTestCaseClass, reuseUserDir, + gui, enableClasspathModules, honorAutoEager + , level, failOnException); + } + + /** Fails if there is an exception reported to {@link Logger} with appropriate + * level or higher during the test run execution. + * + * @param level the minimal level of the message + * @return new configuration filled with this data + * @since 1.58 + */ + public Configuration failOnException(Level level) { + return new Configuration( + clusterRegExp, moduleRegExp, parentClassLoader, + tests, latestTestCaseClass, reuseUserDir, + gui, enableClasspathModules, honorAutoEager + , failOnMessage, level); } private void addLatest(List newTests) { @@ -350,7 +392,7 @@ clusterRegExp, moduleRegExp, parentClassLoader, newTests, latestTestCaseClass, reuseUserDir, gui, enableClasspathModules - ,honorAutoEager); + ,honorAutoEager, failOnMessage, failOnException); } /** Should the system run with GUI or without? The default behaviour @@ -367,7 +409,7 @@ clusterRegExp, moduleRegExp, parentClassLoader, tests, latestTestCaseClass, reuseUserDir, gui, enableClasspathModules - ,honorAutoEager); + ,honorAutoEager, failOnMessage, failOnException); } /** @@ -380,7 +422,7 @@ return new Configuration( clusterRegExp, moduleRegExp, parentClassLoader, tests, latestTestCaseClass, reuse, gui, enableClasspathModules - ,honorAutoEager); + ,honorAutoEager, failOnMessage, failOnException); } } @@ -618,6 +660,8 @@ if (!config.gui) { args.add("--nogui"); } + + Test handler = NbModuleLogHandler.registerBuffer(config.failOnMessage, config.failOnException); m.invoke(null, (Object)args.toArray(new String[0])); ClassLoader global = Thread.currentThread().getContextClassLoader(); @@ -645,12 +689,20 @@ toRun.addTest(sndClazz.newInstance()); } } + + if (handler != null) { + toRun.addTest(handler); + } + testCount = toRun.countTestCases(); toRun.run(result); } catch (ClassNotFoundException ex) { result.addError(this, ex); } catch (NoClassDefFoundError ex) { result.addError(this, ex); + } + if (handler != null) { + NbModuleLogHandler.finish(); } Class lifeClazz = global.loadClass("org.openide.LifecycleManager"); // NOI18N