All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.testng.Reporter Maven / Gradle / Ivy

package org.testng;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.testng.collections.Lists;
import org.testng.collections.Maps;
import org.testng.util.Strings;

/**
 * This class is used for test methods to log messages that will be
 * included in the HTML reports generated by TestNG.
 * 
*
* Implementation details. *
*
* The reporter keeps a combined output of strings (in m_output) and also * a record of which method output which line. In order to do this, callers * specify what the current method is with setCurrentTestResult() and the * Reporter maintains a mapping of each test result with a list of integers. * These integers are indices in the combined output (avoids duplicating * the output). * * Created on Nov 2, 2005 * @author cbeust */ public class Reporter { // when tests are run in parallel, each thread may be working with different // 'current test result'. Also, this value should be inherited if the test code // spawns its own thread. private static ThreadLocal m_currentTestResult = new InheritableThreadLocal<>(); /** * All output logged in a sequential order. */ private static List m_output = new Vector<>(); /** The key is the hashCode of the ITestResult */ private static Map> m_methodOutputMap = Maps.newHashMap(); private static boolean m_escapeHtml = false; //This variable is responsible for persisting all output that is yet to be associated with any //valid TestResult objects. private static ThreadLocal> m_orphanedOutput = new InheritableThreadLocal<>(); public static void setCurrentTestResult(ITestResult m) { m_currentTestResult.set(m); } public static List getOutput() { return m_output; } /** * Erase the content of all the output generated so far. */ public static void clear() { m_methodOutputMap.clear(); m_output.clear(); } /** * @return If true, use HTML entities for special HTML characters (<, >, &, ...). */ public static boolean getEscapeHtml() { return m_escapeHtml; } /** * @param escapeHtml If true, use HTML entities for special HTML characters (<, >, &, ...). */ public static void setEscapeHtml(boolean escapeHtml) { m_escapeHtml = escapeHtml; } private static synchronized void log(String s, ITestResult m) { // Escape for the HTML reports if (m_escapeHtml) { s = Strings.escapeHtml(s); } if (m == null) { //Persist the output temporarily into a Threadlocal String list. if (m_orphanedOutput.get() == null) { m_orphanedOutput.set(new ArrayList()); } m_orphanedOutput.get().add(s); return; } // synchronization needed to ensure the line number and m_output are updated atomically int n = getOutput().size(); List lines = m_methodOutputMap.get(m.hashCode()); if (lines == null) { lines = Lists.newArrayList(); m_methodOutputMap.put(m.hashCode(), lines); } // Check if there was already some orphaned output for the current thread. if (m_orphanedOutput.get() != null) { n = n + m_orphanedOutput.get().size(); getOutput().addAll(m_orphanedOutput.get()); // Since we have already added all of the orphaned output to the current // TestResult, lets clear it off m_orphanedOutput.remove(); } lines.add(n); getOutput().add(s); } /** * Log the passed string to the HTML reports * @param s The message to log */ public static void log(String s) { log(s, getCurrentTestResult()); } /** * Log the passed string to the HTML reports if the current verbosity * is equal or greater than the one passed in parameter. If logToStandardOut * is true, the string will also be printed on standard out. * * @param s The message to log * @param level The verbosity of this message * @param logToStandardOut Whether to print this string on standard * out too */ public static void log(String s, int level, boolean logToStandardOut) { if (TestRunner.getVerbose() >= level) { log(s, getCurrentTestResult()); if (logToStandardOut) { System.out.println(s); } } } /** * Log the passed string to the HTML reports. If logToStandardOut * is true, the string will also be printed on standard out. * * @param s The message to log * @param logToStandardOut Whether to print this string on standard * out too */ public static void log(String s, boolean logToStandardOut) { log(s, getCurrentTestResult()); if (logToStandardOut) { System.out.println(s); } } /** * Log the passed string to the HTML reports if the current verbosity * is equal or greater than the one passed in parameter * * @param s The message to log * @param level The verbosity of this message */ public static void log(String s, int level) { if (TestRunner.getVerbose() >= level) { log(s, getCurrentTestResult()); } } /** * @return the current test result. */ public static ITestResult getCurrentTestResult() { return m_currentTestResult.get(); } public static synchronized List getOutput(ITestResult tr) { List result = Lists.newArrayList(); if (tr == null) { //guard against a possible NPE in scenarios wherein the test result object itself could be a null value. return result; } List lines = m_methodOutputMap.get(tr.hashCode()); if (lines != null) { for (Integer n : lines) { result.add(getOutput().get(n)); } } return result; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy