/******************************************************************************* * Copyright (c) 2009 STMicroelectronics. * 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: * Xavier Raynaud <xavier.raynaud@st.com> - initial API and implementation *******************************************************************************/ package org.eclipse.linuxtools.internal.gprof.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import java.io.File; import java.io.FileFilter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.LineNumberReader; import java.net.URL; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.linuxtools.dataviewers.abstractview.AbstractSTDataView; import org.eclipse.linuxtools.dataviewers.abstractviewers.STDataViewersCSVExporter; import org.osgi.framework.Bundle; /** * This class only contains some tools to facilitate tests * (compare) * @author Xavier Raynaud <xavier.raynaud@st.com> */ public class STJunitUtils { public static final String BINARY_FILE = "a.out"; public static final String OUTPUT_FILE = "gmon.out"; public static final String DIRECTORY_SUFFIX = "_gprof_input"; /** * Test CSV export of the given view * @param view * @param dumpFullFileName * @param refFullFileName */ public static boolean testCSVExport(AbstractSTDataView view, String dumpFullFileName, String refFullFileName) { STDataViewersCSVExporter exporter = new STDataViewersCSVExporter(view.getSTViewer()); exporter.exportTo(dumpFullFileName, new NullProgressMonitor()); // compare with ref return compareCSVIgnoreEOL(dumpFullFileName, refFullFileName, true); } /** * Utility method to compare files * @param dumpFile * @param refFile * @return */ public static boolean compareIgnoreEOL(String dumpFile, String refFile, boolean deleteDumpFileIfOk) { String message = "Comparing ref file ("+refFile+ ")and dump file (" + dumpFile+")"; boolean equals = false; try (LineNumberReader is1 = new LineNumberReader(new FileReader(dumpFile)); LineNumberReader is2 = new LineNumberReader(new FileReader(refFile))){ do { String line1 = is1.readLine(); String line2 = is2.readLine(); if (line1 == null) { if (line2 == null) { equals = true; } break; } else if (line2 == null || !line1.equals(line2)) { break; } } while (true); if (!equals) { assertEquals(message + ": not correspond ", true, false); } is1.close(); is2.close(); // delete dump only for successful tests if (equals && deleteDumpFileIfOk) { new File(dumpFile).delete(); } }catch (FileNotFoundException fnfe) { message += "... FAILED: One of these files may not exist"; assertNull(message, fnfe); } catch (Exception e) { message += ": exception raised ... FAILED"; assertNull(message, e); } return equals; } /** * Utility method to compare exported CSV files * @param dumpFile * @param refFile * @return */ public static boolean compareCSVIgnoreEOL(String dumpFile, String refFile, boolean deleteDumpFileIfOk) { String message = "Comparing ref file ("+refFile+ ")and dump file (" + dumpFile+")"; boolean equals = false; String str = "[in-charge]"; // this string can be dumped according to binutils version installed on local machine try (LineNumberReader is1 = new LineNumberReader(new FileReader(dumpFile)); LineNumberReader is2 = new LineNumberReader(new FileReader(refFile))){ do { String line1 = is1.readLine(); String line2 = is2.readLine(); int length = str.length(); if (line1 == null) { if (line2 == null) { equals = true; } break; } else if (line1.contains(str)){ int idx = line1.indexOf("[in-charge]"); char c = line1.charAt(idx -1); if (c == ' ' ){ idx--; length++; } line1 = line1.substring(0, idx) + line1.substring(idx+length, line1.length()); if (!line1.equals(line2)) break; } else if (line2 == null || !line1.equals(line2)) { break; } } while (true); is1.close(); is2.close(); if (!equals) { StringBuffer msg = new StringBuffer(message + ": not correspond "); msg.append("\n========= begin dump file =========\n"); try (FileReader fr = new FileReader(dumpFile)) { int c; while ((c = fr.read()) != -1) { msg.append((char) c); } } msg.append("\n========= end dump file =========\n"); assertEquals(msg.toString(), true, false); } // delete dump only for successful tests if (equals && deleteDumpFileIfOk) { new File(dumpFile).delete(); } }catch (FileNotFoundException e) { message += "... FAILED: One of these files may not exist"; assertNull(message, e); } catch (Exception e) { message += ": exception raised ... FAILED"; assertNull(message, e); } return equals; } /** * Utility method to compare Input streams * @param ISdump * @param ISref * @return * @throws IOException */ public static boolean compare(InputStream ISdump, InputStream ISref) throws IOException { try { boolean equals = false; do { int char1 = ISdump.read(); int char2 = ISref.read(); if (char1 != char2) break; if (char1 == -1) { equals = true; break; } } while (true); return equals; } finally { ISdump.close(); ISref.close(); } } /** * Gets the absolute path of a resource in the given plugin * @param pluginId * @param relativeName * @return an absolute path to a file */ public static String getAbsolutePath(String pluginId, String relativeName) { Bundle b = Platform.getBundle(pluginId); URL url = FileLocator.find(b, new Path(relativeName), null); try { url = FileLocator.toFileURL(url); } catch (IOException e) { assertNotNull("Problem locating " + relativeName + " in" + pluginId,e); } String filename = url.getFile(); return filename; } /** * Utility method * @return the list of directories that belong to the pluginDirectory and * ends with the given extensionSuffix */ public static File[] getTestDirs() { // load directories containing tests String filename = getAbsolutePath("org.eclipse.linuxtools.gprof.test", "."); File dir = new File(filename); File[] testDirs = dir.listFiles( new FileFilter() { @Override public boolean accept(File arg0) { return (arg0.isDirectory() && arg0.getName().matches(".*" + DIRECTORY_SUFFIX)); } } ); // test if there is any directory samples assertNotNull("No project files to test",testDirs); return testDirs; } }