/*******************************************************************************
* Copyright (c) 2010, 2017 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.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.linuxtools.internal.oprofile.core.opxml.checkevent.CheckEventAdapter;
import org.eclipse.linuxtools.internal.oprofile.core.opxml.info.InfoAdapter;
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.xml.sax.SAXException;
/**
* Test cases for checking the validity of the info parsed from oprofile
* that is modified to mimic the 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 TestCheckEventsPreParse {
private static final String REL_PATH_TO_CHECKEVENT_BAD_UMASK = "resources/test_check-event_invalid_umask.xml";
private static final String REL_PATH_TO_CHECKEVENT_OK = "resources/test_check-event_ok.xml";
private static final String REL_PATH_TO_INFO_PRE_PARSE_RAW = "resources/test_info_pre_parse_raw.xml";
// the values are checked for validity in the order they
// appear here (ctr, event, umask)
private String ctr;
private String umask;
private CheckEventAdapter cea;
/**
* Set the counter, existing event and its default unit mask.
*/
@Before
public void setUp (){
String devOprofileAbsFilePath = null;
Path devOprofilePath = new Path("resources/dev/oprofile/");
URL devOprofileURL = FileLocator.find(FrameworkUtil.getBundle(this.getClass()), devOprofilePath , null);
try {
devOprofileAbsFilePath = FileLocator.toFileURL(devOprofileURL).getFile();
} catch (IOException e) {
fail("Failed to convert the resource file's path.");
}
InfoAdapter.setOprofileDir(devOprofileAbsFilePath);
File devFile = new File(InfoAdapter.DEV_OPROFILE + "0");
if (devFile.exists()){
ctr = "0";
}
File cpuFile = new File(InfoAdapter.CPUTYPE);
try (BufferedReader bi = new BufferedReader(new FileReader(cpuFile))) {
String cpuType = bi.readLine();
File opArchEvents = new File(InfoAdapter.OP_SHARE + cpuType + "/"
+ InfoAdapter.EVENTS);
File opArchUnitMasks = new File(InfoAdapter.OP_SHARE + cpuType
+ "/" + InfoAdapter.UNIT_MASKS);
try (BufferedReader eventReader = new BufferedReader(
new FileReader(opArchEvents))) {
String line;
while ((line = eventReader.readLine()) != null) {
// find the first event and use it
if (line.contains("name:")) {
int start = line.indexOf("name:") + 5;
int end = line.indexOf(" ", start);
// get the string that references the unit mask type
start = line.indexOf("um:") + 3;
end = line.indexOf(" ", start);
String um = line.substring(start, end);
try (BufferedReader unitMaskReader = new BufferedReader(
new FileReader(opArchUnitMasks))) {
while ((line = unitMaskReader.readLine()) != null) {
if (line.contains("name:" + um + " ")) {
start = line.indexOf("default:") + 8;
String unitMaskDef = line.substring(start);
// convert from hex. to dec.
unitMaskDef = unitMaskDef.replaceFirst(
"0x", "");
umask = String.valueOf(Integer.parseInt(
unitMaskDef, 16));
break;
}
}
}
break;
}
}
}
} catch (IOException e) {
}
}
@Test
public void testBadUnitMask (){
umask = "999";
assertValidity(REL_PATH_TO_CHECKEVENT_BAD_UMASK);
}
public void assertValidity (String path){
IFileStore fileStore = null;
String infoAbsFilePath = null;
Path infoFilePath = new Path(REL_PATH_TO_INFO_PRE_PARSE_RAW);
URL infoFileURL = FileLocator.find(FrameworkUtil.getBundle(this.getClass()), infoFilePath, null);
try {
infoAbsFilePath = FileLocator.toFileURL(infoFileURL).getFile();
fileStore = EFS.getLocalFileSystem().getStore(new Path(infoAbsFilePath));
} catch (IOException e) {
fail("Failed to convert the resource file's path.");
}
InfoAdapter ia = new InfoAdapter(fileStore);
ia.process();
cea = new CheckEventAdapter(ctr, "CPU_CLK_UNHALTED", umask);
cea.process();
Document actualDocument = cea.getDocument();
Element actualRoot = (Element) actualDocument.getElementsByTagName(CheckEventAdapter.CHECK_EVENTS).item(0);
Path filePath = new Path(path);
URL fileURL = FileLocator.find(FrameworkUtil.getBundle(this.getClass()), filePath, null);
Element expectedRoot = null;
try {
String 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(CheckEventAdapter.CHECK_EVENTS).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.");
}
Element expectedResultTag = (Element) expectedRoot.getElementsByTagName(CheckEventAdapter.RESULT).item(0);
Element actualResultTag = (Element) actualRoot.getElementsByTagName(CheckEventAdapter.RESULT).item(0);
assertEquals(expectedResultTag.getTextContent(), actualResultTag.getTextContent());
}
}