package com.redhat.lightblue.migrator.facade;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.redhat.lightblue.migrator.facade.model.Country;
/**
* Tests the logic which uses JSONCompare only for non-huge responses.
*
* @author mpatercz
*
*/
@RunWith(MockitoJUnitRunner.class)
public class ConsistencyCheckForHugeDataTest {
private Logger inconsistencyLog = Mockito.spy(LoggerFactory.getLogger(ConsistencyChecker.class));
ConsistencyChecker consistencyChecker;
@Before
public void setup() throws InstantiationException, IllegalAccessException {
consistencyChecker = new ConsistencyChecker(CountryDAO.class.getSimpleName());
consistencyChecker.setInconsistencyLog(inconsistencyLog);
consistencyChecker.setMaxJsonStrLengthForJsonCompare(1000);
}
@After
public void after() {
// no errors logged to inconsistency log
Mockito.verify(inconsistencyLog, Mockito.never()).error(Mockito.anyString());
}
@Test
public void testSmallDataInconsistencyLogsUsingJsonCompare() {
Country pl1 = new Country(1l, "PL");
Country pl2 = new Country(2l, "PL");
Assert.assertFalse(consistencyChecker.checkConsistency(pl1, pl2));
Mockito.verify(inconsistencyLog, Mockito.times(1)).warn(
"[main] Inconsistency found in CountryDAO. - diff: id,Expected: 1, got: 2, - legacyJson: {\"iso2Code\":\"PL\",\"iso3Code\":null,\"id\":1,\"neighbour\":null,\"allies\":null}, lightblueJson: {\"iso2Code\":\"PL\",\"iso3Code\":null,\"id\":2,\"neighbour\":null,\"allies\":null}"
);
}
@Test
public void testBigDataInconsistencyLogsUsingJiff() {
List<Country> countries1 = new ArrayList<>();
for (long i = 0; i < 100; i++) {
countries1.add(new Country(i, "PL" + i));
}
List<Country> countries2 = new ArrayList<>(countries1);
countries2.add(new Country(-1l, "PL"));
countries1.set(0, new Country(-1l, "PL"));
Assert.assertFalse(consistencyChecker.checkConsistency(countries1, countries2));
ArgumentCaptor<String> loggedWarn = ArgumentCaptor.forClass(String.class);
Mockito.verify(inconsistencyLog, Mockito.times(1)).warn(loggedWarn.capture());
loggedWarn.getAllValues().get(0).startsWith("[main] Inconsistency found in CountryDAO. - diff: 100(null != {\"iso2Code\":\"PL\",\"iso3Code\":null,\"id\":-1,\"neighbour\":null})");
}
@Test
public void testCompareJiffAndJsonCompareArrayElementInconsistencies() {
List<Country> countries1 = new ArrayList<>();
for (long i = 0; i < 100; i++) {
countries1.add(new Country(i, "PL" + i));
}
List<Country> countries2 = new ArrayList<>(countries1);
// create allied country inconsistency
countries1.get(0).setAllies(Collections.singletonList(countries1.get(1)));
Country c = new Country(0l, "PL0");
c.setAllies(Collections.singletonList(countries2.get(2)));
countries2.set(0, c);
Assert.assertFalse(consistencyChecker.checkConsistency(countries1, countries2));
ArgumentCaptor<String> loggedWarn = ArgumentCaptor.forClass(String.class);
Mockito.verify(inconsistencyLog, Mockito.times(1)).warn(loggedWarn.capture());
System.out.println(loggedWarn.getAllValues().get(0));
// json compare diff: [id=0].allies[allies=null].id,Expected: 1, got: 2, ; [id=0].allies[allies=null].iso2Code,Expected: PL1, got: PL2,
// jiff diff: 0(null != {"iso2Code":"PL0","iso3Code":null,"id":0,"neighbour":null,"allies":[{"iso2Code":"PL2","iso3Code":null,"id":2,"neighbour":null,"allies":null}]}), 0({"iso2Code":"PL0","iso3Code":null,"id":0,"neighbour":null,"allies":[{"iso2Code":"PL1","iso3Code":null,"id":1,"neighbour":null,"allies":null}]} != null)
}
}