Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bnd-testing-maven-plugin:7.0.0-SNAPSHOT:testing goal fails for certain tests #5568

Closed
wborn opened this issue Feb 25, 2023 · 22 comments · Fixed by #5743 or #5744
Closed

bnd-testing-maven-plugin:7.0.0-SNAPSHOT:testing goal fails for certain tests #5568

wborn opened this issue Feb 25, 2023 · 22 comments · Fixed by #5743 or #5744

Comments

@wborn
Copy link
Contributor

wborn commented Feb 25, 2023

I gave the 7.0.0-SNAPSHOT builds a test on openhab-core but it seems some tests now fail which work fine with 6.4.0.

It looks like there are some classloader issues:

[INFO] --- bnd-testing-maven-plugin:7.0.0-SNAPSHOT:testing (default) @ org.openhab.core.ephemeris.tests ---
[INFO] Matching glob *
[INFO] Testing /home/wouter/git/openhab/openhab-core/itests/org.openhab.core.ephemeris.tests/itest.bndrun:
org.openhab.core.ephemeris [org.openhab.core.ephemeris.internal.EphemerisManagerImpl] WARN : Erroneous day set definition dayset-weekend: No enum constant java.time.DayOfWeek.MONDAX
jollyday [de.jollyday.util.ClassLoadingUtil] WARN : Could not load class with current threads context classloader. Using default. Reason: ClassNotFoundException: de.jollyday.impl.DefaultHolidayManager cannot be found by biz.aQute.tester.junit-platform_7.0.0.202302132255-SNAPSHOT
jollyday [de.jollyday.util.ClassLoadingUtil] WARN : Could not load class with current threads context classloader. Using default. Reason: ClassNotFoundException: de.jollyday.datasource.impl.XmlFileDataSource cannot be found by biz.aQute.tester.junit-platform_7.0.0.202302132255-SNAPSHOT
jollyday [de.jollyday.util.XMLUtil] WARN : Could not create JAXB context using the current threads context classloader. Falling back to ObjectFactory class classloader.
jollyday [de.jollyday.util.ClassLoadingUtil] WARN : Could not load class with current threads context classloader. Using default. Reason: ClassNotFoundException: de.jollyday.parser.impl.ChristianHolidayParser cannot be found by biz.aQute.tester.junit-platform_7.0.0.202302132255-SNAPSHOT
jollyday [de.jollyday.util.ClassLoadingUtil] WARN : Could not load class with current threads context classloader. Using default. Reason: ClassNotFoundException: de.jollyday.parser.impl.FixedParser cannot be found by biz.aQute.tester.junit-platform_7.0.0.202302132255-SNAPSHOT
TEST org.openhab.core.ephemeris.internal.EphemerisManagerImplOSGiTest#testNextBankHoliday() <<< ERROR: Can't find bundle for base name descriptions.holiday_descriptions, locale en_US
java.util.MissingResourceException: Can't find bundle for base name descriptions.holiday_descriptions, locale en_US
	at java.base/java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:2045)
	at java.base/java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1683)
	at java.base/java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1586)
	at java.base/java.util.ResourceBundle.getBundle(ResourceBundle.java:1280)
	at de.jollyday.util.ResourceUtil.getResourceBundle(ResourceUtil.java:174)
	at de.jollyday.util.ResourceUtil.getHolidayDescriptions(ResourceUtil.java:152)
	at de.jollyday.util.ResourceUtil.getHolidayDescription(ResourceUtil.java:83)
	at org.openhab.core.ephemeris.internal.EphemerisManagerImpl.getHolidayDescription(EphemerisManagerImpl.java:419)
	at org.openhab.core.ephemeris.internal.EphemerisManagerImplOSGiTest.testNextBankHoliday(EphemerisManagerImplOSGiTest.java:289)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
	at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at aQute.tester.bundle.engine.BundleDescriptor.executeChild(BundleDescriptor.java:49)
	at aQute.tester.bundle.engine.BundleEngine.lambda$executeBundle$7(BundleEngine.java:120)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at aQute.tester.bundle.engine.BundleEngine.executeBundle(BundleEngine.java:120)
	at aQute.tester.bundle.engine.BundleEngine.lambda$executeBundle$8(BundleEngine.java:133)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at aQute.tester.bundle.engine.BundleEngine.executeBundle(BundleEngine.java:133)
	at aQute.tester.bundle.engine.BundleEngine.lambda$execute$5(BundleEngine.java:100)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at aQute.tester.bundle.engine.BundleEngine.execute(BundleEngine.java:100)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
	at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
	at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)
	at aQute.tester.junit.platform.Activator.test(Activator.java:447)
	at aQute.tester.junit.platform.Activator.automatic(Activator.java:351)
	at aQute.tester.junit.platform.Activator.run(Activator.java:220)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
	at aQute.launcher.Launcher.handleMainCallable(Launcher.java:464)
	at aQute.launcher.Launcher.launch(Launcher.java:437)
	at aQute.launcher.Launcher.run(Launcher.java:185)
	at aQute.launcher.Launcher.main(Launcher.java:161)
	at aQute.launcher.pre.EmbeddedLauncher.executeWithRunPath(EmbeddedLauncher.java:170)
	at aQute.launcher.pre.EmbeddedLauncher.findAndExecute(EmbeddedLauncher.java:135)
	at aQute.launcher.pre.EmbeddedLauncher.main(EmbeddedLauncher.java:52)
