/*
* Copyright to the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.rioproject.impl.associations;
import org.junit.Assert;
import net.jini.core.lookup.ServiceItem;
import org.junit.Test;
import org.rioproject.associations.Association;
import org.rioproject.associations.AssociationDescriptor;
import org.rioproject.associations.AssociationServiceListener;
import java.util.Collection;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Tests injecting associated services
*/
public class AssociationInjectorTest {
@Test
public void testInjectProxy() {
Association<Dummy> a = new DefaultAssociation<Dummy>(createAssociationDescriptor());
Target1 t = new Target1();
AssociationInjector<Dummy> ai = new AssociationInjector<Dummy>(t);
for(int i=0; i<10; i++) {
Dummy dummy = new DummyImpl(i);
a.addServiceItem(AssociationUtils.makeServiceItem(dummy));
ai.discovered(a, dummy);
}
Assert.assertEquals(1, t.injectedCount);
}
@Test
public void testInjectProxyWithListener() {
Association<Dummy> a = new DefaultAssociation<Dummy>(createAssociationDescriptor());
Target1 t = new Target1();
AssociationInjector<Dummy> ai = new AssociationInjector<Dummy>(t);
AL aL = new AL();
a.registerAssociationServiceListener(aL);
for(int i=0; i<10; i++) {
Dummy dummy = new DummyImpl(i);
a.addServiceItem(AssociationUtils.makeServiceItem(dummy));
ai.discovered(a, dummy);
}
Assert.assertEquals(1, t.injectedCount);
Assert.assertEquals(10, aL.addedServiceCount.get());
Assert.assertEquals(0, aL.removedServiceCount.get());
Collection<Dummy> dummies = a.getServices();
for(Dummy d: dummies)
a.removeService(d);
Assert.assertEquals(10, aL.removedServiceCount.get());
Assert.assertEquals(0, a.getServiceCount());
}
@Test
public void testInjectIterable() {
Association<Dummy> a = new DefaultAssociation<Dummy>(createAssociationDescriptor());
Target2 t = new Target2();
AssociationInjector<Dummy> ai = new AssociationInjector<Dummy>(t);
for(int i=0; i<10; i++) {
Dummy dummy = new DummyImpl(i);
a.addServiceItem(AssociationUtils.makeServiceItem(dummy));
ai.discovered(a, dummy);
}
Assert.assertEquals(1, t.injectedCount);
int j = 0;
for(Dummy dummy : t.dummies)
j++;
Assert.assertEquals(10, j);
}
@Test
public void testInjectAssociation() {
Association<Dummy> a = new DefaultAssociation<Dummy>(createAssociationDescriptor());
Target3 t = new Target3();
AssociationInjector<Dummy> ai = new AssociationInjector<Dummy>(t);
for(int i=0; i<10; i++) {
Dummy dummy = new DummyImpl(i);
ServiceItem item = AssociationUtils.makeServiceItem(dummy);
a.addServiceItem(item);
ai.discovered(a, dummy);
}
Assert.assertEquals(1, t.injectedCount);
}
@Test
public void testInjectMultipleAssociation() {
Target4 t = new Target4();
AssociationInjector<Dummy> ai = new AssociationInjector<Dummy>(t);
setup(10, "uno", ai);
setup(9, "dos", ai);
setup(8, "tres", ai);
Assert.assertEquals(3, t.injectedCount);
Assert.assertEquals(10, t.unoDummies.getServiceCount());
Assert.assertEquals(9, t.dosDummies.getServiceCount());
Assert.assertEquals(8, t.tresDummies.getServiceCount());
}
@Test
public void testEagerInjection() {
DefaultAssociationManagement aMgr = new DefaultAssociationManagement();
Target5 target = new Target5();
aMgr.setBackend(target);
AssociationDescriptor descriptor = createAssociationDescriptor();
descriptor.setLazyInject(false);
Association<Dummy> a = aMgr.addAssociationDescriptor(descriptor);
Assert.assertTrue(target.injectedCount==1);
Assert.assertNotNull(target.dummy);
Assert.assertEquals(Association.State.PENDING, target.dummy.getState());
}
public class Target1 {
int injectedCount;
public void setDummy(Dummy dummy) {
injectedCount++;
}
}
public class Target2 {
int injectedCount;
Iterable<Dummy> dummies;
public void setDummy(Iterable<Dummy> dummies) {
this.dummies = dummies;
injectedCount++;
}
}
public class Target3 {
int injectedCount;
public void setDummy(Association<Dummy> dummies) {
injectedCount++;
}
}
public class Target4 {
int injectedCount;
Association<Dummy> unoDummies;
Association<Dummy> dosDummies;
Association<Dummy> tresDummies;
public void setDummy(Association<Dummy> dummies) {
injectedCount++;
if(dummies.getName().equals("uno"))
unoDummies = dummies;
else if(dummies.getName().equals("dos"))
dosDummies = dummies;
else if(dummies.getName().equals("tres"))
tresDummies = dummies;
else
Assert.fail("Unknown association "+dummies);
}
}
public class Target5 {
int injectedCount;
Association<Dummy> dummy;
public void setDummy(Association<Dummy> dummy) {
this.dummy = dummy;
injectedCount++;
}
}
private class AL implements AssociationServiceListener<Dummy> {
AtomicInteger addedServiceCount = new AtomicInteger();
AtomicInteger removedServiceCount = new AtomicInteger();
public void serviceAdded(Dummy service) {
addedServiceCount.incrementAndGet();
}
public void serviceRemoved(Dummy service) {
removedServiceCount.incrementAndGet();
}
}
private AssociationDescriptor createAssociationDescriptor() {
return createAssociationDescriptor(null);
}
private AssociationDescriptor createAssociationDescriptor(String name) {
AssociationDescriptor ad = new AssociationDescriptor();
ad.setName(name);
ad.setInterfaceNames(Dummy.class.getName());
ad.setPropertyName("dummy");
return ad;
}
private void setup(int num, String name, AssociationInjector<Dummy> ai) {
Association<Dummy> a = new DefaultAssociation<Dummy>(createAssociationDescriptor(name));
for(int i=0; i<num; i++) {
DummyImpl d1 = new DummyImpl(i, name);
a.addServiceItem(AssociationUtils.makeServiceItem(d1));
ai.discovered(a, d1);
}
}
}