package com.sequenceiq.it.cloudbreak; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.ConfigFileApplicationContextInitializer; import org.springframework.core.io.ClassPathResource; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; import org.springframework.util.CollectionUtils; import org.testng.Assert; import org.testng.ITestContext; import org.testng.ITestResult; import org.testng.SkipException; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; import org.testng.annotations.Optional; import org.testng.annotations.Parameters; import com.sequenceiq.cloudbreak.client.CloudbreakClient; import com.sequenceiq.it.IntegrationTestContext; import com.sequenceiq.it.SuiteContext; import com.sequenceiq.it.config.IntegrationTestConfiguration; @ContextConfiguration(classes = IntegrationTestConfiguration.class, initializers = ConfigFileApplicationContextInitializer.class) public abstract class AbstractCloudbreakIntegrationTest extends AbstractTestNGSpringContextTests { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractCloudbreakIntegrationTest.class); private IntegrationTestContext itContext; private CloudbreakClient cloudbreakClient; @Inject private SuiteContext suiteContext; @BeforeClass public void checkContextParameters(ITestContext testContext) { itContext = suiteContext.getItContext(testContext.getSuite().getName()); if (itContext.getContextParam(CloudbreakITContextConstants.SKIP_REMAINING_SUITETEST_AFTER_ONE_FAILED, Boolean.class) && !CollectionUtils.isEmpty(itContext.getContextParam(CloudbreakITContextConstants.FAILED_TESTS, List.class))) { throw new SkipException("Suite contains failed tests, the remaining tests will be skipped."); } cloudbreakClient = itContext.getContextParam(CloudbreakITContextConstants.CLOUDBREAK_CLIENT, CloudbreakClient.class); Assert.assertNotNull(cloudbreakClient, "CloudbreakClient cannot be null."); } @AfterMethod @Parameters("sleepTime") public void sleepAfterTest(@Optional("0") int sleepTime) { if (sleepTime > 0) { LOGGER.info("Sleeping {}ms after test...", sleepTime); try { Thread.sleep(sleepTime); } catch (Exception ex) { LOGGER.warn("Ex during sleep!"); } } } @AfterMethod public void checkResult(ITestContext testContext, ITestResult testResult) { if (testResult.getStatus() == ITestResult.FAILURE) { List<String> failedTests = itContext.getContextParam(CloudbreakITContextConstants.FAILED_TESTS, List.class); if (failedTests == null) { failedTests = new ArrayList<>(); itContext.putContextParam(CloudbreakITContextConstants.FAILED_TESTS, failedTests); } failedTests.add(testContext.getName()); } } protected File createTempFileFromClasspath(String file) { try { InputStream sshPemInputStream = new ClassPathResource(file).getInputStream(); File tempKeystoreFile = File.createTempFile(file, ".tmp"); try (OutputStream outputStream = new FileOutputStream(tempKeystoreFile)) { IOUtils.copy(sshPemInputStream, outputStream); } catch (IOException e) { LOGGER.error("can't write " + file, e); } return tempKeystoreFile; } catch (IOException e) { throw new RuntimeException(file + " not found", e); } } protected IntegrationTestContext getItContext() { return itContext; } protected CloudbreakClient getCloudbreakClient() { return cloudbreakClient; } }