TEST org.openhab.core.ephemeris.internal.EphemerisManagerImplOSGiTest#testGetBankHoliday() <<< ERROR: Can't find bundle for base name descriptions.holiday_descriptions, locale en_US
java.util.MissingResourceException: Can't find bundle for base name descriptions.holiday_descriptions, locale en_US
	at java.base/java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:2045)
	at java.base/java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1683)
	at java.base/java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1586)
	at java.base/java.util.ResourceBundle.getBundle(ResourceBundle.java:1280)
	at de.jollyday.util.ResourceUtil.getResourceBundle(ResourceUtil.java:174)
	at de.jollyday.util.ResourceUtil.getHolidayDescriptions(ResourceUtil.java:152)
	at de.jollyday.util.ResourceUtil.getHolidayDescription(ResourceUtil.java:83)
	at org.openhab.core.ephemeris.internal.EphemerisManagerImpl.getHolidayDescription(EphemerisManagerImpl.java:419)
	at org.openhab.core.ephemeris.internal.EphemerisManagerImplOSGiTest.testGetBankHoliday(EphemerisManagerImplOSGiTest.java:276)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
	at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at aQute.tester.bundle.engine.BundleDescriptor.executeChild(BundleDescriptor.java:49)
	at aQute.tester.bundle.engine.BundleEngine.lambda$executeBundle$7(BundleEngine.java:120)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at aQute.tester.bundle.engine.BundleEngine.executeBundle(BundleEngine.java:120)
	at aQute.tester.bundle.engine.BundleEngine.lambda$executeBundle$8(BundleEngine.java:133)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at aQute.tester.bundle.engine.BundleEngine.executeBundle(BundleEngine.java:133)
	at aQute.tester.bundle.engine.BundleEngine.lambda$execute$5(BundleEngine.java:100)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at aQute.tester.bundle.engine.BundleEngine.execute(BundleEngine.java:100)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
	at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
	at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)
	at aQute.tester.junit.platform.Activator.test(Activator.java:447)
	at aQute.tester.junit.platform.Activator.automatic(Activator.java:351)
	at aQute.tester.junit.platform.Activator.run(Activator.java:220)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
	at aQute.launcher.Launcher.handleMainCallable(Launcher.java:464)
	at aQute.launcher.Launcher.launch(Launcher.java:437)
	at aQute.launcher.Launcher.run(Launcher.java:185)
	at aQute.launcher.Launcher.main(Launcher.java:161)
	at aQute.launcher.pre.EmbeddedLauncher.executeWithRunPath(EmbeddedLauncher.java:170)
	at aQute.launcher.pre.EmbeddedLauncher.findAndExecute(EmbeddedLauncher.java:135)
	at aQute.launcher.pre.EmbeddedLauncher.main(EmbeddedLauncher.java:52)
