package edu.cmu.sv.arinc838.validation; import static org.mockito.Mockito.*; import static org.testng.Assert.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import edu.cmu.sv.arinc838.dao.FileDefinitionDao; import edu.cmu.sv.arinc838.dao.IntegrityDefinitionDao; import edu.cmu.sv.arinc838.dao.SoftwareDefinitionFileDao; import edu.cmu.sv.arinc838.dao.SoftwareDescriptionDao; import edu.cmu.sv.arinc838.dao.TargetHardwareDefinitionDao; import edu.cmu.sv.arinc838.validation.SdfChecker.CompareRef; /** * Each of the tests for the compare methods will mock out the sub layers - * those are tested otherwise. Each will verify the right # of calls but check * the primitives. * * @author ryan */ public class SdfCheckerTest { private SdfChecker checker; private String type = "MyType"; private List<String> empty = Collections.<String>emptyList (); private List<String> results; private Class<IntegrityDefinitionDao> integClass = IntegrityDefinitionDao.class; private Class<TargetHardwareDefinitionDao> thClass = TargetHardwareDefinitionDao.class; private Class<FileDefinitionDao> fDefClass = FileDefinitionDao.class; private Class<SoftwareDescriptionDao> descClass = SoftwareDescriptionDao.class; @BeforeMethod public void beforeMethod() { checker = new SdfChecker(); } @Test public void testSoftwareDefinitionFileDaoComparison() { SdfChecker mockChecker = spy (checker); when (mockChecker.compare (any (integClass), any(integClass))).thenReturn(empty); when (mockChecker.compare(any (fDefClass), any(fDefClass))).thenReturn (empty); when (mockChecker.compare(any (thClass), any(thClass))).thenReturn (empty); when (mockChecker.compare(any (descClass), any (descClass))).thenReturn (empty); byte[] byteArray = new byte[] {0x11, 0x23}; SoftwareDefinitionFileDao mine = new SoftwareDefinitionFileDao(); mine.setFileFormatVersion(byteArray); SoftwareDefinitionFileDao theirs = new SoftwareDefinitionFileDao(); theirs.setFileFormatVersion(byteArray); List<String> results = mockChecker.compare(mine, theirs); assertNotNull (results); assertEquals(results.size(), 0); } @Test public void testSoftwareDefinitionFileDaoFailedComparison() { SdfChecker mockChecker = spy (checker); when (mockChecker.compare (any (integClass), any(integClass))).thenReturn(empty); when (mockChecker.compare(any (fDefClass), any(fDefClass))).thenReturn (empty); when (mockChecker.compare(any (thClass), any(thClass))).thenReturn (empty); when (mockChecker.compare(any (descClass), any (descClass))).thenReturn (empty); byte[] byteArray = new byte[] {0x11, 0x23}; SoftwareDefinitionFileDao mine = new SoftwareDefinitionFileDao(); mine.setFileFormatVersion(byteArray); byteArray = new byte[] {0x12}; SoftwareDefinitionFileDao theirs = new SoftwareDefinitionFileDao(); theirs.setFileFormatVersion(byteArray); results = mockChecker.compare(mine, theirs); assertNotNull (results); assertEquals (results.size(), 1); } @Test public void testSoftwareDescriptionComparisonGood () { SoftwareDescriptionDao mine = new SoftwareDescriptionDao(); SoftwareDescriptionDao theirs = new SoftwareDescriptionDao(); String partNumber = "partnumber"; String description = "description"; byte[] byteArray = new byte[] {0x11, 0x23}; mine.setSoftwarePartnumber(partNumber); mine.setSoftwareTypeDescription(description); mine.setSoftwareTypeId(byteArray); theirs.setSoftwarePartnumber(partNumber); theirs.setSoftwareTypeDescription(description); theirs.setSoftwareTypeId(byteArray); results = checker.compare(mine, theirs); assertNotNull (results); assertEquals(results.size(), 0); results = checker.compare(theirs, mine); assertNotNull (results); assertEquals(results.size(), 0); } @Test public void testSoftwareDescriptionComparisonBad () { SoftwareDescriptionDao mine = new SoftwareDescriptionDao(); SoftwareDescriptionDao theirs = new SoftwareDescriptionDao(); String partNumber = "partnumber"; String description = "description"; byte[] byteArray = new byte[] {0x11, 0x23}; mine.setSoftwarePartnumber(partNumber); mine.setSoftwareTypeDescription(description); mine.setSoftwareTypeId(byteArray); theirs.setSoftwarePartnumber(partNumber + "garbage"); theirs.setSoftwareTypeDescription(description + "garbage"); theirs.setSoftwareTypeId(byteArray); results = checker.compare(mine, theirs); assertNotNull (results); assertEquals (results.size(), 2); results = checker.compare(mine, theirs); assertNotNull (results); assertEquals (results.size(), 2); } @Test public void testIntegDefGood () { IntegrityDefinitionDao mine = new IntegrityDefinitionDao (); IntegrityDefinitionDao theirs = new IntegrityDefinitionDao (); long integType = 4; byte[] value = new byte[] {0x11, 0x23}; mine.setIntegrityType(integType); mine.setIntegrityValue(value); theirs.setIntegrityType(integType); theirs.setIntegrityValue(value); results = checker.compare(theirs, mine); assertNotNull (results); assertEquals (results.size(), 0); results = checker.compare(mine, theirs); assertNotNull (results); assertEquals (results.size(), 0); } @Test public void testIntegDefBad () { IntegrityDefinitionDao mine = new IntegrityDefinitionDao (); IntegrityDefinitionDao theirs = new IntegrityDefinitionDao (); long integType = 4; byte[] value = new byte[] {0x11, 0x23}; mine.setIntegrityType(integType); mine.setIntegrityValue(value); theirs.setIntegrityType(integType + 1); theirs.setIntegrityValue(new byte[] {0x34}); results = checker.compare(theirs, mine); assertNotNull (results); assertEquals (results.size(), 2); results = checker.compare(mine, theirs); assertNotNull (results); assertEquals (results.size(), 2); } @Test public void testFileDefinitionGood () { SdfChecker mockChecker = spy (checker); when (mockChecker.compare(any (integClass), any (integClass))).thenReturn(empty); FileDefinitionDao mine = new FileDefinitionDao(); FileDefinitionDao theirs = new FileDefinitionDao(); String fname = "fname"; long fsize = 123; mine.setFileLoadable(true); mine.setIsLast(true); mine.setFileName(fname); mine.setFileSize(fsize); theirs.setFileLoadable(true); theirs.setIsLast(true); theirs.setFileName(fname); theirs.setFileSize(fsize); results = checker.compare(mine, theirs); assertNotNull (results); assertEquals(results.size (), 0); results = checker.compare(theirs, mine); assertNotNull (results); assertEquals(results.size (), 0); } @Test public void testFileDefinitionBad () { SdfChecker mockChecker = spy (checker); when (mockChecker.compare(any (integClass), any (integClass))).thenReturn(empty); FileDefinitionDao mine = new FileDefinitionDao(); FileDefinitionDao theirs = new FileDefinitionDao(); String fname = "fname"; long fsize = 123; mine.setFileLoadable(true); mine.setIsLast(true); mine.setFileName(fname); mine.setFileSize(fsize); theirs.setFileLoadable(true); theirs.setIsLast(true); theirs.setFileName(fname + "garbage"); theirs.setFileSize(fsize + 32); results = checker.compare(mine, theirs); assertNotNull (results); assertEquals(results.size (), 2); results = checker.compare(theirs, mine); assertNotNull (results); assertEquals(results.size (), 2); } @Test public void testTargetHardwareDefGood () { TargetHardwareDefinitionDao mine = new TargetHardwareDefinitionDao(); TargetHardwareDefinitionDao theirs = new TargetHardwareDefinitionDao(); String hwId = "test"; mine.setIsLast(true); mine.setThwId(hwId); theirs.setIsLast(true); theirs.setThwId(hwId); results = checker.compare(mine, theirs); assertNotNull (results); assertEquals(results.size (), 0); results = checker.compare(theirs, mine); assertNotNull (results); assertEquals(results.size (), 0); } @Test public void testTargetHardwareDefBad () { TargetHardwareDefinitionDao mine = new TargetHardwareDefinitionDao(); TargetHardwareDefinitionDao theirs = new TargetHardwareDefinitionDao(); String hwId = "test"; mine.setIsLast(true); mine.setThwId(hwId); theirs.setIsLast(true); theirs.setThwId(hwId + "garbage"); results = checker.compare(mine, theirs); assertNotNull (results); assertEquals(results.size (), 1); results = checker.compare(theirs, mine); assertNotNull (results); assertEquals(results.size (), 1); } @Test public void testNullCheck (){ assertNull (checker.nullCheck(null, null)); assertTrue (checker.nullCheck(null, new Object ())); assertTrue (checker.nullCheck(new Object (), null)); assertFalse (checker.nullCheck(new Object (), new Object ())); } @Test public void testCheckListNullNull() { @SuppressWarnings("unchecked") CompareRef<Object> comp = mock(CompareRef.class); List<Object> mine = null, theirs = null; results = checker.check(mine, theirs, type, comp); assertTrue(checker.check(mine, theirs, type, results)); assertEquals(results.size(), 0); } @Test public void testCheckListNotNullNull() { @SuppressWarnings("unchecked") CompareRef<Object> comp = mock(CompareRef.class); List<Object> mine = null, theirs = null; mine = new ArrayList<Object>(); results = checker.check(mine, theirs, type, comp); assertEquals(results.size(), 1); assertTrue(results.get(0).contains(type)); } @Test public void testCheckListNullNotNull() { @SuppressWarnings("unchecked") CompareRef<Object> comp = mock(CompareRef.class); List<Object> mine = null, theirs = null; theirs = new ArrayList<Object>(); results = checker.check(mine, theirs, type, comp); assertEquals(results.size(), 1); assertTrue(results.get(0).contains(type)); } @Test public void testCheckListSameObject() { @SuppressWarnings("unchecked") CompareRef<Object> comp = mock(CompareRef.class); List<Object> mine = null, theirs = null; theirs = new ArrayList<Object>(); mine = theirs; results = checker.check(mine, theirs, type, comp); assertTrue(checker.check(mine, theirs, type, results)); assertEquals(results.size(), 0); } @Test public void testCheckListDifferentListSameObject() { @SuppressWarnings("unchecked") CompareRef<Object> comp = mock(CompareRef.class); List<Object> mine = null, theirs = null; Object same = new Object(); theirs = new ArrayList<Object>(); mine = new ArrayList<Object>(); mine.add(same); theirs.add(same); results = checker.check(mine, theirs, type, comp); assertTrue(checker.check(mine, theirs, type, results)); assertEquals(results.size(), 0); } @Test public void testCheckListDifferentListWrongNumObject() { @SuppressWarnings("unchecked") CompareRef<Object> comp = mock(CompareRef.class); List<Object> mine = null, theirs = null; Object same = new Object(); theirs = new ArrayList<Object>(); theirs.add(same); mine = new ArrayList<Object>(); mine.add(same); mine.add(new Object()); results = checker.check(mine, theirs, type, comp); assertEquals(results.size(), 1); assertTrue(results.get(0).contains(type)); } @Test public void testSimpleCheckNullNull() { results = new ArrayList<String>(); Object mine = null, theirs = null; assertTrue(checker.check(mine, theirs, type, results)); assertEquals(results.size(), 0); } @Test public void testSimpleCheckNotNullNull() { results = new ArrayList<String>(); Object mine = new Object(), theirs = null; assertFalse(checker.check(mine, theirs, type, results)); assertEquals(results.size(), 1); assertTrue(results.get(0).contains(type)); } @Test public void testSimpleCheckNullNotNull() { results = new ArrayList<String>(); Object mine = null, theirs = new Object(); assertFalse(checker.check(mine, theirs, type, results)); assertEquals(results.size(), 1); assertTrue(results.get(0).contains(type)); } @Test public void testSimpleCheckSameObj() { results = new ArrayList<String>(); Object mine = new Object(), theirs = mine; // same objects theirs = mine; assertTrue(checker.check(mine, theirs, type, results)); assertEquals(results.size(), 0); } @Test public void testSimpleCheckDifferentObjects() { results = new ArrayList<String>(); Object mine = new Object(), theirs = new Object(); assertFalse(checker.check(mine, theirs, type, results)); assertEquals(results.size(), 1); assertTrue(results.get(0).contains(type)); } }