blob: a195df62edb624b755628e93dcdcb86a717d51c4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.sse.core.tests.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import junit.framework.TestCase;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.wst.sse.core.internal.util.JarUtilities;
import org.eclipse.wst.sse.core.tests.SSEModelTestsPlugin;
/**
* Tests for org.eclipse.wst.sse.core.internal.util.JarUtilities
*/
public class TestJarUtilities extends TestCase {
private static final String[] fExpectedNames = new String[]{".project", "about.html", "build.properties", "plugin.properties", "test.xml"};
private static final String TEST_JAR_UTILITIES_PROJECT = "TestJarUtilities";
private static final String TEST_JAR_UTILITIES_TESTFILE_JAR = "testfile.jar";
private static final String TESTFILE_BUNDLE_ENTRY = "resources/testfile.jar";
static IFile _copyBundleEntryIntoWorkspace(String entryname, String fullPath) throws Exception {
IFile file = null;
URL entry = SSEModelTestsPlugin.getDefault().getBundle().getEntry(entryname);
if (entry != null) {
IPath path = new Path(fullPath);
byte[] b = new byte[2048];
InputStream input = entry.openStream();
ByteArrayOutputStream output = new ByteArrayOutputStream();
int i = -1;
while ((i = input.read(b)) > -1) {
output.write(b, 0, i);
}
file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
if (file != null) {
if (!file.exists()) {
file.create(new ByteArrayInputStream(output.toByteArray()), true, new NullProgressMonitor());
}
else {
file.setContents(new ByteArrayInputStream(output.toByteArray()), true, false, new NullProgressMonitor());
}
}
}
else {
System.err.println("can't find " + entryname);
}
return file;
}
static IFile copyBundleEntryIntoWorkspace(final String entryname, final String fullPath) throws Exception {
final IFile file[] = new IFile[1];
IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
try {
file[0] = _copyBundleEntryIntoWorkspace(entryname, fullPath);
}
catch (Exception e) {
throw new CoreException(new Status(IStatus.ERROR, SSEModelTestsPlugin.getDefault().getBundle().getSymbolicName(), 0, null, e));
}
ResourcesPlugin.getWorkspace().checkpoint(true);
}
};
ResourcesPlugin.getWorkspace().run(runnable, new NullProgressMonitor());
return file[0];
}
/**
* Creates a simple project.
*
* @param name
* - the name of the project
* @return
*/
static IProject createSimpleProject(String name) {
IProjectDescription description = ResourcesPlugin.getWorkspace().newProjectDescription(name);
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
try {
project.create(description, new NullProgressMonitor());
project.open(new NullProgressMonitor());
}
catch (CoreException e) {
e.printStackTrace();
}
return project;
}
public TestJarUtilities() {
super("JarUtilities Tests");
}
private String readContents(InputStream is) {
String charset = "iso-8859-1";
StringBuffer s = new StringBuffer();
Reader reader = null;
try {
reader = new InputStreamReader(is, charset);
char[] readBuffer = new char[2048];
int n = reader.read(readBuffer);
while (n > 0) {
s.append(readBuffer, 0, n);
n = reader.read(readBuffer);
}
}
catch (Exception e) {
}
finally {
try {
if (is != null) {
is.close();
}
if (reader != null)
reader.close();
}
catch (Exception e) {
// nothing to do
}
}
return s.toString();
}
protected void setUp() throws Exception {
super.setUp();
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(getName());
if (!project.isAccessible()) {
project = createSimpleProject(getName());
copyBundleEntryIntoWorkspace(TESTFILE_BUNDLE_ENTRY, getJarFile().getFullPath().toString());
}
}
private IFile getJarFile() {
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(getName());
return project.getFile(TEST_JAR_UTILITIES_TESTFILE_JAR);
}
/* (non-Javadoc)
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception {
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(getName());
project.delete(true, null);
super.tearDown();
}
public void testEntryCountFromFilesystem() {
String[] entryNames = JarUtilities.getEntryNames(getJarFile().getLocation().toString());
assertEquals("incorrect number of entries", 5, entryNames.length);
}
public void testEntryCountFromMissingFile() {
String[] names = JarUtilities.getEntryNames(TEST_JAR_UTILITIES_PROJECT + "/nonexistent.jar");
assertNotNull("null names", names);
assertEquals("entries returned for missing file", 0, names.length);
}
public void testEntryCountFromWorkspace() {
String[] entryNames = JarUtilities.getEntryNames(getJarFile());
assertEquals("incorrect number of entries", 5, entryNames.length);
}
public void testEntryCountWithDirectoriesFromFilesystem() {
String[] entryNames = JarUtilities.getEntryNames(getJarFile().getLocation().toString(), false);
assertEquals("incorrect number of entries", 6, entryNames.length);
}
public void testEntryNamesFromFilesystem() {
String[] entryNames = JarUtilities.getEntryNames(getJarFile().getLocation().toString());
Collection names = new ArrayList(Arrays.asList(entryNames));
for (int i = 0; i < fExpectedNames.length; i++) {
assertTrue("missing name of entry: " + fExpectedNames[i], names.contains(fExpectedNames[i]));
}
}
public void testEntryNamesFromWorkspace() {
String[] entryNames = JarUtilities.getEntryNames(getJarFile());
Collection names = new ArrayList(Arrays.asList(entryNames));
for (int i = 0; i < fExpectedNames.length; i++) {
assertTrue("missing name of entry: " + fExpectedNames[i], names.contains(fExpectedNames[i]));
}
}
public void testEntryNamesWithDirectoriesFromFilesystem() {
String[] entryNames = JarUtilities.getEntryNames(getJarFile().getLocation().toString(), false);
Collection names = new ArrayList(Arrays.asList(entryNames));
String[] expectedNames = new String[]{".project", "about.html", "build.properties", "plugin.properties", "test.xml"};
for (int i = 0; i < expectedNames.length; i++) {
assertTrue("missing name of entry: " + entryNames[i], names.contains(entryNames[i]));
}
assertTrue("missing name of folder entry: empty/", names.contains("empty/"));
}
public void testReadFromFilesystem() {
String location = getJarFile().getLocation().toString();
String contents = readContents(JarUtilities.getInputStream(location, "plugin.properties"));
assertNotNull("no contents loaded", contents);
assertTrue("not enough contents read", contents.length() > 40);
assertTrue("contents not as expected" + contents.substring(0, 40), contents.startsWith("##########################################################"));
}
public void testReadFromMissingFile() {
InputStream contents = JarUtilities.getInputStream(TEST_JAR_UTILITIES_PROJECT + "/nonexistent.jar", "plugin.properties");
assertNull("contents loaded", contents);
}
public void testReadFromSupportedURL() throws MalformedURLException {
String location = getJarFile().getLocation().toString();
String contents = readContents(JarUtilities.getInputStream(new URL("jar:file:" + location + "!/plugin.properties")));
assertNotNull("no contents loaded", contents);
assertTrue("not enough contents read", contents.length() > 0);
assertTrue("contents not as expected", contents.startsWith("##########################################################"));
}
public void testReadFromUnsupportedURL() {
URL entry = SSEModelTestsPlugin.getDefault().getBundle().getEntry("about.html");
assertNotNull("null URL to about.html", entry);
InputStream inputStream = JarUtilities.getInputStream(entry);
assertNotNull("null input stream to "+entry, inputStream);
String contents = readContents(inputStream);
assertNotNull("no contents loaded", contents);
assertTrue("not enough contents read. Contents Length was " + contents.length() + " but expected more than 750.", contents.length() > 750);
assertTrue("contents not as expected" + contents.substring(0, 75), contents.indexOf("DOCTYPE") > 0);
}
public void testReadFromWorkspace() {
IResource jar = getJarFile();
String contents = readContents(JarUtilities.getInputStream(jar, "plugin.properties"));
assertNotNull("no contents loaded", contents);
assertTrue("not enough contents read", contents.length() > 40);
assertTrue("contents not as expected" + contents.substring(0, 40), contents.startsWith("##########################################################"));
}
}