/*******************************************************************************
* Copyright (c) 2007, 2014 compeople AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* compeople AG - initial API and implementation
*******************************************************************************/
package org.eclipse.riena.core.injector.service;
import java.util.Dictionary;
import java.util.Hashtable;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceRegistration;
import org.eclipse.riena.core.injector.Inject;
import org.eclipse.riena.core.injector.InjectionFailure;
import org.eclipse.riena.core.test.RienaTestCase;
import org.eclipse.riena.core.test.collect.NonUITestCase;
/**
* Tests the {@code ServiceInjector}.
*/
@NonUITestCase
public class ServiceInjectorTest extends RienaTestCase {
public void testInjectDepOneObviousBindUnbindError() {
printTestName();
final Target target = new Target();
final DepOne depOne = new DepOne();
final ServiceRegistration reg = getContext().registerService(DepOne.class.getName(), depOne, null);
try {
Inject.service(DepOne.class.getName()).into(target).bind("baind").andStart(getContext());
fail("Well, that should not have happended");
} catch (final InjectionFailure e) {
assertTrue(true);
} finally {
reg.unregister();
}
}
public void testInjectDepOneNotSoObviousBindUnbindError() {
printTestName();
final Target target = new Target();
final DepTwo depTwo = new DepTwo();
final ServiceRegistration reg = getContext().registerService(DepTwo.class.getName(), depTwo, null);
try {
Inject.service(DepOne.class.getName()).into(target).bind("binde").unbind("entbinde").andStart(getContext());
assertEquals(0, target.count("binde", DepOne.class));
} catch (final InjectionFailure e) {
assertTrue(false);
} finally {
reg.unregister();
}
}
public void testInjectDepOneDefaultBindUnbind() {
printTestName();
final Target target = new Target();
final DepOne depOne = new DepOne();
final ServiceRegistration reg = getContext().registerService(DepOne.class.getName(), depOne, null);
final ServiceInjector shot = Inject.service(DepOne.class.getName()).into(target).andStart(getContext());
assertEquals(1, target.count("bind", DepOne.class));
shot.stop();
assertEquals(0, target.count("bind", DepOne.class));
reg.unregister();
}
public void testInjectDepOneDefaultBindUnbindUseClassInsteadOfClassname() {
printTestName();
final Target target = new Target();
final DepOne depOne = new DepOne();
final ServiceRegistration reg = getContext().registerService(DepOne.class.getName(), depOne, null);
final ServiceInjector shot = Inject.service(DepOne.class).into(target).andStart(getContext());
assertEquals(1, target.count("bind", DepOne.class));
shot.stop();
assertEquals(0, target.count("bind", DepOne.class));
reg.unregister();
}
public void testInjectDepOneAndDepTwoDefaultBindUnbind() {
printTestName();
final Target target = new Target();
final DepOne depOne = new DepOne();
final ServiceRegistration reg1 = getContext().registerService(DepOne.class.getName(), depOne, null);
final ServiceInjector shot1 = Inject.service(DepOne.class.getName()).into(target).andStart(getContext());
assertEquals(1, target.count("bind", DepOne.class));
final ServiceInjector shot2 = Inject.service(DepTwo.class.getName()).into(target).andStart(getContext());
final DepTwo depTwo = new DepTwo();
final ServiceRegistration reg2 = getContext().registerService(DepTwo.class.getName(), depTwo, null);
assertEquals(1, target.count("bind", DepTwo.class));
shot1.stop();
assertEquals(0, target.count("bind", DepOne.class));
shot2.stop();
assertEquals(0, target.count("bind", DepTwo.class));
reg1.unregister();
reg2.unregister();
}
public void testInjectDepOneBindeEntbinde() {
printTestName();
final Target target = new Target();
final DepOne depOne = new DepOne();
final ServiceRegistration reg = getContext().registerService(DepOne.class.getName(), depOne, null);
final ServiceInjector shot = Inject.service(DepOne.class.getName()).into(target).bind("binde")
.unbind("entbinde").andStart(getContext());
assertEquals(1, target.count("binde", DepOne.class));
shot.stop();
assertEquals(0, target.count("binde", DepOne.class));
reg.unregister();
}
public void testInjectRankedServicesServicesRegisteredBefore() {
printTestName();
final Target target = new Target();
final IRanking rank1 = new RankingOne(0);
final ServiceRegistration reg1 = getContext().registerService(IRanking.class.getName(), rank1, null);
final IRanking rank2 = new RankingTwo(100);
final Dictionary<String, Object> dict = new Hashtable<String, Object>();
dict.put(Constants.SERVICE_RANKING, Integer.valueOf(100));
final ServiceRegistration reg2 = getContext().registerService(IRanking.class.getName(), rank2, dict);
final ServiceInjector shot = Inject.service(IRanking.class.getName()).useRanking().into(target)
.andStart(getContext());
assertEquals(1, target.count("bind", IRanking.class));
assertEquals(100, target.getDepRanking());
shot.stop();
assertEquals(0, target.count("bind", IRanking.class));
reg1.unregister();
reg2.unregister();
}
public void testInjectRankedServicesServicesRegisteredOnTheRun() {
printTestName();
final Target target = new Target();
final IRanking rank1 = new RankingOne(0);
final ServiceRegistration reg1 = getContext().registerService(IRanking.class.getName(), rank1, null);
final ServiceInjector shot = Inject.service(IRanking.class.getName()).useRanking().into(target)
.andStart(getContext());
assertEquals(1, target.count("bind", IRanking.class));
assertEquals(0, target.getDepRanking());
final IRanking rank2 = new RankingTwo(100);
final Dictionary<String, Object> dict = new Hashtable<String, Object>();
dict.put(Constants.SERVICE_RANKING, Integer.valueOf(100));
final ServiceRegistration reg2 = getContext().registerService(IRanking.class.getName(), rank2, dict);
assertEquals(1, target.count("bind", IRanking.class));
assertEquals(100, target.getDepRanking());
reg2.unregister();
assertEquals(1, target.count("bind", IRanking.class));
assertEquals(0, target.getDepRanking());
final ServiceRegistration reg3 = getContext().registerService(IRanking.class.getName(), rank2, dict);
assertEquals(1, target.count("bind", IRanking.class));
assertEquals(100, target.getDepRanking());
shot.stop();
assertEquals(0, target.count("bind", IRanking.class));
reg1.unregister();
reg3.unregister();
}
public void testFilterTest() {
printTestName();
final Target target = new Target();
final DepOne depOne = new DepOne();
final Hashtable<String, String> props = new Hashtable<String, String>();
props.put("x", "y");
final ServiceRegistration reg = getContext().registerService(DepOne.class.getName(), depOne, props);
final ServiceInjector shot = Inject.service(DepOne.class.getName()).useFilter("(x=y)").into(target)
.andStart(getContext());
assertEquals(1, target.count("bind", DepOne.class));
shot.stop();
assertEquals(0, target.count("bind", DepOne.class));
reg.unregister();
}
}