blob: 5fc4bf9f39d03b51dbafe428e2ac4a5444ec7940 [file] [log] [blame]
// Copyright 2010 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.junit4;
import static com.google.common.truth.Truth.assertThat;
import static com.google.testing.junit.runner.sharding.ShardingFilters.DEFAULT_SHARDING_STRATEGY;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import com.google.common.collect.Iterables;
import com.google.testing.junit.runner.model.AntXmlResultWriter;
import com.google.testing.junit.runner.model.TestNode;
import com.google.testing.junit.runner.model.TestSuiteModel;
import com.google.testing.junit.runner.model.XmlResultWriter;
import com.google.testing.junit.runner.sharding.ShardingEnvironment;
import com.google.testing.junit.runner.sharding.ShardingFilters;
import com.google.testing.junit.runner.sharding.testing.StubShardingEnvironment;
import com.google.testing.junit.runner.util.FakeTestClock;
import com.google.testing.junit.runner.util.TestClock;
import java.util.List;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.Description;
import org.junit.runner.Request;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
/**
* Tests for {@code JUnit4TestModelBuilder}
*/
@RunWith(JUnit4.class)
public class JUnit4TestModelBuilderTest {
private final TestClock fakeTestClock = new FakeTestClock();
private final ShardingEnvironment stubShardingEnvironment = new StubShardingEnvironment();
private final XmlResultWriter xmlResultWriter = new AntXmlResultWriter();
private JUnit4TestModelBuilder builder(Request request, String suiteName,
ShardingEnvironment shardingEnvironment, ShardingFilters shardingFilters,
XmlResultWriter xmlResultWriter) {
return new JUnit4TestModelBuilder(
request,
suiteName,
new TestSuiteModel.Builder(
fakeTestClock, shardingFilters, shardingEnvironment, xmlResultWriter));
}
@Test
public void testTouchesShardFileWhenShardingEnabled() {
Class<?> testClass = SampleTestCaseWithTwoTests.class;
Request request = Request.classWithoutSuiteMethod(testClass);
ShardingEnvironment mockShardingEnvironment = mock(ShardingEnvironment.class);
ShardingFilters shardingFilters = new ShardingFilters(
mockShardingEnvironment, DEFAULT_SHARDING_STRATEGY);
JUnit4TestModelBuilder modelBuilder = builder(
request, testClass.getCanonicalName(), mockShardingEnvironment, shardingFilters,
xmlResultWriter);
when(mockShardingEnvironment.isShardingEnabled()).thenReturn(true);
when(mockShardingEnvironment.getTotalShards()).thenReturn(2);
modelBuilder.get();
verify(mockShardingEnvironment).touchShardFile();
}
@Test
public void testDoesNotTouchShardFileWhenShardingDisabled() {
Class<?> testClass = SampleTestCaseWithTwoTests.class;
Request request = Request.classWithoutSuiteMethod(testClass);
ShardingEnvironment mockShardingEnvironment = mock(ShardingEnvironment.class);
ShardingFilters shardingFilters = new ShardingFilters(
mockShardingEnvironment, DEFAULT_SHARDING_STRATEGY);
JUnit4TestModelBuilder modelBuilder = builder(
request, testClass.getCanonicalName(), mockShardingEnvironment, shardingFilters,
xmlResultWriter);
when(mockShardingEnvironment.isShardingEnabled()).thenReturn(false);
modelBuilder.get();
verify(mockShardingEnvironment, never()).touchShardFile();
}
@Test
public void testCreateModel_topLevelIgnore() throws Exception {
Class<?> testClass = SampleTestCaseWithTopLevelIgnore.class;
Request request = Request.classWithoutSuiteMethod(testClass);
String testClassName = testClass.getCanonicalName();
JUnit4TestModelBuilder modelBuilder =
builder(request, testClassName, stubShardingEnvironment, null, xmlResultWriter);
TestSuiteModel testSuiteModel = modelBuilder.get();
assertThat(testSuiteModel.getNumTestCases()).isEqualTo(0);
}
@Test
public void testCreateModel_singleTestClass() throws Exception {
Class<?> testClass = SampleTestCaseWithTwoTests.class;
Request request = Request.classWithoutSuiteMethod(testClass);
String testClassName = testClass.getCanonicalName();
JUnit4TestModelBuilder modelBuilder = builder(
request, testClassName, stubShardingEnvironment, null, xmlResultWriter);
Description suite = request.getRunner().getDescription();
Description testOne = suite.getChildren().get(0);
Description testTwo = suite.getChildren().get(1);
TestSuiteModel model = modelBuilder.get();
TestNode suiteNode = Iterables.getOnlyElement(model.getTopLevelTestSuites());
assertThat(suiteNode.getDescription()).isEqualTo(suite);
List<TestNode> testCases = suiteNode.getChildren();
assertThat(testCases).hasSize(2);
TestNode testOneNode = testCases.get(0);
TestNode testTwoNode = testCases.get(1);
assertThat(testOneNode.getDescription()).isEqualTo(testOne);
assertThat(testTwoNode.getDescription()).isEqualTo(testTwo);
assertThat(testOneNode.getChildren()).isEmpty();
assertThat(testTwoNode.getChildren()).isEmpty();
assertThat(model.getNumTestCases()).isEqualTo(2);
}
@Test
public void testCreateModel_simpleSuite() throws Exception {
Class<?> suiteClass = SampleSuite.class;
Request request = Request.classWithoutSuiteMethod(suiteClass);
String suiteClassName = suiteClass.getCanonicalName();
JUnit4TestModelBuilder modelBuilder = builder(
request, suiteClassName, stubShardingEnvironment, null, xmlResultWriter);
Description topSuite = request.getRunner().getDescription();
Description innerSuite = topSuite.getChildren().get(0);
Description testOne = innerSuite.getChildren().get(0);
TestSuiteModel model = modelBuilder.get();
TestNode topSuiteNode = Iterables.getOnlyElement(model.getTopLevelTestSuites());
assertThat(topSuiteNode.getDescription()).isEqualTo(topSuite);
TestNode innerSuiteNode = Iterables.getOnlyElement(topSuiteNode.getChildren());
assertThat(innerSuiteNode.getDescription()).isEqualTo(innerSuite);
TestNode testOneNode = Iterables.getOnlyElement(innerSuiteNode.getChildren());
assertThat(testOneNode.getDescription()).isEqualTo(testOne);
assertThat(testOneNode.getChildren()).isEmpty();
assertThat(model.getNumTestCases()).isEqualTo(1);
}
/** Sample test case with two tests. */
@RunWith(JUnit4.class)
public static class SampleTestCaseWithTwoTests {
@Test
public void testOne() {
}
@Test
public void testTwo() {
}
}
/** Sample test case with top level @Ignore */
@Ignore
@RunWith(JUnit4.class)
public static class SampleTestCaseWithTopLevelIgnore {
@Test
public void testOne() {}
@Test
public void testTwo() {}
}
/** Sample test case with one test. */
@RunWith(JUnit4.class)
public static class SampleTestCaseWithOneTest {
@Test
public void testOne() {
}
}
/** Sample suite with one test. */
@RunWith(Suite.class)
@SuiteClasses(SampleTestCaseWithOneTest.class)
public static class SampleSuite {
}
}