package org.cad.interruptus.repository.zookeeper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicReference;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.locks.InterProcessLock;
import org.cad.interruptus.core.GsonSerializer;
import org.cad.interruptus.entity.Configuration;
import org.cad.interruptus.entity.Entity;
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class ConfigurationManagerTest
{
GsonSerializer<Configuration> serializer;
AtomicReference<Configuration> reference;
CuratorFramework client;
String path;
@Before
public void setUp()
{
path = "/path/to/config";
serializer = mock(GsonSerializer.class);
reference = mock(AtomicReference.class);
client = mock(CuratorFramework.class, RETURNS_MOCKS);
}
@Test
public void testMutexCall() throws Exception
{
final ConfigurationManager manager = new ConfigurationManager(client, reference, serializer, path);
final InterProcessLock mutex = mock(InterProcessLock.class);
final Throwable throwable = new RuntimeException();
final Callable callable = mock(Callable.class);
manager.mutex(callable, mutex);
verify(mutex).acquire();
verify(callable).call();
verify(mutex).release();
reset(mutex, callable);
when(callable.call()).thenThrow(throwable);
try {
manager.mutex(callable, mutex);
} catch (Exception e) {
assertSame(e, throwable);
}
verify(mutex).acquire();
verify(callable).call();
verify(mutex).release();
}
@Test
public void testGetLoadedConfiguration() throws Exception
{
final ConfigurationManager manager = new ConfigurationManager(client, reference, serializer, path);
final Configuration configuration = mock(Configuration.class);
reference.set(configuration);
assertSame(configuration, manager.get());
}
@Test
public void testMapConfiguration() throws Exception
{
final ConfigurationManager manager = new ConfigurationManager(client, reference, serializer, path);
final Configuration configuration = mock(Configuration.class);
final Entity entity1 = mock(Entity.class);
final Entity entity2 = mock(Entity.class);
final Map<String, Entity> map = new HashMap<>();
map.put("entity1", entity1);
map.put("entity2", entity2);
reference.set(configuration);
when(configuration.mapOf(eq(Entity.class))).thenReturn(map);
assertEquals(map, manager.map(Entity.class));
verify(configuration).mapOf(eq(Entity.class));
}
@Test
public void testListConfiguration() throws Exception
{
final ConfigurationManager manager = new ConfigurationManager(client, reference, serializer, path);
final Configuration configuration = mock(Configuration.class);
final Entity entity1 = mock(Entity.class);
final Entity entity2 = mock(Entity.class);
final Map<String, Entity> map = new HashMap<>();
map.put("entity1", entity1);
map.put("entity2", entity2);
reference.set(configuration);
when(configuration.mapOf(eq(Entity.class))).thenReturn(map);
final List<Entity> result = manager.list(Entity.class);
assertEquals(2, result.size());
assertTrue(result.contains(entity1));
assertTrue(result.contains(entity2));
verify(configuration).mapOf(eq(Entity.class));
}
@Test
public void testSave() throws Exception
{
final ConfigurationManager manager = new ConfigurationManager(client, reference, serializer, path);
final Configuration configuration = mock(Configuration.class);
final Entity entity = mock(Entity.class);
reference.set(configuration);
manager.save(entity);
verify(configuration).put(entity);
}
@Test
public void testRemove() throws Exception
{
final ConfigurationManager manager = new ConfigurationManager(client, reference, serializer, path);
final Configuration configuration = mock(Configuration.class);
final String entityId = "foo";
reference.set(configuration);
manager.remove(Entity.class, entityId);
verify(configuration).remove(Entity.class, entityId);
}
}