// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.testing.local;

import org.junit.runner.Description;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener;

/** A json RunListener that creates a Json file with test run information.
 */
public class JsonListener extends RunListener {

    private final JsonLogger mJsonLogger;
    private long mTestStartTimeMillis;
    private boolean mCurrentTestPassed;

    public JsonListener(JsonLogger jsonLogger) {
        mJsonLogger = jsonLogger;
    }

    /** Called after all tests run. */
    @Override
    public void testRunFinished(Result r) throws Exception {
        for (Failure f : r.getFailures()) {
            Description d = f.getDescription();
            if (d.isTest()) continue; // Already handled by testFinished

            mJsonLogger.addTestResultInfo(d, "CRASH", 0);
        }
        mJsonLogger.writeJsonToFile();
    }

    /** Called when a test is about to start.
     */
    @Override
    public void testStarted(Description d) throws Exception {
        mCurrentTestPassed = true;
        mTestStartTimeMillis = System.currentTimeMillis();
    }

    /** Called when a test has just finished.
     */
    @Override
    public void testFinished(Description d) throws Exception {
        long testElapsedTimeMillis = System.currentTimeMillis() - mTestStartTimeMillis;
        mJsonLogger.addTestResultInfo(d, mCurrentTestPassed, testElapsedTimeMillis);
    }

    /** Called when a test fails.
     */
    @Override
    public void testFailure(Failure f) throws Exception {
        mCurrentTestPassed = false;
    }
}