jollyday [de.jollyday.util.ClassLoadingUtil] WARN : Could not load class with current threads context classloader. Using default. Reason: ClassNotFoundException: de.jollyday.impl.DefaultHolidayManager cannot be found by biz.aQute.tester.junit-platform_7.0.0.202302132255-SNAPSHOT
jollyday [de.jollyday.util.ClassLoadingUtil] WARN : Could not load class with current threads context classloader. Using default. Reason: ClassNotFoundException: de.jollyday.datasource.impl.XmlFileDataSource cannot be found by biz.aQute.tester.junit-platform_7.0.0.202302132255-SNAPSHOT
jollyday [de.jollyday.util.XMLUtil] WARN : Could not create JAXB context using the current threads context classloader. Falling back to ObjectFactory class classloader.
jollyday [de.jollyday.util.ClassLoadingUtil] WARN : Could not load class with current threads context classloader. Using default. Reason: ClassNotFoundException: de.jollyday.parser.impl.FixedParser cannot be found by biz.aQute.tester.junit-platform_7.0.0.202302132255-SNAPSHOT
jollyday [de.jollyday.util.ClassLoadingUtil] WARN : Could not load class with current threads context classloader. Using default. Reason: ClassNotFoundException: de.jollyday.parser.impl.FixedWeekdayInMonthParser cannot be found by biz.aQute.tester.junit-platform_7.0.0.202302132255-SNAPSHOT
[INFO] 2 Error(s)
[ERROR] Error   : Exit code remote process 2: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -cp /home/wouter/git/openhab/openhab-core/itests/org.openhab.core.ephemeris.tests/target/test/tmp/testing/itest/cnf/cache/7.0.0/bnd-cache/biz.aQute.launcher/biz.aQute.launcher.pre.jar -Dlauncher.properties=/home/wouter/git/openhab/openhab-core/itests/org.openhab.core.ephemeris.tests/target/test/tmp/testing/itest/generated/launch13000258856525847729.properties -Dorg.osgi.service.http.port=41299 --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED --add-opens=java.base/java.time=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.desktop/java.awt.font=ALL-UNNAMED --add-opens=java.naming/javax.naming.spi=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED -ea -Dlauncher.runpath=/home/wouter/git/openhab/openhab-core/itests/org.openhab.core.ephemeris.tests/target/test/tmp/testing/itest/cnf/cache/7.0.0/org.openhab.core.bom.runtime-index/org.eclipse.osgi-3.17.200.v20220215-2237.jar,/home/wouter/git/openhab/openhab-core/itests/org.openhab.core.ephemeris.tests/target/test/tmp/testing/itest/cnf/cache/7.0.0/bnd-cache/biz.aQute.launcher/biz.aQute.launcher-7.0.0.jar aQute.launcher.pre.EmbeddedLauncher

Logging of another test having issues:

[INFO] --- bnd-testing-maven-plugin:7.0.0-SNAPSHOT:testing (default) @ org.openhab.core.model.thing.tests ---
[INFO] Matching glob *
[INFO] Testing /home/wouter/git/openhab/openhab-core/itests/org.openhab.core.model.thing.tests/itest.bndrun:
org.openhab.core.transform [org.openhab.core.transform.FileTransformationProvider] WARN : Could not list files in 'conf/transform', transformation configurations might be missing: conf/transform
TEST org.openhab.core.model.thing.test.GenericItemChannelLinkProviderJavaTest#testLinkConfiguration() <<< ERROR: Unable to provision, see the following errors:

1) [Guice/ErrorInjectingConstructor]: WrappedException: RuntimeException: Cannot create a resource for 'http://www.eclipse.org/2008/Xtext'; a registered resource factory is needed
  at ThingGrammarAccess.<init>(ThingGrammarAccess.java:889)
  at ThingGrammarAccess.class(ThingGrammarAccess.java:889)
  while locating ThingGrammarAccess
  at LazyLinker.grammarAccess(LazyLinker.java:300)
      \_ for field grammarAccess
  while locating LazyLinker
  at XtextResource.linker(XtextResource.java:474)
      \_ for field linker
  while locating LazyLinkingResource
  while locating XtextResource

Learn more:
  https://github.com/google/guice/wiki/ERROR_INJECTING_CONSTRUCTOR

1 error

======================
Full classname legend:
======================
LazyLinker:          "org.eclipse.xtext.linking.lazy.LazyLinker"
LazyLinkingResource: "org.eclipse.xtext.linking.lazy.LazyLinkingResource"
ThingGrammarAccess:  "org.openhab.core.model.thing.services.ThingGrammarAccess"
WrappedException:    "org.eclipse.emf.common.util.WrappedException"
XtextResource:       "org.eclipse.xtext.resource.XtextResource"
========================
End of classname legend:
========================

