001package org.w3.ldp.testsuite.reporter;
002
003import java.util.Arrays;
004
005import org.apache.commons.lang3.text.WordUtils;
006import org.testng.ITestContext;
007import org.testng.ITestResult;
008import org.testng.TestListenerAdapter;
009import org.testng.internal.Utils;
010
011public class LdpTestListener extends TestListenerAdapter {
012
013        private static final String FAIL = "Failed";
014        private static final String SKIP = "Skipped";
015        private static final String PASSED = "Passed";
016
017        private long startTime;
018        private StringBuffer errors;
019
020        @Override
021        public void onStart(ITestContext testContext) {
022                startTime = System.currentTimeMillis();
023                errors = new StringBuffer();
024        }
025
026        @Override
027        public void onFinish(ITestContext testContext) {
028                long now = System.currentTimeMillis();
029                double timeInSeconds = (double) (now - startTime) / 1000;
030                System.out.printf("%nTotal Time: %.2fs%n", timeInSeconds);
031                
032                if (errors.length() != 0) {
033                        System.err.println(errors);
034                }
035        }
036
037        @Override
038        public void onTestFailure(ITestResult tr) {
039                log(tr, FAIL);
040                printErrorDetails(tr);
041        }
042
043        protected void printErrorDetails(ITestResult tr) {
044                errors.append("\n[FAILURE] ");
045                errors.append(tr.getTestClass().getRealClass().getSimpleName());
046                errors.append(".");
047                errors.append(tr.getName());
048                errors.append("\n");
049
050                String description = tr.getMethod().getDescription();
051                if (description != null) {
052                        errors.append("\n");
053                        errors.append(WordUtils.wrap(description, 78));
054                        errors.append("\n");
055                }
056
057                Throwable thrown = tr.getThrowable();
058                if (thrown != null) {
059                        errors.append("\n");
060                        errors.append(Utils.stackTrace(thrown, false)[0]);
061                        errors.append("\n");
062                }
063    }
064
065        @Override
066        public void onTestSkipped(ITestResult tr) {
067                log(tr, SKIP);
068        }
069
070        @Override
071        public void onTestSuccess(ITestResult tr) {
072                log(tr, PASSED);
073        }
074
075        private void log(ITestResult tr, String status) {
076                System.out.printf(
077                                "%-50s %-17s %-8s %-15s %8s%n",
078                                tr.getName(),
079                                tr.getTestClass().getRealClass().getSimpleName()
080                                                .replaceAll("Test", ""), status,
081                                Arrays.toString(tr.getMethod().getGroups()),
082                                (tr.getEndMillis() - tr.getStartMillis()) + "ms");
083        }
084}