diff --git a/integration-tests/virtual-threads/amqp-virtual-threads/pom.xml b/integration-tests/virtual-threads/amqp-virtual-threads/pom.xml
index d05b0088e1546..5e207e911d5b7 100644
--- a/integration-tests/virtual-threads/amqp-virtual-threads/pom.xml
+++ b/integration-tests/virtual-threads/amqp-virtual-threads/pom.xml
@@ -32,6 +32,11 @@
quarkus-junit5
test
+
+ io.quarkus.junit5
+ junit5-virtual-threads
+ test
+
io.rest-assured
rest-assured
diff --git a/integration-tests/virtual-threads/amqp-virtual-threads/src/test/java/io/quarkus/it/vthreads/amqp/NoPinningVerify.java b/integration-tests/virtual-threads/amqp-virtual-threads/src/test/java/io/quarkus/it/vthreads/amqp/NoPinningVerify.java
deleted file mode 100644
index 0db11972e439b..0000000000000
--- a/integration-tests/virtual-threads/amqp-virtual-threads/src/test/java/io/quarkus/it/vthreads/amqp/NoPinningVerify.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package io.quarkus.it.vthreads.amqp;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * An integration test reading the output of the unit test to verify that no tests where pinning the carrier thread.
- * It reads the reports generated by surefire.
- */
-public class NoPinningVerify {
-
- @Test
- void verify() throws IOException, ParserConfigurationException, SAXException {
- var reports = new File("target", "surefire-reports");
- Assertions.assertTrue(reports.isDirectory(),
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
- var list = reports.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.startsWith("TEST") && name.endsWith("Test.xml");
- }
- });
- Assertions.assertNotNull(list,
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
-
- for (File report : list) {
- Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(report);
- var suite = document.getFirstChild();
- var cases = getChildren(suite.getChildNodes(), "testcase");
- for (Node c : cases) {
- verify(report, c);
- }
- }
-
- }
-
- private void verify(File file, Node ca) {
- var fullname = ca.getAttributes().getNamedItem("classname").getTextContent() + "."
- + ca.getAttributes().getNamedItem("name").getTextContent();
- var output = getChildren(ca.getChildNodes(), "system-out");
- if (output.isEmpty()) {
- return;
- }
- var sout = output.get(0).getTextContent();
- if (sout.contains("VThreadContinuation.onPinned")) {
- throw new AssertionError("The test case " + fullname + " pinned the carrier thread, check " + file.getAbsolutePath()
- + " for details (or the log of the test)");
- }
-
- }
-
- private List getChildren(NodeList nodes, String name) {
- List list = new ArrayList<>();
- for (int i = 0; i < nodes.getLength(); i++) {
- var node = nodes.item(i);
- if (node.getNodeName().equalsIgnoreCase(name)) {
- list.add(node);
- }
- }
- return list;
- }
-
-}
diff --git a/integration-tests/virtual-threads/amqp-virtual-threads/src/test/java/io/quarkus/it/vthreads/amqp/VirtualThreadTest.java b/integration-tests/virtual-threads/amqp-virtual-threads/src/test/java/io/quarkus/it/vthreads/amqp/VirtualThreadTest.java
index 4d44358a66087..f78312ba795d5 100644
--- a/integration-tests/virtual-threads/amqp-virtual-threads/src/test/java/io/quarkus/it/vthreads/amqp/VirtualThreadTest.java
+++ b/integration-tests/virtual-threads/amqp-virtual-threads/src/test/java/io/quarkus/it/vthreads/amqp/VirtualThreadTest.java
@@ -13,9 +13,13 @@
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit5.virtual.ShouldNotPin;
+import io.quarkus.test.junit5.virtual.VirtualThreadUnit;
@QuarkusTest
@QuarkusTestResource(WireMockExtension.class)
+@VirtualThreadUnit
+@ShouldNotPin
public class VirtualThreadTest {
public static final int EXPECTED_CALLS = 10;
diff --git a/integration-tests/virtual-threads/grpc-virtual-threads/pom.xml b/integration-tests/virtual-threads/grpc-virtual-threads/pom.xml
index 266391bf2da6a..ba8052cf73552 100644
--- a/integration-tests/virtual-threads/grpc-virtual-threads/pom.xml
+++ b/integration-tests/virtual-threads/grpc-virtual-threads/pom.xml
@@ -28,6 +28,11 @@
quarkus-junit5
test
+
+ io.quarkus.junit5
+ junit5-virtual-threads
+ test
+
io.rest-assured
rest-assured
diff --git a/integration-tests/virtual-threads/grpc-virtual-threads/src/test/java/io/quarkus/grpc/example/streaming/NoPinningVerify.java b/integration-tests/virtual-threads/grpc-virtual-threads/src/test/java/io/quarkus/grpc/example/streaming/NoPinningVerify.java
deleted file mode 100644
index 7e3dc8bbea963..0000000000000
--- a/integration-tests/virtual-threads/grpc-virtual-threads/src/test/java/io/quarkus/grpc/example/streaming/NoPinningVerify.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package io.quarkus.grpc.example.streaming;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * An integration test reading the output of the unit test to verify that no tests where pinning the carrier thread.
- * It reads the reports generated by surefire.
- */
-public class NoPinningVerify {
-
- @Test
- void verify() throws IOException, ParserConfigurationException, SAXException {
- var reports = new File("target", "surefire-reports");
- Assertions.assertTrue(reports.isDirectory(),
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
- var list = reports.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.startsWith("TEST") && name.endsWith("Test.xml");
- }
- });
- Assertions.assertNotNull(list,
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
-
- for (File report : list) {
- Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(report);
- var suite = document.getFirstChild();
- var cases = getChildren(suite.getChildNodes(), "testcase");
- for (Node c : cases) {
- verify(report, c);
- }
- }
-
- }
-
- private void verify(File file, Node ca) {
- var fullname = ca.getAttributes().getNamedItem("classname").getTextContent() + "."
- + ca.getAttributes().getNamedItem("name").getTextContent();
- var output = getChildren(ca.getChildNodes(), "system-out");
- if (output.isEmpty()) {
- return;
- }
- var sout = output.get(0).getTextContent();
- if (sout.contains("VThreadContinuation.onPinned")) {
- throw new AssertionError("The test case " + fullname + " pinned the carrier thread, check " + file.getAbsolutePath()
- + " for details (or the log of the test)");
- }
-
- }
-
- private List getChildren(NodeList nodes, String name) {
- List list = new ArrayList<>();
- for (int i = 0; i < nodes.getLength(); i++) {
- var node = nodes.item(i);
- if (node.getNodeName().equalsIgnoreCase(name)) {
- list.add(node);
- }
- }
- return list;
- }
-
-}
diff --git a/integration-tests/virtual-threads/grpc-virtual-threads/src/test/java/io/quarkus/grpc/example/streaming/VertxVirtualThreadTest.java b/integration-tests/virtual-threads/grpc-virtual-threads/src/test/java/io/quarkus/grpc/example/streaming/VertxVirtualThreadTest.java
index c2799cc70f2f8..f480f0139b76e 100644
--- a/integration-tests/virtual-threads/grpc-virtual-threads/src/test/java/io/quarkus/grpc/example/streaming/VertxVirtualThreadTest.java
+++ b/integration-tests/virtual-threads/grpc-virtual-threads/src/test/java/io/quarkus/grpc/example/streaming/VertxVirtualThreadTest.java
@@ -3,8 +3,12 @@
import io.quarkus.grpc.test.utils.VertxGRPCTestProfile;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.TestProfile;
+import io.quarkus.test.junit5.virtual.ShouldNotPin;
+import io.quarkus.test.junit5.virtual.VirtualThreadUnit;
@QuarkusTest
@TestProfile(VertxGRPCTestProfile.class)
+@VirtualThreadUnit
+@ShouldNotPin
public class VertxVirtualThreadTest extends VirtualThreadTestBase {
}
diff --git a/integration-tests/virtual-threads/grpc-virtual-threads/src/test/java/io/quarkus/grpc/example/streaming/VirtualThreadTest.java b/integration-tests/virtual-threads/grpc-virtual-threads/src/test/java/io/quarkus/grpc/example/streaming/VirtualThreadTest.java
index a8f5412fe7e71..b5c773153a0c9 100644
--- a/integration-tests/virtual-threads/grpc-virtual-threads/src/test/java/io/quarkus/grpc/example/streaming/VirtualThreadTest.java
+++ b/integration-tests/virtual-threads/grpc-virtual-threads/src/test/java/io/quarkus/grpc/example/streaming/VirtualThreadTest.java
@@ -1,7 +1,11 @@
package io.quarkus.grpc.example.streaming;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit5.virtual.ShouldNotPin;
+import io.quarkus.test.junit5.virtual.VirtualThreadUnit;
@QuarkusTest
+@VirtualThreadUnit
+@ShouldNotPin
public class VirtualThreadTest extends VirtualThreadTestBase {
}
diff --git a/integration-tests/virtual-threads/jms-virtual-threads/pom.xml b/integration-tests/virtual-threads/jms-virtual-threads/pom.xml
index 8b96a092b993e..2c52d9aaa85b5 100644
--- a/integration-tests/virtual-threads/jms-virtual-threads/pom.xml
+++ b/integration-tests/virtual-threads/jms-virtual-threads/pom.xml
@@ -58,6 +58,11 @@
quarkus-junit5
test
+
+ io.quarkus.junit5
+ junit5-virtual-threads
+ test
+
io.rest-assured
rest-assured
diff --git a/integration-tests/virtual-threads/jms-virtual-threads/src/test/java/io/quarkus/it/vthreads/jms/NoPinningVerify.java b/integration-tests/virtual-threads/jms-virtual-threads/src/test/java/io/quarkus/it/vthreads/jms/NoPinningVerify.java
deleted file mode 100644
index b32c44a8f8a15..0000000000000
--- a/integration-tests/virtual-threads/jms-virtual-threads/src/test/java/io/quarkus/it/vthreads/jms/NoPinningVerify.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package io.quarkus.it.vthreads.jms;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * An integration test reading the output of the unit test to verify that no tests where pinning the carrier thread.
- * It reads the reports generated by surefire.
- */
-public class NoPinningVerify {
-
- @Test
- void verify() throws IOException, ParserConfigurationException, SAXException {
- var reports = new File("target", "surefire-reports");
- Assertions.assertTrue(reports.isDirectory(),
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
- var list = reports.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.startsWith("TEST") && name.endsWith("Test.xml");
- }
- });
- Assertions.assertNotNull(list,
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
-
- for (File report : list) {
- Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(report);
- var suite = document.getFirstChild();
- var cases = getChildren(suite.getChildNodes(), "testcase");
- for (Node c : cases) {
- verify(report, c);
- }
- }
-
- }
-
- private void verify(File file, Node ca) {
- var fullname = ca.getAttributes().getNamedItem("classname").getTextContent() + "."
- + ca.getAttributes().getNamedItem("name").getTextContent();
- var output = getChildren(ca.getChildNodes(), "system-out");
- if (output.isEmpty()) {
- return;
- }
- var sout = output.get(0).getTextContent();
- if (sout.contains("VThreadContinuation.onPinned")) {
- throw new AssertionError("The test case " + fullname + " pinned the carrier thread, check " + file.getAbsolutePath()
- + " for details (or the log of the test)");
- }
-
- }
-
- private List getChildren(NodeList nodes, String name) {
- List list = new ArrayList<>();
- for (int i = 0; i < nodes.getLength(); i++) {
- var node = nodes.item(i);
- if (node.getNodeName().equalsIgnoreCase(name)) {
- list.add(node);
- }
- }
- return list;
- }
-
-}
diff --git a/integration-tests/virtual-threads/jms-virtual-threads/src/test/java/io/quarkus/it/vthreads/jms/VirtualThreadTest.java b/integration-tests/virtual-threads/jms-virtual-threads/src/test/java/io/quarkus/it/vthreads/jms/VirtualThreadTest.java
index bb115b5ea1d3e..39ebce8240846 100644
--- a/integration-tests/virtual-threads/jms-virtual-threads/src/test/java/io/quarkus/it/vthreads/jms/VirtualThreadTest.java
+++ b/integration-tests/virtual-threads/jms-virtual-threads/src/test/java/io/quarkus/it/vthreads/jms/VirtualThreadTest.java
@@ -13,9 +13,13 @@
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit5.virtual.ShouldNotPin;
+import io.quarkus.test.junit5.virtual.VirtualThreadUnit;
@QuarkusTest
@QuarkusTestResource(WireMockExtension.class)
+@VirtualThreadUnit
+@ShouldNotPin
public class VirtualThreadTest {
public static final int EXPECTED_CALLS = 10;
diff --git a/integration-tests/virtual-threads/kafka-virtual-threads/pom.xml b/integration-tests/virtual-threads/kafka-virtual-threads/pom.xml
index 6e8e10ae29f62..16c86a83ad846 100644
--- a/integration-tests/virtual-threads/kafka-virtual-threads/pom.xml
+++ b/integration-tests/virtual-threads/kafka-virtual-threads/pom.xml
@@ -32,6 +32,11 @@
quarkus-junit5
test
+
+ io.quarkus.junit5
+ junit5-virtual-threads
+ test
+
io.rest-assured
rest-assured
diff --git a/integration-tests/virtual-threads/kafka-virtual-threads/src/test/java/io/quarkus/it/vthreads/kafka/NoPinningVerify.java b/integration-tests/virtual-threads/kafka-virtual-threads/src/test/java/io/quarkus/it/vthreads/kafka/NoPinningVerify.java
deleted file mode 100644
index 69ade96c85ab9..0000000000000
--- a/integration-tests/virtual-threads/kafka-virtual-threads/src/test/java/io/quarkus/it/vthreads/kafka/NoPinningVerify.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package io.quarkus.it.vthreads.kafka;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * An integration test reading the output of the unit test to verify that no tests where pinning the carrier thread.
- * It reads the reports generated by surefire.
- */
-public class NoPinningVerify {
-
- @Test
- void verify() throws IOException, ParserConfigurationException, SAXException {
- var reports = new File("target", "surefire-reports");
- Assertions.assertTrue(reports.isDirectory(),
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
- var list = reports.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.startsWith("TEST") && name.endsWith("Test.xml");
- }
- });
- Assertions.assertNotNull(list,
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
-
- for (File report : list) {
- Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(report);
- var suite = document.getFirstChild();
- var cases = getChildren(suite.getChildNodes(), "testcase");
- for (Node c : cases) {
- verify(report, c);
- }
- }
-
- }
-
- private void verify(File file, Node ca) {
- var fullname = ca.getAttributes().getNamedItem("classname").getTextContent() + "."
- + ca.getAttributes().getNamedItem("name").getTextContent();
- var output = getChildren(ca.getChildNodes(), "system-out");
- if (output.isEmpty()) {
- return;
- }
- var sout = output.get(0).getTextContent();
- if (sout.contains("VThreadContinuation.onPinned")) {
- throw new AssertionError("The test case " + fullname + " pinned the carrier thread, check " + file.getAbsolutePath()
- + " for details (or the log of the test)");
- }
-
- }
-
- private List getChildren(NodeList nodes, String name) {
- List list = new ArrayList<>();
- for (int i = 0; i < nodes.getLength(); i++) {
- var node = nodes.item(i);
- if (node.getNodeName().equalsIgnoreCase(name)) {
- list.add(node);
- }
- }
- return list;
- }
-
-}
diff --git a/integration-tests/virtual-threads/kafka-virtual-threads/src/test/java/io/quarkus/it/vthreads/kafka/VirtualThreadTest.java b/integration-tests/virtual-threads/kafka-virtual-threads/src/test/java/io/quarkus/it/vthreads/kafka/VirtualThreadTest.java
index 547055b00a1f1..ca5060e18aec1 100644
--- a/integration-tests/virtual-threads/kafka-virtual-threads/src/test/java/io/quarkus/it/vthreads/kafka/VirtualThreadTest.java
+++ b/integration-tests/virtual-threads/kafka-virtual-threads/src/test/java/io/quarkus/it/vthreads/kafka/VirtualThreadTest.java
@@ -13,9 +13,13 @@
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit5.virtual.ShouldNotPin;
+import io.quarkus.test.junit5.virtual.VirtualThreadUnit;
@QuarkusTest
@QuarkusTestResource(WireMockExtension.class)
+@VirtualThreadUnit
+@ShouldNotPin
public class VirtualThreadTest {
public static final int EXPECTED_CALLS = 10;
diff --git a/integration-tests/virtual-threads/mailer-virtual-threads/pom.xml b/integration-tests/virtual-threads/mailer-virtual-threads/pom.xml
index e567f6a56f49e..9ed5f6e17c566 100644
--- a/integration-tests/virtual-threads/mailer-virtual-threads/pom.xml
+++ b/integration-tests/virtual-threads/mailer-virtual-threads/pom.xml
@@ -28,6 +28,11 @@
quarkus-junit5
test
+
+ io.quarkus.junit5
+ junit5-virtual-threads
+ test
+
io.rest-assured
rest-assured
diff --git a/integration-tests/virtual-threads/mailer-virtual-threads/src/test/java/io/quarkus/virtual/mail/NoPinningVerify.java b/integration-tests/virtual-threads/mailer-virtual-threads/src/test/java/io/quarkus/virtual/mail/NoPinningVerify.java
deleted file mode 100644
index 99ce0563fdbb4..0000000000000
--- a/integration-tests/virtual-threads/mailer-virtual-threads/src/test/java/io/quarkus/virtual/mail/NoPinningVerify.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package io.quarkus.virtual.mail;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * An integration test reading the output of the unit test to verify that no tests where pinning the carrier thread.
- * It reads the reports generated by surefire.
- */
-public class NoPinningVerify {
-
- @Test
- void verify() throws IOException, ParserConfigurationException, SAXException {
- var reports = new File("target", "surefire-reports");
- Assertions.assertTrue(reports.isDirectory(),
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
- var list = reports.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.startsWith("TEST") && name.endsWith("Test.xml");
- }
- });
- Assertions.assertNotNull(list,
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
-
- for (File report : list) {
- Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(report);
- var suite = document.getFirstChild();
- var cases = getChildren(suite.getChildNodes(), "testcase");
- for (Node c : cases) {
- verify(report, c);
- }
- }
-
- }
-
- private void verify(File file, Node ca) {
- var fullname = ca.getAttributes().getNamedItem("classname").getTextContent() + "."
- + ca.getAttributes().getNamedItem("name").getTextContent();
- var output = getChildren(ca.getChildNodes(), "system-out");
- if (output.isEmpty()) {
- return;
- }
- var sout = output.get(0).getTextContent();
- if (sout.contains("VThreadContinuation.onPinned")) {
- throw new AssertionError("The test case " + fullname + " pinned the carrier thread, check " + file.getAbsolutePath()
- + " for details (or the log of the test)");
- }
-
- }
-
- private List getChildren(NodeList nodes, String name) {
- List list = new ArrayList<>();
- for (int i = 0; i < nodes.getLength(); i++) {
- var node = nodes.item(i);
- if (node.getNodeName().equalsIgnoreCase(name)) {
- list.add(node);
- }
- }
- return list;
- }
-
-}
diff --git a/integration-tests/virtual-threads/mailer-virtual-threads/src/test/java/io/quarkus/virtual/mail/RunOnVirtualThreadTest.java b/integration-tests/virtual-threads/mailer-virtual-threads/src/test/java/io/quarkus/virtual/mail/RunOnVirtualThreadTest.java
index d179f04cea365..659dc606b7e4a 100644
--- a/integration-tests/virtual-threads/mailer-virtual-threads/src/test/java/io/quarkus/virtual/mail/RunOnVirtualThreadTest.java
+++ b/integration-tests/virtual-threads/mailer-virtual-threads/src/test/java/io/quarkus/virtual/mail/RunOnVirtualThreadTest.java
@@ -8,12 +8,16 @@
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit5.virtual.ShouldNotPin;
+import io.quarkus.test.junit5.virtual.VirtualThreadUnit;
import io.restassured.RestAssured;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
@QuarkusTest
@QuarkusTestResource(MailHogResource.class)
+@VirtualThreadUnit
+@ShouldNotPin
class RunOnVirtualThreadTest {
@Test
diff --git a/integration-tests/virtual-threads/pom.xml b/integration-tests/virtual-threads/pom.xml
index 0e70fcb25a22f..853d39c10638b 100644
--- a/integration-tests/virtual-threads/pom.xml
+++ b/integration-tests/virtual-threads/pom.xml
@@ -106,19 +106,6 @@
--enable-preview -Djdk.tracePinnedThreads -Dgradle.scan.captureTestLogging=false
${skipTests}
-
-
- pinning-test
-
- test
-
-
-
- NoPinningVerify.java
-
-
-
-
io.quarkus
diff --git a/integration-tests/virtual-threads/quartz-virtual-threads/pom.xml b/integration-tests/virtual-threads/quartz-virtual-threads/pom.xml
index ba61edfaeb22b..77a37c7b6e55b 100644
--- a/integration-tests/virtual-threads/quartz-virtual-threads/pom.xml
+++ b/integration-tests/virtual-threads/quartz-virtual-threads/pom.xml
@@ -28,6 +28,11 @@
quarkus-junit5
test
+
+ io.quarkus.junit5
+ junit5-virtual-threads
+ test
+
io.rest-assured
rest-assured
diff --git a/integration-tests/virtual-threads/quartz-virtual-threads/src/test/java/io/quarkus/virtual/mail/NoPinningVerify.java b/integration-tests/virtual-threads/quartz-virtual-threads/src/test/java/io/quarkus/virtual/mail/NoPinningVerify.java
deleted file mode 100644
index 99ce0563fdbb4..0000000000000
--- a/integration-tests/virtual-threads/quartz-virtual-threads/src/test/java/io/quarkus/virtual/mail/NoPinningVerify.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package io.quarkus.virtual.mail;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * An integration test reading the output of the unit test to verify that no tests where pinning the carrier thread.
- * It reads the reports generated by surefire.
- */
-public class NoPinningVerify {
-
- @Test
- void verify() throws IOException, ParserConfigurationException, SAXException {
- var reports = new File("target", "surefire-reports");
- Assertions.assertTrue(reports.isDirectory(),
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
- var list = reports.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.startsWith("TEST") && name.endsWith("Test.xml");
- }
- });
- Assertions.assertNotNull(list,
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
-
- for (File report : list) {
- Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(report);
- var suite = document.getFirstChild();
- var cases = getChildren(suite.getChildNodes(), "testcase");
- for (Node c : cases) {
- verify(report, c);
- }
- }
-
- }
-
- private void verify(File file, Node ca) {
- var fullname = ca.getAttributes().getNamedItem("classname").getTextContent() + "."
- + ca.getAttributes().getNamedItem("name").getTextContent();
- var output = getChildren(ca.getChildNodes(), "system-out");
- if (output.isEmpty()) {
- return;
- }
- var sout = output.get(0).getTextContent();
- if (sout.contains("VThreadContinuation.onPinned")) {
- throw new AssertionError("The test case " + fullname + " pinned the carrier thread, check " + file.getAbsolutePath()
- + " for details (or the log of the test)");
- }
-
- }
-
- private List getChildren(NodeList nodes, String name) {
- List list = new ArrayList<>();
- for (int i = 0; i < nodes.getLength(); i++) {
- var node = nodes.item(i);
- if (node.getNodeName().equalsIgnoreCase(name)) {
- list.add(node);
- }
- }
- return list;
- }
-
-}
diff --git a/integration-tests/virtual-threads/quartz-virtual-threads/src/test/java/io/quarkus/virtual/mail/RunOnVirtualThreadTest.java b/integration-tests/virtual-threads/quartz-virtual-threads/src/test/java/io/quarkus/virtual/mail/RunOnVirtualThreadTest.java
index 7f2bec0ae9ba7..2a6244806d48b 100644
--- a/integration-tests/virtual-threads/quartz-virtual-threads/src/test/java/io/quarkus/virtual/mail/RunOnVirtualThreadTest.java
+++ b/integration-tests/virtual-threads/quartz-virtual-threads/src/test/java/io/quarkus/virtual/mail/RunOnVirtualThreadTest.java
@@ -8,10 +8,14 @@
import org.junit.jupiter.api.Test;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit5.virtual.ShouldNotPin;
+import io.quarkus.test.junit5.virtual.VirtualThreadUnit;
import io.restassured.RestAssured;
import io.restassured.common.mapper.TypeRef;
@QuarkusTest
+@VirtualThreadUnit
+@ShouldNotPin
class RunOnVirtualThreadTest {
@Test
diff --git a/integration-tests/virtual-threads/redis-virtual-threads/pom.xml b/integration-tests/virtual-threads/redis-virtual-threads/pom.xml
index 0ac0cd3aef8b5..9b333098d0d45 100644
--- a/integration-tests/virtual-threads/redis-virtual-threads/pom.xml
+++ b/integration-tests/virtual-threads/redis-virtual-threads/pom.xml
@@ -32,6 +32,11 @@
quarkus-junit5
test
+
+ io.quarkus.junit5
+ junit5-virtual-threads
+ test
+
io.rest-assured
rest-assured
diff --git a/integration-tests/virtual-threads/redis-virtual-threads/src/test/java/io/quarkus/virtual/redis/NoPinningVerify.java b/integration-tests/virtual-threads/redis-virtual-threads/src/test/java/io/quarkus/virtual/redis/NoPinningVerify.java
deleted file mode 100644
index 6490e39a4d387..0000000000000
--- a/integration-tests/virtual-threads/redis-virtual-threads/src/test/java/io/quarkus/virtual/redis/NoPinningVerify.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package io.quarkus.virtual.redis;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * An integration test reading the output of the unit test to verify that no tests where pinning the carrier thread.
- * It reads the reports generated by surefire.
- */
-public class NoPinningVerify {
-
- @Test
- void verify() throws IOException, ParserConfigurationException, SAXException {
- var reports = new File("target", "surefire-reports");
- Assertions.assertTrue(reports.isDirectory(),
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
- var list = reports.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.startsWith("TEST") && name.endsWith("Test.xml");
- }
- });
- Assertions.assertNotNull(list,
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
-
- for (File report : list) {
- Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(report);
- var suite = document.getFirstChild();
- var cases = getChildren(suite.getChildNodes(), "testcase");
- for (Node c : cases) {
- verify(report, c);
- }
- }
-
- }
-
- private void verify(File file, Node ca) {
- var fullname = ca.getAttributes().getNamedItem("classname").getTextContent() + "."
- + ca.getAttributes().getNamedItem("name").getTextContent();
- var output = getChildren(ca.getChildNodes(), "system-out");
- if (output.isEmpty()) {
- return;
- }
- var sout = output.get(0).getTextContent();
- if (sout.contains("VThreadContinuation.onPinned")) {
- throw new AssertionError("The test case " + fullname + " pinned the carrier thread, check " + file.getAbsolutePath()
- + " for details (or the log of the test)");
- }
-
- }
-
- private List getChildren(NodeList nodes, String name) {
- List list = new ArrayList<>();
- for (int i = 0; i < nodes.getLength(); i++) {
- var node = nodes.item(i);
- if (node.getNodeName().equalsIgnoreCase(name)) {
- list.add(node);
- }
- }
- return list;
- }
-
-}
diff --git a/integration-tests/virtual-threads/redis-virtual-threads/src/test/java/io/quarkus/virtual/redis/RunOnVirtualThreadTest.java b/integration-tests/virtual-threads/redis-virtual-threads/src/test/java/io/quarkus/virtual/redis/RunOnVirtualThreadTest.java
index 0b45efdd598d8..e0c7d648457f1 100644
--- a/integration-tests/virtual-threads/redis-virtual-threads/src/test/java/io/quarkus/virtual/redis/RunOnVirtualThreadTest.java
+++ b/integration-tests/virtual-threads/redis-virtual-threads/src/test/java/io/quarkus/virtual/redis/RunOnVirtualThreadTest.java
@@ -6,9 +6,13 @@
import org.junit.jupiter.api.Test;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit5.virtual.ShouldNotPin;
+import io.quarkus.test.junit5.virtual.VirtualThreadUnit;
import io.restassured.RestAssured;
@QuarkusTest
+@VirtualThreadUnit
+@ShouldNotPin
class RunOnVirtualThreadTest {
@Test
diff --git a/integration-tests/virtual-threads/rest-client-reactive-virtual-threads/pom.xml b/integration-tests/virtual-threads/rest-client-reactive-virtual-threads/pom.xml
index 263ea8ad3342d..d5a26f855ea21 100644
--- a/integration-tests/virtual-threads/rest-client-reactive-virtual-threads/pom.xml
+++ b/integration-tests/virtual-threads/rest-client-reactive-virtual-threads/pom.xml
@@ -28,6 +28,11 @@
quarkus-junit5
test
+
+ io.quarkus.junit5
+ junit5-virtual-threads
+ test
+
io.rest-assured
rest-assured
diff --git a/integration-tests/virtual-threads/rest-client-reactive-virtual-threads/src/test/java/io/quarkus/virtual/rest/NoPinningVerify.java b/integration-tests/virtual-threads/rest-client-reactive-virtual-threads/src/test/java/io/quarkus/virtual/rest/NoPinningVerify.java
deleted file mode 100644
index 2eb1d2963110d..0000000000000
--- a/integration-tests/virtual-threads/rest-client-reactive-virtual-threads/src/test/java/io/quarkus/virtual/rest/NoPinningVerify.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package io.quarkus.virtual.rest;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * An integration test reading the output of the unit test to verify that no tests where pinning the carrier thread.
- * It reads the reports generated by surefire.
- */
-public class NoPinningVerify {
-
- @Test
- void verify() throws IOException, ParserConfigurationException, SAXException {
- var reports = new File("target", "surefire-reports");
- Assertions.assertTrue(reports.isDirectory(),
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
- var list = reports.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.startsWith("TEST") && name.endsWith("Test.xml");
- }
- });
- Assertions.assertNotNull(list,
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
-
- for (File report : list) {
- Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(report);
- var suite = document.getFirstChild();
- var cases = getChildren(suite.getChildNodes(), "testcase");
- for (Node c : cases) {
- verify(report, c);
- }
- }
-
- }
-
- private void verify(File file, Node ca) {
- var fullname = ca.getAttributes().getNamedItem("classname").getTextContent() + "."
- + ca.getAttributes().getNamedItem("name").getTextContent();
- var output = getChildren(ca.getChildNodes(), "system-out");
- if (output.isEmpty()) {
- return;
- }
- var sout = output.get(0).getTextContent();
- if (sout.contains("VThreadContinuation.onPinned")) {
- throw new AssertionError("The test case " + fullname + " pinned the carrier thread, check " + file.getAbsolutePath()
- + " for details (or the log of the test)");
- }
-
- }
-
- private List getChildren(NodeList nodes, String name) {
- List list = new ArrayList<>();
- for (int i = 0; i < nodes.getLength(); i++) {
- var node = nodes.item(i);
- if (node.getNodeName().equalsIgnoreCase(name)) {
- list.add(node);
- }
- }
- return list;
- }
-
-}
diff --git a/integration-tests/virtual-threads/rest-client-reactive-virtual-threads/src/test/java/io/quarkus/virtual/rest/RunOnVirtualThreadTest.java b/integration-tests/virtual-threads/rest-client-reactive-virtual-threads/src/test/java/io/quarkus/virtual/rest/RunOnVirtualThreadTest.java
index a1b5318ba225a..8ff0ccff1f41c 100644
--- a/integration-tests/virtual-threads/rest-client-reactive-virtual-threads/src/test/java/io/quarkus/virtual/rest/RunOnVirtualThreadTest.java
+++ b/integration-tests/virtual-threads/rest-client-reactive-virtual-threads/src/test/java/io/quarkus/virtual/rest/RunOnVirtualThreadTest.java
@@ -5,9 +5,13 @@
import org.junit.jupiter.api.Test;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit5.virtual.ShouldNotPin;
+import io.quarkus.test.junit5.virtual.VirtualThreadUnit;
import io.restassured.RestAssured;
@QuarkusTest
+@VirtualThreadUnit
+@ShouldNotPin
class RunOnVirtualThreadTest {
@Test
diff --git a/integration-tests/virtual-threads/resteasy-reactive-virtual-threads/pom.xml b/integration-tests/virtual-threads/resteasy-reactive-virtual-threads/pom.xml
index 2eff569b5e35d..f59e520c0348e 100644
--- a/integration-tests/virtual-threads/resteasy-reactive-virtual-threads/pom.xml
+++ b/integration-tests/virtual-threads/resteasy-reactive-virtual-threads/pom.xml
@@ -24,6 +24,11 @@
quarkus-junit5
test
+
+ io.quarkus.junit5
+ junit5-virtual-threads
+ test
+
io.rest-assured
rest-assured
diff --git a/integration-tests/virtual-threads/resteasy-reactive-virtual-threads/src/test/java/io/quarkus/virtual/rr/NoPinningVerify.java b/integration-tests/virtual-threads/resteasy-reactive-virtual-threads/src/test/java/io/quarkus/virtual/rr/NoPinningVerify.java
deleted file mode 100644
index 3dc4cf6e76b2a..0000000000000
--- a/integration-tests/virtual-threads/resteasy-reactive-virtual-threads/src/test/java/io/quarkus/virtual/rr/NoPinningVerify.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package io.quarkus.virtual.rr;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * An integration test reading the output of the unit test to verify that no tests where pinning the carrier thread.
- * It reads the reports generated by surefire.
- */
-public class NoPinningVerify {
-
- @Test
- void verify() throws IOException, ParserConfigurationException, SAXException {
- var reports = new File("target", "surefire-reports");
- Assertions.assertTrue(reports.isDirectory(),
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
- var list = reports.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.startsWith("TEST") && name.endsWith("Test.xml");
- }
- });
- Assertions.assertNotNull(list,
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
-
- for (File report : list) {
- Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(report);
- var suite = document.getFirstChild();
- var cases = getChildren(suite.getChildNodes(), "testcase");
- for (Node c : cases) {
- verify(report, c);
- }
- }
-
- }
-
- private void verify(File file, Node ca) {
- var fullname = ca.getAttributes().getNamedItem("classname").getTextContent() + "."
- + ca.getAttributes().getNamedItem("name").getTextContent();
- var output = getChildren(ca.getChildNodes(), "system-out");
- if (output.isEmpty()) {
- return;
- }
- var sout = output.get(0).getTextContent();
- if (sout.contains("VThreadContinuation.onPinned")) {
- throw new AssertionError("The test case " + fullname + " pinned the carrier thread, check " + file.getAbsolutePath()
- + " for details (or the log of the test)");
- }
-
- }
-
- private List getChildren(NodeList nodes, String name) {
- List list = new ArrayList<>();
- for (int i = 0; i < nodes.getLength(); i++) {
- var node = nodes.item(i);
- if (node.getNodeName().equalsIgnoreCase(name)) {
- list.add(node);
- }
- }
- return list;
- }
-
-}
diff --git a/integration-tests/virtual-threads/resteasy-reactive-virtual-threads/src/test/java/io/quarkus/virtual/rr/RunOnVirtualThreadTest.java b/integration-tests/virtual-threads/resteasy-reactive-virtual-threads/src/test/java/io/quarkus/virtual/rr/RunOnVirtualThreadTest.java
index d4562adee1ed9..a2af77a6f9be2 100644
--- a/integration-tests/virtual-threads/resteasy-reactive-virtual-threads/src/test/java/io/quarkus/virtual/rr/RunOnVirtualThreadTest.java
+++ b/integration-tests/virtual-threads/resteasy-reactive-virtual-threads/src/test/java/io/quarkus/virtual/rr/RunOnVirtualThreadTest.java
@@ -7,9 +7,13 @@
import org.junit.jupiter.api.Test;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit5.virtual.ShouldNotPin;
+import io.quarkus.test.junit5.virtual.VirtualThreadUnit;
import io.restassured.RestAssured;
@QuarkusTest
+@VirtualThreadUnit
+@ShouldNotPin
class RunOnVirtualThreadTest {
@Test
diff --git a/integration-tests/virtual-threads/scheduler-virtual-threads/pom.xml b/integration-tests/virtual-threads/scheduler-virtual-threads/pom.xml
index 0811268cd06e2..0d7b25e3c866a 100644
--- a/integration-tests/virtual-threads/scheduler-virtual-threads/pom.xml
+++ b/integration-tests/virtual-threads/scheduler-virtual-threads/pom.xml
@@ -28,6 +28,11 @@
quarkus-junit5
test
+
+ io.quarkus.junit5
+ junit5-virtual-threads
+ test
+
io.rest-assured
rest-assured
diff --git a/integration-tests/virtual-threads/scheduler-virtual-threads/src/test/java/io/quarkus/virtual/mail/NoPinningVerify.java b/integration-tests/virtual-threads/scheduler-virtual-threads/src/test/java/io/quarkus/virtual/mail/NoPinningVerify.java
deleted file mode 100644
index 99ce0563fdbb4..0000000000000
--- a/integration-tests/virtual-threads/scheduler-virtual-threads/src/test/java/io/quarkus/virtual/mail/NoPinningVerify.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package io.quarkus.virtual.mail;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * An integration test reading the output of the unit test to verify that no tests where pinning the carrier thread.
- * It reads the reports generated by surefire.
- */
-public class NoPinningVerify {
-
- @Test
- void verify() throws IOException, ParserConfigurationException, SAXException {
- var reports = new File("target", "surefire-reports");
- Assertions.assertTrue(reports.isDirectory(),
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
- var list = reports.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.startsWith("TEST") && name.endsWith("Test.xml");
- }
- });
- Assertions.assertNotNull(list,
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
-
- for (File report : list) {
- Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(report);
- var suite = document.getFirstChild();
- var cases = getChildren(suite.getChildNodes(), "testcase");
- for (Node c : cases) {
- verify(report, c);
- }
- }
-
- }
-
- private void verify(File file, Node ca) {
- var fullname = ca.getAttributes().getNamedItem("classname").getTextContent() + "."
- + ca.getAttributes().getNamedItem("name").getTextContent();
- var output = getChildren(ca.getChildNodes(), "system-out");
- if (output.isEmpty()) {
- return;
- }
- var sout = output.get(0).getTextContent();
- if (sout.contains("VThreadContinuation.onPinned")) {
- throw new AssertionError("The test case " + fullname + " pinned the carrier thread, check " + file.getAbsolutePath()
- + " for details (or the log of the test)");
- }
-
- }
-
- private List getChildren(NodeList nodes, String name) {
- List list = new ArrayList<>();
- for (int i = 0; i < nodes.getLength(); i++) {
- var node = nodes.item(i);
- if (node.getNodeName().equalsIgnoreCase(name)) {
- list.add(node);
- }
- }
- return list;
- }
-
-}
diff --git a/integration-tests/virtual-threads/scheduler-virtual-threads/src/test/java/io/quarkus/virtual/mail/RunOnVirtualThreadTest.java b/integration-tests/virtual-threads/scheduler-virtual-threads/src/test/java/io/quarkus/virtual/mail/RunOnVirtualThreadTest.java
index 7f2bec0ae9ba7..2a6244806d48b 100644
--- a/integration-tests/virtual-threads/scheduler-virtual-threads/src/test/java/io/quarkus/virtual/mail/RunOnVirtualThreadTest.java
+++ b/integration-tests/virtual-threads/scheduler-virtual-threads/src/test/java/io/quarkus/virtual/mail/RunOnVirtualThreadTest.java
@@ -8,10 +8,14 @@
import org.junit.jupiter.api.Test;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit5.virtual.ShouldNotPin;
+import io.quarkus.test.junit5.virtual.VirtualThreadUnit;
import io.restassured.RestAssured;
import io.restassured.common.mapper.TypeRef;
@QuarkusTest
+@VirtualThreadUnit
+@ShouldNotPin
class RunOnVirtualThreadTest {
@Test
diff --git a/integration-tests/virtual-threads/vertx-event-bus-virtual-threads/pom.xml b/integration-tests/virtual-threads/vertx-event-bus-virtual-threads/pom.xml
index 52ce0825438bf..57617bea7d8fb 100644
--- a/integration-tests/virtual-threads/vertx-event-bus-virtual-threads/pom.xml
+++ b/integration-tests/virtual-threads/vertx-event-bus-virtual-threads/pom.xml
@@ -24,6 +24,11 @@
quarkus-junit5
test
+
+ io.quarkus.junit5
+ junit5-virtual-threads
+ test
+
io.rest-assured
rest-assured
diff --git a/integration-tests/virtual-threads/vertx-event-bus-virtual-threads/src/test/java/io/quarkus/virtual/vertx/NoPinningVerify.java b/integration-tests/virtual-threads/vertx-event-bus-virtual-threads/src/test/java/io/quarkus/virtual/vertx/NoPinningVerify.java
deleted file mode 100644
index 84f96f5700fd5..0000000000000
--- a/integration-tests/virtual-threads/vertx-event-bus-virtual-threads/src/test/java/io/quarkus/virtual/vertx/NoPinningVerify.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package io.quarkus.virtual.vertx;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * An integration test reading the output of the unit test to verify that no tests where pinning the carrier thread.
- * It reads the reports generated by surefire.
- */
-public class NoPinningVerify {
-
- @Test
- void verify() throws IOException, ParserConfigurationException, SAXException {
- var reports = new File("target", "surefire-reports");
- Assertions.assertTrue(reports.isDirectory(),
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
- var list = reports.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.startsWith("TEST") && name.endsWith("Test.xml");
- }
- });
- Assertions.assertNotNull(list,
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
-
- for (File report : list) {
- Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(report);
- var suite = document.getFirstChild();
- var cases = getChildren(suite.getChildNodes(), "testcase");
- for (Node c : cases) {
- verify(report, c);
- }
- }
-
- }
-
- private void verify(File file, Node ca) {
- var fullname = ca.getAttributes().getNamedItem("classname").getTextContent() + "."
- + ca.getAttributes().getNamedItem("name").getTextContent();
- var output = getChildren(ca.getChildNodes(), "system-out");
- if (output.isEmpty()) {
- return;
- }
- var sout = output.get(0).getTextContent();
- if (sout.contains("VThreadContinuation.onPinned")) {
- throw new AssertionError("The test case " + fullname + " pinned the carrier thread, check " + file.getAbsolutePath()
- + " for details (or the log of the test)");
- }
-
- }
-
- private List getChildren(NodeList nodes, String name) {
- List list = new ArrayList<>();
- for (int i = 0; i < nodes.getLength(); i++) {
- var node = nodes.item(i);
- if (node.getNodeName().equalsIgnoreCase(name)) {
- list.add(node);
- }
- }
- return list;
- }
-
-}
diff --git a/integration-tests/virtual-threads/vertx-event-bus-virtual-threads/src/test/java/io/quarkus/virtual/vertx/RunOnVirtualThreadTest.java b/integration-tests/virtual-threads/vertx-event-bus-virtual-threads/src/test/java/io/quarkus/virtual/vertx/RunOnVirtualThreadTest.java
index 05c3b0516d786..d9dc0285247e6 100644
--- a/integration-tests/virtual-threads/vertx-event-bus-virtual-threads/src/test/java/io/quarkus/virtual/vertx/RunOnVirtualThreadTest.java
+++ b/integration-tests/virtual-threads/vertx-event-bus-virtual-threads/src/test/java/io/quarkus/virtual/vertx/RunOnVirtualThreadTest.java
@@ -6,9 +6,13 @@
import org.junit.jupiter.api.Test;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit5.virtual.ShouldNotPin;
+import io.quarkus.test.junit5.virtual.VirtualThreadUnit;
import io.restassured.RestAssured;
@QuarkusTest
+@VirtualThreadUnit
+@ShouldNotPin
class RunOnVirtualThreadTest {
@Test
diff --git a/integration-tests/virtual-threads/virtual-threads-disabled/pom.xml b/integration-tests/virtual-threads/virtual-threads-disabled/pom.xml
index 87aff3d36f75c..cf83eb35efc5d 100644
--- a/integration-tests/virtual-threads/virtual-threads-disabled/pom.xml
+++ b/integration-tests/virtual-threads/virtual-threads-disabled/pom.xml
@@ -24,6 +24,11 @@
quarkus-junit5
test
+
+ io.quarkus.junit5
+ junit5-virtual-threads
+ test
+
io.rest-assured
rest-assured
diff --git a/integration-tests/virtual-threads/virtual-threads-disabled/src/test/java/io/quarkus/virtual/disabled/NoPinningVerify.java b/integration-tests/virtual-threads/virtual-threads-disabled/src/test/java/io/quarkus/virtual/disabled/NoPinningVerify.java
deleted file mode 100644
index cb1aeee98ce59..0000000000000
--- a/integration-tests/virtual-threads/virtual-threads-disabled/src/test/java/io/quarkus/virtual/disabled/NoPinningVerify.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package io.quarkus.virtual.disabled;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * An integration test reading the output of the unit test to verify that no tests where pinning the carrier thread.
- * It reads the reports generated by surefire.
- */
-public class NoPinningVerify {
-
- @Test
- void verify() throws IOException, ParserConfigurationException, SAXException {
- var reports = new File("target", "surefire-reports");
- Assertions.assertTrue(reports.isDirectory(),
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
- var list = reports.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.startsWith("TEST") && name.endsWith("Test.xml");
- }
- });
- Assertions.assertNotNull(list,
- "Unable to find " + reports.getAbsolutePath() + ", did you run the tests with Maven before?");
-
- for (File report : list) {
- Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(report);
- var suite = document.getFirstChild();
- var cases = getChildren(suite.getChildNodes(), "testcase");
- for (Node c : cases) {
- verify(report, c);
- }
- }
-
- }
-
- private void verify(File file, Node ca) {
- var fullname = ca.getAttributes().getNamedItem("classname").getTextContent() + "."
- + ca.getAttributes().getNamedItem("name").getTextContent();
- var output = getChildren(ca.getChildNodes(), "system-out");
- if (output.isEmpty()) {
- return;
- }
- var sout = output.get(0).getTextContent();
- if (sout.contains("VThreadContinuation.onPinned")) {
- throw new AssertionError("The test case " + fullname + " pinned the carrier thread, check " + file.getAbsolutePath()
- + " for details (or the log of the test)");
- }
-
- }
-
- private List getChildren(NodeList nodes, String name) {
- List list = new ArrayList<>();
- for (int i = 0; i < nodes.getLength(); i++) {
- var node = nodes.item(i);
- if (node.getNodeName().equalsIgnoreCase(name)) {
- list.add(node);
- }
- }
- return list;
- }
-
-}
diff --git a/integration-tests/virtual-threads/virtual-threads-disabled/src/test/java/io/quarkus/virtual/disabled/RunOnVirtualThreadDisabledTest.java b/integration-tests/virtual-threads/virtual-threads-disabled/src/test/java/io/quarkus/virtual/disabled/RunOnVirtualThreadDisabledTest.java
index 4a60c8922bc2f..8fef3565fc1f3 100644
--- a/integration-tests/virtual-threads/virtual-threads-disabled/src/test/java/io/quarkus/virtual/disabled/RunOnVirtualThreadDisabledTest.java
+++ b/integration-tests/virtual-threads/virtual-threads-disabled/src/test/java/io/quarkus/virtual/disabled/RunOnVirtualThreadDisabledTest.java
@@ -7,9 +7,13 @@
import org.junit.jupiter.api.Test;
import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit5.virtual.ShouldNotPin;
+import io.quarkus.test.junit5.virtual.VirtualThreadUnit;
import io.restassured.RestAssured;
@QuarkusTest
+@VirtualThreadUnit
+@ShouldNotPin
class RunOnVirtualThreadDisabledTest {
@Test