com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) [Guice/ErrorInjectingConstructor]: WrappedException: RuntimeException: Cannot create a resource for 'http://www.eclipse.org/2008/Xtext'; a registered resource factory is needed
  at ThingGrammarAccess.<init>(ThingGrammarAccess.java:889)
  at ThingGrammarAccess.class(ThingGrammarAccess.java:889)
  while locating ThingGrammarAccess
  at LazyLinker.grammarAccess(LazyLinker.java:300)
      \_ for field grammarAccess
  while locating LazyLinker
  at XtextResource.linker(XtextResource.java:474)
      \_ for field linker
  while locating LazyLinkingResource
  while locating XtextResource

Learn more:
  https://github.com/google/guice/wiki/ERROR_INJECTING_CONSTRUCTOR

1 error

======================
Full classname legend:
======================
LazyLinker:          "org.eclipse.xtext.linking.lazy.LazyLinker"
LazyLinkingResource: "org.eclipse.xtext.linking.lazy.LazyLinkingResource"
ThingGrammarAccess:  "org.openhab.core.model.thing.services.ThingGrammarAccess"
WrappedException:    "org.eclipse.emf.common.util.WrappedException"
XtextResource:       "org.eclipse.xtext.resource.XtextResource"
========================
End of classname legend:
========================

	at com.google.inject.internal.InternalProvisionException.toProvisionException(InternalProvisionException.java:251)
	at com.google.inject.internal.InjectorImpl$1.get(InjectorImpl.java:1103)
	at org.eclipse.xtext.resource.XtextResourceFactory.createResource(XtextResourceFactory.java:28)
	at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.createResource(ResourceSetImpl.java:434)
	at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.createResource(ResourceSetImpl.java:423)
	at org.eclipse.xtext.resource.SynchronizedXtextResourceSet.createResource(SynchronizedXtextResourceSet.java:40)
	at org.openhab.core.model.core.internal.ModelRepositoryImpl.validateModel(ModelRepositoryImpl.java:260)
	at org.openhab.core.model.core.internal.ModelRepositoryImpl.addOrRefreshModel(ModelRepositoryImpl.java:105)
	at org.openhab.core.model.thing.test.GenericItemChannelLinkProviderJavaTest.testLinkConfiguration(GenericItemChannelLinkProviderJavaTest.java:189)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
	at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at aQute.tester.bundle.engine.BundleDescriptor.executeChild(BundleDescriptor.java:49)
	at aQute.tester.bundle.engine.BundleEngine.lambda$executeBundle$7(BundleEngine.java:120)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at aQute.tester.bundle.engine.BundleEngine.executeBundle(BundleEngine.java:120)
	at aQute.tester.bundle.engine.BundleEngine.lambda$executeBundle$8(BundleEngine.java:133)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at aQute.tester.bundle.engine.BundleEngine.executeBundle(BundleEngine.java:133)
	at aQute.tester.bundle.engine.BundleEngine.lambda$execute$5(BundleEngine.java:100)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at aQute.tester.bundle.engine.BundleEngine.execute(BundleEngine.java:100)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
	at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
	at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)
	at aQute.tester.junit.platform.Activator.test(Activator.java:447)
	at aQute.tester.junit.platform.Activator.automatic(Activator.java:351)
	at aQute.tester.junit.platform.Activator.run(Activator.java:220)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
	at aQute.launcher.Launcher.handleMainCallable(Launcher.java:464)
	at aQute.launcher.Launcher.launch(Launcher.java:437)
	at aQute.launcher.Launcher.run(Launcher.java:185)
	at aQute.launcher.Launcher.main(Launcher.java:161)
	at aQute.launcher.pre.EmbeddedLauncher.executeWithRunPath(EmbeddedLauncher.java:170)
	at aQute.launcher.pre.EmbeddedLauncher.findAndExecute(EmbeddedLauncher.java:135)
	at aQute.launcher.pre.EmbeddedLauncher.main(EmbeddedLauncher.java:52)
