Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [equinox-dev] Testing OSGI Bundles with JUnit

Hi David,

let me see. First your configuration is _all_ what your osgi bundle
context will look like. So, currently you specify three frameworks
(felix,equinox,knopflerfish). This will start all three frameworks
after each other and execute your test inside each of them.
To get started and learn the stuff its probably easier to just specify
one framework (equinox for this matter).

Now, all resources you have in your test-classes output (most of it
are usually your compiled testcases) are bundled up into a bundle with
a fully managed manifest (you cannot control). This is what we call
the "test probe" and exist just to have the test inside the osgi
environment.

Now, you launch the test just like an ordinary JUnit test (which it
is, from eclipse point of view).

This should trigger Pax Exam to download everything necessary (more on
that below), launch a new vm per framework, start the framework,
install you "test probe", and trigger the test from inside eclipse via
an rmi remote hook.

Now, in your case it will not find your Service (Test will fail)
because you test setup is mostly empty. As i mentioned, the what you
define inside the  @Configuration method (returning array of Option)
defines your whole test setup: your target vm, your osgi framework +
version, your bundles.

For target vm you have a default (your JAVA_HOME vm), for framework
you have specified felix,equiniox and knopflerfish (for test, just
keep one for now).
But, you did not mention your bundle.
Now, there are many ways on how you can do this.
Simpliest way is if you bundle is a maven artifact, then you can do
(inside options(..)):
mavenBundle().groupId("foo").artifactId("bar").version("1.0.0")

If not, you can use basically any url:
bundle(String URL)

If you really want to keep using PDE, you can do this then:
bundle("file:mybundle.jar")
or so.

Your configuration then looks like this:
public static Option[] configuration()
     {
         return options(
            equinox(),
            provision(
               bundle("yourbundleurl"),
               bundle("probablyanotherurl"),
           )
        );
     }

To answer the last question about the activator for the test probe:
no, there's no way. (by design if you want. Same for manifest entries.
The Test Probe is not something you should rely on. You can assume
that your injected bundlecontext is a valid BundleContext. And you can
rely on that all your stuff from your test folder will be inside that
test probe.
Finally, the test probe has a (calculated by bytecode inspection)
import-package part with all resolution=optional.

Tell us about your experience.

Sure, a detailed howto for eclipse/PDE users would be great. ;)

I see you are from spain, do you intend to come to OSGi DevCon in
Zurich , June, 22nd ?

cheers,
Toni

