Hello !

Thanks a lot for the very detailed explanation.

FYI, I finally found a rather simple way to trick Liquibase behavior,
excluding it from the activated bundles :

    @Override
    protected String getBundleFilter() {
        // Avoid executing Liquibase as a bundle and fails after on
FrameworkUtil.
        return "(!(Bundle-SymbolicName=org.liquibase.core))";
    }

This way, Liquibase is running as a simple jar in the classpath and it
seems to work as expected in unit tests.

Back to Felix connect vs Pax Exam : is there any way to switch to
another OSGi implementation in CamelBlueprintTestSupport ? As I said,
the calls to FrameworkUtil in our code are not critical and do not
make our tests fail, but perhaps someday another dependency like
Liquibase may actually expect a bundle and can't be excluded as I did.

Anyway I'm going to have a look at Pax Exam and bndrun...

Thanks again.

Regards.

Le jeu. 2 févr. 2023 à 06:52, Grzegorz Grzybek <gr.grzy...@gmail.com> a écrit :
>
> Hello
>
> CamelBlueprintTestSupport is a class to support with OSGi/Blueprint tests,
> but in quite limited manner.
>
> The most important thing is that the bundles available during the test are
> not installed in normal OSGi framework and none of the bundles has its own
> classloader.
> Historically something called PojoSR (Plain Old Java Object Service
> Registry) was used and now it's something called Felix Connect - an
> implementation of OSGi Connect specification
> <https://docs.osgi.org/specification/osgi.core/8.0.0/framework.connect.html>
> .
>
> When thinking about proper OSGi framework as two crucial parts:
>  - module layer dealing with bundles, headers, isolation, classloaders,
> revisions, wirings, wires, capabilities, requirements
>  - service layer dealing with service registry, service registrations,
> service references, service trackers
>
> you should think about Felix Connect (and in consequence also
> CamelBlueprintTestSupport tests) as OSGi runtime without module layer.
>
> That's why FrameworkUtil.getBundle doesn't work because the classloader of
> given class is not an implementation of BundleReference - it's usually
> AppClassLoader from system.
>
> Why? Because if you want to properly test actual, complex (relying on
> module layer) bundles (like liquibase or even JPA/Aries/Hibernate), you
> HAVE TO use Pax Exam or bndrun.
>
> So this is indeed a limitation, but as you can see, it's quite powerful -
> lots of blueprint based (thus the name) tests work, because Blueprint
> relies more on the service layer.
>
> I hope this helps.
>
> regards
> Grzegorz Grzybek
>
> śr., 1 lut 2023 o 17:19 Ephemeris Lappis <ephemeris.lap...@gmail.com>
> napisał(a):
>
> > Hello.
> >
> > I've observed that tests based on CamelBlueprintTestSupport have a
> > strange OSGi context : the "FrameworkUtil" class doesn't work as
> > expected and returns null.
> >
> > For some parts of our application code, where optional information is
> > not required, we can handle the null value. But we can't do it for
> > example for Liquibase that detects the OSGi context, but fails reading
> > bundle information.
> >
> > Here is the code of Liquibase that fails :
> >
> >             Boolean osgiPlatform =
> > Scope.getCurrentScope().get(Scope.Attr.osgiPlatform, Boolean.class);
> >             if (Boolean.TRUE.equals(osgiPlatform)) {
> >                 Bundle bundle =
> > FrameworkUtil.getBundle(LiquibaseUtil.class);
> >                 URL propURL =
> > bundle.getEntry("liquibase.build.properties");
> >
> > As the returned bundle is null, Liquibase fails, and all the
> > application code too.
> >
> > Could someone explain why the OSGi context of the test fails
> > retrieving bundles, while it seems to work for all the rest ?
> >
> > Can we do something in the test setting to enable the expected behavior ?
> >
> > Thanks in advance for explanations and help !
> >
> > Regards.
> >

Reply via email to