/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.utils.servicemanager;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dspace.kernel.ServiceManager;
import org.dspace.kernel.mixins.OrderedService;
import org.junit.Test;
/**
* Tests the usage of the provider stack
*
* @author Aaron Zeckoski (azeckoski @ gmail.com)
*/
public class ProviderStackTest {
// some stuff for testing
public interface Provider {
public String getPrefix();
}
public class UnorderedProvider implements Provider {
protected String prefix;
public UnorderedProvider(String prefix) {
this.prefix = prefix;
}
public String getPrefix() {
return prefix;
}
}
public class OrderedProvider extends UnorderedProvider implements OrderedService {
protected int order = 0;
public OrderedProvider(String prefix, int order) {
super(prefix);
this.order = order;
}
public int getOrder() {
return order;
}
}
/**
* Test method for {@link org.dspace.utils.servicemanager.ProviderStack#ProviderStack(org.dspace.kernel.ServiceManager, java.lang.Class)}.
*/
@Test
public void testProviderStackServiceManagerClassOfT() {
// fake service manager for testing
ServiceManager sm = new ServiceManager() {
public <T> T getServiceByName(String name, Class<T> type) {
return null;
}
public <T> List<T> getServicesByType(Class<T> type) {
return new ArrayList<T>();
}
public List<String> getServicesNames() {
return new ArrayList<String>();
}
public boolean isServiceExists(String name) {
return false;
}
public void pushConfig(Map<String, Object> settings) {
}
public void registerService(String name, Object service) {
}
@Override
public void registerServiceNoAutowire(String name, Object service) {
}
public <T> T registerServiceClass(String name, Class<T> type) {
return null;
}
public void unregisterService(String name) {
}
};
ProviderStack<Provider> providers = new ProviderStack<Provider>(sm, Provider.class);
assertNotNull(providers.hashCode());
assertNotNull(providers.toString());
assertEquals(0, providers.size());
assertTrue(providers.getProviders().size() == 0);
providers.clear();
providers = null;
}
/**
* Test method for {@link org.dspace.utils.servicemanager.ProviderStack#ProviderStack(Object[])}.
*/
@Test
public void testProviderStackTArray() {
ProviderStack<Provider> providers = new ProviderStack<Provider>(new Provider[] {
new UnorderedProvider("ccc"),
new UnorderedProvider("ddd"),
new OrderedProvider("bbb", 5),
new OrderedProvider("aaa", 2)
});
assertNotNull(providers.hashCode());
assertNotNull(providers.toString());
assertEquals(4, providers.size());
// check the order
List<Provider> l = providers.getProviders();
assertEquals("aaa", l.get(0).getPrefix());
assertEquals("bbb", l.get(1).getPrefix());
assertEquals("ccc", l.get(2).getPrefix());
assertEquals("ddd", l.get(3).getPrefix());
l = null;
providers.clear();
providers = null;
}
/**
* Test method for {@link org.dspace.utils.servicemanager.ProviderStack#addProvider(java.lang.Object)}.
*/
@Test
public void testAddProvider() {
// preload
ProviderStack<Provider> providers = new ProviderStack<Provider>(new Provider[] {
new UnorderedProvider("ccc"),
new UnorderedProvider("ddd"),
new OrderedProvider("bbb", 5),
new OrderedProvider("aaa", 2)
});
assertNotNull(providers.hashCode());
assertNotNull(providers.toString());
assertEquals(4, providers.size());
// check the order
List<Provider> l = providers.getProviders();
assertEquals("aaa", l.get(0).getPrefix());
assertEquals("bbb", l.get(1).getPrefix());
assertEquals("ccc", l.get(2).getPrefix());
assertEquals("ddd", l.get(3).getPrefix());
// now do some adds
// unordered should go to the end
Provider p5 = new UnorderedProvider("eee");
providers.addProvider( p5 );
assertEquals(5, providers.size());
l = providers.getProviders();
assertEquals("aaa", l.get(0).getPrefix());
assertEquals("bbb", l.get(1).getPrefix());
assertEquals("ccc", l.get(2).getPrefix());
assertEquals("ddd", l.get(3).getPrefix());
assertEquals("eee", l.get(4).getPrefix());
// ordered should go in order
Provider p6 = new OrderedProvider("ab6", 3);
providers.addProvider( p6 );
assertEquals(6, providers.size());
l = providers.getProviders();
assertEquals("aaa", l.get(0).getPrefix());
assertEquals("ab6", l.get(1).getPrefix());
assertEquals("bbb", l.get(2).getPrefix());
assertEquals("ccc", l.get(3).getPrefix());
assertEquals("ddd", l.get(4).getPrefix());
assertEquals("eee", l.get(5).getPrefix());
Provider p7 = new OrderedProvider("bc7", 6);
providers.addProvider( p7 );
assertEquals(7, providers.size());
l = providers.getProviders();
assertEquals("aaa", l.get(0).getPrefix());
assertEquals("ab6", l.get(1).getPrefix());
assertEquals("bbb", l.get(2).getPrefix());
assertEquals("bc7", l.get(3).getPrefix());
assertEquals("ccc", l.get(4).getPrefix());
assertEquals("ddd", l.get(5).getPrefix());
assertEquals("eee", l.get(6).getPrefix());
l = null;
p5 = p6 = p7 = null;
providers.clear();
providers = null;
}
/**
* Test method for {@link org.dspace.utils.servicemanager.ProviderStack#removeProvider(int)}.
*/
@Test
public void testRemoveProvider() {
// preload
ProviderStack<Provider> providers = new ProviderStack<Provider>(new Provider[] {
new UnorderedProvider("ccc"),
new UnorderedProvider("ddd"),
new OrderedProvider("bbb", 5),
new OrderedProvider("aaa", 2)
});
assertNotNull(providers.hashCode());
assertNotNull(providers.toString());
assertEquals(4, providers.size());
providers.removeProvider(1);
assertEquals(3, providers.size());
List<Provider> l = providers.getProviders();
assertEquals("aaa", l.get(0).getPrefix());
assertEquals("ccc", l.get(1).getPrefix());
assertEquals("ddd", l.get(2).getPrefix());
// test no failure for invalid remove
providers.removeProvider(5);
l = null;
providers.clear();
providers = null;
}
/**
* Test method for {@link org.dspace.utils.servicemanager.ProviderStack#getProviders()}.
*/
@Test
public void testGetProviders() {
// preload
ProviderStack<Provider> providers = new ProviderStack<Provider>(new Provider[] {
new UnorderedProvider("ccc"),
new UnorderedProvider("ddd"),
new OrderedProvider("bbb", 5),
new OrderedProvider("aaa", 2)
});
assertNotNull(providers.hashCode());
assertNotNull(providers.toString());
assertEquals(4, providers.size());
List<Provider> l = providers.getProviders();
assertNotNull(l);
assertEquals(4, l.size());
l = null;
providers = new ProviderStack<Provider>();
l = providers.getProviders();
assertNotNull(l);
assertEquals(0, l.size());
l = null;
providers.clear();
providers = null;
}
/**
* Test method for {@link org.dspace.utils.servicemanager.ProviderStack#getIterator()}.
*/
@Test
public void testGetIterator() {
// preload
ProviderStack<Provider> providers = new ProviderStack<Provider>(new Provider[] {
new UnorderedProvider("ccc"),
new UnorderedProvider("ddd"),
new OrderedProvider("bbb", 5),
new OrderedProvider("aaa", 2)
});
assertNotNull(providers.hashCode());
assertNotNull(providers.toString());
assertEquals(4, providers.size());
Iterator<Provider> it = providers.getIterator();
assertNotNull(it);
assertTrue(it.hasNext());
assertNotNull(it.next());
assertTrue(it.hasNext());
assertNotNull(it.next());
assertTrue(it.hasNext());
assertNotNull(it.next());
assertTrue(it.hasNext());
assertNotNull(it.next());
assertFalse(it.hasNext());
providers = new ProviderStack<Provider>();
it = providers.getIterator();
assertNotNull(it);
assertFalse(it.hasNext());
it = null;
providers.clear();
providers = null;
}
/**
* Test method for {@link org.dspace.utils.servicemanager.ProviderStack#getProvider(int)}.
*/
@Test
public void testGetProvider() {
// preload
ProviderStack<Provider> providers = new ProviderStack<Provider>(new Provider[] {
new UnorderedProvider("ccc"),
new UnorderedProvider("ddd"),
new OrderedProvider("bbb", 5),
new OrderedProvider("aaa", 2)
});
assertNotNull(providers.hashCode());
assertNotNull(providers.toString());
assertEquals(4, providers.size());
assertEquals("aaa", providers.getProvider(0).getPrefix());
assertEquals("bbb", providers.getProvider(1).getPrefix());
assertEquals("ccc", providers.getProvider(2).getPrefix());
assertEquals("ddd", providers.getProvider(3).getPrefix());
assertEquals(null, providers.getProvider(4));
assertEquals(null, providers.getProvider(5));
assertEquals(null, providers.getProvider(-1));
providers.clear();
providers = null;
}
/**
* Test method for {@link org.dspace.utils.servicemanager.ProviderStack#size()}.
*/
@Test
public void testSize() {
// preload
ProviderStack<Provider> providers = new ProviderStack<Provider>(new Provider[] {
new UnorderedProvider("ccc"),
new UnorderedProvider("ddd"),
new OrderedProvider("bbb", 5),
new OrderedProvider("aaa", 2)
});
assertNotNull(providers.hashCode());
assertNotNull(providers.toString());
assertEquals(4, providers.size());
providers.clear();
providers = null;
}
/**
* Test method for {@link org.dspace.utils.servicemanager.ProviderStack#clear()}.
*/
@Test
public void testClear() {
// preload
ProviderStack<Provider> providers = new ProviderStack<Provider>(new Provider[] {
new UnorderedProvider("ccc"),
new UnorderedProvider("ddd"),
new OrderedProvider("bbb", 5),
new OrderedProvider("aaa", 2)
});
assertNotNull(providers.hashCode());
assertNotNull(providers.toString());
assertEquals(4, providers.size());
providers.clear();
assertNotNull(providers.hashCode());
assertNotNull(providers.toString());
assertEquals(0, providers.size());
providers.clear();
providers = null;
}
/**
* Test method for {@link org.dspace.utils.servicemanager.ProviderStack#refresh()}.
*/
@Test
public void testRefresh() {
Provider p1 = new OrderedProvider("aaa", 2);
Provider p2 = new UnorderedProvider("ccc");
ProviderStack<Provider> providers = new ProviderStack<Provider>(new Provider[] {
p2,
new UnorderedProvider("ddd"),
new OrderedProvider("bbb", 5),
p1
});
assertNotNull(providers.hashCode());
assertNotNull(providers.toString());
assertEquals(4, providers.size());
providers.refresh();
assertEquals(4, providers.size());
System.gc(); // should wipe the 2 without a reference
providers.refresh();
assertEquals(2, providers.size());
assertEquals(p1, providers.getProvider(0));
assertEquals(p2, providers.getProvider(1));
p1 = null;
System.gc(); // should wipe the p1
providers.refresh();
assertEquals(1, providers.size());
assertEquals(p2, providers.getProvider(0));
p2 = null;
providers.clear();
providers = null;
}
}