From 66b7a46b7b1eeca48b51bce5e7579e30d2f07165 Mon Sep 17 00:00:00 2001 From: ap891843 Date: Tue, 3 Sep 2024 11:10:37 +0200 Subject: [PATCH 1/2] test: add usecase test interceptor Signed-off-by: ap891843 --- .../cobol-lsp-vscode-extension/dist/note.md | 2 +- server/engine/pom.xml | 4 + .../usecases/suite/TestWatcherHelper.java | 58 ++++++++ .../usecases/suite/UniqueIdTestWatcher.java | 138 ++++++++++++++++++ .../org.junit.jupiter.api.extension.Extension | 17 +++ .../test/resources/junit-platform.properties | 1 + .../test/engine/ExtensionContextCleaner.java | 33 +++++ .../test/engine/ExtensionContextProvider.java | 49 +++++++ .../test/engine/PreprocessedDocument.java | 2 +- .../lsp/cobol/test/engine/TestData.java | 2 +- .../lsp/cobol/test/engine/UseCaseEngine.java | 3 + .../lsp/cobol/test/engine/UseCaseUtils.java | 23 ++- 12 files changed, 328 insertions(+), 4 deletions(-) create mode 100644 server/engine/src/test/java/org/eclipse/lsp/cobol/usecases/suite/TestWatcherHelper.java create mode 100644 server/engine/src/test/java/org/eclipse/lsp/cobol/usecases/suite/UniqueIdTestWatcher.java create mode 100644 server/engine/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension create mode 100644 server/engine/src/test/resources/junit-platform.properties create mode 100644 server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextCleaner.java create mode 100644 server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextProvider.java diff --git a/clients/cobol-lsp-vscode-extension/dist/note.md b/clients/cobol-lsp-vscode-extension/dist/note.md index 8f14b329f1..0af9a7e40b 100644 --- a/clients/cobol-lsp-vscode-extension/dist/note.md +++ b/clients/cobol-lsp-vscode-extension/dist/note.md @@ -14,4 +14,4 @@ --> # Dialect support information -Place bundled extension code into this folder \ No newline at end of file +Place bundled extension code into this folder diff --git a/server/engine/pom.xml b/server/engine/pom.xml index 59232f549d..5e2afd9623 100644 --- a/server/engine/pom.xml +++ b/server/engine/pom.xml @@ -291,6 +291,10 @@ ${listingSnap} + + usecase.test.repo.dir + ${usecase.test.repo.dir} + **/org/eclipse/lsp/cobol/dialects/**/* diff --git a/server/engine/src/test/java/org/eclipse/lsp/cobol/usecases/suite/TestWatcherHelper.java b/server/engine/src/test/java/org/eclipse/lsp/cobol/usecases/suite/TestWatcherHelper.java new file mode 100644 index 0000000000..9fe4f51c62 --- /dev/null +++ b/server/engine/src/test/java/org/eclipse/lsp/cobol/usecases/suite/TestWatcherHelper.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2024 Broadcom. + * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Broadcom, Inc. - initial API and implementation + * + */ +package org.eclipse.lsp.cobol.usecases.suite; + +import lombok.experimental.UtilityClass; +import org.junit.jupiter.api.extension.ExtensionContext; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Utility class for TestWatchers + */ +@UtilityClass +public class TestWatcherHelper { + private static final Pattern UNIT_TEST_ID_PATTERN = + Pattern.compile("\\[.*?\\]/\\[.*?\\]/\\[.*?\\]/\\[.*?:(.*?)\\]"); + static final String ROOT_DIRECTORY_PROPERTY = "usecase.test.repo.dir"; + + Path fetchTargetPath(ExtensionContext context, String rootFolder) + throws IOException { + String className = context.getTestClass().get().getSimpleName(); + String methodName = context.getRequiredTestMethod().getName(); + Optional parameterInvocation = getParameterInvocation(context); + + List subfolder = new ArrayList<>(Arrays.asList(className, methodName)); + parameterInvocation.ifPresent(subfolder::add); + + Path mainFolderPath = Paths.get(rootFolder, subfolder.toArray(new String[0])); + Files.createDirectories(mainFolderPath); + return mainFolderPath; + } + + private static Optional getParameterInvocation(ExtensionContext context) { + Matcher matcher = UNIT_TEST_ID_PATTERN.matcher(context.getUniqueId()); + return matcher.find() ? Optional.of(matcher.group(1)) : Optional.empty(); + } +} diff --git a/server/engine/src/test/java/org/eclipse/lsp/cobol/usecases/suite/UniqueIdTestWatcher.java b/server/engine/src/test/java/org/eclipse/lsp/cobol/usecases/suite/UniqueIdTestWatcher.java new file mode 100644 index 0000000000..f5573a527a --- /dev/null +++ b/server/engine/src/test/java/org/eclipse/lsp/cobol/usecases/suite/UniqueIdTestWatcher.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2024 Broadcom. + * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Broadcom, Inc. - initial API and implementation + * + */ +package org.eclipse.lsp.cobol.usecases.suite; + +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.lsp.cobol.test.CobolText; +import org.eclipse.lsp.cobol.test.engine.PreprocessedDocument; +import org.eclipse.lsp.cobol.test.engine.TestData; +import org.eclipse.lsp4j.DiagnosticSeverity; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.TestWatcher; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; + +import static org.eclipse.lsp.cobol.usecases.suite.TestWatcherHelper.ROOT_DIRECTORY_PROPERTY; + +/** + * This is unit test watcher class and is responsible to write test data if "usecase.test.repo.dir" + * system property is configured + */ +@Slf4j +public class UniqueIdTestWatcher implements TestWatcher { + public static final String SOURCE_CBL = "source.cbl"; + public static final String COPYBOOK_EXT = ".cpy"; + + @Override + public void testSuccessful(ExtensionContext context) { + interceptor(context); + } + + @Override + public void testFailed(ExtensionContext context, Throwable cause) { + LOG.info("{} test failed", context.getRequiredTestMethod().toString()); + interceptor(context); + } + + @Override + public void testAborted(ExtensionContext context, Throwable cause) { + LOG.info("{} test is aborted", context.getRequiredTestMethod().toString()); + interceptor(context); + } + + @Override + public void testDisabled(ExtensionContext context, Optional reason) { + LOG.info( + "{} test is disabled due to {}", + context.getRequiredTestMethod().toString(), + reason.orElse("unknown reason")); + } + + @SneakyThrows + private static void interceptor(ExtensionContext context) { + Optional rootDirectory = + Optional.ofNullable(System.getProperty(ROOT_DIRECTORY_PROPERTY)); + if (rootDirectory.isPresent()) { + String rootFolder = rootDirectory.get(); + PreprocessedDocument document = getDocumentFromContext(context); + + Path mainFolderPath = TestWatcherHelper.fetchTargetPath(context, rootFolder); + writeCobolDocument(document, mainFolderPath); + writeCopybooks(document.getCopybooks(), mainFolderPath); + if (Objects.nonNull(document.getTestData())) { + writeTestData(document.getTestData(), mainFolderPath); + createZeroDiagnosticIndicatorFile(document.getTestData(), mainFolderPath); + } else { + LOG.info("no test data for {}", context.getRequiredTestMethod().toString()); + Files.createFile(mainFolderPath.resolve("NoTestData")); + } + } + } + + private static PreprocessedDocument getDocumentFromContext(ExtensionContext context) { + return (PreprocessedDocument) + context + .getStore(ExtensionContext.Namespace.create(context.getRequiredTestMethod())) + .get("document"); + } + + private static void writeCobolDocument(PreprocessedDocument document, Path mainFolderPath) + throws IOException { + Path cobolDocPath = mainFolderPath.resolve(SOURCE_CBL); + writeToFile(cobolDocPath, document.getText()); + } + + private static void writeCopybooks(List copybooks, Path mainFolderPath) { + copybooks.forEach( + cobolText -> { + try { + Path filePath = mainFolderPath.resolve(cobolText.getFileName() + COPYBOOK_EXT); + writeToFile(filePath, cobolText.getFullText()); + System.out.println("Created file: " + filePath); + } catch (IOException e) { + System.err.println("Error writing copybook: " + e.getMessage()); + } + }); + } + + private static void writeTestData(TestData testData, Path mainFolderPath) throws IOException { + Path testDataPath = mainFolderPath.resolve("testData.txt"); + Files.deleteIfExists(testDataPath); + writeToFile(testDataPath, testData.toString()); + } + + private static void writeToFile(Path filePath, String content) throws IOException { + Files.write(filePath, content.getBytes()); + } + + private static void createZeroDiagnosticIndicatorFile(TestData testData, Path mainFolderPath) + throws IOException { + boolean hasErrorDiagnostics = + testData.getDiagnostics().values().stream() + .flatMap(List::stream) + .anyMatch(d -> d.getSeverity() == DiagnosticSeverity.Error); + + Path diaFlag = mainFolderPath.resolve("ZeroDiagnosticsFlag"); + if (!hasErrorDiagnostics) { + if (!Files.exists(diaFlag)) Files.createFile(diaFlag); + } else { + Files.deleteIfExists(diaFlag); + } + } +} diff --git a/server/engine/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/server/engine/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension new file mode 100644 index 0000000000..500486a9a9 --- /dev/null +++ b/server/engine/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension @@ -0,0 +1,17 @@ +#/* +# * Copyright (c) 2024 Broadcom. +# * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. +# * +# * This program and the accompanying materials are made +# * available under the terms of the Eclipse Public License 2.0 +# * which is available at https://www.eclipse.org/legal/epl-2.0/ +# * +# * SPDX-License-Identifier: EPL-2.0 +# * +# * Contributors: +# * Broadcom, Inc. - initial API and implementation +# * +# */ +org.eclipse.lsp.cobol.usecases.suite.UniqueIdTestWatcher +org.eclipse.lsp.cobol.test.engine.ExtensionContextProvider +org.eclipse.lsp.cobol.test.engine.ExtensionContextCleaner diff --git a/server/engine/src/test/resources/junit-platform.properties b/server/engine/src/test/resources/junit-platform.properties new file mode 100644 index 0000000000..6efc0d5e85 --- /dev/null +++ b/server/engine/src/test/resources/junit-platform.properties @@ -0,0 +1 @@ +junit.jupiter.extensions.autodetection.enabled=true diff --git a/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextCleaner.java b/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextCleaner.java new file mode 100644 index 0000000000..cabb13ff45 --- /dev/null +++ b/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextCleaner.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024 Broadcom. + * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Broadcom, Inc. - initial API and implementation + * + */ +package org.eclipse.lsp.cobol.test.engine; + +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; + +/** + * ExtensionContextCleaner + */ +public class ExtensionContextCleaner implements AfterEachCallback { + + /** + * + * @param context + */ + @Override + public void afterEach(ExtensionContext context) { + ExtensionContextProvider.clearExtensionContext(); + } +} diff --git a/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextProvider.java b/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextProvider.java new file mode 100644 index 0000000000..b24524797c --- /dev/null +++ b/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextProvider.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2024 Broadcom. + * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Broadcom, Inc. - initial API and implementation + * + */ + +package org.eclipse.lsp.cobol.test.engine; + +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import java.util.Optional; + +/** + * BeforeEachCallback for Use case test + */ +public class ExtensionContextProvider implements BeforeEachCallback { + + private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); + + @Override + public void beforeEach(ExtensionContext context) { + CONTEXT_HOLDER.set(context); + } + + /** + * get junit extensionContext + * + * @return ExtensionContext + */ + public static Optional getExtensionContext() { + return Optional.ofNullable(CONTEXT_HOLDER.get()); + } + + /** + * clear context + */ + public static void clearExtensionContext() { + CONTEXT_HOLDER.remove(); + } +} diff --git a/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/PreprocessedDocument.java b/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/PreprocessedDocument.java index 53a64f9011..81d2d69019 100644 --- a/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/PreprocessedDocument.java +++ b/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/PreprocessedDocument.java @@ -25,7 +25,7 @@ * to the actual Language Engine, and the testDAta will be used to assert the result. */ @Value -class PreprocessedDocument { +public class PreprocessedDocument { String text; List copybooks; TestData testData; diff --git a/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/TestData.java b/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/TestData.java index 308d845504..9641a09fce 100644 --- a/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/TestData.java +++ b/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/TestData.java @@ -26,7 +26,7 @@ /** This data class defines output of use-case text preprocessor */ @Value @Builder(toBuilder = true) -class TestData { +public class TestData { String text; String copybookName; String dialectType; diff --git a/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/UseCaseEngine.java b/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/UseCaseEngine.java index 2d069d31a2..293b6c5556 100644 --- a/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/UseCaseEngine.java +++ b/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/UseCaseEngine.java @@ -27,6 +27,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; import com.google.gson.JsonElement; + import java.util.*; import java.util.function.Function; import java.util.function.Predicate; @@ -262,6 +263,7 @@ public AnalysisResult runTest( PreprocessedDocument document = AnnotatedDocumentCleaning.prepareDocument( text, copybooks, subroutineNames, expectedDiagnostics, sqlBackendSetting, analysisConfig.getCompilerOptions()); + AnalysisResult actual = analyze( UseCase.builder() @@ -278,6 +280,7 @@ public AnalysisResult runTest( .build(), languageId); assertResultEquals(actual, document.getTestData()); + UseCaseUtils.storeDocumentToUnitTextExtensionContext(document.getText(), document.getCopybooks(), document.getTestData()); return actual; } diff --git a/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/UseCaseUtils.java b/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/UseCaseUtils.java index fd9641f7dd..2a7f9c3af8 100644 --- a/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/UseCaseUtils.java +++ b/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/UseCaseUtils.java @@ -19,7 +19,10 @@ import static java.util.stream.Collectors.toList; import com.google.inject.Injector; + +import java.lang.reflect.Method; import java.util.List; +import java.util.Optional; import java.util.ServiceLoader; import java.util.stream.StreamSupport; import lombok.experimental.UtilityClass; @@ -34,6 +37,7 @@ import org.eclipse.lsp.cobol.test.UseCaseInitializer; import org.eclipse.lsp4j.Diagnostic; import org.eclipse.lsp4j.DiagnosticSeverity; +import org.junit.jupiter.api.extension.ExtensionContext; /** * This utility class provides methods to run use cases with COBOL code examples. @@ -114,7 +118,7 @@ public static AnalysisResult analyze(UseCase useCase) { * @return the entire analysis result */ public static AnalysisResult analyze(UseCase useCase, CobolLanguageId languageId) { - + storeDocumentToUnitTextExtensionContext(useCase.getText(), useCase.getCopybooks(), null); ServiceLoader loader = ServiceLoader.load(UseCaseInitializer.class); Injector injector = StreamSupport.stream(loader.spliterator(), false).findFirst() .map(UseCaseInitializer::createInjector) @@ -156,4 +160,21 @@ public static CopybookModel toCopybookModel(CobolText cobolText, String programU return new CopybookModel(copybookName.toCopybookId(programUri), copybookName, uri, cobolText.getFullText()); } + + /** + * Stores the document in the Extension context store + * @param documentText + * @param copybooks + * @param testData + */ + static void storeDocumentToUnitTextExtensionContext( + String documentText, List copybooks, TestData testData) { + Optional extensionContext = ExtensionContextProvider.getExtensionContext(); + if (extensionContext.isPresent()) { + Method requiredTestMethod = extensionContext.get().getRequiredTestMethod(); + ExtensionContext.Store store = + extensionContext.get().getStore(ExtensionContext.Namespace.create(requiredTestMethod)); + store.put("document", new PreprocessedDocument(documentText, copybooks, testData)); + } + } } From 4f5d2be52b5c719e2c322cd7deaf73993e614c90 Mon Sep 17 00:00:00 2001 From: ap891843 Date: Thu, 19 Sep 2024 16:53:33 +0200 Subject: [PATCH 2/2] fix: update as per PR comments Signed-off-by: ap891843 --- .../usecases/suite/UniqueIdTestWatcher.java | 1 - .../org.junit.jupiter.api.extension.Extension | 1 - .../test/engine/ExtensionContextCleaner.java | 33 ------------------- .../test/engine/ExtensionContextProvider.java | 12 ++++++- 4 files changed, 11 insertions(+), 36 deletions(-) delete mode 100644 server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextCleaner.java diff --git a/server/engine/src/test/java/org/eclipse/lsp/cobol/usecases/suite/UniqueIdTestWatcher.java b/server/engine/src/test/java/org/eclipse/lsp/cobol/usecases/suite/UniqueIdTestWatcher.java index f5573a527a..ebaf31213d 100644 --- a/server/engine/src/test/java/org/eclipse/lsp/cobol/usecases/suite/UniqueIdTestWatcher.java +++ b/server/engine/src/test/java/org/eclipse/lsp/cobol/usecases/suite/UniqueIdTestWatcher.java @@ -113,7 +113,6 @@ private static void writeCopybooks(List copybooks, Path mainFolderPat private static void writeTestData(TestData testData, Path mainFolderPath) throws IOException { Path testDataPath = mainFolderPath.resolve("testData.txt"); - Files.deleteIfExists(testDataPath); writeToFile(testDataPath, testData.toString()); } diff --git a/server/engine/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/server/engine/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension index 500486a9a9..43e66a56eb 100644 --- a/server/engine/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension +++ b/server/engine/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension @@ -14,4 +14,3 @@ # */ org.eclipse.lsp.cobol.usecases.suite.UniqueIdTestWatcher org.eclipse.lsp.cobol.test.engine.ExtensionContextProvider -org.eclipse.lsp.cobol.test.engine.ExtensionContextCleaner diff --git a/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextCleaner.java b/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextCleaner.java deleted file mode 100644 index cabb13ff45..0000000000 --- a/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextCleaner.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2024 Broadcom. - * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. - * - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * Broadcom, Inc. - initial API and implementation - * - */ -package org.eclipse.lsp.cobol.test.engine; - -import org.junit.jupiter.api.extension.AfterEachCallback; -import org.junit.jupiter.api.extension.ExtensionContext; - -/** - * ExtensionContextCleaner - */ -public class ExtensionContextCleaner implements AfterEachCallback { - - /** - * - * @param context - */ - @Override - public void afterEach(ExtensionContext context) { - ExtensionContextProvider.clearExtensionContext(); - } -} diff --git a/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextProvider.java b/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextProvider.java index b24524797c..c0ebe3f0de 100644 --- a/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextProvider.java +++ b/server/test/src/main/java/org/eclipse/lsp/cobol/test/engine/ExtensionContextProvider.java @@ -15,6 +15,7 @@ package org.eclipse.lsp.cobol.test.engine; +import org.junit.jupiter.api.extension.AfterEachCallback; import org.junit.jupiter.api.extension.BeforeEachCallback; import org.junit.jupiter.api.extension.ExtensionContext; import java.util.Optional; @@ -22,7 +23,7 @@ /** * BeforeEachCallback for Use case test */ -public class ExtensionContextProvider implements BeforeEachCallback { +public class ExtensionContextProvider implements BeforeEachCallback, AfterEachCallback { private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); @@ -46,4 +47,13 @@ public static Optional getExtensionContext() { public static void clearExtensionContext() { CONTEXT_HOLDER.remove(); } + + /** + * + * @param context + */ + @Override + public void afterEach(ExtensionContext context) { + ExtensionContextProvider.clearExtensionContext(); + } }