/*******************************************************************************
* Copyright (c) 2010-2013 Red Hat, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.oprofile.core.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.linuxtools.internal.oprofile.core.opxml.modeldata.ModelDataAdapter;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.FrameworkUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
* Test cases for checking validity of the model data parsed from oprofile that
* is modified to mimic the XML format expected by the SAX parser.
* The oprofile module must be loaded and the driver interface must be
* available. ie. run opcontrol --init
*/
public class TestModelDataPreParse {
private static final String REL_PATH_TO_MODEL_DATA_RAW = "resources/test_model-data_raw.xml";
private static final String REL_PATH_TO_MODEL_DATA_EXPECTED = "resources/test_model-data_expected.xml";
ModelDataAdapter mda;
Element [] rootList;
ArrayList<ArrayList<String>> valueList;
@Before
public void setUp (){
String absFilePath;
Path filePath = new Path(REL_PATH_TO_MODEL_DATA_RAW);
URL fileURL = FileLocator.find(FrameworkUtil.getBundle(this.getClass()), filePath, null);
try {
absFilePath = FileLocator.toFileURL(fileURL).getFile();
File file = new File (absFilePath);
FileInputStream inp = new FileInputStream(file);
mda = new ModelDataAdapter(inp);
mda.process();
} catch (IOException e) {
e.printStackTrace();
}
mda.process();
Document actualDocument = mda.getDocument();
Element actualRoot = (Element) actualDocument.getElementsByTagName(ModelDataAdapter.MODEL_DATA).item(0);
filePath = new Path(REL_PATH_TO_MODEL_DATA_EXPECTED);
fileURL = FileLocator.find(FrameworkUtil.getBundle(this.getClass()), filePath, null);
Element expectedRoot = null;
try {
absFilePath = FileLocator.toFileURL(fileURL).getFile();
File file = new File (absFilePath);
FileInputStream inp = new FileInputStream(file);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
builder = factory.newDocumentBuilder();
Document expectedDocument = builder.parse(inp);
expectedRoot = (Element) expectedDocument.getElementsByTagName(ModelDataAdapter.MODEL_DATA).item(0);
} catch (FileNotFoundException e) {
fail("File was not found.");
} catch (IOException e) {
fail("Failed to convert the resource file's path.");
} catch (SAXException e) {
fail("Failed to parse the XML.");
} catch (ParserConfigurationException e) {
fail("Failed to create a document builder.");
}
rootList = new Element [] {expectedRoot, actualRoot};
valueList = new ArrayList<> ();
for (int i = 0; i < rootList.length; i++){
valueList.add(new ArrayList<String>());
}
}
@Test
public void testBasic (){
final String [] imageAttrs = new String [] {ModelDataAdapter.NAME, ModelDataAdapter.COUNT};
final String [] symbolAttrs = new String [] {ModelDataAdapter.NAME, ModelDataAdapter.FILE, ModelDataAdapter.COUNT};
final String [] sampleTags = new String [] {ModelDataAdapter.COUNT, ModelDataAdapter.LINE};
for (int i = 0; i < rootList.length; i++){
Element imageTag = (Element) rootList[i].getElementsByTagName(ModelDataAdapter.IMAGE).item(0);
// image name, count
for (int j = 0; j < imageAttrs.length; j++){
String attr = imageTag.getAttribute(imageAttrs[j]);
valueList.get(i).add(attr);
}
Element symbolsTag = (Element) rootList[i].getElementsByTagName(ModelDataAdapter.SYMBOLS).item(0);
NodeList symbolList = symbolsTag.getElementsByTagName(ModelDataAdapter.SYMBOL);
// go through each symbol
for (int j = 0; j < symbolList.getLength(); j++){
Element symbolTag = (Element) symbolList.item(j);
// symbol name, file, count
for (int k = 0; k < symbolAttrs.length; k++){
String attr = symbolTag.getAttribute(symbolAttrs[k]);
valueList.get(i).add(attr);
}
NodeList sampleList = symbolsTag.getElementsByTagName(ModelDataAdapter.SAMPLE);
// go through each sample
for (int k = 0; k < sampleList.getLength(); k++){
Element sampleTag = (Element) sampleList.item(k);
for (int n = 0; n < sampleTags.length; n++){
Element elem = (Element) sampleTag.getElementsByTagName(sampleTags[n]).item(0);
valueList.get(i).add(elem.getTextContent());
}
}
}
}
assertSameValues(valueList);
}
private void assertSameValues(ArrayList<ArrayList<String>> valueList) {
for (int i = 0; i < valueList.get(0).size(); i++){
assertEquals(valueList.get(0).get(i), valueList.get(1).get(i));
}
}
}