blob: a155f7eaa863804c8f44072b4dfd59a7fffb4ca4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2013 Nokia and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Nokia (Ed Swartz) - initial API and implementation
* Wind River Systems - Bug 338936
*******************************************************************************/
package org.eclipse.cdt.make.core.tests;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.core.makefile.IMacroDefinition;
import org.eclipse.cdt.make.core.makefile.IMakefile;
import org.eclipse.cdt.make.core.makefile.IMakefileReaderProvider;
import org.eclipse.cdt.make.core.makefile.IRule;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
@SuppressWarnings("nls")
public class MakefileReaderProviderTests extends TestCase {
private String[] inclDirs;
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
@Override
protected void setUp() throws Exception {
super.setUp();
String basePath = "";
File baseDir = getPluginRelativeFile(new Path("data"));
if (baseDir != null)
basePath = baseDir.getAbsolutePath() + File.separator;
inclDirs = new String[] { basePath + "bogus", basePath + "incl" };
}
public void testNoReaderProvider() throws Exception {
IPath path = new Path("data/Makefile.main");
File file = getPluginRelativeFile(path);
// doesn't work in packaged plugin, which is fine
if (file != null) {
IMakefile makefile = MakeCorePlugin.createMakefile(URIUtil.toURI(file.getAbsolutePath()), true, inclDirs);
assertMakefileContents(makefile);
}
}
public void testNullReaderProvider() throws Exception {
IPath path = new Path("data/Makefile.main");
File file = getPluginRelativeFile(path);
// doesn't work in packaged plugin, which is fine
if (file != null) {
IMakefile makefile = MakeCorePlugin.createMakefile(URIUtil.toURI(file.getAbsolutePath()), true, inclDirs,
null);
assertMakefileContents(makefile);
}
}
public void testInputStreamReaderProvider() throws Exception {
IPath path = new Path("Makefile.main");
// get base directory for searches
final URL url = getPluginRelativeURL(new Path("data").addTrailingSeparator());
IMakefile makefile = MakeCorePlugin.createMakefile(URIUtil.toURI(path), true, inclDirs,
new IMakefileReaderProvider() {
@Override
public Reader getReader(URI fileURI) throws IOException {
URL fileUrl;
try {
fileUrl = new URL(url, fileURI.getPath());
} catch (MalformedURLException e) {
fileUrl = new URL("file", null, fileURI.getPath());
}
InputStream is = fileUrl.openStream();
return new InputStreamReader(is);
}
});
assertMakefileContents(makefile);
}
public void testInMemoryReaderProvider() throws Exception {
IMakefile makefile = MakeCorePlugin.createMakefile(URIUtil.toURI("/memory/Makefile.main"), true, inclDirs,
new IMakefileReaderProvider() {
@Override
public Reader getReader(URI fileURI) throws IOException {
String name = new File(fileURI).getName();
if (name.equals("Makefile.main"))
return new StringReader("VAR = foo\r\n" + "\r\n" + "include Makefile.incl\r\n" + "\r\n"
+ "main: $(VAR)\r\n" + " nothing\r\n");
if (name.equals("Makefile.incl"))
return new StringReader("INCLVAR = bar\r\n" + "\r\n" + "foo.o: .PHONY\r\n");
throw new FileNotFoundException(fileURI.getPath());
}
});
assertMakefileContents(makefile);
}
public void testReaderIsClosed_Bug338936() throws Exception {
final boolean[] streamIsClosed = { false };
MakeCorePlugin.createMakefile(URIUtil.toURI("Makefile.main"), true, inclDirs, new IMakefileReaderProvider() {
@Override
public Reader getReader(URI fileURI) throws IOException {
return new StringReader("") {
@Override
public void close() {
super.close();
streamIsClosed[0] = true;
}
};
}
});
assertTrue("Stream is not closed", streamIsClosed[0]);
}
/**
* @param makefile
*/
private void assertMakefileContents(IMakefile makefile) {
assertNotNull(makefile);
IMacroDefinition[] macroDefinitions = makefile.getMacroDefinitions();
assertNotNull(macroDefinitions);
assertEquals(2, macroDefinitions.length);
assertEquals("VAR", macroDefinitions[0].getName());
assertEquals("INCLVAR", macroDefinitions[1].getName());
IRule[] rules = makefile.getRules();
assertEquals(2, rules.length);
assertEquals("foo.o", rules[0].getTarget().toString());
assertEquals("main", rules[1].getTarget().toString());
}
/**
* Try to get a file in the development version of a plugin --
* will return <code>null</code> for a jar-packaged plugin.
* @param path
* @return
* @throws Exception
*/
private File getPluginRelativeFile(IPath path) throws Exception {
URL url = getPluginRelativeURL(path);
assertNotNull(url);
if (url.getProtocol().equals("file"))
return new File(url.getPath());
return null;
}
private URL getPluginRelativeURL(IPath path) throws Exception {
if (MakeTestsPlugin.getDefault() != null) {
URL url = FileLocator.find(MakeTestsPlugin.getDefault().getBundle(), path, null);
return url != null ? FileLocator.toFileURL(url) : null;
} else {
return new URL("file", null, path.toFile().getAbsolutePath());
}
}
public static Test suite() {
return new TestSuite(MakefileReaderProviderTests.class);
}
}