Caused by: org.eclipse.emf.common.util.WrappedException: java.lang.RuntimeException: Cannot create a resource for 'http://www.eclipse.org/2008/Xtext'; a registered resource factory is needed
	at org.eclipse.xtext.parser.BaseEPackageAccess.loadResource(BaseEPackageAccess.java:58)
	at org.eclipse.xtext.parser.BaseEPackageAccess.loadGrammarFile(BaseEPackageAccess.java:45)
	at org.eclipse.xtext.service.GrammarProvider.doGetGrammar(GrammarProvider.java:71)
	at org.eclipse.xtext.service.GrammarProvider.getGrammar(GrammarProvider.java:53)
	at org.openhab.core.model.thing.services.ThingGrammarAccess.internalFindGrammar(ThingGrammarAccess.java:914)
	at org.openhab.core.model.thing.services.ThingGrammarAccess.<init>(ThingGrammarAccess.java:890)
	at org.openhab.core.model.thing.services.ThingGrammarAccess$$FastClassByGuice$$122369758.GUICE$TRAMPOLINE(<generated>)
	at org.openhab.core.model.thing.services.ThingGrammarAccess$$FastClassByGuice$$122369758.apply(<generated>)
	at com.google.inject.internal.DefaultConstructionProxyFactory$FastClassProxy.newInstance(DefaultConstructionProxyFactory.java:82)
	at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:114)
	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:296)
	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
	at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:169)
	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:45)
	at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:60)
	at com.google.inject.internal.SingleFieldInjector.inject(SingleFieldInjector.java:50)
	at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:146)
	at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:124)
	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:296)
	at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:60)
	at com.google.inject.internal.SingleFieldInjector.inject(SingleFieldInjector.java:50)
	at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:146)
	at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:124)
	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:296)
	at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:60)
	at com.google.inject.internal.InjectorImpl$1.get(InjectorImpl.java:1100)
	... 120 more
Caused by: java.lang.RuntimeException: Cannot create a resource for 'http://www.eclipse.org/2008/Xtext'; a registered resource factory is needed
	at org.eclipse.xtext.resource.XtextResourceSet.getResource(XtextResourceSet.java:263)
	at org.eclipse.xtext.resource.SynchronizedXtextResourceSet.getResource(SynchronizedXtextResourceSet.java:33)
	at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.getEObject(ResourceSetImpl.java:220)
	at org.eclipse.emf.ecore.resource.impl.BinaryResourceImpl$EObjectInputStream.readEPackage(BinaryResourceImpl.java:2061)
	at org.eclipse.emf.ecore.resource.impl.BinaryResourceImpl$EObjectInputStream.readEClass(BinaryResourceImpl.java:2110)
	at org.eclipse.emf.ecore.resource.impl.BinaryResourceImpl$EObjectInputStream.loadEObject(BinaryResourceImpl.java:2495)
	at org.eclipse.emf.ecore.resource.impl.BinaryResourceImpl$EObjectInputStream.loadResource(BinaryResourceImpl.java:2219)
	at org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.doLoad(XMLResourceImpl.java:219)
	at org.eclipse.emf.ecore.resource.impl.ResourceImpl.load(ResourceImpl.java:1563)
	at org.eclipse.emf.ecore.resource.impl.ResourceImpl.load(ResourceImpl.java:1342)
	at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoad(ResourceSetImpl.java:259)
	at org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.demandLoadHelper(ResourceSetImpl.java:274)
	at org.eclipse.xtext.resource.XtextResourceSet.getResource(XtextResourceSet.java:266)
	at org.eclipse.xtext.resource.SynchronizedXtextResourceSet.getResource(SynchronizedXtextResourceSet.java:33)
	at org.eclipse.xtext.parser.BaseEPackageAccess.loadResource(BaseEPackageAccess.java:53)
	... 148 more

It can be reproduced using my openhab-core bnd-7 branch as follows:

git clone --single-branch --branch bnd-7 https://github.com/wborn/openhab-core
cd openhab-core
mvn clean install -DskipChecks=true -DskipTests=true -Dfeatures.verify.skip=true -nsu -T 1.5C

cd itests/org.openhab.core.ephemeris.tests
mvn verify

cd ../org.openhab.core.model.item.tests
mvn verify

Tested using Java 17 (Temurin) on macOS 12, Ubuntu 22.04 and Windows 2022.
See also this GHA build: https://github.com/wborn/openhab-core/actions/runs/4270878268/jobs/7434962625

@pkriens
Copy link
Member

pkriens commented Feb 27, 2023

Could you diagnose the exact reason why the resource is not found? Is it not in the bundle?

@pkriens
Copy link
Member

pkriens commented Mar 3, 2023

@wborn any news about what the problem is?

@wborn
Copy link
Contributor Author

wborn commented Mar 4, 2023

If I look at the code it uses the Thread.currentThread().getContextClassLoader(). So most likely that behaves differently with Bnd 7.

I see it is using a EquinoxClassLoader which cannot be cast to an URLClassLoader. So it is a bit difficult to figure out what classpath is used.

I also tried to get some more Equinox debug output by adding a VM arg -Dosgi.debug=debug.properties and settings some properties in the file like:

org.eclipse.osgi/debug=true
org.eclipse.osgi/debug/loader=true