#
On 5/19/09, David Conde <dconde@xxxxxxxx> wrote:
> Hi,
>
>
>
> Thanks Alin for your answer.
>
>
>
> I have tried what you told me in your email.
>
>
>
> I have downloaded
>
>
>
> *	 <http://repository.ops4j.org/maven2/org/ops4j/pax/exam/pax-exam>
> pax-exam
> *
> <http://repository.ops4j.org/maven2/org/ops4j/pax/exam/pax-exam-junit>
> pax-exam-junit
> *
> <http://repository.ops4j.org/maven2/org/ops4j/pax/exam/pax-exam-container-de
> fault> pax-exam-container-default
>
>
>
> and I followed : http://wiki.ops4j.org//x/f4Cr
> <http://wiki.ops4j.org/x/f4Cr> .
>
>
>
> These were my steps:
>
> 1.       I added the jars previously mentioned in ClassPath (Environment
> Variables)
>
> 2.       I created a MyTestClass as shown below:
>
>
>
> import ….
>
>
>
> @RunWith( JUnit4TestRunner.class )
>
> public class MyUnitTest
>
> {
>
>
>
>     @Inject
>
>     BundleContext bundleContext;
>
>
>
>     @Configuration
>
>     public static Option[] configuration()
>
>     {
>
>         return options(
>
>             frameworks(
>
>                 felix(),
>
>                 equinox(),
>
>                 knopflerfish()
>
>             )
>
>
>
>             );
>
>     }
>
>
>
>     private ServiceTracker tracker;
>
>     @Test
>
>     public void testMethod()
>
>         throws Exception
>
>     {
>
>       tracker = new ServiceTracker(bundleContext,
> MyServicetobeTEsted.class.getName(), null);
>
>             tracker.open();
>
>
>
>             MyServicetobeTEsted service = (MyServicetobeTEsted)
> tracker.getService();
>
>
>
>             org.junit.Assert.assertTrue(service.addValue("Nivel", 5));
>
>
>
>
>
>     }
>
>
>
> }
>
>
>
> 3.       I have exported my TestProject in Eclipse as a jar or bundle(I did
> this in the same way I exported my other Bundles using Eclipse, I mean, I
> have exported my TestProject, which have a package where there is just one
> class (MyUnitTest), and there is no Activator class at all.
>
> 4.       I have launched Equinox with MyServicetobeTEsted already installed
>
> 5.       I have installed my TestProject Bundle
>
> 6.       I have started my TestProject bundle but I did not get any result
> at all. I do not get any exception neither.
>
>
>
>
>
>
>
> Am I missing anything?
>
>
>
> I have some questions about Pax Exam now:
>
>
>
> -Is it possible to get with Pax Exam the same Visual Interface than JUnit
> uses?
>
> -Where do I get the result from testing?
>
> -Do I  have to create Activator class with start method to my TestClass?
>
>
>
> What does it mean that I have to built the TESTBUNDLE on the fly?
> Thank you in advance
>
>
>
> David
>
>
>
>
>
>
>
>
>
> De: equinox-dev-bounces@xxxxxxxxxxx [mailto:equinox-dev-bounces@xxxxxxxxxxx]
> En nombre de Alin Dreghiciu
> Enviado el: viernes, 15 de mayo de 2009 22:57
> Para: Equinox development mailing list
> Asunto: Re: [equinox-dev] Testing OSGI Bundles with JUnit
>
>
>
> I think an user guide for using Px Exam with Eclipse will be very useful. If
> Toni does not do it before me, I will during this weekend.
>
> Till then the what you can do is to:
>
> 1. Add this jars to your classpath (take latest)
>
> *	 <http://repository.ops4j.org/maven2/org/ops4j/pax/exam/pax-exam>
> pax-exam
> *
> <http://repository.ops4j.org/maven2/org/ops4j/pax/exam/pax-exam-junit>
> pax-exam-junit
> *
> <http://repository.ops4j.org/maven2/org/ops4j/pax/exam/pax-exam-container-de
> fault> pax-exam-container-default
>
> 2. Follow http://wiki.ops4j.org//x/f4Cr <http://wiki.ops4j.org/x/f4Cr> .
>
>
>
> On Fri, May 15, 2009 at 11:42 AM, David Conde <dconde@xxxxxxxx> wrote:
>
>
> Hi Toni,
>
> Thank you for your idea!
>
> I have Reading about Pax Exam and  I am not clear about what exactly I have
> to do for installing and using it in Equinox.
>
> I would like to test a simple Bundle which uses Preference Service from
> Equinox. I do not use neither Maven nor other containers, just Equinox v34.
>
> As I have read in Pax Exam website, If I want to test my Bundle I should
> create a Test Class similar to T1S2_HowToUseBundleContext example, I
> thought, my Test Class should implements TestCase class but I do not see any
> TestCase implementation in examples so I suppose that using "@RunWith(
> JUnit4TestRunner.class )" it is enough. I asume either that I should also
> include the next piece of code inside to fix Equinox as framework:
>
> @Configuration
> public Option[] configure() {
> return options(
>            equinox()
>        );
> }
>
> Either I would have to fix @test in each method which I would like to test.
>
> Finally I suppose that I would have to add pax-exam-junit.jar from
> (http://repository.ops4j.org/maven2/org/ops4j/pax/exam/pax-exam-junit/0.5.0/
> ) and junit.jar from (JUnit website) to the classpath.
>
> So if I am not wrong, the steps to test a Bundle in Equinox would be like as
> shown below:
>
> 1-Include pax-exam-junit.jar and junit.jar in ClassPath
> 2-Create a new Bundle which will create a MyTestClass instance (with
> “@RunWith( JUnit4TestRunner.class )" included.
> 3-Call to Preference Service from BundleContext object as the same way as I
> did using the real Context in real bundles.
> 4- Launch Equinox with all the Bundles
>
> And now, my questions are? HOw BundleContext can call to
> bundleContext.getBundles method if it was defined as null in
> T1S2_HowToUseBundleContext example?
>
> Could I call for example
> bundleContext.getService(“PreferenceServiceReference”)?
>
>
> I either would like to ask about the results, how do I get test results? Is
> it possible to use junit.swingui.TestRunner in order to get results as a
> visual interface?
>
>
> Thank you in advance
>
> David
>
> -----Mensaje original-----
> De: equinox-dev-bounces@xxxxxxxxxxx [mailto:equinox-dev-bounces@xxxxxxxxxxx]
> En nombre de Toni Menzel
> Enviado el: jueves, 14 de mayo de 2009 12:06
> Para: Equinox development mailing list
> Asunto: Re: [equinox-dev] Testing OSGI Bundles with JUnit
>
>
> Have you had a look at pax exam
> (http://wiki.ops4j.org/display/paxexam/Pax+Exam) ?
>
> It actually lets you write Junit Tests in OSGi Framework independent way.
> You finally wrap your test in a test probe bundle (built on the fly),
> start your target framework (equinox in this case), provision it with
> you setup (extra bundles), and thats about it.
>
> IF you use PDE (because you pointed to the fact you are using eclipse
> a couple of times):
> Without external means like maven you probably end up re-specifiying
> all your dependencies again just for test setup.
>
> Tell us if you do or not as it might help us a lot to get you started
> with pax exam.
>
> Finally, in exam you end up inside an isolated vm process running just
> your test vm with your test framework
> (Equinox,Felix,Knopflerfish,Concierge, all recent versions at you
> fingertipps) exactly as specified. From there you (currently) get the
> (real!) bundleContext from where you probably get any service you
> want.
>
> Toni
>
>
>
>
> On 5/14/09, David Conde <dconde@xxxxxxxx> wrote:
>> Hi everyone,
>>
>>
>>
>> I am trying to do test cases for OSGI Bundles in Equinox, using Eclipse. I
>> found the problem when I tried to model BundleContext and services like
>> Preference Services, which are complex objects. I read about how I could
>> solve this problem and I found some libraries from Spring Framework which
>> use “mocks” to test BundleContext, but I am not sure if these ones
> provided
>> special Services likes Preference services. So, my question is , is there
>> any library with mocks to simulate BundleContext and other complex Equinox
>> classes? Is there any library provided by Equinox?
>>
>>
>>
>> Thank you in advance
>>
>>
>>
>>
>>
>> --
>>
>> David Conde Baena
>>
>>
>> CITIC
>> Centro Andaluz de Innovación y Tecnologías de la Información y las
>> Comunicaciones
>> Edificio CITIC, C/ Marie Curie, 6
>> Parque Tecnológico de Andalucía
>> 29590 - Campanillas (MÁLAGA)
>>
>> Tfno.: +34 952028610
>> Fax: +34 951231029
>>  <mailto:usuario@xxxxxxxx> Email: dconde@xxxxxxxx
>>  <http://www.citic.es/> Web: www.citic.es
>>
>>
>>
>>
>>
>>
>
>
> --
> Toni Menzel
> Independent Software Developer - Looking for new projects!
> Professional Profile: http://www.osgify.com
> Blog: tonitcom.blogspot.com
> toni@xxxxxxxxxxxxxxx
> http://www.ops4j.org     - New Energy for OSS Communities - Open
> Participation Software.
> _______________________________________________
> equinox-dev mailing list
> equinox-dev@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/equinox-dev
>
> _______________________________________________
> equinox-dev mailing list
> equinox-dev@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/equinox-dev
>
>
>
>
> --
> Alin Dreghiciu
> Software Developer - Looking for new projects!
> My profile: http://www.linkedin.com/in/alindreghiciu
> My blog: http://adreghiciu.blogspot.com
> http://www.ops4j.org - New Energy for OSS Communities - Open Participation
> Software.
> http://www.qi4j.org - New Energy for Java - Domain Driven Development.
>
>


-- 
Toni Menzel
Independent Software Developer - Looking for new projects!
Professional Profile: http://www.osgify.com
Blog: tonitcom.blogspot.com
toni@xxxxxxxxxxxxxxx
http://www.ops4j.org     - New Energy for OSS Communities - Open
Participation Software.


Back to the top