/*
* 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 Feb 6, 2012
*/
package edu.cmu.sv.arinc838.writer;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.io.File;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import org.testng.annotations.Test;
import com.arinc.arinc838.FileDefinition;
import com.arinc.arinc838.IntegrityDefinition;
import com.arinc.arinc838.SdfFile;
import com.arinc.arinc838.SoftwareDescription;
import com.arinc.arinc838.ThwDefinition;
import edu.cmu.sv.arinc838.dao.SoftwareDefinitionFileDao;
import edu.cmu.sv.arinc838.util.Converter;
import edu.cmu.sv.arinc838.validation.DataValidator;
import edu.cmu.sv.arinc838.validation.ReferenceData;
import edu.cmu.sv.arinc838.validation.SoftwareDefinitionFileValidator;
public class XdfWriterTest {
@Test
public void xdfWriteTest() throws Exception {
SdfFile file = getTestFile();
File writtenXmlFile = new File(
ReferenceData.SOFTWARE_PART_NUMBER_REFERENCE.replace("-", "") + ".XDF");
try {
// write the file based on the input
XdfWriter writer = new XdfWriter();
writer.write(writtenXmlFile, file);
// read the file back in
SdfFile jaxbFile = readJaxb(writtenXmlFile);
// verify the files match
verifyMatch(file, writtenXmlFile.getName(), jaxbFile,
writtenXmlFile.getName());
} finally {
writtenXmlFile.delete();
}
}
@Test
public void testGetFileName() throws Exception {
SdfFile file = getTestFile();
SoftwareDefinitionFileDao sdfDao = new SoftwareDefinitionFileDao(file, "");
XdfWriter writer = new XdfWriter();
String fileName = writer.getFilename(sdfDao);
assertEquals(fileName, sdfDao.getXmlFileName());
}
private void verifyMatch(SdfFile file1, String fileName1, SdfFile file2,
String fileName2) throws Exception {
// verify validity of both files
SoftwareDefinitionFileValidator validator = new SoftwareDefinitionFileValidator(
new DataValidator());
List<Exception> errors = validator.validateSdfFile(
new SoftwareDefinitionFileDao(file1, ""), fileName1, null);
assertEquals(errors.size(), 0);
assertEquals(validator.validateXmlFileHeader(new File (fileName1)).size(), 0);
errors = validator.validateSdfFile(
new SoftwareDefinitionFileDao(file2, ""), fileName2, null);
assertEquals(errors.size(), 0);
assertEquals(validator.validateXmlFileHeader(new File (fileName2)).size(), 0);
assertEquals(file1.getFileFormatVersion(), file2.getFileFormatVersion());
assertEquals(file1.getLspIntegrityDefinition().getIntegrityType(),
file2.getLspIntegrityDefinition().getIntegrityType());
assertEquals(file1.getLspIntegrityDefinition().getIntegrityValue(),
file2.getLspIntegrityDefinition().getIntegrityValue());
assertEquals(file1.getSoftwareDescription().getSoftwarePartnumber(),
file2.getSoftwareDescription().getSoftwarePartnumber());
assertEquals(file1.getSoftwareDescription()
.getSoftwareTypeDescription(), file2.getSoftwareDescription()
.getSoftwareTypeDescription());
assertEquals(file1.getSoftwareDescription().getSoftwareTypeId(), file2
.getSoftwareDescription().getSoftwareTypeId());
assertEquals(file1.getFileDefinitions().size(), file2
.getFileDefinitions().size());
List<FileDefinition> file1FileDefs = file1.getFileDefinitions();
List<FileDefinition> file2FileDefs = file2.getFileDefinitions();
for (int i = 0; i < file1FileDefs.size(); i++) {
FileDefinition fdef1 = file1FileDefs.get(i);
FileDefinition fdef2 = file2FileDefs.get(i);
assertEquals(fdef1.getFileName(), fdef2.getFileName());
assertEquals(fdef1.getFileSize(), fdef2.getFileSize());
assertEquals(fdef1.getFileIntegrityDefinition().getIntegrityType(),
fdef2.getFileIntegrityDefinition().getIntegrityType());
assertEquals(
fdef1.getFileIntegrityDefinition().getIntegrityValue(),
fdef2.getFileIntegrityDefinition().getIntegrityValue());
}
assertEquals(file1.getThwDefinitions().size(), file2
.getThwDefinitions().size());
List<ThwDefinition> file1ThwDefs = file1.getThwDefinitions();
List<ThwDefinition> file2ThwDefs = file2.getThwDefinitions();
for (int i = 0; i < file1ThwDefs.size(); i++) {
ThwDefinition tdef1 = file1ThwDefs.get(i);
ThwDefinition tdef2 = file2ThwDefs.get(i);
assertEquals(tdef1.getThwId(), tdef2.getThwId());
}
}
private SdfFile readJaxb(File writtenXmlFile) throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(SdfFile.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
return (SdfFile) jaxbUnmarshaller.unmarshal(writtenXmlFile);
}
private static SdfFile getTestFile() {
SdfFile swDefFile = new SdfFile();
IntegrityDefinition lspInteg = new IntegrityDefinition();
lspInteg.setIntegrityType(2);
lspInteg.setIntegrityValue(Converter.hexToBytes("DEADBEEF"));
IntegrityDefinition sdfInteg = new IntegrityDefinition();
sdfInteg.setIntegrityType(2);
sdfInteg.setIntegrityValue(Converter.hexToBytes("DEADBEEF"));
swDefFile.setLspIntegrityDefinition(lspInteg);
swDefFile.setSdfIntegrityDefinition(sdfInteg);
SoftwareDescription swDesc = new SoftwareDescription();
swDesc.setSoftwarePartnumber(ReferenceData.SOFTWARE_PART_NUMBER_REFERENCE);
swDesc.setSoftwareTypeDescription("type");
swDesc.setSoftwareTypeId(Converter.hexToBytes("DEADBEEF"));
swDefFile.setSoftwareDescription(swDesc);
FileDefinition file = new FileDefinition();
file.setFileIntegrityDefinition(lspInteg);
file.setFileName("test.rom");
file.setFileSize(42);
file.setFileLoadable(true);
swDefFile.getFileDefinitions().add(file);
swDefFile
.setFileFormatVersion(SoftwareDefinitionFileDao.DEFAULT_FILE_FORMAT_VERSION);
return swDefFile;
}
@Test
public void testBuildsCorrectFileName() throws Exception {
SoftwareDefinitionFileDao builder = new SoftwareDefinitionFileDao(getTestFile(), "");
XdfWriter writer = new XdfWriter();
String tempPath = System.getProperty("java.io.tmpdir");
String filename = tempPath + builder.getXmlFileName();
writer.write(tempPath, builder);
File file = new File(filename);
assertTrue(file.exists());
file.delete();
}
}