package org.openstack.atlas.usagerefactor;
import com.github.springtestdbunit.DbUnitTestExecutionListener;
import com.github.springtestdbunit.annotation.DatabaseSetup;
import com.github.springtestdbunit.annotation.DbUnitConfiguration;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.openstack.atlas.dbunit.FlatXmlLoader;
import org.openstack.atlas.service.domain.entities.Host;
import org.openstack.atlas.service.domain.events.UsageEvent;
import org.openstack.atlas.service.domain.repository.HostRepository;
import org.openstack.atlas.service.domain.services.UsageRefactorService;
import org.openstack.atlas.service.domain.usage.entities.LoadBalancerHostUsage;
import org.openstack.atlas.service.domain.usage.entities.LoadBalancerMergedHostUsage;
import org.openstack.atlas.usagerefactor.generator.UsagePollerGenerator;
import org.openstack.atlas.usagerefactor.helpers.UsagePollerHelper;
import org.openstack.atlas.usagerefactor.helpers.UsageProcessorResult;
import org.openstack.atlas.usagerefactor.junit.AssertLoadBalancerHostUsage;
import org.openstack.atlas.usagerefactor.junit.AssertLoadBalancerMergedHostUsage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import static org.mockito.Matchers.anyMap;
import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import java.text.SimpleDateFormat;
import java.util.*;
/*
To see what each case is testing please refer to their respective xml
file for more information.
*/
@RunWith(Enclosed.class)
public class UsageProcessorTest {
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:dbunit-context.xml"})
public static class WhenTestingProcessExistingEvents {
@Mock
private UsagePollerHelper usagePollerHelper;
@InjectMocks
private UsageProcessor usageProcessor = new UsageProcessor();
private List<LoadBalancerMergedHostUsage> mergedExistingUsages = new ArrayList<LoadBalancerMergedHostUsage>();
private List<LoadBalancerMergedHostUsage> mergedCurrentUsages = new ArrayList<LoadBalancerMergedHostUsage>();
private List<LoadBalancerHostUsage> newLBHostUsages = new ArrayList<LoadBalancerHostUsage>();
private UsageProcessorResult processorResult;
private Calendar pollTime;
String pollTimeStr;
@Before
public void standUp() throws Exception {
pollTime = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
pollTimeStr = sdf.format(pollTime.getTime());
}
@Test
public void shouldAddExistingUsageMergedRecordsAndCurrentUsageMergedRecordsAndReturnNewHostUsages() {
LoadBalancerMergedHostUsage merged1 = mock(LoadBalancerMergedHostUsage.class);
LoadBalancerMergedHostUsage merged2 = mock(LoadBalancerMergedHostUsage.class);
LoadBalancerMergedHostUsage merged3 = mock(LoadBalancerMergedHostUsage.class);
LoadBalancerMergedHostUsage merged4 = mock(LoadBalancerMergedHostUsage.class);
mergedExistingUsages.add(merged1);
mergedExistingUsages.add(merged2);
mergedExistingUsages.add(merged3);
mergedExistingUsages.add(merged4);
LoadBalancerMergedHostUsage merged5 = mock(LoadBalancerMergedHostUsage.class);
LoadBalancerMergedHostUsage merged6 = mock(LoadBalancerMergedHostUsage.class);
LoadBalancerMergedHostUsage merged7 = mock(LoadBalancerMergedHostUsage.class);
LoadBalancerMergedHostUsage merged8 = mock(LoadBalancerMergedHostUsage.class);
mergedCurrentUsages.add(merged5);
mergedCurrentUsages.add(merged6);
mergedCurrentUsages.add(merged7);
mergedCurrentUsages.add(merged8);
LoadBalancerHostUsage hostUsage1 = mock(LoadBalancerHostUsage.class);
LoadBalancerHostUsage hostUsage2 = mock(LoadBalancerHostUsage.class);
LoadBalancerHostUsage hostUsage3 = mock(LoadBalancerHostUsage.class);
LoadBalancerHostUsage hostUsage4 = mock(LoadBalancerHostUsage.class);
newLBHostUsages.add(hostUsage1);
newLBHostUsages.add(hostUsage2);
newLBHostUsages.add(hostUsage3);
newLBHostUsages.add(hostUsage4);
initMocks(this);
when(usagePollerHelper.processExistingEvents(anyMap())).thenReturn(mergedExistingUsages);
processorResult = new UsageProcessorResult(mergedCurrentUsages, newLBHostUsages);
when(usagePollerHelper.processCurrentUsage(anyMap(), anyMap(), anyCalendar())).thenReturn(processorResult);
int mergedExistingUsagesSize = mergedExistingUsages.size();
int mergedCurrentUsagesSize = mergedCurrentUsages.size();
UsageProcessorResult result = usageProcessor.mergeRecords(null, null, pollTime);
Assert.assertEquals(mergedExistingUsagesSize + mergedCurrentUsagesSize, result.getMergedUsages().size());
Assert.assertEquals(newLBHostUsages.size(), result.getLbHostUsages().size());
Assert.assertEquals(mergedExistingUsages.get(0), result.getMergedUsages().get(0));
Assert.assertEquals(mergedExistingUsages.get(1), result.getMergedUsages().get(1));
Assert.assertEquals(mergedExistingUsages.get(2), result.getMergedUsages().get(2));
Assert.assertEquals(mergedExistingUsages.get(3), result.getMergedUsages().get(3));
Assert.assertEquals(mergedCurrentUsages.get(0), result.getMergedUsages().get(4));
Assert.assertEquals(mergedCurrentUsages.get(1), result.getMergedUsages().get(5));
Assert.assertEquals(mergedCurrentUsages.get(2), result.getMergedUsages().get(6));
Assert.assertEquals(mergedCurrentUsages.get(3), result.getMergedUsages().get(7));
Assert.assertEquals(newLBHostUsages.get(0), result.getLbHostUsages().get(0));
Assert.assertEquals(newLBHostUsages.get(1), result.getLbHostUsages().get(1));
Assert.assertEquals(newLBHostUsages.get(2), result.getLbHostUsages().get(2));
Assert.assertEquals(newLBHostUsages.get(3), result.getLbHostUsages().get(3));
}
private Calendar anyCalendar(){
ArgumentMatcher<Calendar> t = new ArgumentMatcher<Calendar>(){
@Override
public boolean matches(Object o) {
return o instanceof Calendar;
}
};
return argThat(t);
}
}
}