However it doesn't print any addtional debug output.

I also tried setting a breakpoint in Eclipse and inspect the classloader that way, however I wasn't able to debug that way due to an Exception when launching the test in Eclipse 2022-03:

Screenshot from 2023-03-04 10-37-17

Maybe you know a way to troubleshoot this?

@pkriens
Copy link
Member

pkriens commented Mar 13, 2023

Hmm. It depends very much on the setup?

The error you get is that the biz.aQute.tester jar is not found on the -runpath (class path of the VM). This Jar is normally included in the bnd distribution. For the bnd workspace model you can see them in the ./cnf/cache directory. However, this is pretty basic, testing won't even start. So I am not sure how I can rhyme this with the first exception?

@pkriens
Copy link
Member

pkriens commented Mar 17, 2023

Ping?

@wborn
Copy link
Contributor Author

wborn commented Mar 18, 2023

Sorry I currently don't have a lot of time to further debug this. You probably know how that goes as fellow OSS maintainer. 😉

@pkriens
Copy link
Member

pkriens commented May 26, 2023

Any idea when we can do something?

@pkriens
Copy link
Member

pkriens commented Jul 21, 2023

When you want to work on this, please reopen. Notice that we will release in the coming month

@pkriens pkriens closed this as not planned Won't fix, can't repro, duplicate, stale Jul 21, 2023
@wborn
Copy link
Contributor Author

wborn commented Jul 31, 2023

Hi @pkriens!

