11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipackage org.chromium.testing.local;
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.junit.runner.Computer;
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.junit.runner.Description;
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.junit.runner.Runner;
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.junit.runner.manipulation.Filter;
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.junit.runner.manipulation.Filterable;
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.junit.runner.manipulation.NoTestsRemainException;
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.junit.runner.notification.RunNotifier;
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.junit.runners.model.InitializationError;
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.junit.runners.model.RunnerBuilder;
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/**
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *  A Computer that logs the start and end of test cases googletest-style.
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipublic class GtestComputer extends Computer {
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private final GtestLogger mLogger;
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public GtestComputer(GtestLogger logger) {
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mLogger = logger;
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *  A wrapping Runner that logs the start and end of each test case.
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    private class GtestSuiteRunner extends Runner implements Filterable {
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        private final Runner mRunner;
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        public GtestSuiteRunner(Runner contained) {
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            mRunner = contained;
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        public Description getDescription() {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            return mRunner.getDescription();
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        public void run(RunNotifier notifier) {
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            long startTimeMillis = System.currentTimeMillis();
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            mLogger.testCaseStarted(mRunner.getDescription(),
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    mRunner.getDescription().testCount());
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            mRunner.run(notifier);
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            mLogger.testCaseFinished(mRunner.getDescription(),
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    mRunner.getDescription().testCount(),
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    System.currentTimeMillis() - startTimeMillis);
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        public void filter(Filter filter) throws NoTestsRemainException {
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if (mRunner instanceof Filterable) {
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ((Filterable) mRunner).filter(filter);
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            }
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *  Returns a suite of unit tests with each class runner wrapped by a
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     *  GtestSuiteRunner.
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @Override
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public Runner getSuite(final RunnerBuilder builder, Class<?>[] classes)
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            throws InitializationError {
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return super.getSuite(
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                new RunnerBuilder() {
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    @Override
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    public Runner runnerForClass(Class<?> testClass) throws Throwable {
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        return new GtestSuiteRunner(builder.runnerForClass(testClass));
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    }
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                }, classes);
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
77