package org.jvalue.ods.processor;
import com.codahale.metrics.MetricRegistry;
import com.fasterxml.jackson.core.JsonPointer;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.ektorp.DocumentNotFoundException;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.jvalue.commons.utils.Cache;
import org.jvalue.ods.api.processors.ExecutionInterval;
import org.jvalue.ods.api.processors.ProcessorReference;
import org.jvalue.ods.api.processors.ProcessorReferenceChain;
import org.jvalue.ods.api.sources.DataSource;
import org.jvalue.ods.api.sources.DataSourceMetaData;
import org.jvalue.ods.db.DataRepository;
import org.jvalue.ods.db.ProcessorChainReferenceRepository;
import org.jvalue.ods.db.RepositoryFactory;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import mockit.Expectations;
import mockit.Mocked;
import mockit.Verifications;
import mockit.integration.junit4.JMockit;
@RunWith(JMockit.class)
public final class ProcessorChainManagerTest {
private static final String FILTER_CHAIN_ID = "someFilterChainId";
private final DataSource source = new DataSource(
"someId",
JsonPointer.compile("/id"),
new ObjectNode(JsonNodeFactory.instance),
new DataSourceMetaData("", "", "", "", "", "", ""));
@Mocked private ProcessorChainFactory chainFactory;
@Mocked private Cache<ProcessorChainReferenceRepository> repositoryCache;
@Mocked private RepositoryFactory repositoryFactory;
@Mocked private MetricRegistry registry;
private ProcessorChainManager manager;
private final ProcessorReferenceChain reference = new ProcessorReferenceChain(
"someId",
new LinkedList<ProcessorReference>(),
new ExecutionInterval(75, TimeUnit.MILLISECONDS));
@Before
public void createFilterChainManager() {
manager = new ProcessorChainManager(chainFactory, repositoryCache, repositoryFactory, registry);
}
@Test
public void testAddAndRemove(
@Mocked final DataRepository dataRepository,
@Mocked final ProcessorChainReferenceRepository referenceRepository,
@Mocked final ProcessorChain chain) throws Exception {
setupStartingFilterChain(dataRepository, referenceRepository, chain);
// add chain
manager.add(source, dataRepository, reference);
Thread.sleep(50);
// remove chain
manager.remove(source, dataRepository, reference);
Thread.sleep(50);
new Verifications() {{
// add chain
repositoryFactory.createFilterChainReferenceRepository(anyString);
referenceRepository.add(reference);
repositoryCache.put(anyString, referenceRepository);
// remove chain
referenceRepository.remove(reference);
// chain started once
chain.startProcessing();
times = 1;
}};
}
@Test
public void testEmptyGet(
@Mocked final ProcessorChainReferenceRepository referenceRepository) {
new Expectations() {{
repositoryCache.contains(anyString);
result = true;
repositoryCache.get(anyString);
result = referenceRepository;
}};
manager.get(source, FILTER_CHAIN_ID);
new Verifications() {{
repositoryCache.get(anyString);
times = 1;
}};
}
@Test
public void testEmptyGetAll() {
List<ProcessorReferenceChain> references = manager.getAll(source);
Assert.assertNotNull(references);
Assert.assertEquals(0, references.size());
}
@Test
public void testEmptyChainExists(
@Mocked final ProcessorChainReferenceRepository referenceRepository) {
new Expectations() {{
repositoryCache.contains(anyString);
result = true;
repositoryCache.get(anyString);
result = referenceRepository;
referenceRepository.findById(anyString);
result = new DocumentNotFoundException("");
}};
Assert.assertFalse(manager.contains(source, FILTER_CHAIN_ID));
}
@Test
public void testStartAndStopAll(
@Mocked final DataRepository dataRepository,
@Mocked final ProcessorChainReferenceRepository referenceRepository,
@Mocked final ProcessorChain chain) throws Exception {
setupStartingFilterChain(dataRepository, referenceRepository, chain);
new Expectations() {{
referenceRepository.getAll();
List<ProcessorReferenceChain> list = new LinkedList<>();
list.add(reference);
result = list;
}};
Map<DataSource, DataRepository> sources = new HashMap<>();
sources.put(source, dataRepository);
// start all
manager.startAllProcessorChains(sources);
Thread.sleep(50);
// stop all
manager.stopAllProcessorChains();
Thread.sleep(50);
new Verifications() {{
chain.startProcessing();
times = 1;
}};
}
private void setupStartingFilterChain(
final DataRepository dataRepository,
final ProcessorChainReferenceRepository referenceRepository,
final ProcessorChain chain) {
new Expectations() {{
repositoryFactory.createFilterChainReferenceRepository(anyString);
result = referenceRepository;
chainFactory.createProcessorChain(reference, source, dataRepository);
result = chain;
}};
}
}