blob: 1ec30da2b67ba259645e7c8de343bf4bc40881b4 [file] [log] [blame]
// Copyright (C) 2021 The Android Open Source Project
//
// 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.gerrit.testing;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import com.google.gerrit.testing.ConfigSuite.AfterConfig;
import com.google.gerrit.testing.ConfigSuite.BeforeConfig;
import com.google.gerrit.testing.ConfigSuite.ConfigRule;
import org.eclipse.jgit.lib.Config;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runner.Result;
import org.junit.runner.RunWith;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.model.Statement;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class ConfigSuiteTest {
@Mock private ConfigBasedTestListener configBasedTestListener;
private RunNotifier notifier;
@Before
public void setUp() {
notifier = new RunNotifier();
ConfigBasedTest.setConfigBasedTestListener(configBasedTestListener);
}
@After
public void tearDown() {
ConfigBasedTest.setConfigBasedTestListener(null);
}
@Test
public void methodsExecuteInCorrectOrder() throws Exception {
InOrder inOrder = Mockito.inOrder(configBasedTestListener);
new ConfigSuite(ConfigBasedTest.class).run(notifier);
inOrder.verify(configBasedTestListener, Mockito.times(1)).classRuleExecuted();
inOrder.verify(configBasedTestListener, Mockito.times(1)).beforeClassExecuted();
// default config
inOrder.verify(configBasedTestListener, Mockito.times(1)).configRuleExectued();
inOrder.verify(configBasedTestListener, Mockito.times(1)).beforeConfigExecuted();
inOrder.verify(configBasedTestListener, Mockito.times(2)).testExecuted(any(), any(), any());
inOrder.verify(configBasedTestListener, Mockito.times(1)).afterConfigExecuted();
// first config
inOrder.verify(configBasedTestListener, Mockito.times(1)).configRuleExectued();
inOrder.verify(configBasedTestListener, Mockito.times(1)).beforeConfigExecuted();
inOrder.verify(configBasedTestListener, Mockito.times(2)).testExecuted(any(), any(), any());
inOrder.verify(configBasedTestListener, Mockito.times(1)).afterConfigExecuted();
// second config
inOrder.verify(configBasedTestListener, Mockito.times(1)).configRuleExectued();
inOrder.verify(configBasedTestListener, Mockito.times(1)).beforeConfigExecuted();
inOrder.verify(configBasedTestListener, Mockito.times(2)).testExecuted(any(), any(), any());
inOrder.verify(configBasedTestListener, Mockito.times(1)).afterConfigExecuted();
inOrder.verify(configBasedTestListener, Mockito.times(1)).afterClassExecuted();
}
@Test
public void beforeClassExecutedOnce() throws Exception {
new ConfigSuite(ConfigBasedTest.class).run(notifier);
verify(configBasedTestListener, Mockito.times(1)).beforeClassExecuted();
}
@Test
public void afterClassExecutedOnce() throws Exception {
new ConfigSuite(ConfigBasedTest.class).run(notifier);
verify(configBasedTestListener, Mockito.times(1)).afterClassExecuted();
}
@Test
public void classRuleExecutedOnlyOnce() throws Exception {
new ConfigSuite(ConfigBasedTest.class).run(notifier);
verify(configBasedTestListener, Mockito.times(1)).classRuleExecuted();
}
@Test
public void beforeConfigExecutedForEachConfig() throws Exception {
new ConfigSuite(ConfigBasedTest.class).run(notifier);
// default, firstConfig, secondConfig
verify(configBasedTestListener, Mockito.times(3)).beforeConfigExecuted();
}
@Test
public void afterConfigExecutedForEachConfig() throws Exception {
new ConfigSuite(ConfigBasedTest.class).run(notifier);
// default, firstConfig, secondConfig
verify(configBasedTestListener, Mockito.times(3)).afterConfigExecuted();
}
@Test
public void configRuleExecutedForEachConfig() throws Exception {
new ConfigSuite(ConfigBasedTest.class).run(notifier);
// default, firstConfig, secondConfig
verify(configBasedTestListener, Mockito.times(3)).afterConfigExecuted();
}
@Test
public void testsExecuteWithCorrectConfigAndName() throws Exception {
new ConfigSuite(ConfigBasedTest.class).run(notifier);
verify(configBasedTestListener, Mockito.times(6)).testExecuted(any(), any(), any());
verify(configBasedTestListener, Mockito.times(1)).testExecuted("test1", "default", null);
verify(configBasedTestListener, Mockito.times(1)).testExecuted("test2", "default", null);
verify(configBasedTestListener, Mockito.times(1))
.testExecuted("test1", "firstValue", "firstConfig");
verify(configBasedTestListener, Mockito.times(1))
.testExecuted("test2", "firstValue", "firstConfig");
verify(configBasedTestListener, Mockito.times(1))
.testExecuted("test1", "secondValue", "secondConfig");
verify(configBasedTestListener, Mockito.times(1))
.testExecuted("test2", "secondValue", "secondConfig");
}
@Test
public void testResultWasSuccessful() throws Exception {
Result result = new Result();
notifier.addListener(result.createListener());
new ConfigSuite(ConfigBasedTest.class).run(notifier);
assertThat(result.wasSuccessful()).isTrue();
}
@Test
public void failedTestResultNotMissed() throws Exception {
Result result = new Result();
notifier.addListener(result.createListener());
new ConfigSuite(FailedConfigBasedTest.class).run(notifier);
// 3 fails with 3 different configs
assertThat(result.wasSuccessful()).isFalse();
assertThat(result.getFailureCount()).isEqualTo(3);
}
interface ConfigBasedTestListener {
void beforeClassExecuted();
void afterClassExecuted();
void classRuleExecuted();
void configRuleExectued();
void testExecuted(String testName, String testValue, String configName);
void beforeConfigExecuted();
void afterConfigExecuted();
}
public static class ConfigBasedTest {
private static ConfigBasedTestListener listener;
public static void setConfigBasedTestListener(ConfigBasedTestListener listener) {
ConfigBasedTest.listener = listener;
}
@BeforeClass
public static void beforeClass() {
listener.beforeClassExecuted();
}
@AfterClass
public static void afterClass() {
listener.afterClassExecuted();
}
@ClassRule
public static TestRule classRule =
new TestRule() {
@Override
public Statement apply(Statement statement, Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
listener.classRuleExecuted();
statement.evaluate();
}
};
}
};
@ConfigRule
public static TestRule configRule =
new TestRule() {
@Override
public Statement apply(Statement statement, Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
listener.configRuleExectued();
statement.evaluate();
}
};
}
};
@BeforeConfig
public static void beforeConfig() {
listener.beforeConfigExecuted();
}
@AfterConfig
public static void afterConfig() {
listener.afterConfigExecuted();
}
@ConfigSuite.Config
public static Config firstConfig() {
Config cfg = new Config();
cfg.setString("gerrit", null, "testValue", "firstValue");
return cfg;
}
@ConfigSuite.Config
public static Config secondConfig() {
Config cfg = new Config();
cfg.setString("gerrit", null, "testValue", "secondValue");
return cfg;
}
@ConfigSuite.Parameter public Config config;
@ConfigSuite.Name public String name;
@Test
public void test1() {
String testValue = config.getString("gerrit", null, "testValue");
listener.testExecuted("test1", testValue != null ? testValue : "default", name);
}
@Test
public void test2() {
String testValue = config.getString("gerrit", null, "testValue");
listener.testExecuted("test2", testValue != null ? testValue : "default", name);
}
}
public static class FailedConfigBasedTest extends ConfigBasedTest {
@Test
public void failedTest() {
assertThat(true).isFalse();
}
}
}