blob: 9310eb7314677a5cd297fafa9890e3d79dc66086 [file] [log] [blame]
// Copyright 2015 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.model;
import static com.google.common.truth.Truth.assertThat;
import static com.google.testing.junit.runner.model.TestInstantUtil.advance;
import static com.google.testing.junit.runner.model.TestInstantUtil.testInstant;
import com.google.testing.junit.runner.util.TestClock.TestInstant;
import java.time.Duration;
import java.time.Instant;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.Description;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Unit test for {@link TestCaseNode}.
*/
@RunWith(JUnit4.class)
public class TestCaseNodeTest {
private static final TestInstant NOW = testInstant(Instant.ofEpochMilli(1));
private static Description suite;
private static Description testCase;
@BeforeClass
public static void createDescriptions() {
suite = Description.createSuiteDescription(TestSuiteNode.class);
testCase = Description.createTestDescription(TestSuite.class, "testCase");
suite.addChild(testCase);
}
@Test
public void assertIsTestCase() {
assertThat(new TestCaseNode(testCase, new TestSuiteNode(suite)).isTestCase()).isTrue();
}
@Test
public void assertIsFilteredIfNeverPending() {
TestCaseNode testCaseNode = new TestCaseNode(testCase, new TestSuiteNode(suite));
assertStatusWithoutTiming(testCaseNode, TestResult.Status.FILTERED);
}
@Test
public void assertIsCancelledIfNotStarted() {
TestCaseNode testCaseNode = new TestCaseNode(testCase, new TestSuiteNode(suite));
testCaseNode.pending();
assertStatusWithoutTiming(testCaseNode, TestResult.Status.CANCELLED);
}
@Test
public void assertIsCancelledIfInterruptedBeforeStart() {
TestCaseNode testCaseNode = new TestCaseNode(testCase, new TestSuiteNode(suite));
testCaseNode.pending();
testCaseNode.testInterrupted(NOW);
assertStatusAndTiming(testCaseNode, TestResult.Status.CANCELLED, NOW, 0);
}
@Test
public void assertIsCompletedIfFailedBeforeStart() {
TestCaseNode testCaseNode = new TestCaseNode(testCase, new TestSuiteNode(suite));
testCaseNode.pending();
testCaseNode.testFailure(new Exception(), NOW);
assertStatusAndTiming(testCaseNode, TestResult.Status.COMPLETED, NOW, 0);
}
@Test
public void assertInterruptedIfStartedAndNotFinished() {
TestCaseNode testCaseNode = new TestCaseNode(testCase, new TestSuiteNode(suite));
testCaseNode.pending();
testCaseNode.started(NOW);
assertStatusAndTiming(testCaseNode, TestResult.Status.INTERRUPTED, NOW, 0);
// Notice: This is an unexpected ending state, as even interrupted test executions should go
// through the testCaseNode.interrupted() code path.
}
@Test
public void assertInterruptedIfStartedAndInterrupted() {
TestCaseNode testCaseNode = new TestCaseNode(testCase, new TestSuiteNode(suite));
testCaseNode.pending();
testCaseNode.started(NOW);
testCaseNode.testInterrupted(advance(NOW, Duration.ofMillis(1)));
assertStatusAndTiming(testCaseNode, TestResult.Status.INTERRUPTED, NOW, 1);
}
@Test
public void assertSkippedIfStartedAndSkipped() {
TestCaseNode testCaseNode = new TestCaseNode(testCase, new TestSuiteNode(suite));
testCaseNode.pending();
testCaseNode.started(NOW);
testCaseNode.testSkipped(advance(NOW, Duration.ofMillis(1)));
assertStatusAndTiming(testCaseNode, TestResult.Status.SKIPPED, NOW, 1);
}
@Test
public void assertCompletedIfStartedAndFinished() {
TestCaseNode testCaseNode = new TestCaseNode(testCase, new TestSuiteNode(suite));
testCaseNode.pending();
testCaseNode.started(NOW);
testCaseNode.finished(advance(NOW, Duration.ofMillis(1)));
assertStatusAndTiming(testCaseNode, TestResult.Status.COMPLETED, NOW, 1);
}
@Test
public void assertCompletedIfStartedAndFailedAndFinished() {
TestCaseNode testCaseNode = new TestCaseNode(testCase, new TestSuiteNode(suite));
testCaseNode.pending();
testCaseNode.started(NOW);
testCaseNode.testFailure(new Exception(), advance(NOW, Duration.ofMillis(1)));
testCaseNode.finished(advance(NOW, Duration.ofMillis(2)));
assertStatusAndTiming(testCaseNode, TestResult.Status.COMPLETED, NOW, 2);
}
@Test
public void assertInterruptedIfStartedAndFailedAndInterrupted() {
TestCaseNode testCaseNode = new TestCaseNode(testCase, new TestSuiteNode(suite));
testCaseNode.pending();
testCaseNode.started(NOW);
testCaseNode.testFailure(new Exception(), advance(NOW, Duration.ofMillis(1)));
testCaseNode.testInterrupted(advance(NOW, Duration.ofMillis(2)));
assertStatusAndTiming(testCaseNode, TestResult.Status.INTERRUPTED, NOW, 2);
}
@Test
public void assertTestSuppressedIfNotStartedAndSuppressed() {
TestCaseNode testCaseNode = new TestCaseNode(testCase, new TestSuiteNode(suite));
testCaseNode.pending();
testCaseNode.testSuppressed(NOW);
assertStatusAndTiming(testCaseNode, TestResult.Status.SUPPRESSED, NOW, 0);
}
private void assertStatusAndTiming(
TestCaseNode testCase, TestResult.Status status, TestInstant start, long duration) {
TestResult result = testCase.getResult();
assertThat(result.getStatus()).isEqualTo(status);
assertThat(result.getRunTimeInterval()).isNotNull();
assertThat(result.getRunTimeInterval().getStartMillis())
.isEqualTo(start.wallTime().toEpochMilli());
assertThat(result.getRunTimeInterval().toDurationMillis()).isEqualTo(duration);
}
private void assertStatusWithoutTiming(TestCaseNode testCase, TestResult.Status status) {
TestResult result = testCase.getResult();
assertThat(result.getStatus()).isEqualTo(status);
assertThat(result.getRunTimeInterval()).isNull();
}
static class TestSuite {
@Test public void testCase() {}
}
}