// Copyright 2016 The Bazel Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.testing.junit.runner; import com.google.testing.junit.runner.internal.SignalHandlers; import com.google.testing.junit.runner.internal.SignalHandlersFactory; import com.google.testing.junit.runner.junit4.CancellableRequestFactoryFactory; import com.google.testing.junit.runner.junit4.CurrentRunningTestFactory; import com.google.testing.junit.runner.junit4.JUnit4ConfigFactory; import com.google.testing.junit.runner.junit4.JUnit4InstanceModules; import com.google.testing.junit.runner.junit4.JUnit4OptionsFactory; import com.google.testing.junit.runner.junit4.JUnit4Runner; import com.google.testing.junit.runner.junit4.JUnit4RunnerFactory; import com.google.testing.junit.runner.junit4.JUnit4RunnerModule; import com.google.testing.junit.runner.junit4.JUnit4TestModelBuilderFactory; import com.google.testing.junit.runner.junit4.JUnit4TestNameListenerFactory; import com.google.testing.junit.runner.junit4.JUnit4TestStackTraceListenerFactory; import com.google.testing.junit.runner.junit4.JUnit4TestXmlListenerFactory; import com.google.testing.junit.runner.junit4.NameListenerFactory; import com.google.testing.junit.runner.junit4.ProvideTextListenerFactory; import com.google.testing.junit.runner.junit4.ProvideXmlStreamFactory; import com.google.testing.junit.runner.junit4.RequestFactory; import com.google.testing.junit.runner.junit4.ShardingFilterFactoryFactory; import com.google.testing.junit.runner.junit4.SignalHandlerInstallerFactory; import com.google.testing.junit.runner.junit4.StackTraceListenerFactory; import com.google.testing.junit.runner.junit4.TestSuiteModelSupplierFactory; import com.google.testing.junit.runner.junit4.TextListenerFactory; import com.google.testing.junit.runner.junit4.TickerFactory; import com.google.testing.junit.runner.junit4.TopLevelSuiteFactory; import com.google.testing.junit.runner.junit4.TopLevelSuiteNameFactory; import com.google.testing.junit.runner.junit4.XmlListenerFactory; import com.google.testing.junit.runner.model.AntXmlResultWriterFactory; import com.google.testing.junit.runner.model.TestSuiteModel; import com.google.testing.junit.runner.model.TestSuiteModelBuilderFactory; import com.google.testing.junit.runner.model.XmlResultWriter; import com.google.testing.junit.runner.sharding.ShardingEnvironmentFactory; import com.google.testing.junit.runner.sharding.ShardingFilters; import com.google.testing.junit.runner.sharding.ShardingFiltersFactory; import com.google.testing.junit.runner.util.MemoizingSupplier; import com.google.testing.junit.runner.util.SetFactory; import com.google.testing.junit.runner.util.Supplier; import java.io.OutputStream; import java.io.PrintStream; import java.util.Set; import org.junit.internal.TextListener; import org.junit.runner.Request; import org.junit.runner.notification.RunListener; /** * Utility class to create a JUnit4Runner instance from a {@link Builder}. All required * dependencies are being injected automatically. */ public final class JUnit4Bazel { private Supplier<Class<?>> topLevelSuiteSupplier; private Supplier<Request> requestMemoizingSupplier; @SuppressWarnings("rawtypes") private Supplier cancellableRequestFactorySupplier; private Supplier<String> topLevelSuiteNameSupplier; private Supplier<ShardingFilters> shardingFiltersSupplier; private Supplier<XmlResultWriter> resultWriterSupplier; private Supplier<TestSuiteModel.Builder> builderSupplier; @SuppressWarnings("rawtypes") private Supplier jUnit4TestModelBuilderMemoizingSupplier; private Supplier<Supplier<TestSuiteModel>> provideTestSuiteModelSupplierMemoizingSupplier; private Supplier<PrintStream> stdoutStreamMemoizingSupplier; @SuppressWarnings("rawtypes") private Supplier optionsMemoizingSupplier; @SuppressWarnings("rawtypes") private Supplier configMemoizingSupplier; private Supplier<SignalHandlers> signalHandlersSupplier; private Supplier<PrintStream> stderrStreamMemoizingSupplier; @SuppressWarnings("rawtypes") private Supplier jUnit4TestStackTraceListenerMemoizingSupplier; private Supplier<RunListener> stackTraceListenerSupplier; private Supplier<OutputStream> provideXmlStreamMemoizingSupplier; @SuppressWarnings("rawtypes") private Supplier jUnit4TestXmlListenerMemoizingSupplier; private Supplier<RunListener> xmlListenerSupplier; @SuppressWarnings("rawtypes") private Supplier provideCurrentRunningTestMemoizingSupplier; @SuppressWarnings("rawtypes") private Supplier jUnit4TestNameListenerMemoizingSupplier; private Supplier<RunListener> nameListenerSupplier; private Supplier<TextListener> provideTextListenerMemoizingSupplier; private Supplier<RunListener> textListenerSupplier; private Supplier<Set<RunListener>> setOfRunListenerProvider; private Supplier<JUnit4Runner> jUnit4RunnerProvider; private JUnit4Bazel(Builder builder) { assert builder != null; initialize(builder); } public static Builder builder() { return new Builder(); } @SuppressWarnings("unchecked") private void initialize(final Builder builder) { this.topLevelSuiteSupplier = TopLevelSuiteFactory.create(builder.suiteClass); this.requestMemoizingSupplier = new MemoizingSupplier<>(RequestFactory.create(topLevelSuiteSupplier)); this.cancellableRequestFactorySupplier = new MemoizingSupplier<>(CancellableRequestFactoryFactory.create()); this.topLevelSuiteNameSupplier = TopLevelSuiteNameFactory.create(topLevelSuiteSupplier); this.shardingFiltersSupplier = ShardingFiltersFactory.create( ShardingEnvironmentFactory.create(), ShardingFilterFactoryFactory.create()); this.resultWriterSupplier = ResultWriterFactory.create(AntXmlResultWriterFactory.create()); this.builderSupplier = TestSuiteModelBuilderFactory.create( TickerFactory.create(), shardingFiltersSupplier, ShardingEnvironmentFactory.create(), resultWriterSupplier); this.jUnit4TestModelBuilderMemoizingSupplier = new MemoizingSupplier<>(JUnit4TestModelBuilderFactory.create( requestMemoizingSupplier, topLevelSuiteNameSupplier, builderSupplier)); this.provideTestSuiteModelSupplierMemoizingSupplier = new MemoizingSupplier<Supplier<TestSuiteModel>>( TestSuiteModelSupplierFactory.create(jUnit4TestModelBuilderMemoizingSupplier)); this.stdoutStreamMemoizingSupplier = new MemoizingSupplier<>(StdoutStreamFactory.create()); this.optionsMemoizingSupplier = new MemoizingSupplier<>(JUnit4OptionsFactory.create(builder.config)); this.configMemoizingSupplier = new MemoizingSupplier<Object>(JUnit4ConfigFactory.create(optionsMemoizingSupplier)); this.signalHandlersSupplier = SignalHandlersFactory.create(SignalHandlerInstallerFactory.create()); this.stderrStreamMemoizingSupplier = new MemoizingSupplier<>(StderrStreamFactory.create()); this.jUnit4TestStackTraceListenerMemoizingSupplier = new MemoizingSupplier<>(JUnit4TestStackTraceListenerFactory.create( signalHandlersSupplier, stderrStreamMemoizingSupplier)); this.stackTraceListenerSupplier = StackTraceListenerFactory.create(jUnit4TestStackTraceListenerMemoizingSupplier); this.provideXmlStreamMemoizingSupplier = new MemoizingSupplier<OutputStream>( ProvideXmlStreamFactory.create(configMemoizingSupplier)); this.jUnit4TestXmlListenerMemoizingSupplier = new MemoizingSupplier<Object>(JUnit4TestXmlListenerFactory.create( provideTestSuiteModelSupplierMemoizingSupplier, cancellableRequestFactorySupplier, signalHandlersSupplier, provideXmlStreamMemoizingSupplier, stderrStreamMemoizingSupplier)); this.xmlListenerSupplier = XmlListenerFactory.create(jUnit4TestXmlListenerMemoizingSupplier); this.provideCurrentRunningTestMemoizingSupplier = new MemoizingSupplier<>(CurrentRunningTestFactory.create(builder.jUnit4RunnerModule)); this.jUnit4TestNameListenerMemoizingSupplier = new MemoizingSupplier<Object>( JUnit4TestNameListenerFactory.create(provideCurrentRunningTestMemoizingSupplier)); this.nameListenerSupplier = NameListenerFactory.create(jUnit4TestNameListenerMemoizingSupplier); this.provideTextListenerMemoizingSupplier = new MemoizingSupplier<>(ProvideTextListenerFactory.create(stdoutStreamMemoizingSupplier)); this.textListenerSupplier = TextListenerFactory.create(provideTextListenerMemoizingSupplier); this.setOfRunListenerProvider = SetFactory.<RunListener>builder(4, 0) .addSupplier(stackTraceListenerSupplier) .addSupplier(xmlListenerSupplier) .addSupplier(nameListenerSupplier) .addSupplier(textListenerSupplier) .build(); this.jUnit4RunnerProvider = JUnit4RunnerFactory.create( requestMemoizingSupplier, cancellableRequestFactorySupplier, provideTestSuiteModelSupplierMemoizingSupplier, stdoutStreamMemoizingSupplier, configMemoizingSupplier, setOfRunListenerProvider, SetFactory.<JUnit4Runner.Initializer>empty()); } public JUnit4Runner runner() { return jUnit4RunnerProvider.get(); } /** * A builder for instantiating {@link JUnit4Bazel}. */ public static final class Builder { private JUnit4InstanceModules.SuiteClass suiteClass; private JUnit4InstanceModules.Config config; private JUnit4RunnerModule jUnit4RunnerModule; private Builder() {} public JUnit4Bazel build() { if (suiteClass == null) { throw new IllegalStateException( JUnit4InstanceModules.SuiteClass.class.getCanonicalName() + " must be set"); } if (config == null) { throw new IllegalStateException( JUnit4InstanceModules.Config.class.getCanonicalName() + " must be set"); } if (jUnit4RunnerModule == null) { this.jUnit4RunnerModule = new JUnit4RunnerModule(); } return new JUnit4Bazel(this); } public Builder jUnit4RunnerModule(JUnit4RunnerModule jUnit4RunnerModule) { this.jUnit4RunnerModule = checkNotNull(jUnit4RunnerModule); return this; } public Builder suiteClass(JUnit4InstanceModules.SuiteClass suiteClass) { this.suiteClass = checkNotNull(suiteClass); return this; } public Builder config(JUnit4InstanceModules.Config config) { this.config = checkNotNull(config); return this; } } private static <T> T checkNotNull(T reference) { if (reference == null) { throw new NullPointerException(); } return reference; } }