/******************************************************************************* * Copyright (c) 2010 Institute for Software, HSR Hochschule fuer Technik * Rapperswil, University of applied sciences and others * All rights reserved. * * Contributors: * Institute for Software - initial API and implementation ******************************************************************************/ package ch.hsr.ifs.cdttesting.cdttest; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.LinkedHashMap; import java.util.List; import java.util.Map.Entry; import java.util.Properties; import java.util.TreeMap; import org.eclipse.cdt.core.dom.IPDOMManager; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.testplugin.CProjectHelper; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.text.TextSelection; import ch.hsr.ifs.cdttesting.testsourcefile.TestSourceFile; public abstract class CDTSourceFileTest extends CDTProjectTest { private static final String CONFIG_FILE_NAME = ".config"; protected TreeMap<String, TestSourceFile> fileMap; protected String fileWithSelection; protected TextSelection selection; protected String activeFileName; /** * Key: projectName, value: project's files */ protected final LinkedHashMap<String, List<TestSourceFile>> referencedProjectsToLoad; { instantiateExpectedProject = true; } public CDTSourceFileTest() { super(); fileMap = new TreeMap<>(); referencedProjectsToLoad = new LinkedHashMap<>(); } public void initTestSourceFiles(final List<TestSourceFile> files) { initActiveFileName(files); TestSourceFile configFile = null; for (final TestSourceFile file : files) { fileMap.put(file.getName(), file); if (file.getName().equals(CONFIG_FILE_NAME)) { configFile = file; } } if (configFile != null) { initializeConfiguration(configFile); } else { initializeConfiguration(); } initSelection(files); } private void initSelection(final List<TestSourceFile> files) { for (final TestSourceFile file : files) { final TextSelection selection = file.getSelection(); if (selection != null) { fileWithSelection = file.getName(); this.selection = selection; break; } } } private void initActiveFileName(final List<TestSourceFile> files) { activeFileName = ".unknown"; int index = 0; if (files.size() <= index) { return; } if (files.get(0).getName().equals(CONFIG_FILE_NAME)) { index++; } if (files.size() > index) { activeFileName = files.get(index).getName(); } } private void initializeConfiguration(final TestSourceFile configFile) { final Properties properties = new Properties(); try { properties.load(new ByteArrayInputStream(configFile.getSource().getBytes())); } catch (final IOException e) { } initializeConfiguration(properties); fileMap.remove(configFile.getName()); } private void initializeConfiguration(final Properties properties) { initCommonFields(properties); configureTest(properties); } private void initializeConfiguration() { initializeConfiguration(new Properties()); } protected void configureTest(final Properties properties) { }; private void initCommonFields(final Properties properties) { final String filename = properties.getProperty("filename", null); if (filename != null) { activeFileName = filename; } } @Override protected void setupFiles() throws Exception { for (final TestSourceFile testFile : fileMap.values()) { importFile(testFile.getName(), testFile.getSource()); if (expectedProject != null) { importFile(testFile.getName(), testFile.getExpectedSource(), expectedProject); } } project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor()); if (expectedProject != null) { expectedProject.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor()); } } @Override protected void tearDown() throws Exception { super.tearDown(); cleanupProject(); } @Override protected void initReferencedProjects() throws Exception { for (final Entry<String, List<TestSourceFile>> curEntry : referencedProjectsToLoad.entrySet()) { initReferencedProject(curEntry.getKey(), curEntry.getValue()); } } private void initReferencedProject(final String projectName, final List<TestSourceFile> testCases) throws Exception { final ICProject cProj = CProjectHelper.createCCProject(projectName, "bin", IPDOMManager.ID_NO_INDEXER); for (final TestSourceFile testFile : testCases) { if (testFile.getSource().length() > 0) { importFile(testFile.getName(), testFile.getSource(), cProj.getProject()); } } referencedProjects.add(cProj); } protected String getTestSource() throws IOException { return getTestSource(activeFileName); } protected String getTestSource(final String relativeFilePath) throws IOException { if (relativeFilePath.startsWith("..")) { return getExternalSource(makeProjectAbsolutePath(relativeFilePath)); } return fileMap.get(relativeFilePath).getSource(); } private String getExternalSource(final String absoluteFilePath) throws IOException { final int len = (int) (new File(absoluteFilePath).length()); final FileInputStream fis = new FileInputStream(absoluteFilePath); final byte buf[] = new byte[len]; fis.read(buf); fis.close(); return new String(buf); } protected String getExpectedSource() { return getExpectedSource(activeFileName); } protected String getExpectedSource(final String relativeFilePath) { return fileMap.get(relativeFilePath).getExpectedSource(); } }