From 754bd7dd02823fd502a5c38d0db91a9e4efcac46 Mon Sep 17 00:00:00 2001 From: Jonah Graham Date: Mon, 14 Aug 2023 10:59:10 -0400 Subject: [PATCH 1/3] Remove assumption that strings are always intern The pre-existing code assumed that string (qName) passed in to start and end element was always interned and compared those strings to constants using ==. Instead rewrite code using switch statements on the strings. Also includes small change to the exception handling so that code analysis can correctly where exceptions are always thrown. i.e. instead of hiding a throw in an always throwing method, return the exception and throw it at the call site. --- .../META-INF/MANIFEST.MF | 2 +- .../internal/boost/BoostXmlLogHandler.java | 114 ++++++++++-------- 2 files changed, 64 insertions(+), 52 deletions(-) diff --git a/testsrunner/org.eclipse.cdt.testsrunner.boost/META-INF/MANIFEST.MF b/testsrunner/org.eclipse.cdt.testsrunner.boost/META-INF/MANIFEST.MF index 87071d35bd3..69d533489b3 100644 --- a/testsrunner/org.eclipse.cdt.testsrunner.boost/META-INF/MANIFEST.MF +++ b/testsrunner/org.eclipse.cdt.testsrunner.boost/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.testsrunner.boost;singleton:=true -Bundle-Version: 7.2.0.qualifier +Bundle-Version: 7.2.100.qualifier Bundle-Activator: org.eclipse.cdt.testsrunner.internal.boost.BoostTestsRunnerPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin diff --git a/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostXmlLogHandler.java b/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostXmlLogHandler.java index a66cbd70998..da7b794b152 100644 --- a/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostXmlLogHandler.java +++ b/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostXmlLogHandler.java @@ -15,9 +15,6 @@ package org.eclipse.cdt.testsrunner.internal.boost; import java.text.MessageFormat; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; import java.util.Stack; import org.eclipse.cdt.testsrunner.model.ITestItem; @@ -56,19 +53,6 @@ public class BoostXmlLogHandler extends DefaultHandler { private static final String XML_ATTR_MESSAGE_FILE = "file"; //$NON-NLS-1$ private static final String XML_ATTR_MESSAGE_LINE = "line"; //$NON-NLS-1$ - /** Maps the string message level representation to the Tests Runner internal enum code. */ - private static final Map STRING_TO_MESSAGE_LEVEL; - static { - Map aMap = new HashMap<>(); - aMap.put(XML_NODE_INFO, ITestMessage.Level.Info); - aMap.put(XML_NODE_MESSAGE, ITestMessage.Level.Message); - aMap.put(XML_NODE_WARNING, ITestMessage.Level.Warning); - aMap.put(XML_NODE_ERROR, ITestMessage.Level.Error); - aMap.put(XML_NODE_FATAL_ERROR, ITestMessage.Level.FatalError); - // NOTE: Exception node is processed separately - STRING_TO_MESSAGE_LEVEL = Collections.unmodifiableMap(aMap); - } - /** The default file name for test message location. */ private static final String DEFAULT_LOCATION_FILE = null; @@ -106,12 +90,18 @@ public class BoostXmlLogHandler extends DefaultHandler { public void startElement(String namespaceURI, String localName, String qName, Attributes attrs) throws SAXException { + if (qName == null) { + throw createAndLogExceptionForElement(qName); + } + elementDataStack.push(new StringBuilder()); - if (qName == XML_NODE_TEST_SUITE) { + switch (qName) { + case XML_NODE_TEST_SUITE: String testSuiteName = attrs.getValue(XML_ATTR_TEST_SUITE_NAME); modelUpdater.enterTestSuite(testSuiteName); + break; - } else if (qName == XML_NODE_TEST_CASE) { + case XML_NODE_TEST_CASE: String testCaseName = attrs.getValue(XML_ATTR_TEST_CASE_NAME); if (lastTestCaseName.equals(testCaseName)) { @@ -124,23 +114,31 @@ public void startElement(String namespaceURI, String localName, String qName, At modelUpdater.enterTestCase(testCaseName); testStatus = Status.Passed; - - } else if (STRING_TO_MESSAGE_LEVEL.containsKey(qName) || qName == XML_NODE_LAST_CHECKPOINT) { + break; + + case XML_NODE_INFO: + case XML_NODE_MESSAGE: + case XML_NODE_WARNING: + case XML_NODE_ERROR: + case XML_NODE_FATAL_ERROR: + case XML_NODE_LAST_CHECKPOINT: fileName = attrs.getValue(XML_ATTR_MESSAGE_FILE); String lineNumberStr = attrs.getValue(XML_ATTR_MESSAGE_LINE); lineNumber = lineNumberStr != null ? Integer.parseInt(lineNumberStr.trim()) : DEFAULT_LOCATION_LINE; + break; - } else if (qName == XML_NODE_EXCEPTION) { + case XML_NODE_EXCEPTION: fileName = DEFAULT_LOCATION_FILE; lineNumber = DEFAULT_LOCATION_LINE; + break; - } else if (qName == XML_NODE_TESTING_TIME) { - - } else if (qName == XML_NODE_TEST_LOG) { + case XML_NODE_TESTING_TIME: + case XML_NODE_TEST_LOG: /* just skip, do nothing */ + break; - } else { - logAndThrowErrorForElement(qName); + default: + throw createAndLogExceptionForElement(qName); } } @@ -167,30 +165,53 @@ private void addCurrentMessage(ITestMessage.Level level) { @Override public void endElement(String namespaceURI, String localName, String qName) throws SAXException { - if (qName == XML_NODE_TEST_SUITE) { + if (qName == null) { + throw createAndLogExceptionForElement(qName); + } + switch (qName) { + case XML_NODE_TEST_SUITE: modelUpdater.exitTestSuite(); + break; - } else if (qName == XML_NODE_TEST_CASE) { + case XML_NODE_TEST_CASE: modelUpdater.setTestStatus(testStatus); modelUpdater.exitTestCase(); + break; - } else if (qName == XML_NODE_TESTING_TIME) { + case XML_NODE_TESTING_TIME: modelUpdater.setTestingTime(Integer.parseInt(elementDataStack.peek().toString().trim()) / 1000); - - } else if (STRING_TO_MESSAGE_LEVEL.containsKey(qName)) { - addCurrentMessage(STRING_TO_MESSAGE_LEVEL.get(qName)); - - } else if (qName == XML_NODE_EXCEPTION) { + break; + + case XML_NODE_INFO: + addCurrentMessage(ITestMessage.Level.Info); + break; + case XML_NODE_MESSAGE: + addCurrentMessage(ITestMessage.Level.Message); + break; + case XML_NODE_WARNING: + addCurrentMessage(ITestMessage.Level.Warning); + break; + case XML_NODE_ERROR: + addCurrentMessage(ITestMessage.Level.Error); + break; + case XML_NODE_FATAL_ERROR: + addCurrentMessage(ITestMessage.Level.FatalError); + break; + + case XML_NODE_EXCEPTION: if (fileName != DEFAULT_LOCATION_FILE && !fileName.isEmpty() && lineNumber >= 0) { elementDataStack.peek().append(BoostTestsRunnerMessages.BoostXmlLogHandler_exception_suffix); } addCurrentMessage(ITestMessage.Level.Exception); + break; - } else if (qName == XML_NODE_TEST_LOG || qName == XML_NODE_LAST_CHECKPOINT) { + case XML_NODE_TEST_LOG: + case XML_NODE_LAST_CHECKPOINT: /* just skip, do nothing */ + break; - } else { - logAndThrowErrorForElement(qName); + default: + throw createAndLogExceptionForElement(qName); } elementDataStack.pop(); } @@ -207,22 +228,13 @@ public void characters(char[] ch, int start, int length) { * Throws the testing exception for the specified XML tag. * * @param tagName XML tag name - * @throws SAXException the exception that will be thrown - */ - private void logAndThrowErrorForElement(String tagName) throws SAXException { - logAndThrowError(MessageFormat.format(BoostTestsRunnerMessages.BoostXmlLogHandler_wrong_tag_name, tagName)); - } - - /** - * Throws the testing exception with the specified message. - * - * @param message the reason - * @throws SAXException the exception that will be thrown + * @return SAXException the exception that will be thrown */ - private void logAndThrowError(String message) throws SAXException { - SAXException e = new SAXException(message); + private SAXException createAndLogExceptionForElement(String tagName) { + SAXException e = new SAXException( + MessageFormat.format(BoostTestsRunnerMessages.BoostXmlLogHandler_wrong_tag_name, tagName)); BoostTestsRunnerPlugin.log(e); - throw e; + return e; } @Override From 7caa0c04fbd44ff3c89547caa443e828c87d52a1 Mon Sep 17 00:00:00 2001 From: Jonah Graham Date: Mon, 14 Aug 2023 10:42:43 -0400 Subject: [PATCH 2/3] Trim excess whitespace in Boost test output The code for boost test running parsing left all the excess whitespace from the XML file. This led to a lot whitespace in messages in the UI. This change trims leading and trailing whitespace, but preserves whitespace within a message. --- .../testsrunner/internal/boost/BoostXmlLogHandler.java | 8 ++++++-- .../cdt/testsrunner/testsrunners/BoostTestCase.java | 7 ++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostXmlLogHandler.java b/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostXmlLogHandler.java index da7b794b152..1f7e75900c7 100644 --- a/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostXmlLogHandler.java +++ b/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostXmlLogHandler.java @@ -149,7 +149,7 @@ public void startElement(String namespaceURI, String localName, String qName, At * @param level test message level */ private void addCurrentMessage(ITestMessage.Level level) { - modelUpdater.addTestMessage(fileName, lineNumber, level, elementDataStack.peek().toString()); + modelUpdater.addTestMessage(fileName, lineNumber, level, elementDataStack.peek().toString().trim()); fileName = DEFAULT_LOCATION_FILE; lineNumber = DEFAULT_LOCATION_LINE; if (level == ITestMessage.Level.Error || level == ITestMessage.Level.FatalError) { @@ -200,7 +200,11 @@ public void endElement(String namespaceURI, String localName, String qName) thro case XML_NODE_EXCEPTION: if (fileName != DEFAULT_LOCATION_FILE && !fileName.isEmpty() && lineNumber >= 0) { - elementDataStack.peek().append(BoostTestsRunnerMessages.BoostXmlLogHandler_exception_suffix); + StringBuilder current = elementDataStack.peek(); + String trimmed = current.toString().trim(); + current.setLength(0); + current.append(trimmed); + current.append(BoostTestsRunnerMessages.BoostXmlLogHandler_exception_suffix); } addCurrentMessage(ITestMessage.Level.Exception); break; diff --git a/testsrunner/org.eclipse.cdt.testsrunner.tests/src/org/eclipse/cdt/testsrunner/testsrunners/BoostTestCase.java b/testsrunner/org.eclipse.cdt.testsrunner.tests/src/org/eclipse/cdt/testsrunner/testsrunners/BoostTestCase.java index 7d84aabcbb6..9527732d6c7 100644 --- a/testsrunner/org.eclipse.cdt.testsrunner.tests/src/org/eclipse/cdt/testsrunner/testsrunners/BoostTestCase.java +++ b/testsrunner/org.eclipse.cdt.testsrunner.tests/src/org/eclipse/cdt/testsrunner/testsrunners/BoostTestCase.java @@ -226,7 +226,8 @@ public void testEmptyMessage() { mockModelUpdater.enterTestSuite("MainTS"); mockModelUpdater.enterTestCase("test"); mockModelUpdater.addTestMessage("file.cpp", 22, ITestMessage.Level.Info, ""); - mockModelUpdater.addTestMessage("file2.cpp", 47, ITestMessage.Level.Exception, EXCEPTION_CHECKPOINT_SUFFIX); + mockModelUpdater.addTestMessage("file2.cpp", 47, ITestMessage.Level.Exception, + EXCEPTION_CHECKPOINT_SUFFIX.trim()); mockModelUpdater.exitTestCase(); mockModelUpdater.exitTestSuite(); } @@ -245,9 +246,9 @@ public void testSpacesInBeginAndEndOfMessage() { mockModelUpdater.enterTestSuite("MainTS"); mockModelUpdater.enterTestCase("test"); - mockModelUpdater.addTestMessage("file", 42, ITestMessage.Level.Warning, " Custom warning "); + mockModelUpdater.addTestMessage("file", 42, ITestMessage.Level.Warning, "Custom warning"); mockModelUpdater.addTestMessage("file2", 47, ITestMessage.Level.Exception, - " Exception message end " + EXCEPTION_CHECKPOINT_SUFFIX); + "Exception message end" + EXCEPTION_CHECKPOINT_SUFFIX); mockModelUpdater.exitTestCase(); mockModelUpdater.exitTestSuite(); } From f59c109f46578790f6466141c64a1d4623159da7 Mon Sep 17 00:00:00 2001 From: Jonah Graham Date: Mon, 14 Aug 2023 11:53:55 -0400 Subject: [PATCH 3/3] Support Context tags in Boost test runs Boost a while ago added Context tags, this commit makes those context tags supported in the testsrunner code of CDT See also https://www.boost.org/doc/libs/1_82_0/libs/test/doc/html/boost_test/test_output/test_tools_support_for_logging/contexts.html Fixes 459 --- .../boost/BoostTestsRunnerMessages.java | 6 +- .../boost/BoostTestsRunnerMessages.properties | 6 +- .../internal/boost/BoostXmlLogHandler.java | 63 +++++++- .../testsrunners/BoostTestCase.java | 134 +++++++++++++++++- 4 files changed, 199 insertions(+), 10 deletions(-) diff --git a/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostTestsRunnerMessages.java b/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostTestsRunnerMessages.java index 71911af35d5..37ea0c1003c 100644 --- a/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostTestsRunnerMessages.java +++ b/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostTestsRunnerMessages.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011, 2012 Anton Gorenkov. + * Copyright (c) 2011, 2023 Anton Gorenkov and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -21,6 +21,10 @@ public class BoostTestsRunnerMessages extends NLS { public static String BoostTestsRunner_io_error_prefix; public static String BoostTestsRunner_wrong_tests_paths_count; public static String BoostTestsRunner_xml_error_prefix; + public static String BoostXmlLogHandler_ContextHeader; + public static String BoostXmlLogHandler_ContextOverflow; + public static String BoostXmlLogHandler_ContextPrefix; + public static String BoostXmlLogHandler_ContextSuffix; public static String BoostXmlLogHandler_exception_suffix; public static String BoostXmlLogHandler_wrong_tag_name; static { diff --git a/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostTestsRunnerMessages.properties b/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostTestsRunnerMessages.properties index ba5709f28a4..e1ed91dac5b 100644 --- a/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostTestsRunnerMessages.properties +++ b/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostTestsRunnerMessages.properties @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2011 Anton Gorenkov +# Copyright (c) 2011, 2023 Anton Gorenkov and others. # # This program and the accompanying materials # are made available under the terms of the Eclipse Public License 2.0 @@ -15,5 +15,9 @@ BoostTestsRunner_error_format={0}: {1} BoostTestsRunner_io_error_prefix=I/O Error BoostTestsRunner_wrong_tests_paths_count=Only on test suite or test case should be specified to rerun BoostTestsRunner_xml_error_prefix=XML parse error +BoostXmlLogHandler_ContextHeader=\nContext:\u0020 +BoostXmlLogHandler_ContextOverflow=... +BoostXmlLogHandler_ContextPrefix=\u0020[ +BoostXmlLogHandler_ContextSuffix=] BoostXmlLogHandler_exception_suffix=\nLast check point was here. BoostXmlLogHandler_wrong_tag_name=Invalid XML format: Element "{0}" is not accepted\! diff --git a/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostXmlLogHandler.java b/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostXmlLogHandler.java index 1f7e75900c7..27c498def0a 100644 --- a/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostXmlLogHandler.java +++ b/testsrunner/org.eclipse.cdt.testsrunner.boost/src/org/eclipse/cdt/testsrunner/internal/boost/BoostXmlLogHandler.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011, 2013 Anton Gorenkov and others. + * Copyright (c) 2011, 2023 Anton Gorenkov and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -46,6 +46,8 @@ public class BoostXmlLogHandler extends DefaultHandler { private static final String XML_NODE_ERROR = "Error"; //$NON-NLS-1$ private static final String XML_NODE_FATAL_ERROR = "FatalError"; //$NON-NLS-1$ private static final String XML_NODE_EXCEPTION = "Exception"; //$NON-NLS-1$ + private static final String XML_NODE_CONTEXT = "Context"; //$NON-NLS-1$ + private static final String XML_NODE_FRAME = "Frame"; //$NON-NLS-1$ // Boost.Test XML log attributes private static final String XML_ATTR_TEST_SUITE_NAME = "name"; //$NON-NLS-1$ @@ -53,6 +55,13 @@ public class BoostXmlLogHandler extends DefaultHandler { private static final String XML_ATTR_MESSAGE_FILE = "file"; //$NON-NLS-1$ private static final String XML_ATTR_MESSAGE_LINE = "line"; //$NON-NLS-1$ + /** + * The context can be of arbitrary length, to prevent excessively long strings + * in the tree limit the context to this length in the tree. The full context + * is available in the details tab. + */ + private static final int MAX_CONTEXT_LENGTH_IN_TREE = 50; + /** The default file name for test message location. */ private static final String DEFAULT_LOCATION_FILE = null; @@ -81,6 +90,10 @@ public class BoostXmlLogHandler extends DefaultHandler { private String lastTestCaseName = ""; //$NON-NLS-1$ private static final int SAME_TEST_CASE_NAME_COUNT_START = 2; private int sameTestCaseNameCount = SAME_TEST_CASE_NAME_COUNT_START; + private StringBuilder context = new StringBuilder(); + + private boolean testCaseEnterDeferred = false; + private StringBuilder testCaseName = new StringBuilder(); BoostXmlLogHandler(ITestModelUpdater modelUpdater) { this.modelUpdater = modelUpdater; @@ -102,17 +115,18 @@ public void startElement(String namespaceURI, String localName, String qName, At break; case XML_NODE_TEST_CASE: - String testCaseName = attrs.getValue(XML_ATTR_TEST_CASE_NAME); + testCaseName.setLength(0); + testCaseName.append(attrs.getValue(XML_ATTR_TEST_CASE_NAME)); - if (lastTestCaseName.equals(testCaseName)) { - testCaseName += " (" + sameTestCaseNameCount + ")"; //$NON-NLS-1$ //$NON-NLS-2$ + if (lastTestCaseName.equals(testCaseName.toString())) { + testCaseName.append(" (" + sameTestCaseNameCount + ")"); //$NON-NLS-1$ //$NON-NLS-2$ ++sameTestCaseNameCount; } else { - lastTestCaseName = testCaseName; + lastTestCaseName = testCaseName.toString(); sameTestCaseNameCount = SAME_TEST_CASE_NAME_COUNT_START; } - modelUpdater.enterTestCase(testCaseName); + testCaseEnterDeferred = true; testStatus = Status.Passed; break; @@ -132,6 +146,11 @@ public void startElement(String namespaceURI, String localName, String qName, At lineNumber = DEFAULT_LOCATION_LINE; break; + case XML_NODE_CONTEXT: + case XML_NODE_FRAME: + /* handle in endElement */ + break; + case XML_NODE_TESTING_TIME: case XML_NODE_TEST_LOG: /* just skip, do nothing */ @@ -149,7 +168,26 @@ public void startElement(String namespaceURI, String localName, String qName, At * @param level test message level */ private void addCurrentMessage(ITestMessage.Level level) { - modelUpdater.addTestMessage(fileName, lineNumber, level, elementDataStack.peek().toString().trim()); + String text = elementDataStack.peek().toString().trim(); + if (testCaseEnterDeferred) { + if (!context.isEmpty()) { + testCaseName.append(BoostTestsRunnerMessages.BoostXmlLogHandler_ContextPrefix); + if (context.length() > MAX_CONTEXT_LENGTH_IN_TREE) { + testCaseName.append(context.subSequence(0, MAX_CONTEXT_LENGTH_IN_TREE)); + testCaseName.append(BoostTestsRunnerMessages.BoostXmlLogHandler_ContextOverflow); + } else { + testCaseName.append(context); + } + testCaseName.append(BoostTestsRunnerMessages.BoostXmlLogHandler_ContextSuffix); + } + modelUpdater.enterTestCase(testCaseName.toString()); + testCaseEnterDeferred = false; + } + if (!context.isEmpty()) { + text += BoostTestsRunnerMessages.BoostXmlLogHandler_ContextHeader + context.toString().trim(); + context.setLength(0); + } + modelUpdater.addTestMessage(fileName, lineNumber, level, text.trim()); fileName = DEFAULT_LOCATION_FILE; lineNumber = DEFAULT_LOCATION_LINE; if (level == ITestMessage.Level.Error || level == ITestMessage.Level.FatalError) { @@ -174,6 +212,10 @@ public void endElement(String namespaceURI, String localName, String qName) thro break; case XML_NODE_TEST_CASE: + if (testCaseEnterDeferred) { + modelUpdater.enterTestCase(testCaseName.toString()); + testCaseEnterDeferred = false; + } modelUpdater.setTestStatus(testStatus); modelUpdater.exitTestCase(); break; @@ -209,6 +251,13 @@ public void endElement(String namespaceURI, String localName, String qName) thro addCurrentMessage(ITestMessage.Level.Exception); break; + case XML_NODE_CONTEXT: + context.insert(0, elementDataStack.peek().toString().trim()); + break; + case XML_NODE_FRAME: + context.append(elementDataStack.peek().toString().trim()); + break; + case XML_NODE_TEST_LOG: case XML_NODE_LAST_CHECKPOINT: /* just skip, do nothing */ diff --git a/testsrunner/org.eclipse.cdt.testsrunner.tests/src/org/eclipse/cdt/testsrunner/testsrunners/BoostTestCase.java b/testsrunner/org.eclipse.cdt.testsrunner.tests/src/org/eclipse/cdt/testsrunner/testsrunners/BoostTestCase.java index 9527732d6c7..000ef5aaaa4 100644 --- a/testsrunner/org.eclipse.cdt.testsrunner.tests/src/org/eclipse/cdt/testsrunner/testsrunners/BoostTestCase.java +++ b/testsrunner/org.eclipse.cdt.testsrunner.tests/src/org/eclipse/cdt/testsrunner/testsrunners/BoostTestCase.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011, 2013 Anton Gorenkov and others. + * Copyright (c) 2011, 2023 Anton Gorenkov and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -507,4 +507,136 @@ public void testParameterizedTests() { mockModelUpdater.exitTestCase(); mockModelUpdater.exitTestSuite(); } + + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + // + public void testWithContextTests() { + mockModelUpdater.skipCalls("setTestStatus"); + + mockModelUpdater.enterTestSuite("MainTS"); + mockModelUpdater.enterTestCase("single-context [context 1 message here]"); + mockModelUpdater.addTestMessage("file1.cpp", 1, ITestMessage.Level.Info, "Context: context 1 message here"); + mockModelUpdater.exitTestCase(); + mockModelUpdater.enterTestCase("single-context-and-info-message [context 2 message here]"); + mockModelUpdater.addTestMessage("file2.cpp", 2, ITestMessage.Level.Info, + "info 2 message here\nContext: context 2 message here"); + mockModelUpdater.exitTestCase(); + + // I am not convinced the handling of this is correct, there is an assumption in the code that the first + // context seen in an info (or error/warning/etc) message is the one to display next to the test case + // name. This works if all the info messages have the same context, but is that an oversimplification? + // See https://github.com/eclipse-cdt/cdt/issues/459#issuecomment-1677589998 + mockModelUpdater.enterTestCase("multi-context [context 3a message here]"); + mockModelUpdater.addTestMessage("file3.cpp", 1, ITestMessage.Level.Info, "Context: context 3a message here"); + mockModelUpdater.addTestMessage("file3.cpp", 2, ITestMessage.Level.Info, "Context: context 3b message here"); + mockModelUpdater.exitTestCase(); + + mockModelUpdater.enterTestCase("error-message [context 4 message here]"); + mockModelUpdater.addTestMessage("file4.cpp", 1, ITestMessage.Level.Error, + "error 4 message here\nContext: context 4 message here"); + mockModelUpdater.exitTestCase(); + + // These tests make sure there is no off-by-one error when shortening context strings + mockModelUpdater.enterTestCase("off-by-one-check-a [very very very long context off-by-one-check 01234...]"); + mockModelUpdater.addTestMessage("off-by-one.cpp", 1, ITestMessage.Level.Error, + "Context: very very very long context off-by-one-check 01234567890"); + mockModelUpdater.exitTestCase(); + mockModelUpdater.enterTestCase("off-by-one-check-b [very very very long context off-by-one-check 01234...]"); + mockModelUpdater.addTestMessage("off-by-one.cpp", 1, ITestMessage.Level.Error, + "Context: very very very long context off-by-one-check 012345"); + mockModelUpdater.exitTestCase(); + mockModelUpdater.enterTestCase("off-by-one-check-c [very very very long context off-by-one-check 01234]"); + mockModelUpdater.addTestMessage("off-by-one.cpp", 1, ITestMessage.Level.Error, + "Context: very very very long context off-by-one-check 01234"); + mockModelUpdater.exitTestCase(); + mockModelUpdater.enterTestCase("off-by-one-check-d [very very very long context off-by-one-check 0123]"); + mockModelUpdater.addTestMessage("off-by-one.cpp", 1, ITestMessage.Level.Error, + "Context: very very very long context off-by-one-check 0123"); + mockModelUpdater.exitTestCase(); + + mockModelUpdater.exitTestSuite(); + } }