/*******************************************************************************
* Copyright (c) 2013, 2016 Red Hat, Inc.
* 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:
* Red Hat - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.rpm.core.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
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.core.runtime.jobs.Job;
import org.eclipse.linuxtools.rpm.core.RPMProject;
import org.eclipse.linuxtools.rpm.core.RPMProjectLayout;
import org.eclipse.linuxtools.rpm.core.utils.DownloadJob;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.osgi.framework.FrameworkUtil;
/**
* Tests for the Download and Prepare sources command from RPM UI Editor
*
*/
public class DownloadPrepareSourcesTest {
static IWorkspace workspace;
static IWorkspaceRoot root;
static NullProgressMonitor monitor;
String pluginRoot;
static IProject testProject;
final String file_sep = System.getProperty("file.separator"); //$NON-NLS-1$
/**
* Prepare the workspace
*/
@BeforeClass
public static void setUpBeforeClass() {
workspace = ResourcesPlugin.getWorkspace();
root = workspace.getRoot();
monitor = new NullProgressMonitor();
}
/**
* Create the test project before starting each test
*
* @throws CoreException
*/
@Before
public void setUpBeforeTests() throws CoreException {
testProject = root.getProject("testHelloWorld");
testProject.create(monitor);
testProject.open(monitor);
}
/**
* If the test project exists, delete it and its contents
* (used to start clean and fresh for each test case)
*
* @throws CoreException
*/
@After
public void cleanUpAfterTests() throws CoreException {
if (testProject != null && testProject.exists()) {
testProject.delete(true, true, monitor);
}
}
/**
* Testing downloading sources using RPMBuild layout
*
* @throws CoreException
* @throws IOException
* @throws InterruptedException
*/
@Test
public void layoutRPMBuildDownloadSourcesTest() throws CoreException,
IOException, InterruptedException {
RPMProject rpmProject = importSrpm(testProject,
RPMProjectLayout.RPMBUILD);
assertNotNull(rpmProject);
downloadFile(rpmProject);
checkDownloadedFile(rpmProject, RPMProjectLayout.RPMBUILD);
}
/**
* Test downloading sources using FLAT layout
*
* @throws CoreException
* @throws IOException
* @throws InterruptedException
*/
@Test
public void layoutFLATDownloadSourcesTest() throws CoreException,
IOException, InterruptedException {
RPMProject rpmProject = importSrpm(testProject, RPMProjectLayout.FLAT);
assertNotNull(rpmProject);
downloadFile(rpmProject);
checkDownloadedFile(rpmProject, RPMProjectLayout.FLAT);
}
/**
* Test preparing sources using RPMBuild layout
*
* @throws CoreException
* @throws IOException
* @throws InterruptedException
*/
@Test
public void layoutRPMBuildPrepareSourcesTest() throws CoreException,
IOException, InterruptedException {
RPMProject rpmProject = importSrpm(testProject,
RPMProjectLayout.RPMBUILD);
assertNotNull(rpmProject);
downloadFile(rpmProject);
checkDownloadedFile(rpmProject, RPMProjectLayout.RPMBUILD);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
IStatus is = rpmProject.buildPrep(bos);
assertTrue(is.isOK());
checkPreparedSources(rpmProject, RPMProjectLayout.RPMBUILD);
}
/**
* Test preparing sources using FLAT layout
*
* @throws CoreException
* @throws IOException
* @throws InterruptedException
*/
@Test
public void layoutFLATPrepareSourcesTest() throws CoreException,
IOException, InterruptedException {
RPMProject rpmProject = importSrpm(testProject,
RPMProjectLayout.FLAT);
assertNotNull(rpmProject);
downloadFile(rpmProject);
checkDownloadedFile(rpmProject, RPMProjectLayout.FLAT);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
IStatus is = rpmProject.buildPrep(bos);
assertTrue(is.isOK());
checkPreparedSources(rpmProject, RPMProjectLayout.FLAT);
}
/**
* Check if the file was downloaded correctly based on project layout
*
* @param project The RPM project
* @param layout The layout of the RPM project (RPMBuild or FLAT)
* @throws CoreException
*/
public void checkDownloadedFile(RPMProject project, RPMProjectLayout layout)
throws CoreException {
IContainer sourcesFolder = project.getConfiguration()
.getSourcesFolder();
assertNotNull(sourcesFolder);
switch (layout) {
case RPMBUILD:
assertNotNull(sourcesFolder.getParent().findMember("SOURCES"));
assertEquals(sourcesFolder.members().length, 1);
// check if the file exists under SOURCES folder
assertNotNull(sourcesFolder
.findMember(new Path("hello-2.8.tar.gz")));
break;
case FLAT:
// 4 = "hello-2.8.tar.gz" + ".project" + "hello-2.8-1.fc19.src.rpm" + "hello.spec"
assertEquals(sourcesFolder.members().length, 4);
assertNotNull(sourcesFolder
.findMember(new Path("hello-2.8.tar.gz")));
break;
}
}
/**
* Check if the source was prepared correctly based on project layout
*
* @param project The RPM project
* @param layout The layout of the RPM project (RPMBuild or FLAT)
* @throws CoreException
*/
public void checkPreparedSources(RPMProject project, RPMProjectLayout layout)
throws CoreException {
IContainer buildFolder = project.getConfiguration().getBuildFolder();
IFolder helloBuildFolder = null;
assertNotNull(buildFolder);
switch (layout) {
case RPMBUILD:
assertNotNull(buildFolder.getParent().findMember("BUILD"));
assertEquals(buildFolder.members().length, 1);
// check if the file exists under BUILD folder
helloBuildFolder = buildFolder.getFolder(new Path("hello-2.8"));
assertTrue(helloBuildFolder.exists());
// there should be some stuff within hello-2.8/ folder
assertTrue(helloBuildFolder.members().length >= 1);
break;
case FLAT:
// 4 = "hello-2.8.tar.gz" + ".project" + "hello-2.8-1.fc19.src.rpm" + "hello.spec" + "hello-2.8/"
assertEquals(buildFolder.members().length, 5);
helloBuildFolder = buildFolder.getFolder(new Path("hello-2.8"));
assertTrue(helloBuildFolder.exists());
// there should be some stuff within hello-2.8/ folder
assertTrue(helloBuildFolder.members().length >= 1);
break;
}
}
/**
* Download and also test if the file was downloaded correctly
*
* @param project The RPM project
* @throws IOException
* @throws InterruptedException
*/
public void downloadFile(RPMProject project) throws IOException,
InterruptedException {
// connect to the URL
URL url = new URL("http://ftp.gnu.org/gnu/hello/hello-2.8.tar.gz");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
assertEquals(connection.getResponseCode(), HttpURLConnection.HTTP_OK);
// download the file
String filename = "hello-2.8.tar.gz";
IFile file = project.getConfiguration().getSourcesFolder()
.getFile(new Path(filename));
Job downloadJob = new DownloadJob(file, connection);
downloadJob.setUser(true);
downloadJob.schedule();
downloadJob.join();
assertEquals(downloadJob.getResult(),Status.OK_STATUS);
}
/**
* Import the SRPM into the project (make .spec accessible)
*
* @param testProject The test project
* @param layout layout The layout of the RPM project (RPMBuild or FLAT)
* @return The RPM project
* @throws CoreException
* @throws IOException
*/
private RPMProject importSrpm(IProject testProject, RPMProjectLayout layout)
throws CoreException, IOException {
// Instantiate an RPMProject
RPMProject rpmProject = new RPMProject(testProject, layout);
// Find the test SRPM and install it
URL url = FileLocator.find(FrameworkUtil
.getBundle(RPMProjectTest.class), new Path(
"resources" + file_sep + "srpms" + file_sep + //$NON-NLS-1$ //$NON-NLS-2$
"hello-2.8-1.fc19.src.rpm"), null);
File foo = new File(FileLocator.toFileURL(url).getPath());
// import the SRPM into the RPMProject
rpmProject.importSourceRPM(foo);
return rpmProject;
}
}