|
31 | 31 | import org.junit.jupiter.api.TestInstance; |
32 | 32 | import org.junit.jupiter.api.extension.ExecutionCondition; |
33 | 33 | import org.junit.jupiter.api.extension.Extension; |
| 34 | +import org.junit.jupiter.api.extension.ExtensionConfigurationException; |
34 | 35 | import org.junit.jupiter.api.extension.ExtensionContext; |
35 | 36 | import org.junit.jupiter.api.extension.TestInstantiationAwareExtension; |
36 | 37 | import org.junit.jupiter.api.io.CleanupMode; |
@@ -64,61 +65,67 @@ public String getId() { |
64 | 65 |
|
65 | 66 | @Override |
66 | 67 | public TestDescriptor discover(EngineDiscoveryRequest discoveryRequest, UniqueId uniqueId) { |
67 | | - final BytecodeEnhancedEngineDescriptor engineDescriptor = new BytecodeEnhancedEngineDescriptor( |
68 | | - (JupiterEngineDescriptor) new JupiterTestEngine().discover( discoveryRequest, uniqueId ) |
69 | | - ); |
70 | | - |
71 | | - for ( TestDescriptor testDescriptor : new HashSet<>( engineDescriptor.getChildren() ) ) { |
72 | | - if ( testDescriptor instanceof ClassBasedTestDescriptor ) { |
73 | | - try { |
74 | | - ClassBasedTestDescriptor descriptor = (ClassBasedTestDescriptor) testDescriptor; |
75 | | - // if the test class is annotated with @BytecodeEnhanced |
76 | | - // we replace the descriptor with the new one that will point to an enhanced test class, |
77 | | - // this also means that we need to add all the child descriptors back as well... |
78 | | - // Then on the extension side we set the classloader that contains the enhanced test class |
79 | | - // and set it back to the original once the test class is destroyed. |
80 | | - Optional<BytecodeEnhanced> bytecodeEnhanced = findAnnotation( |
81 | | - descriptor.getTestClass(), BytecodeEnhanced.class ); |
82 | | - if ( bytecodeEnhanced.isPresent() ) { |
83 | | - TestDescriptor parent = descriptor.getParent().orElseThrow( IllegalStateException::new ); |
84 | | - Class<?> klass = descriptor.getTestClass(); |
85 | | - |
86 | | - JupiterConfiguration jc = ( (JupiterEngineDescriptor) parent ).getConfiguration(); |
87 | | - |
88 | | - String[] testEnhancedClasses = Arrays.stream( bytecodeEnhanced.get().testEnhancedClasses() ) |
89 | | - .map( Class::getName ).toArray( String[]::new ); |
90 | | - |
91 | | - // NOTE: get children before potentially removing from hierarchy, since after that there will be none. |
92 | | - Set<? extends TestDescriptor> children = new HashSet<>( descriptor.getChildren() ); |
93 | | - if ( !bytecodeEnhanced.get().runNotEnhancedAsWell() ) { |
94 | | - descriptor.removeFromHierarchy(); |
95 | | - } |
96 | | - |
97 | | - Map<Object, Class<?>> classes = enhanceTestClass( klass ); |
98 | | - if ( classes.size() == 1 ) { |
99 | | - replaceWithEnhanced( classes.values().iterator().next(), descriptor, jc, children, parent, testEnhancedClasses ); |
100 | | - } |
101 | | - else { |
102 | | - for ( Map.Entry<Object, Class<?>> entry : classes.entrySet() ) { |
103 | | - replaceWithEnhanced( |
104 | | - entry.getValue(), descriptor, jc, children, parent, testEnhancedClasses, entry.getKey() ); |
105 | | - } |
106 | | - } |
107 | | - |
108 | | - addEnhancementCheck( false, testEnhancedClasses, descriptor, jc ); |
109 | | - } |
110 | | - else { |
111 | | - testDescriptor.removeFromHierarchy(); |
112 | | - } |
113 | | - } |
114 | | - catch (ClassNotFoundException | NoSuchMethodException e) { |
115 | | - throw new RuntimeException( e ); |
116 | | - } |
117 | | - } |
118 | | - } |
119 | | - |
120 | | - return engineDescriptor; |
121 | | - } |
| 68 | + try { |
| 69 | + final BytecodeEnhancedEngineDescriptor engineDescriptor = new BytecodeEnhancedEngineDescriptor( |
| 70 | + (JupiterEngineDescriptor) new JupiterTestEngine().discover( discoveryRequest, uniqueId ) |
| 71 | + ); |
| 72 | + |
| 73 | + for ( TestDescriptor testDescriptor : new HashSet<>( engineDescriptor.getChildren() ) ) { |
| 74 | + if ( testDescriptor instanceof ClassBasedTestDescriptor ) { |
| 75 | + try { |
| 76 | + ClassBasedTestDescriptor descriptor = (ClassBasedTestDescriptor) testDescriptor; |
| 77 | + // if the test class is annotated with @BytecodeEnhanced |
| 78 | + // we replace the descriptor with the new one that will point to an enhanced test class, |
| 79 | + // this also means that we need to add all the child descriptors back as well... |
| 80 | + // Then on the extension side we set the classloader that contains the enhanced test class |
| 81 | + // and set it back to the original once the test class is destroyed. |
| 82 | + Optional<BytecodeEnhanced> bytecodeEnhanced = findAnnotation( |
| 83 | + descriptor.getTestClass(), BytecodeEnhanced.class ); |
| 84 | + if ( bytecodeEnhanced.isPresent() ) { |
| 85 | + TestDescriptor parent = descriptor.getParent().orElseThrow( IllegalStateException::new ); |
| 86 | + Class<?> klass = descriptor.getTestClass(); |
| 87 | + |
| 88 | + JupiterConfiguration jc = ( (JupiterEngineDescriptor) parent ).getConfiguration(); |
| 89 | + |
| 90 | + String[] testEnhancedClasses = Arrays.stream( bytecodeEnhanced.get().testEnhancedClasses() ) |
| 91 | + .map( Class::getName ).toArray( String[]::new ); |
| 92 | + |
| 93 | + // NOTE: get children before potentially removing from hierarchy, since after that there will be none. |
| 94 | + Set<? extends TestDescriptor> children = new HashSet<>( descriptor.getChildren() ); |
| 95 | + if ( !bytecodeEnhanced.get().runNotEnhancedAsWell() ) { |
| 96 | + descriptor.removeFromHierarchy(); |
| 97 | + } |
| 98 | + |
| 99 | + Map<Object, Class<?>> classes = enhanceTestClass( klass ); |
| 100 | + if ( classes.size() == 1 ) { |
| 101 | + replaceWithEnhanced( classes.values().iterator().next(), descriptor, jc, children, parent, testEnhancedClasses ); |
| 102 | + } |
| 103 | + else { |
| 104 | + for ( Map.Entry<Object, Class<?>> entry : classes.entrySet() ) { |
| 105 | + replaceWithEnhanced( |
| 106 | + entry.getValue(), descriptor, jc, children, parent, testEnhancedClasses, entry.getKey() ); |
| 107 | + } |
| 108 | + } |
| 109 | + |
| 110 | + addEnhancementCheck( false, testEnhancedClasses, descriptor, jc ); |
| 111 | + } |
| 112 | + else { |
| 113 | + testDescriptor.removeFromHierarchy(); |
| 114 | + } |
| 115 | + } |
| 116 | + catch (ClassNotFoundException | NoSuchMethodException e) { |
| 117 | + throw new RuntimeException( e ); |
| 118 | + } |
| 119 | + } |
| 120 | + } |
| 121 | + |
| 122 | + return engineDescriptor; |
| 123 | + } catch (OutOfMemoryError e) { |
| 124 | + throw e; |
| 125 | + } catch (Error e) { |
| 126 | + throw new ExtensionConfigurationException("Encountered a problem when enhancing the test classes. It is highly likely that @BytecodeEnhanced extension is incompatible with the provided version of JUnit.", e); |
| 127 | + } |
| 128 | + } |
122 | 129 |
|
123 | 130 | private void addEnhancementCheck(boolean enhance, String[] testEnhancedClasses, |
124 | 131 | ClassBasedTestDescriptor descriptor, JupiterConfiguration jc) { |
|
0 commit comments