1a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmannpackage org.testng.reporters;
224312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
324312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmannimport java.lang.reflect.Method;
424312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmannimport java.util.List;
5a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmannimport org.testng.ITestContext;
6a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmannimport org.testng.ITestNGMethod;
7a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmannimport org.testng.ITestResult;
8a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmannimport org.testng.TestListenerAdapter;
924312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmannimport org.testng.internal.Utils;
1024312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
1124312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann/**
1232169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann * Reporter printing out detailed messages about what TestNG
1332169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann * is going to run and what is the status of what has been just run.
1432169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann *
1532169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann * To see messages from this reporter, either run Ant in verbose mode ('ant -v')
1632169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann * or set verbose level to 5 or higher
1724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann *
1824312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann * @author Lukas Jungmann
1932169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann * @since 6.4
2024312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann */
21a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmannpublic class VerboseReporter extends TestListenerAdapter {
2224312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
2332169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann    /**
2432169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     * Default prefix for messages printed out by this reporter
2532169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     *
2632169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     */
27a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmann    public static final String LISTENER_PREFIX = "[VerboseTestNG] ";
28c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann    private String suiteName;
29a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmann    private final String prefix;
3024312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
31c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann    private enum Status {
32c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann
33c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        SUCCESS(ITestResult.SUCCESS), FAILURE(ITestResult.FAILURE), SKIP(ITestResult.SKIP),
34c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        SUCCESS_PERCENTAGE_FAILURE(ITestResult.SUCCESS_PERCENTAGE_FAILURE), STARTED(ITestResult.STARTED);
35c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        private int status;
36c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann
37c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        private Status(int i) {
38c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            status = i;
39c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        }
40c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann    }
41c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann
4232169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann    /**
4332169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     * Default constructor
4432169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     */
45a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmann    public VerboseReporter() {
46a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmann        this(LISTENER_PREFIX);
4724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    }
48a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmann
4932169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann    /**
5032169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     * Create VerboseReporter with custom prefix
5132169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     *
5232169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     * @param prefix prefix for messages printed out by this reporter
5332169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     */
54a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmann    public VerboseReporter(String prefix) {
55c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        this.prefix = prefix;
56a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmann    }
57a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmann
5824312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    @Override
5924312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    public void beforeConfiguration(ITestResult tr) {
6024312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        super.beforeConfiguration(tr);
61c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        logTestResult(Status.STARTED, tr, true);
6224312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    }
6324312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
6424312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    @Override
6524312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    public void onConfigurationFailure(ITestResult tr) {
6624312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        super.onConfigurationFailure(tr);
67c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        logTestResult(Status.FAILURE, tr, true);
6824312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    }
6924312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
7024312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    @Override
7124312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    public void onConfigurationSkip(ITestResult tr) {
7224312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        super.onConfigurationSkip(tr);
73c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        logTestResult(Status.SKIP, tr, true);
7424312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    }
7524312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
7624312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    @Override
7724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    public void onConfigurationSuccess(ITestResult tr) {
7824312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        super.onConfigurationSuccess(tr);
79c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        logTestResult(Status.SUCCESS, tr, true);
80c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann    }
81c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann
82c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann    @Override
83c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann    public void onTestStart(ITestResult tr) {
84c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        logTestResult(Status.STARTED, tr, false);
8524312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    }
8624312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
8724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    @Override
8824312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    public void onTestFailure(ITestResult tr) {
8924312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        super.onTestFailure(tr);
90c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        logTestResult(Status.FAILURE, tr, false);
9124312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    }
9224312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
9324312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    @Override
9424312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    public void onTestFailedButWithinSuccessPercentage(ITestResult tr) {
9524312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        super.onTestFailedButWithinSuccessPercentage(tr);
96c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        logTestResult(Status.SUCCESS_PERCENTAGE_FAILURE, tr, false);
9724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    }
9824312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
9924312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    @Override
10024312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    public void onTestSkipped(ITestResult tr) {
10124312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        super.onTestSkipped(tr);
102c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        logTestResult(Status.SKIP, tr, false);
10324312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    }
10424312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
10524312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    @Override
10624312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    public void onTestSuccess(ITestResult tr) {
10724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        super.onTestSuccess(tr);
108c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        logTestResult(Status.SUCCESS, tr, false);
10924312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    }
11024312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
11124312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    @Override
11224312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    public void onStart(ITestContext ctx) {
113c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        suiteName = ctx.getName();//ctx.getSuite().getXmlSuite().getFileName();
114c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        log("RUNNING: Suite: \"" + suiteName + "\" containing \"" + ctx.getAllTestMethods().length + "\" Tests (config: " + ctx.getSuite().getXmlSuite().getFileName() + ")");
11524312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    }
11624312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
11724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    @Override
11824312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    public void onFinish(ITestContext context) {
11924312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        logResults();
120c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        suiteName = null;
12124312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    }
12224312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
12324312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    private ITestNGMethod[] resultsToMethods(List<ITestResult> results) {
12424312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        ITestNGMethod[] result = new ITestNGMethod[results.size()];
12524312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        int i = 0;
12624312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        for (ITestResult tr : results) {
12724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            result[i++] = tr.getMethod();
12824312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        }
12924312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        return result;
13024312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    }
13124312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
13232169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann    /**
13332169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     * Print out test summary
13432169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     */
13524312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    private void logResults() {
13624312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        //
13724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        // Log test summary
13824312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        //
13924312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        ITestNGMethod[] ft = resultsToMethods(getFailedTests());
140c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        StringBuilder sb = new StringBuilder("\n===============================================\n");
141c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        sb.append("    ").append(suiteName).append("\n");
142c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        sb.append("    Tests run: ").append(Utils.calculateInvokedMethodCount(getAllTestMethods()));
143c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        sb.append(", Failures: ").append(Utils.calculateInvokedMethodCount(ft));
144c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        sb.append(", Skips: ").append(Utils.calculateInvokedMethodCount(resultsToMethods(getSkippedTests())));
14524312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        int confFailures = getConfigurationFailures().size();
14624312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        int confSkips = getConfigurationSkips().size();
147c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        if (confFailures > 0 || confSkips > 0) {
148c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            sb.append("\n").append("    Configuration Failures: ").append(confFailures);
149c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            sb.append(", Skips: ").append(confSkips);
15024312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        }
151c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        sb.append("\n===============================================");
152c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        log(sb.toString());
15324312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    }
15424312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
15532169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann    /**
15632169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     * Log meaningful message for passed in arguments.
15732169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     * Message itself is of form:
158e0d2dfbe16cc13a1139df6e19c16a4e211513fa9Lukas Jungmann     * $status: "$suiteName" - $methodDeclaration ($actualArguments) finished in $x ms ($run of $totalRuns)
15932169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     *
16032169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     * @param st status of passed in itr
16132169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     * @param itr test result to be described
16232169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     * @param isConfMethod is itr describing configuration method
16332169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     */
164c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann    private void logTestResult(Status st, ITestResult itr, boolean isConfMethod) {
165c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        StringBuilder sb = new StringBuilder();
166b05395c5744539818ac569fa7b438f209dbfdaebLukas Jungmann        StringBuilder succRate = null;
167c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        String stackTrace = "";
168c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        switch (st) {
169c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            case STARTED:
170c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                sb.append("INVOKING");
171c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                break;
172c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            case SKIP:
173c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                sb.append("SKIPPED");
174c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                stackTrace = itr.getThrowable() != null
175c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                        ? Utils.stackTrace(itr.getThrowable(), false)[0] : "";
176c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                break;
177c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            case FAILURE:
178c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                sb.append("FAILED");
179c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                stackTrace = itr.getThrowable() != null
180c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                        ? Utils.stackTrace(itr.getThrowable(), false)[0] : "";
181c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                break;
182c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            case SUCCESS:
183c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                sb.append("PASSED");
184c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                break;
185c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            case SUCCESS_PERCENTAGE_FAILURE:
186c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                sb.append("PASSED with failures");
187c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                break;
188c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            default:
189c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                //not happen
190c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                throw new RuntimeException("Unsupported test status:" + itr.getStatus());
191c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        }
192c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        if (isConfMethod) {
193c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            sb.append(" CONFIGURATION: ");
194c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        } else {
195c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            sb.append(": ");
196c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        }
197c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        ITestNGMethod tm = itr.getMethod();
198c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        int identLevel = sb.length();
199c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        sb.append(getMethodDeclaration(tm));
200c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        Object[] params = itr.getParameters();
201c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        Class[] paramTypes = tm.getMethod().getParameterTypes();
20224312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        if (null != params && params.length > 0) {
20324312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            // The error might be a data provider parameter mismatch, so make
20424312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            // a special case here
20524312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            if (params.length != paramTypes.length) {
206c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                sb.append("Wrong number of arguments were passed by the Data Provider: found ");
207c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                sb.append(params.length);
208c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                sb.append(" but expected ");
209c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                sb.append(paramTypes.length);
21024312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            } else {
211c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                sb.append("(value(s): ");
21224312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann                for (int i = 0; i < params.length; i++) {
21324312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann                    if (i > 0) {
214c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                        sb.append(", ");
21524312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann                    }
216c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                    sb.append(Utils.toString(params[i], paramTypes[i]));
21724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann                }
218c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                sb.append(")");
219c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann
22024312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            }
22124312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        }
222c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        if (Status.STARTED != st) {
223c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            sb.append(" finished in ");
224c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            sb.append(itr.getEndMillis() - itr.getStartMillis());
225c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            sb.append(" ms");
226c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            if (!Utils.isStringEmpty(tm.getDescription())) {
227c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                sb.append("\n");
228c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                for (int i = 0; i < identLevel; i++) {
229c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                    sb.append(" ");
230c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                }
231c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                sb.append(tm.getDescription());
232c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            }
233e0d2dfbe16cc13a1139df6e19c16a4e211513fa9Lukas Jungmann            if (tm.getInvocationCount() > 1) {
234e0d2dfbe16cc13a1139df6e19c16a4e211513fa9Lukas Jungmann                sb.append(" (");
235e0d2dfbe16cc13a1139df6e19c16a4e211513fa9Lukas Jungmann                sb.append(tm.getCurrentInvocationCount());
236e0d2dfbe16cc13a1139df6e19c16a4e211513fa9Lukas Jungmann                sb.append(" of ");
237e0d2dfbe16cc13a1139df6e19c16a4e211513fa9Lukas Jungmann                sb.append(tm.getInvocationCount());
238e0d2dfbe16cc13a1139df6e19c16a4e211513fa9Lukas Jungmann                sb.append(")");
239e0d2dfbe16cc13a1139df6e19c16a4e211513fa9Lukas Jungmann            }
240c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            if (!Utils.isStringEmpty(stackTrace)) {
241c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann                sb.append("\n").append(stackTrace.substring(0, stackTrace.lastIndexOf(System.getProperty("line.separator"))));
24224312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            }
243b05395c5744539818ac569fa7b438f209dbfdaebLukas Jungmann        } else {
244b05395c5744539818ac569fa7b438f209dbfdaebLukas Jungmann            if (!isConfMethod && tm.getInvocationCount() > 1) {
245b05395c5744539818ac569fa7b438f209dbfdaebLukas Jungmann                sb.append(" success: ");
246b05395c5744539818ac569fa7b438f209dbfdaebLukas Jungmann                sb.append(tm.getSuccessPercentage());
247b05395c5744539818ac569fa7b438f209dbfdaebLukas Jungmann                sb.append("%");
248b05395c5744539818ac569fa7b438f209dbfdaebLukas Jungmann            }
24924312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        }
250c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        log(sb.toString());
251c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann    }
252c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann
25354ab70124a3db497736dd1c6297e9eebea9b4313Aled Sage    protected void log(String message) {
254c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        //prefix all output lines
255c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        System.out.println(message.replaceAll("(?m)^", prefix));
25624312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    }
25724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann
25832169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann    /**
25932169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     *
26032169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     * @param method method to be described
26132169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     * @return FQN of a class + method declaration for a method passed in
26232169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     *      ie. test.triangle.CheckCount.testCheckCount(java.lang.String)
26332169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann     */
264c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann    private String getMethodDeclaration(ITestNGMethod method) {
26532169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann        //see Utils.detailedMethodName
26632169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann        //perhaps should rather adopt the original method instead
26724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        Method m = method.getMethod();
268c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        StringBuilder buf = new StringBuilder();
26924312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        buf.append("\"");
270c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        if (suiteName != null) {
271c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann            buf.append(suiteName);
27224312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        } else {
27324312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            buf.append("UNKNOWN");
27424312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        }
27524312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        buf.append("\"");
27624312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        buf.append(" - ");
27724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        if (method.isBeforeSuiteConfiguration()) {
27824312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            buf.append("@BeforeSuite ");
27924312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        } else if (method.isBeforeTestConfiguration()) {
28024312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            buf.append("@BeforeTest ");
28124312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        } else if (method.isBeforeClassConfiguration()) {
28224312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            buf.append("@BeforeClass ");
28324312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        } else if (method.isBeforeGroupsConfiguration()) {
28424312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            buf.append("@BeforeGroups ");
28524312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        } else if (method.isBeforeMethodConfiguration()) {
28624312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            buf.append("@BeforeMethod ");
287c7bdf7d8ae1501bbca7ccaf882365b0ca53347a9Lukas Jungmann        } else if (method.isAfterMethodConfiguration()) {
28824312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            buf.append("@AfterMethod ");
289c7bdf7d8ae1501bbca7ccaf882365b0ca53347a9Lukas Jungmann        } else if (method.isAfterGroupsConfiguration()) {
29024312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            buf.append("@AfterGroups ");
291c7bdf7d8ae1501bbca7ccaf882365b0ca53347a9Lukas Jungmann        } else if (method.isAfterClassConfiguration()) {
29224312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            buf.append("@AfterClass ");
293c7bdf7d8ae1501bbca7ccaf882365b0ca53347a9Lukas Jungmann        } else if (method.isAfterTestConfiguration()) {
29424312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            buf.append("@AfterTest ");
295c7bdf7d8ae1501bbca7ccaf882365b0ca53347a9Lukas Jungmann        } else if (method.isAfterSuiteConfiguration()) {
29624312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            buf.append("@AfterSuite ");
29724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        }
29824312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        buf.append(m.getDeclaringClass().getName());
29924312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        buf.append(".");
30024312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        buf.append(m.getName());
30124312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        buf.append("(");
30224312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        int i = 0;
30324312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        for (Class<?> p : m.getParameterTypes()) {
30424312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            if (i++ > 0) {
30524312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann                buf.append(", ");
30624312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            }
30724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann            buf.append(p.getName());
30824312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        }
30924312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann        buf.append(")");
310c659e13962ad03a3472a7b3bad10f0a7fda6386dLukas Jungmann        return buf.toString();
31124312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann    }
312a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmann
313a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmann    @Override
314a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmann    public String toString() {
31532169c3847739ff9e68b7e4a7ff41d3a3114663aLukas Jungmann        return "VerboseReporter{" + "suiteName=" + suiteName + '}';
316a7726191c419ea3086e36cf69207117c5a616e63Lukas Jungmann    }
31724312cd57c31ecc959bd9990a71c45885410b4d4Lukas Jungmann}
318