/*******************************************************************************
* Copyright (c) 2008, 2011 QNX Software Systems and others.
* 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:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core.internal.errorparsers.tests;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ErrorParserManager;
import org.eclipse.cdt.core.IErrorParser;
import org.eclipse.cdt.core.IErrorParser2;
import org.eclipse.cdt.core.IMarkerGenerator;
import org.eclipse.cdt.core.ProblemMarkerInfo;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.CTestPlugin;
import org.eclipse.core.internal.registry.ExtensionRegistry;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceDescription;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.ContributorFactoryOSGi;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IContributor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
/**
* @author Alena Laskavaia
*
* Tests for ErrorParser manager and different parsers
*
*/
public class ErrorParserManagerTest extends TestCase {
IWorkspace workspace;
IWorkspaceRoot root;
NullProgressMonitor monitor;
private ICProject cProject;
private ErrorParserManager epManager;
private ArrayList<ProblemMarkerInfo> errorList;
private IMarkerGenerator markerGenerator;
/**
* Constructor for CModelTests.
* @param name
*/
public ErrorParserManagerTest(String name) {
super(name);
}
/**
* Sets up the test fixture.
*
* Called before every test case method.
*
* Example code test the packages in the project
* "com.qnx.tools.ide.cdt.core"
*/
@Override
protected void setUp() throws Exception {
/***
* The test of the tests assume that they have a working workspace
* and workspace root object to use to create projects/files in,
* so we need to get them setup first.
*/
IWorkspaceDescription desc;
workspace = ResourcesPlugin.getWorkspace();
root = workspace.getRoot();
monitor = new NullProgressMonitor();
if (workspace == null)
fail("Workspace was not setup");
if (root == null)
fail("Workspace root was not setup");
desc = workspace.getDescription();
desc.setAutoBuilding(false);
workspace.setDescription(desc);
errorList = new ArrayList<ProblemMarkerInfo>();
cProject = createProject("errorparsersanity");
markerGenerator = new IMarkerGenerator() {
public void addMarker(IResource file, int lineNumber, String errorDesc, int severity, String errorVar) {
// Obsolete
}
public void addMarker(ProblemMarkerInfo problemMarkerInfo) {
errorList.add(problemMarkerInfo);
}
};
String[] errorParsersIds = {
"org.eclipse.cdt.core.CWDLocator",
"org.eclipse.cdt.core.GCCErrorParser",
"org.eclipse.cdt.core.GASErrorParser",
"org.eclipse.cdt.core.GLDErrorParser",
"org.eclipse.cdt.core.VCErrorParser",
"org.eclipse.cdt.core.GmakeErrorParser",
};
epManager = new ErrorParserManager(cProject.getProject(), markerGenerator, errorParsersIds);
}
/**
* Tears down the test fixture.
*
* Called after every test case method.
*/
@Override
protected void tearDown() {
// release resources here and clean-up
}
public static TestSuite suite() {
return new TestSuite(ErrorParserManagerTest.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
private ICProject createProject(String name) throws CoreException {
ICProject testProject;
testProject = CProjectHelper.createCProject(name, "none", IPDOMManager.ID_NO_INDEXER);
if (testProject == null) {
fail("Unable to create project");
}
return testProject;
}
private void output(String line) throws IOException {
epManager.write(line.getBytes(), 0, line.length());
}
private void end() throws IOException {
epManager.getOutputStream();
epManager.close();
epManager.getOutputStream().close();
}
public void testParsersSanity() throws CoreException, IOException {
output("catchpoints.cpp:12: warning: no return statement in function returning non-void\n");
end();
assertEquals(1, errorList.size());
ProblemMarkerInfo problemMarkerInfo = errorList.get(0);
assertEquals("no return statement in function returning non-void",problemMarkerInfo.description);
assertEquals(new Path("catchpoints.cpp"),problemMarkerInfo.externalPath);
}
public void testParsersSanityTrimmed() throws CoreException, IOException {
output(" catchpoints.cpp:12: warning: no return statement in function returning non-void \n");
end();
assertEquals(1, errorList.size());
ProblemMarkerInfo problemMarkerInfo = errorList.get(0);
assertEquals("no return statement in function returning non-void",problemMarkerInfo.description);
assertEquals(new Path("catchpoints.cpp"),problemMarkerInfo.externalPath);
}
public void testOutput() throws IOException {
FileInputStream fileInputStream = new FileInputStream(CTestPlugin.getDefault().getFileInPlugin(
new Path("resources/errortests/output-1")));
byte b[] = new byte[1024];
while (true) {
int k = fileInputStream.read(b);
if (k < 0)
break;
epManager.write(b, 0, k);
}
end();
assertEquals(22, errorList.size());
}
private String addErrorParserExtension(String shortId, Class cl) {
String ext = "<plugin><extension id=\"" + shortId + "\" name=\"" + shortId
+ "\" point=\"org.eclipse.cdt.core.ErrorParser\">" + "<errorparser class=\"" + cl.getName() + "\"/>"
+ "</extension></plugin>";
IContributor contributor = ContributorFactoryOSGi.createContributor(CTestPlugin.getDefault().getBundle());
boolean added = Platform.getExtensionRegistry().addContribution(new ByteArrayInputStream(ext.getBytes()),
contributor, false, shortId, null,
((ExtensionRegistry) Platform.getExtensionRegistry()).getTemporaryUserToken());
assertTrue("failed to add extension", added);
String fullId = "org.eclipse.cdt.core.tests." + shortId;
IErrorParser[] errorParser = CCorePlugin.getDefault().getErrorParser(fullId);
assertTrue(errorParser.length > 0);
return fullId;
}
public static class TestParser1 implements IErrorParser2 {
String last = null;
public int getProcessLineBehaviour() {
return KEEP_UNTRIMMED;
}
public boolean processLine(String line, ErrorParserManager eoParser) {
if (line.startsWith(" ") && last!=null) {
eoParser.generateExternalMarker(null, 1, last+line, 1, "", null);
return true;
}
if (line.startsWith("bug:")) {
last = line;
return true;
} else {
last = null;
}
return false;
}
}
public void testNoTrimParser() throws IOException {
String id = addErrorParserExtension("test1", TestParser1.class);
epManager = new ErrorParserManager(cProject.getProject(), markerGenerator, new String[] { id });
output("bug: start\n");
output(" end");
end();
assertEquals(1, errorList.size());
ProblemMarkerInfo problemMarkerInfo = errorList.get(0);
assertEquals("bug: start end",problemMarkerInfo.description);
}
public static class TestParser2 implements IErrorParser2 {
public int getProcessLineBehaviour() {
return KEEP_LONGLINES;
}
public boolean processLine(String line, ErrorParserManager eoParser) {
if (line.startsWith("errorT: ")) {
eoParser.generateExternalMarker(null, 1, line, 1, "", null);
return true;
}
return false;
}
}
public void testLongLinesParser() throws IOException {
String id = addErrorParserExtension("test2", TestParser2.class);
epManager = new ErrorParserManager(cProject.getProject(), markerGenerator, new String[] { id });
StringBuffer buf = new StringBuffer("errorT: ");
for (int i = 0; i < 100; i++) {
buf.append("la la la la la "+i+" ");
}
output(buf.toString()+"\n");
end();
assertEquals(1, errorList.size());
ProblemMarkerInfo problemMarkerInfo = errorList.get(0);
int l = problemMarkerInfo.description.length();
assertTrue(l>1000);
String end = problemMarkerInfo.description.substring(l-10,l);
// check - line trimmed but long
assertEquals("a la la 99",end);
}
public static class TestParser3 implements IErrorParser2 {
public int getProcessLineBehaviour() {
return KEEP_LONGLINES | KEEP_UNTRIMMED;
}
public boolean processLine(String line, ErrorParserManager eoParser) {
if (line.startsWith("errorT: ")) {
eoParser.generateExternalMarker(null, 1, line, 1, "", null);
return true;
}
return false;
}
}
public void testLongLinesUntrimmedParser() throws IOException {
String id = addErrorParserExtension("test3", TestParser3.class);
epManager = new ErrorParserManager(cProject.getProject(), markerGenerator, new String[] { id });
StringBuffer buf = new StringBuffer("errorT: ");
for (int i = 0; i < 100; i++) {
buf.append("la la la la la "+i+" ");
}
output(buf.toString()+"\n");
end();
assertEquals(1, errorList.size());
ProblemMarkerInfo problemMarkerInfo = errorList.get(0);
int l = problemMarkerInfo.description.length();
assertTrue(l>1000);
String end = problemMarkerInfo.description.substring(l-10,l);
// check - line trimmed but long
assertEquals(" la la 99 ",end);
}
public static class TestParser4 implements IErrorParser {
public boolean processLine(String line, ErrorParserManager eoParser) {
ProblemMarkerInfo problemMarkerInfo = new ProblemMarkerInfo(null, 0, "Workspace level marker", IMarker.SEVERITY_INFO, null);
eoParser.addProblemMarker(problemMarkerInfo);
return true;
}
}
public void testWorkspaceLevelError() throws IOException {
String id = addErrorParserExtension("test4", TestParser4.class);
epManager = new ErrorParserManager(null, markerGenerator, new String[] { id });
StringBuffer buf = new StringBuffer("errorT: ");
output(buf.toString()+"\n");
end();
assertEquals(1, errorList.size());
ProblemMarkerInfo problemMarkerInfo = errorList.get(0);
assertEquals("Workspace level marker", problemMarkerInfo.description);
assertTrue(problemMarkerInfo.file instanceof IWorkspaceRoot);
}
}