It seems that the classloader issues are caused by this commit 6da959b (#5480)
There are no classloader issues in our tests if I build and use 7.0.0-SNAPSHOT using the commit before that one (20c1a07).

I don't see a button to reopen this issue but maybe you have one.

@wborn
Copy link
Contributor Author

wborn commented Jul 31, 2023

I see there is even a commit in that PR to change class loaders: 859636b

@wborn
Copy link
Contributor Author

wborn commented Jul 31, 2023

Perhaps the class loader change is no longer necessary for JUnit because there were also some fixes regarding this in JUnit, see:

https://bnd.discourse.group/t/classnotfoundexception-when-using-junit-5-parametrizedtest-with-methodsource-on-java-11-with-bnd/314

WDYT @kriegfrj?

@kriegfrj
Copy link
Contributor

kriegfrj commented Aug 3, 2023

Sorry @wborn, I'm late to the party (again) and I've only just seen your message.

I can't comment with certainty as I have not had (and likely will not have) time for a deep-dive on this. However, I suspect that the problem that @bjhargrave was trying to solve with 859636b related to the loading of custom plugins - JUnit 5 (and in particular the Jupiter engine) uses the serviceloader as one mechanism to load custom plugins. This is different to the issue mentioned in https://bnd.discourse.group/t/classnotfoundexception-when-using-junit-5-parametrizedtest-with-methodsource-on-java-11-with-bnd/314, which is not about loading plugins but about loading test classes and their associated annotations. I don't think that junit-team/junit5#3297 will solve this particular problem.

I'm also not sure how the TCCL classloader trick here will solve any serviceloader issue with JUnit. The way it is written, it will mean that biz.aQute.tester.junit-platform's classloader will be used to attempt to load the serviceloader implementations, but I don't see how that will help because that bundle is unlikely to import any custom serviceloader implementations and so they still won't be able to be loaded. It would be nice if @bjhargrave can weigh in with the use case he had in mind when he made this change.

Also with regard to the screenshot that you have of the ClassNotFoundException - I think that the most interesting part of that stack trace might be further down. Sometimes a ClassNotFoundException is actually caused not when the class itself cannot be found, but when a transitive dependency cannot be found. If this is the case, then the missing transitive dependency that caused the error is usually found in the chained "Cause" exception (usually a NoClassDefFoundError or ExceptionInInitializerError or something like that). If you could scroll down from your screenshot and see if there is a chained "cause" exception to the CNFE, that might be helpful. Blessings!

@bjhargrave
Copy link
Member

bjhargrave commented Aug 3, 2023

It would be nice if @bjhargrave can weigh in with the use case he had in mind when he made this change.

I don't recall the specific reason for the change to set the TCCL but I will assume it was necessary for update of the JUnit 5 version when updating to Eclipse 4.25. I think the issue was that the updated JUnit 5 version did not find the ServiceLoader resource for the bnd test engine so that it would be loaded.

It is possible the fix will need to set the TCCL to a "composite" class loader which will look in both the bundle's class loader (to find bnd test engine) and the original TCCL (to handle the case identified here).

@bjhargrave bjhargrave reopened this Aug 3, 2023
@pkriens
Copy link
Member

pkriens commented Aug 7, 2023

@bjhargrave since you reopened it, are you planning to work on it?

bjhargrave added a commit to bjhargrave/bnd that referenced this issue Aug 7, 2023
We use CompositeClassLoader to composite the tester bundle's class
loader with the original TCCL when loading and executing tests. This
will provide visibility classes and resource from the original TCCL.

Fixes bndtools#5568

Signed-off-by: BJ Hargrave <[email protected]>
@bjhargrave
Copy link
Member

@wborn Please check if the fix in PR #5743 addresses this issue for you.

bjhargrave added a commit to bjhargrave/bnd that referenced this issue Aug 7, 2023
We use CompositeClassLoader to composite the tester bundle's class
loader with the original TCCL when loading and executing tests. This
will provide visibility classes and resource from the original TCCL.

Fixes bndtools#5568

Signed-off-by: BJ Hargrave <[email protected]>
@kriegfrj
Copy link
Contributor

kriegfrj commented Aug 8, 2023

Hi team,

Sorry I'm late to the party again, but I've had a deeper dive on this.

I went to the trouble of going back and reverting the TCCL hack to try and understand why we introduced it in the first place.

It seems that the reason the classloader switch was brought in was to make the tests pass once we upped the minimum dependency to Eclipse 4.25. What happened is that the later version of Eclipse brought a later version of JUnit-Platform (1.9.0), which was using the ServiceLoader mechanism to find implementations of TestEngine, TestExecutionListener etc. The tests started failing because of a peculiarity of the Launchpad test harness that we were using. In Launchpad, each test fires up and starts an OSGi framework. So we have JUnit in the launching environment (which is executing the test), and another instance of JUnit inside the started OSGi framework which is part of the system-under-test. We have taken steps (both in the core Launchpad and in the biz.aQute.tester.test test bundle) to isolate the test harness from the system-under-test, but as they are running in the same JVM this isolation cannot be total. In particular, all of the java.* classes will inevitably be common to both the system-under-test and the test harness. This includes java.util.ServiceLoader, because it is one of those classes that leaks across the isolation barrier. So what is happening is that the LauncherFactory.create() call from aQute.tester.junit.platform.Activator is actually finding TestExecutionListeners that are registered in the test harness and are bound to TestExecutionListener class in the test harness, which comes from a different bundle than the one installed inside the system-under-test. Hence we get ServiceConfigurationError unless we set the TCCL before calling ServiceLoader.load().

I think that this is primarily a problem created by the use of Launchpad and the presence of two different junit-platform-launcher bundles. In my own local build, I reverted 859636b and although the Launchpad tests fail, when I deploy it into the test instance of Eclipse 4.25 and put it through its paces in there everything runs fine. So I think that the TCCL trick will be mostly not be needed (if at all) in the real world - the only case would be in a framework with multiple versions of JUnit Platform installed, but this seems an unlikely possibility. But if we are to keep it for those remote possibilities (as well as keeping the Launchpad tests happy), I propose the following changes:

  1. Set the TCCL to the classloader of junit-platform-launcher bundle rather than to the biz.aQute.tester.junit-platform classloader. While I think that using biz.aQute.tester.junit-platform bundle may well work (because it will import most of the necessary dependencies), I think it will be more robust if we use the bundle itself which (should) always have the right dependencies.
  2. Reduce the scope of the TCCL change to the minimum necessary. I think we should basically wrap the call to create(), rather than the entire execution path.

I think that the second point in particular will solve the classloader-related issues that you had in your tests.

@wborn, if you get a chance, can you try out #5744 and see if that fixes your problem too?

@bjhargrave
Copy link
Member

  1. Set the TCCL to the classloader of junit-platform-launcher bundle rather than to the biz.aQute.tester.junit-platform classloader.

How does that allow ServiceLoader to find the bnd engine? biz.aQute.tester.junit-platform bundle will have visibility to junit-platform-launcher so I think, unless there is a compelling reason otherwise, it is more fool-proof to use the biz.aQute.tester.junit-platform bundle's class loader.

2. Reduce the scope of the TCCL change to the minimum necessary.

OK, but I am not sure what this buys you. Is there a real reason to limit the scope?

@wborn
Copy link
Contributor Author

wborn commented Aug 8, 2023

Thank you for having a look! 👍

Please check if the fix in PR #5743 addresses this issue for you.

With this fix the same tests keep failing for the same reasons.

can you try out #5744 and see if that fixes your problem too?

This fix solves all the class loader issues in our tests.

@bjhargrave
Copy link
Member

can you try out #5744 and see if that fixes your problem too?

This fix solves all the class loader issues in our tests.

Nicely done @kriegfrj :-)

