/*
* Copyright (c) 2012 Chris Ellison, Mike Deats, Liron Yahdav, Ryan Neal,
* Brandon Sutherlin, Scott Griffin
*
* This software is released under the MIT license
* (http://www.opensource.org/licenses/mit-license.php)
*
* Created on Mar 26, 2012
*/
package edu.cmu.sv.arinc838.validation;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.testng.Assert.assertEquals;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.mockito.InOrder;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import edu.cmu.sv.arinc838.binary.BdfFile;
import edu.cmu.sv.arinc838.dao.FileDefinitionDao;
import edu.cmu.sv.arinc838.dao.IntegrityDefinitionDao;
import edu.cmu.sv.arinc838.dao.IntegrityDefinitionDao.IntegrityType;
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.util.Converter;
public class SoftwareDefinitionFileValidatorTest {
private DataValidator dataVal;
private File sdfFile;
private BdfFile bdfFile;
private SoftwareDefinitionFileDao sdfDao;
@BeforeMethod
public void setUp() throws IOException {
dataVal = mock(DataValidator.class);
sdfFile = new File("src/test/resources/ACM47-1234-5678",
"ACM4712345678.BDF");
bdfFile = new BdfFile(sdfFile);
sdfDao = mock(SoftwareDefinitionFileDao.class);
when(sdfDao.getPath()).thenReturn("src/test/resources/crc_test_files");
}
private List<Exception> errorList(String message) {
List<Exception> errors = new ArrayList<Exception>();
errors.add(new Exception(message));
return errors;
}
@SuppressWarnings("unchecked")
@Test
public void testValidateSdfFile() throws IOException {
BdfFile bdfFile = mock(BdfFile.class);
when(dataVal.validateFileFormatVersion(any(byte[].class))).thenThrow(
new IllegalArgumentException("0"));
when(sdfDao.getFileFormatVersion()).thenReturn(
SoftwareDefinitionFileDao.DEFAULT_FILE_FORMAT_VERSION);
when(sdfDao.getSoftwareDescription()).thenReturn(
mock(SoftwareDescriptionDao.class));
when(sdfDao.getTargetHardwareDefinitions())
.thenReturn(mock(List.class));
when(sdfDao.getFileDefinitions()).thenReturn(mock(List.class));
when(sdfDao.getSdfIntegrityDefinition()).thenReturn(
mock(IntegrityDefinitionDao.class));
when(sdfDao.getLspIntegrityDefinition()).thenReturn(
mock(IntegrityDefinitionDao.class));
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal) {
@Override
public List<Exception> validateSoftwareDescription(
SoftwareDescriptionDao softwareDesc, String sourceFile) {
softwareDesc.getSoftwarePartnumber();
return errorList("1");
}
@Override
public List<Exception> validateTargetHardwareDefinitions(
List<TargetHardwareDefinitionDao> thwDefs, String sourceFile) {
thwDefs.isEmpty();
return errorList("2");
}
@Override
public List<Exception> validateFileDefinitions(
List<FileDefinitionDao> fileDefs, SoftwareDefinitionFileDao sdfDao, boolean isXdf) {
fileDefs.isEmpty();
return errorList("3");
}
@Override
public List<Exception> validateSdfIntegrityDefinition(
SoftwareDefinitionFileDao sdf, BdfFile bdf) {
sdf.getSdfIntegrityDefinition();
try {
bdf.getFilePointer();
} catch (IOException e) {
}
return errorList("4");
}
@Override
public List<Exception> validateLspIntegrityDefinition(
SoftwareDefinitionFileDao sdf, BdfFile bdf) {
sdf.getLspIntegrityDefinition();
try {
bdf.getFilePointer();
} catch (IOException e) {
}
return errorList("5");
}
};
List<Exception> errors = sdfVal.validateSdfFile(sdfDao, "abc.XDF", bdfFile);
assertEquals(errors.size(), 6);
for (int i = 0; i < errors.size(); i++) {
assertEquals(errors.get(i).getMessage(), i + "");
}
verify(sdfDao.getSoftwareDescription()).getSoftwarePartnumber();
verify(sdfDao.getTargetHardwareDefinitions()).isEmpty();
verify(sdfDao.getFileDefinitions()).isEmpty();
verify(sdfDao).getSdfIntegrityDefinition();
verify(sdfDao).getLspIntegrityDefinition();
verify(dataVal)
.validateFileFormatVersion(sdfDao.getFileFormatVersion());
}
@Test
public void testValidateSdfFileXmlvsBinary() {
SoftwareDefinitionFileDao sdfDao = ReferenceData.SDF_TEST_FILE;
DataValidator dataVal = new DataValidator() {
@Override
public List<Exception> validateStr64kXml(String value) {
ArrayList<Exception> errors = new ArrayList<Exception>();
errors.add(new Exception("xml"));
return errors;
}
@Override
public List<Exception> validateStr64kBinary(String value) {
ArrayList<Exception> errors = new ArrayList<Exception>();
errors.add(new Exception("binary"));
return errors;
}
};
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal) {
@Override
public List<Exception> validateFileDefinition(
FileDefinitionDao fileDef, SoftwareDefinitionFileDao sdfDao, boolean isXdf) {
return new ArrayList<Exception>();
}
@Override
public List<Exception> validateIntegrityDefinition(
IntegrityDefinitionDao integDef, byte[] data) {
return new ArrayList<Exception>();
}
@Override
public List<Exception> validateSdfIntegrityDefinition(
SoftwareDefinitionFileDao sdf, BdfFile bdfFile) {
return new ArrayList<Exception>();
}
};
List<Exception> errors = sdfVal.validateSdfFile(sdfDao,
sdfDao.getXmlFileName(), bdfFile);
assertEquals(errors.size(), 3);
for (Exception e : errors) {
assertEquals(e.getMessage(), "xml");
}
errors = sdfVal.validateSdfFile(sdfDao, sdfDao.getBinaryFileName(),
bdfFile);
assertEquals(errors.size(), 3);
for (Exception e : errors) {
assertEquals(e.getMessage(), "binary");
}
}
@Test
public void testValidateSoftwareDescriptionSoftwarePartnumber() {
SoftwareDescriptionDao softDesc = mock(SoftwareDescriptionDao.class);
when(softDesc.getSoftwarePartnumber()).thenReturn("ACM47-1234-5677");
when(
dataVal.validateSoftwarePartNumber(softDesc
.getSoftwarePartnumber())).thenThrow(
new IllegalArgumentException("0"));
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal);
List<Exception> errors = sdfVal.validateSoftwareDescription(softDesc,
"ACM4712345678.XDF");
assertEquals(errors.size(), 2);
assertEquals(errors.get(0).getMessage(), "0");
}
@Test
public void testValidateSoftwareDescriptionSoftwareTypeDescription() {
SoftwareDescriptionDao softDesc = mock(SoftwareDescriptionDao.class);
when(softDesc.getSoftwarePartnumber()).thenReturn(
ReferenceData.SOFTWARE_PART_NUMBER_REFERENCE);
when(softDesc.getSoftwareTypeDescription()).thenReturn("123");
when(dataVal.validateStr64kXml(softDesc.getSoftwareTypeDescription()))
.thenReturn(errorList("0"));
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal);
List<Exception> errors = sdfVal.validateSoftwareDescription(
softDesc,
ReferenceData.SOFTWARE_PART_NUMBER_REFERENCE
.replaceAll("-", "") + ".XDF");
assertEquals(errors.size(), 1);
assertEquals(errors.get(0).getMessage(), "0");
}
@Test
public void testValidateSoftwareDescriptionSoftwareTypeId() {
SoftwareDescriptionDao softDesc = mock(SoftwareDescriptionDao.class);
when(softDesc.getSoftwarePartnumber()).thenReturn(
ReferenceData.SOFTWARE_PART_NUMBER_REFERENCE);
when(softDesc.getSoftwareTypeId()).thenReturn(new byte[] {});
when(dataVal.validateHexbin32(softDesc.getSoftwareTypeId())).thenThrow(
new IllegalArgumentException("0"));
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal);
List<Exception> errors = sdfVal.validateSoftwareDescription(
softDesc,
ReferenceData.SOFTWARE_PART_NUMBER_REFERENCE
.replaceAll("-", "") + ".XDF");
assertEquals(errors.size(), 1);
assertEquals(errors.get(0).getMessage(), "0");
}
@Test
public void testValidateTargetHardwareDefinitions() {
when(dataVal.validateStr64kXml("0")).thenReturn(errorList("0"));
when(dataVal.validateStr64kXml("1")).thenReturn(errorList("1"));
when(dataVal.validateStr64kXml("2")).thenReturn(errorList("2"));
TargetHardwareDefinitionDao thwDef1 = mock(TargetHardwareDefinitionDao.class);
when(thwDef1.getPositions()).thenReturn(
Arrays.asList(new String[] { "0" }));
TargetHardwareDefinitionDao thwDef2 = mock(TargetHardwareDefinitionDao.class);
when(thwDef2.getPositions()).thenReturn(
Arrays.asList(new String[] { "1", "2" }));
TargetHardwareDefinitionDao thwDef3 = mock(TargetHardwareDefinitionDao.class);
when(thwDef3.getPositions()).thenReturn(null);
List<TargetHardwareDefinitionDao> thwDefs = Arrays
.asList(new TargetHardwareDefinitionDao[] { thwDef1, thwDef2,
thwDef3 });
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal);
List<Exception> errors = sdfVal.validateTargetHardwareDefinitions(
thwDefs, "file.XDF");
assertEquals(errors.size(), 3);
for (int i = 0; i < errors.size(); i++) {
assertEquals(errors.get(i).getMessage(), i + "");
}
}
@Test
public void testValidateFileDefinitions() {
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal) {
@Override
public List<Exception> validateFileDefinition(
FileDefinitionDao fileDef, SoftwareDefinitionFileDao sdfDao, boolean isXdf) {
fileDef.getFileName();
return errorList(fileDef.getFileName());
}
};
FileDefinitionDao fileDef1 = mock(FileDefinitionDao.class);
when(fileDef1.getFileName()).thenReturn("a");
FileDefinitionDao fileDef2 = mock(FileDefinitionDao.class);
when(fileDef2.getFileName()).thenReturn("b");
FileDefinitionDao fileDef3 = mock(FileDefinitionDao.class);
when(fileDef3.getFileName()).thenReturn("b");
List<FileDefinitionDao> fileDefs = Arrays
.asList(new FileDefinitionDao[] { fileDef1, fileDef2 });
InOrder order = inOrder(dataVal);
when(dataVal.validateList1(fileDefs)).thenThrow(
new IllegalArgumentException("0"));
List<Exception> errors = sdfVal.validateFileDefinitions(fileDefs, sdfDao, true);
order.verify(dataVal).validateList1(fileDefs);
order.verify(dataVal).validateDataFileNamesAreUnique(fileDefs);
assertEquals(errors.size(), 3);
assertEquals(errors.get(0).getMessage(), "0");
assertEquals(errors.get(1).getMessage(), fileDef1.getFileName());
assertEquals(errors.get(2).getMessage(), fileDef2.getFileName());
}
@Test
public void testValidateFileDefinitionFileName() {
FileDefinitionDao fileDef = mock(FileDefinitionDao.class);
when(fileDef.getFileName()).thenReturn("123");
when(dataVal.validateDataFileName(fileDef.getFileName())).thenReturn(
errorList("0"));
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal) {
@Override
public List<Exception> validateIntegrityDefinition(
IntegrityDefinitionDao integDef, byte[] data) {
return new ArrayList<Exception>();
}
};
List<Exception> errors = sdfVal.validateFileDefinition(fileDef, sdfDao, false);
assertEquals(errors.size(), 2);
assertEquals(errors.get(0).getMessage(), "0");
}
@Test
public void testValidateFileDefinitionFileSize() {
FileDefinitionDao fileDef = mock(FileDefinitionDao.class);
when(fileDef.getFileSize()).thenReturn(1234L);
when(fileDef.getFileName()).thenReturn("someFile");
when(dataVal.validateUint32(fileDef.getFileSize())).thenThrow(
new IllegalArgumentException("0"));
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal) {
@Override
public List<Exception> validateIntegrityDefinition(
IntegrityDefinitionDao integDef, byte[] data) {
return new ArrayList<Exception>();
}
};
List<Exception> errors = sdfVal.validateFileDefinition(fileDef, sdfDao, false);
assertEquals(errors.size(), 2);
assertEquals(errors.get(0).getMessage(), "Checksum for file someFile was invalid! Error was '0'.");
}
@Test
public void testValidateFileDefinitionIntegrityDefinition() {
when(sdfDao.getPath()).thenReturn("src/test/resources/crc_test_files");
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal) {
@Override
public List<Exception> validateIntegrityDefinition(
IntegrityDefinitionDao integDef, byte[] data) {
return errorList("0");
}
};
FileDefinitionDao fileDef = mock(FileDefinitionDao.class);
when(fileDef.getFileIntegrityDefinition()).thenReturn(
new IntegrityDefinitionDao());
when(fileDef.getFileName()).thenReturn("someFile");
List<Exception> errors = sdfVal.validateFileDefinition(fileDef, sdfDao, false);
assertEquals(errors.size(), 2);
assertEquals(errors.get(1).getMessage(), "0");
}
@Test
public void testValidateFileDefinitionIntegrityDefinitionCrcCheckPass() {
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal);
FileDefinitionDao fileDef = new FileDefinitionDao();
fileDef.setFileName("CRC_T05A.rom");
fileDef.setFileSize(3976);
IntegrityDefinitionDao integ = new IntegrityDefinitionDao();
integ.setIntegrityType(IntegrityType.CRC32.getType());
integ.setIntegrityValue(Converter.hexToBytes("0096142DCA"));
fileDef.setFileIntegrityDefinition(integ);
List<Exception> errors = sdfVal.validateFileDefinition(fileDef, sdfDao, false);
assertEquals(errors.size(), 0);
}
@Test
public void testValidateIntegrityDefinitionIntegrityType() {
IntegrityDefinitionDao integDef = mock(IntegrityDefinitionDao.class);
when(integDef.getIntegrityType()).thenReturn(
IntegrityType.CRC16.getType());
when(dataVal.validateIntegrityType(integDef.getIntegrityType()))
.thenThrow(new IllegalArgumentException("0"));
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal);
List<Exception> errors = sdfVal.validateIntegrityDefinition(integDef,
null);
assertEquals(errors.size(), 1);
assertEquals(errors.get(0).getMessage(), "0");
}
@Test
public void testValidateIntegrityDefinitionIntegrityValue() {
IntegrityDefinitionDao integDef = mock(IntegrityDefinitionDao.class);
when(integDef.getIntegrityValue())
.thenReturn(new byte[] { 1, 2, 3, 4 });
when(dataVal.validateIntegrityValue(integDef.getIntegrityValue()))
.thenThrow(new IllegalArgumentException("0"));
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal);
List<Exception> errors = sdfVal.validateIntegrityDefinition(integDef,
null);
assertEquals(errors.size(), 1);
assertEquals(errors.get(0).getMessage(), "0");
}
@Test
public void testValidateIntegrityDefinitionCrc16() {
IntegrityDefinitionDao integDef = mock(IntegrityDefinitionDao.class);
when(integDef.getIntegrityValue())
.thenReturn(new byte[] { 0, 0, 0, 0 });
when(integDef.getIntegrityType()).thenReturn(
IntegrityType.CRC16.getType());
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal);
byte[] data = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
List<Exception> errors = sdfVal.validateIntegrityDefinition(integDef,
data);
assertEquals(errors.size(), 1);
}
@Test
public void testValidateIntegrityDefinitionCrc32() {
IntegrityDefinitionDao integDef = mock(IntegrityDefinitionDao.class);
when(integDef.getIntegrityValue())
.thenReturn(new byte[] { 0, 0, 0, 0 });
when(integDef.getIntegrityType()).thenReturn(
IntegrityType.CRC32.getType());
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal);
byte[] data = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
List<Exception> errors = sdfVal.validateIntegrityDefinition(integDef,
data);
assertEquals(errors.size(), 1);
}
@Test
public void testValidateIntegrityDefinitionCrc64() {
IntegrityDefinitionDao integDef = mock(IntegrityDefinitionDao.class);
when(integDef.getIntegrityValue())
.thenReturn(new byte[] { 0, 0, 0, 0 });
when(integDef.getIntegrityType()).thenReturn(
IntegrityType.CRC64.getType());
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal);
byte[] data = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
List<Exception> errors = sdfVal.validateIntegrityDefinition(integDef,
data);
assertEquals(errors.size(), 1);
}
@Test
public void testValidateSdfIntegrityDefinition() {
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal) {
@Override
protected List<Exception> validateIntegrityDefStructure(
IntegrityDefinitionDao integDef) {
return errorList("0");
}
};
when(sdfDao.getSdfIntegrityDefinition()).thenReturn(
ReferenceData.SDF_TEST_FILE.getSdfIntegrityDefinition());
List<Exception> errors = sdfVal.validateSdfIntegrityDefinition(sdfDao,
bdfFile);
assertEquals(errors.size(), 1);
assertEquals(errors.get(0).getMessage(), "0");
}
@Test
public void testValidateSdfIntegrityDefinitionCrcCheckPass()
throws IOException {
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal);
List<Exception> errors = sdfVal.validateSdfIntegrityDefinition(
ReferenceData.SDF_TEST_FILE, bdfFile);
assertEquals(errors.size(), 0);
}
@Test
public void testValidateLspIntegrityDefinition() {
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal) {
@Override
protected List<Exception> validateIntegrityDefStructure(
IntegrityDefinitionDao integDef) {
return errorList("0");
}
};
SoftwareDefinitionFileDao sdfDao = mock(SoftwareDefinitionFileDao.class);
when(sdfDao.getLspIntegrityDefinition()).thenReturn(
ReferenceData.SDF_TEST_FILE.getLspIntegrityDefinition());
when(sdfDao.getFileDefinitions()).thenReturn(
ReferenceData.SDF_TEST_FILE.getFileDefinitions());
when(sdfDao.getPath()).thenReturn("src/test/resources/ACM47-1234-5678");
List<Exception> errors = sdfVal.validateLspIntegrityDefinition(sdfDao,
bdfFile);
assertEquals(errors.size(), 1);
assertEquals(errors.get(0).getMessage(), "0");
}
@Test
public void testValidateLspIntegrityDefinitionCrcCheckPass()
throws IOException {
SoftwareDefinitionFileValidator sdfVal = new SoftwareDefinitionFileValidator(
dataVal);
List<Exception> errors = sdfVal.validateLspIntegrityDefinition(
ReferenceData.SDF_TEST_FILE, bdfFile);
assertEquals(errors.size(), 0);
}
}