/*******************************************************************************
* Copyright (c) 2013 Red Hat Inc. 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:
* Neil Guzman - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.rpm.createrepo.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
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.linuxtools.internal.rpm.createrepo.Createrepo;
import org.eclipse.linuxtools.internal.rpm.createrepo.CreaterepoProject;
import org.eclipse.linuxtools.internal.rpm.createrepo.CreaterepoProjectCreator;
import org.eclipse.linuxtools.internal.rpm.createrepo.CreaterepoUtils;
import org.eclipse.linuxtools.internal.rpm.createrepo.form.tests.ICreaterepoTestConstants;
import org.junit.After;
import org.junit.Assume;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.osgi.framework.FrameworkUtil;
/**
* Tests for CreaterepoProject.
*/
public class CreaterepoProjectTest {
private static final String TEST_RPM_LOC1 = ICreaterepoTestConstants.RPM_RESOURCE_LOC
.concat(ICreaterepoTestConstants.RPM1);
private static final String TEST_RPM_LOC2 = ICreaterepoTestConstants.RPM_RESOURCE_LOC
.concat(ICreaterepoTestConstants.RPM2);
private static IWorkspaceRoot root;
private static NullProgressMonitor monitor;
private IProject project;
/**
* Initialize workspace root and progress monitor.
*/
@BeforeClass
public static void beforeClass() {
root = ResourcesPlugin.getWorkspace().getRoot();
monitor = new NullProgressMonitor();
}
/**
* Create the project using CreaterepoProjectCreator.
*
* @throws CoreException
*/
@Before
public void setUp() throws CoreException {
if (project == null || !project.exists()) {
project = CreaterepoProjectCreator.create(ICreaterepoTestConstants.PROJECT_NAME,
root.getLocation(), ICreaterepoTestConstants.REPO_NAME, monitor);
}
assertNotNull(project);
assertTrue(project.exists());
}
/**
* Forcefully delete the project if it exists.
*
* @throws CoreException
*/
@After
public void tearDown() throws CoreException {
if (project != null && project.exists()) {
project.delete(true, true, monitor);
}
assertFalse(project.exists());
}
/**
* Test if initializing createrepo project is successful. This means that
* content folder is initialized but not created (done by wizard, import, or
* execute commands) and that .repo file exists.
*
* @throws CoreException
*/
@Test
public void testInitialize() throws CoreException {
CreaterepoProject createrepoProject = new CreaterepoProject(project,
(IFile)project.findMember(ICreaterepoTestConstants.REPO_NAME));
// content folder is defined, but not created (wizard does that)
assertNotNull(createrepoProject.getContentFolder());
assertFalse(createrepoProject.getContentFolder().exists());
// repo file is found and exists
assertNotNull(createrepoProject.getRepoFile());
assertTrue(createrepoProject.getRepoFile().exists());
assertEquals(ICreaterepoTestConstants.REPO_NAME, createrepoProject.getRepoFile().getName());
}
/**
* Test if initializing createrepo project is successful
* without specifying .repo file.
*
* @throws CoreException
*/
@Test
public void testInitializeNoRepoFileSpecfied() throws CoreException {
// repo file will be found rather than initialized
CreaterepoProject createrepoProject = new CreaterepoProject(project);
// content folder is defined, but not created (wizard does that)
assertNotNull(createrepoProject.getContentFolder());
assertFalse(createrepoProject.getContentFolder().exists());
// repo file is found and exists
assertNotNull(createrepoProject.getRepoFile());
assertTrue(createrepoProject.getRepoFile().exists());
assertEquals(ICreaterepoTestConstants.REPO_NAME, createrepoProject.getRepoFile().getName());
}
/**
* Test if importing RPMs from external source successfully saves into
* the "content" folder.
*
* @throws CoreException
* @throws IOException
*/
@Test
public void testImportRPM() throws CoreException, IOException {
CreaterepoProject createrepoProject = new CreaterepoProject(project);
// test for file
URL rpmURL = FileLocator.find(FrameworkUtil
.getBundle(CreaterepoProjectTest.class), new Path(TEST_RPM_LOC1), null);
File rpmFile = new File(FileLocator.toFileURL(rpmURL).getPath());
createrepoProject.importRPM(rpmFile);
assertNotNull(createrepoProject.getContentFolder());
assertTrue(createrepoProject.getContentFolder().exists());
assertEquals(1, createrepoProject.getContentFolder().members().length);
assertTrue(createrepoProject.getContentFolder().findMember(ICreaterepoTestConstants.RPM1).exists());
// test for duplicate file
createrepoProject.importRPM(rpmFile);
assertEquals(1, createrepoProject.getContentFolder().members().length);
assertTrue(createrepoProject.getContentFolder().findMember(ICreaterepoTestConstants.RPM1).exists());
// test for new file
rpmURL = FileLocator.find(FrameworkUtil
.getBundle(CreaterepoProjectTest.class), new Path(TEST_RPM_LOC2), null);
rpmFile = new File(FileLocator.toFileURL(rpmURL).getPath());
createrepoProject.importRPM(rpmFile);
assertEquals(2, createrepoProject.getContentFolder().members().length);
assertTrue(createrepoProject.getContentFolder().findMember(ICreaterepoTestConstants.RPM2).exists());
}
/**
* Test if getting the RPMs is successful.
*
* @throws CoreException
* @throws IOException
*/
@Test
public void testGetRPMs() throws CoreException, IOException {
CreaterepoProject createrepoProject = new CreaterepoProject(project);
URL rpmURL = FileLocator.find(FrameworkUtil
.getBundle(CreaterepoProjectTest.class), new Path(TEST_RPM_LOC1), null);
File rpmFile = new File(FileLocator.toFileURL(rpmURL).getPath());
createrepoProject.importRPM(rpmFile);
rpmURL = FileLocator.find(FrameworkUtil
.getBundle(CreaterepoProjectTest.class), new Path(TEST_RPM_LOC2), null);
rpmFile = new File(FileLocator.toFileURL(rpmURL).getPath());
createrepoProject.importRPM(rpmFile);
List<IResource> rpms = createrepoProject.getRPMs();
assertEquals(2, rpms.size());
}
/**
* Simple test execution of createrepo. This checks to see if the "content" folder
* was created while executing and that the execution is successful if repomd.xml was created
* under the repodata folder.
*
* @throws CoreException
*/
@Test @Ignore
public void testSimpleExecute() throws CoreException {
// assume that there is creatrepo version of >= 0.9.8
Assume.assumeTrue(Createrepo.isCorrectVersion().isOK());
CreaterepoProject createrepoProject = new CreaterepoProject(project);
// make sure that content folder doesn't exist
assertFalse(createrepoProject.getContentFolder().exists());
IStatus status = createrepoProject.createrepo(CreaterepoUtils.findConsole("test").newMessageStream()); //$NON-NLS-1$
// check if executing has an OK status and that content folder is created with the repodata contents
assertEquals(Status.OK_STATUS, status);
assertTrue(createrepoProject.getContentFolder().exists());
assertTrue(createrepoProject.getContentFolder().members().length > 0);
// check if the repodata folder exists and repomd.xml exists within it
assertTrue(createrepoProject.getContentFolder().findMember(
ICreaterepoTestConstants.REPODATA_FOLDER).exists());
IFolder repodataFolder = (IFolder) createrepoProject.getContentFolder()
.findMember(ICreaterepoTestConstants.REPODATA_FOLDER);
// repodata should have at least more than 1 file: repomd.xml + archives
assertTrue(repodataFolder.members().length > 1);
assertTrue(repodataFolder.findMember(ICreaterepoTestConstants.REPO_MD_NAME)
.exists());
}
}