@kriegfrj
Copy link
Contributor

kriegfrj commented Aug 9, 2023

  1. Set the TCCL to the classloader of junit-platform-launcher bundle rather than to the biz.aQute.tester.junit-platform classloader.

How does that allow ServiceLoader to find the bnd engine?

biz.aQute.tester.junit-platform does its best to completely circumvent junit-platform-launcher's inbuilt test engine discovery via the ServiceLoader mechanism so that it can interpose itself between junit-platform-launcher and the other test engines. It needs to do this because otherwise the non-OSGi-aware test engines will not know how to find/load their test classes.

biz.aQute.tester.junit-platform circumvents the ServiceLoader mechanism for test engines by calling enableTestEngineAutoRegistration(false) and then by directly instantiating the BundleEngine and explicitly passing it in to the LauncherFactory:

launcher = LauncherFactory.create(LauncherConfig.builder()
.enableTestEngineAutoRegistration(false)
.addTestEngines(new BundleEngine())
.build());

As JUnit itself is gradually becoming more classloader-sensitive, such gymnastics may not be needed at some point in the future.

The current TCCL hack in #5744 may not be a complete solution either. junit-platform-launcher still may not be able to find any of the services via the ServiceLoader mechanism. The best way to get this to work properly is to fix JUnit at the source to add the necessary Require/Provides-Capability directives for the OSGi ServiceLoader mechanism (ie, SPI-Fly). If/when this happens, we may also need to re-visit some of biz.aQute.tester.junit-platform's own wrapper implementations that mimic core junit-platform-launcher's behaviour (eg, the ability to register TestExecutionListeners as OSGi services (I can forsee a situation where, if we get the ServiceLoader implementation in core junit-platform-launcher working properly, the registered TestExecutionListeners will be installed twice - once by core JUnit and once by the Bnd activator...)

biz.aQute.tester.junit-platform bundle will have visibility to junit-platform-launcher so I think, unless there is a compelling reason otherwise, it is more fool-proof to use the biz.aQute.tester.junit-platform bundle's class loader.

biz-aQute.tester.junit-platform will only have visibility to that subset of the junit-platform-launcher packages that it uses directly (primarily, the service defined by the TestEngine interface). There are other interfaces in junit-platform-launcher that use the ServiceLoader mechanism which biz.aQute.tester.junit-platform does not import (eg, PostDiscoveryFilter, LauncherSessionListener, etc).

  1. Reduce the scope of the TCCL change to the minimum necessary.

OK, but I am not sure what this buys you. Is there a real reason to limit the scope?

This was based on the observation that @wborn's tests work without the TCCL switch, and when I looked at his failing stack traces I noted 1. that they were clearly classloader-related issues, and 2. that they originated during the execution phase of the test lifecycle (not during launcher creation). Thus I reasoned that by ensuring that original classloader was restored during test execution it would make his tests start working again. But I wanted to retain the TCCL switch during the launcher creation phase so as not to undo your original fix in 859636b. Reducing the scope of the TCCL seemed like the easiest way to achieve both at the same time.

@kriegfrj
Copy link
Contributor

kriegfrj commented Aug 9, 2023

Thank you for having a look! 👍

Thank you so much for obliging with your feedback about whether our fixes work. It might seem like a small thing, but it's invaluable.

I'm glad we were able to sort it out for you (eventually!)

kriegfrj added a commit that referenced this issue Aug 9, 2023
This is an alternative fix for #5568 which supersedes
commit bef0458 in PR #5743. We minimise the scope of the
TCCL change so that it does not interfere with the (otherwise
working) default classloader mechanisms during test execution.

Fixes #5568.

Signed-off-by: Fr Jeremy Krieg <[email protected]>
@wborn
Copy link
Contributor Author

wborn commented Aug 9, 2023

I'm very happy to see it fixed as these class loader issues are always very tricky. I hope it will give others also a seamless migration to Bnd 7! 😀

Your write up on how it all works is also very helpful for future reference whenever this subject needs to be revisited. 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
4 participants