use of io.quarkus.test.common.TestResourceManager in project quarkus by quarkusio.
the class QuarkusTestExtension method doJavaStart.
private ExtensionState doJavaStart(ExtensionContext context, Class<? extends QuarkusTestProfile> profile) throws Throwable {
TracingHandler.quarkusStarting();
hangDetectionExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "Quarkus hang detection timer thread");
}
});
String time = "10m";
// config is not established yet
// we can only read from system properties
String sysPropString = System.getProperty(QUARKUS_TEST_HANG_DETECTION_TIMEOUT);
if (sysPropString != null) {
time = sysPropString;
}
hangTimeout = new DurationConverter().convert(time);
hangTaskKey = hangDetectionExecutor.schedule(hangDetectionTask, hangTimeout.toMillis(), TimeUnit.MILLISECONDS);
quarkusTestProfile = profile;
Class<?> requiredTestClass = context.getRequiredTestClass();
Closeable testResourceManager = null;
try {
final LinkedBlockingDeque<Runnable> shutdownTasks = new LinkedBlockingDeque<>();
PrepareResult result = createAugmentor(context, profile, shutdownTasks);
AugmentAction augmentAction = result.augmentAction;
QuarkusTestProfile profileInstance = result.profileInstance;
testHttpEndpointProviders = TestHttpEndpointProvider.load();
StartupAction startupAction = augmentAction.createInitialRuntimeApplication();
Thread.currentThread().setContextClassLoader(startupAction.getClassLoader());
populateDeepCloneField(startupAction);
// must be done after the TCCL has been set
testResourceManager = (Closeable) startupAction.getClassLoader().loadClass(TestResourceManager.class.getName()).getConstructor(Class.class, Class.class, List.class, boolean.class, Map.class, Optional.class).newInstance(requiredTestClass, profile != null ? profile : null, getAdditionalTestResources(profileInstance, startupAction.getClassLoader()), profileInstance != null && profileInstance.disableGlobalTestResources(), startupAction.getDevServicesProperties(), Optional.empty());
testResourceManager.getClass().getMethod("init", String.class).invoke(testResourceManager, profile != null ? profile.getName() : null);
Map<String, String> properties = (Map<String, String>) testResourceManager.getClass().getMethod("start").invoke(testResourceManager);
startupAction.overrideConfig(properties);
hasPerTestResources = (boolean) testResourceManager.getClass().getMethod("hasPerTestResources").invoke(testResourceManager);
populateCallbacks(startupAction.getClassLoader());
populateTestMethodInvokers(startupAction.getClassLoader());
if (profileInstance == null || !profileInstance.runMainMethod()) {
runningQuarkusApplication = startupAction.run(profileInstance == null ? new String[0] : profileInstance.commandLineParameters());
} else {
Class<?> lifecycleManager = Class.forName(ApplicationLifecycleManager.class.getName(), true, startupAction.getClassLoader());
lifecycleManager.getDeclaredMethod("setDefaultExitCodeHandler", Consumer.class).invoke(null, (Consumer<Integer>) integer -> {
});
runningQuarkusApplication = startupAction.runMainClass(profileInstance.commandLineParameters());
}
String patternString = runningQuarkusApplication.getConfigValue("quarkus.test.class-clone-pattern", String.class).orElse("java\\..*");
clonePattern = Pattern.compile(patternString);
TracingHandler.quarkusStarted();
if (hangTaskKey != null) {
hangTaskKey.cancel(false);
hangTimeout = runningQuarkusApplication.getConfigValue(QUARKUS_TEST_HANG_DETECTION_TIMEOUT, Duration.class).orElse(Duration.of(10, ChronoUnit.MINUTES));
hangTaskKey = hangDetectionExecutor.schedule(hangDetectionTask, hangTimeout.toMillis(), TimeUnit.MILLISECONDS);
}
ConfigProviderResolver.setInstance(new RunningAppConfigResolver(runningQuarkusApplication));
RestorableSystemProperties restorableSystemProperties = RestorableSystemProperties.setProperties(Collections.singletonMap("test.url", TestHTTPResourceManager.getUri(runningQuarkusApplication)));
Closeable tm = testResourceManager;
Closeable shutdownTask = new Closeable() {
@Override
public void close() throws IOException {
TracingHandler.quarkusStopping();
try {
runningQuarkusApplication.close();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
TracingHandler.quarkusStopped();
try {
while (!shutdownTasks.isEmpty()) {
shutdownTasks.pop().run();
}
} finally {
try {
tm.close();
} finally {
restorableSystemProperties.close();
GroovyCacheCleaner.clearGroovyCache();
shutdownHangDetection();
}
}
try {
TestClassIndexer.removeIndex(requiredTestClass);
} catch (Exception ignored) {
}
}
}
};
ExtensionState state = new ExtensionState(testResourceManager, shutdownTask);
return state;
} catch (Throwable e) {
if (!InitialConfigurator.DELAYED_HANDLER.isActivated()) {
activateLogging();
}
try {
if (testResourceManager != null) {
testResourceManager.close();
}
} catch (Exception ex) {
e.addSuppressed(ex);
}
throw e;
} finally {
if (originalCl != null) {
Thread.currentThread().setContextClassLoader(originalCl);
}
}
}
use of io.quarkus.test.common.TestResourceManager in project quarkus by quarkusio.
the class QuarkusIntegrationTestExtension method doProcessStart.
private IntegrationTestExtensionState doProcessStart(Properties quarkusArtifactProperties, Class<? extends QuarkusTestProfile> profile, ExtensionContext context) throws Throwable {
String artifactType = getArtifactType(quarkusArtifactProperties);
boolean isDockerLaunch = isContainer(artifactType);
ArtifactLauncher.InitContext.DevServicesLaunchResult devServicesLaunchResult = handleDevServices(context, isDockerLaunch);
devServicesProps = devServicesLaunchResult.properties();
containerNetworkId = devServicesLaunchResult.networkId();
quarkusTestProfile = profile;
currentJUnitTestClass = context.getRequiredTestClass();
TestResourceManager testResourceManager = null;
try {
Class<?> requiredTestClass = context.getRequiredTestClass();
Map<String, String> sysPropRestore = getSysPropsToRestore();
TestProfileAndProperties testProfileAndProperties = determineTestProfileAndProperties(profile, sysPropRestore);
testResourceManager = new TestResourceManager(requiredTestClass, quarkusTestProfile, getAdditionalTestResources(testProfileAndProperties.testProfile, context.getRequiredTestClass().getClassLoader()), testProfileAndProperties.testProfile != null && testProfileAndProperties.testProfile.disableGlobalTestResources(), devServicesProps, containerNetworkId == null ? Optional.empty() : Optional.of(containerNetworkId));
testResourceManager.init(testProfileAndProperties.testProfile != null ? testProfileAndProperties.testProfile.getClass().getName() : null);
hasPerTestResources = testResourceManager.hasPerTestResources();
Map<String, String> additionalProperties = new HashMap<>(testProfileAndProperties.properties);
additionalProperties.putAll(QuarkusIntegrationTestExtension.devServicesProps);
Map<String, String> resourceManagerProps = testResourceManager.start();
Map<String, String> old = new HashMap<>();
for (Map.Entry<String, String> i : resourceManagerProps.entrySet()) {
old.put(i.getKey(), System.getProperty(i.getKey()));
if (i.getValue() == null) {
System.clearProperty(i.getKey());
} else {
System.setProperty(i.getKey(), i.getValue());
}
}
context.getStore(ExtensionContext.Namespace.GLOBAL).put(NativeTestExtension.class.getName() + ".systemProps", new ExtensionContext.Store.CloseableResource() {
@Override
public void close() throws Throwable {
for (Map.Entry<String, String> i : old.entrySet()) {
old.put(i.getKey(), System.getProperty(i.getKey()));
if (i.getValue() == null) {
System.clearProperty(i.getKey());
} else {
System.setProperty(i.getKey(), i.getValue());
}
}
}
});
additionalProperties.putAll(resourceManagerProps);
ArtifactLauncher<?> launcher = null;
String testHost = System.getProperty("quarkus.http.test-host");
if ((testHost != null) && !testHost.isEmpty()) {
launcher = new TestHostLauncher();
} else {
ServiceLoader<ArtifactLauncherProvider> loader = ServiceLoader.load(ArtifactLauncherProvider.class);
for (ArtifactLauncherProvider launcherProvider : loader) {
if (launcherProvider.supportsArtifactType(artifactType)) {
launcher = launcherProvider.create(new DefaultArtifactLauncherCreateContext(quarkusArtifactProperties, context, requiredTestClass, devServicesLaunchResult));
break;
}
}
}
if (launcher == null) {
throw new IllegalStateException("Artifact type + '" + artifactType + "' is not supported by @QuarkusIntegrationTest");
}
activateLogging();
startLauncher(launcher, additionalProperties, () -> ssl = true);
IntegrationTestExtensionState state = new IntegrationTestExtensionState(testResourceManager, launcher, sysPropRestore);
testHttpEndpointProviders = TestHttpEndpointProvider.load();
return state;
} catch (Throwable e) {
if (!InitialConfigurator.DELAYED_HANDLER.isActivated()) {
activateLogging();
}
try {
if (testResourceManager != null) {
testResourceManager.close();
}
} catch (Exception ex) {
e.addSuppressed(ex);
}
throw e;
}
}
use of io.quarkus.test.common.TestResourceManager in project quarkus by quarkusio.
the class QuarkusMainIntegrationTestExtension method doProcessStart.
private ArtifactLauncher.LaunchResult doProcessStart(ExtensionContext context, String[] args) {
try {
Class<? extends QuarkusTestProfile> profile = IntegrationTestUtil.findProfile(context.getRequiredTestClass());
TestResourceManager testResourceManager = null;
Map<String, String> old = new HashMap<>();
String artifactType = quarkusArtifactProperties.getProperty("type");
try {
Class<?> requiredTestClass = context.getRequiredTestClass();
Map<String, String> sysPropRestore = getSysPropsToRestore();
TestProfileAndProperties testProfileAndProperties = determineTestProfileAndProperties(profile, sysPropRestore);
testResourceManager = new TestResourceManager(requiredTestClass, profile, getAdditionalTestResources(testProfileAndProperties.testProfile, context.getRequiredTestClass().getClassLoader()), testProfileAndProperties.testProfile != null && testProfileAndProperties.testProfile.disableGlobalTestResources());
testResourceManager.init(testProfileAndProperties.testProfile != null ? testProfileAndProperties.testProfile.getClass().getName() : null);
Map<String, String> additionalProperties = new HashMap<>(testProfileAndProperties.properties);
additionalProperties.putAll(QuarkusMainIntegrationTestExtension.devServicesProps);
Map<String, String> resourceManagerProps = testResourceManager.start();
for (Map.Entry<String, String> i : resourceManagerProps.entrySet()) {
old.put(i.getKey(), System.getProperty(i.getKey()));
if (i.getValue() == null) {
System.clearProperty(i.getKey());
} else {
System.setProperty(i.getKey(), i.getValue());
}
}
additionalProperties.putAll(resourceManagerProps);
testResourceManager.inject(context.getRequiredTestInstance());
ArtifactLauncher<?> launcher = null;
ServiceLoader<ArtifactLauncherProvider> loader = ServiceLoader.load(ArtifactLauncherProvider.class);
for (ArtifactLauncherProvider launcherProvider : loader) {
if (launcherProvider.supportsArtifactType(artifactType)) {
launcher = launcherProvider.create(new DefaultArtifactLauncherCreateContext(quarkusArtifactProperties, context, requiredTestClass, devServicesLaunchResult));
break;
}
}
if (launcher == null) {
throw new IllegalStateException("Artifact type + '" + artifactType + "' is not supported by @QuarkusMainIntegrationTest");
}
launcher.includeAsSysProps(additionalProperties);
activateLogging();
return launcher.runToCompletion(args);
} finally {
for (Map.Entry<String, String> i : old.entrySet()) {
old.put(i.getKey(), System.getProperty(i.getKey()));
if (i.getValue() == null) {
System.clearProperty(i.getKey());
} else {
System.setProperty(i.getKey(), i.getValue());
}
}
if (testResourceManager != null) {
testResourceManager.close();
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
use of io.quarkus.test.common.TestResourceManager in project quarkus by quarkusio.
the class NativeTestExtension method doNativeStart.
private IntegrationTestExtensionState doNativeStart(ExtensionContext context, Class<? extends QuarkusTestProfile> profile) throws Throwable {
Map<String, String> devServicesProps = handleDevServices(context, false).properties();
quarkusTestProfile = profile;
currentJUnitTestClass = context.getRequiredTestClass();
TestResourceManager testResourceManager = null;
try {
Class<?> requiredTestClass = context.getRequiredTestClass();
Map<String, String> sysPropRestore = getSysPropsToRestore();
TestProfileAndProperties testProfileAndProperties = determineTestProfileAndProperties(profile, sysPropRestore);
testResourceManager = new TestResourceManager(requiredTestClass, quarkusTestProfile, getAdditionalTestResources(testProfileAndProperties.testProfile, currentJUnitTestClass.getClassLoader()), testProfileAndProperties.testProfile != null && testProfileAndProperties.testProfile.disableGlobalTestResources());
testResourceManager.init(testProfileAndProperties.testProfile != null ? testProfileAndProperties.testProfile.getClass().getName() : null);
hasPerTestResources = testResourceManager.hasPerTestResources();
Map<String, String> additionalProperties = new HashMap<>(testProfileAndProperties.properties);
additionalProperties.putAll(devServicesProps);
Map<String, String> resourceManagerProps = testResourceManager.start();
Map<String, String> old = new HashMap<>();
for (Map.Entry<String, String> i : resourceManagerProps.entrySet()) {
old.put(i.getKey(), System.getProperty(i.getKey()));
if (i.getValue() == null) {
System.clearProperty(i.getKey());
} else {
System.setProperty(i.getKey(), i.getValue());
}
}
context.getStore(ExtensionContext.Namespace.GLOBAL).put(NativeTestExtension.class.getName() + ".systemProps", new ExtensionContext.Store.CloseableResource() {
@Override
public void close() throws Throwable {
for (Map.Entry<String, String> i : old.entrySet()) {
old.put(i.getKey(), System.getProperty(i.getKey()));
if (i.getValue() == null) {
System.clearProperty(i.getKey());
} else {
System.setProperty(i.getKey(), i.getValue());
}
}
}
});
additionalProperties.putAll(resourceManagerProps);
NativeImageLauncher launcher = createLauncher(requiredTestClass);
startLauncher(launcher, additionalProperties, () -> ssl = true);
final IntegrationTestExtensionState state = new IntegrationTestExtensionState(testResourceManager, launcher, sysPropRestore);
testHttpEndpointProviders = TestHttpEndpointProvider.load();
return state;
} catch (Throwable e) {
try {
if (testResourceManager != null) {
testResourceManager.close();
}
} catch (Exception ex) {
e.addSuppressed(ex);
}
throw e;
}
}
use of io.quarkus.test.common.TestResourceManager in project quarkus by quarkusio.
the class QuarkusMainTestExtension method doJavaStart.
private int doJavaStart(ExtensionContext context, Class<? extends QuarkusTestProfile> profile, String[] arguments) throws Exception {
TracingHandler.quarkusStarting();
Closeable testResourceManager = null;
try {
StartupAction startupAction = prepareResult.augmentAction.createInitialRuntimeApplication();
Thread.currentThread().setContextClassLoader(startupAction.getClassLoader());
QuarkusConsole.installRedirects();
flushAllLoggers();
installLoggerRedirect();
QuarkusTestProfile profileInstance = prepareResult.profileInstance;
// must be done after the TCCL has been set
testResourceManager = (Closeable) startupAction.getClassLoader().loadClass(TestResourceManager.class.getName()).getConstructor(Class.class, Class.class, List.class, boolean.class, Map.class, Optional.class).newInstance(context.getRequiredTestClass(), profile != null ? profile : null, getAdditionalTestResources(profileInstance, startupAction.getClassLoader()), profileInstance != null && profileInstance.disableGlobalTestResources(), startupAction.getDevServicesProperties(), Optional.empty());
testResourceManager.getClass().getMethod("init", String.class).invoke(testResourceManager, profile != null ? profile.getName() : null);
Map<String, String> properties = (Map<String, String>) testResourceManager.getClass().getMethod("start").invoke(testResourceManager);
startupAction.overrideConfig(properties);
hasPerTestResources = (boolean) testResourceManager.getClass().getMethod("hasPerTestResources").invoke(testResourceManager);
testResourceManager.getClass().getMethod("inject", Object.class).invoke(testResourceManager, context.getRequiredTestInstance());
var result = startupAction.runMainClassBlocking(arguments);
flushAllLoggers();
return result;
} catch (Throwable e) {
if (!InitialConfigurator.DELAYED_HANDLER.isActivated()) {
activateLogging();
}
try {
if (testResourceManager != null) {
testResourceManager.close();
}
} catch (Exception ex) {
e.addSuppressed(ex);
}
throw e;
} finally {
uninstallLoggerRedirect();
QuarkusConsole.uninstallRedirects();
if (originalCl != null) {
Thread.currentThread().setContextClassLoader(originalCl);
}
}
}
Aggregations