/*******************************************************************************
* 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.form.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 static org.junit.Assert.fail;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
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.linuxtools.internal.rpm.createrepo.Createrepo;
import org.eclipse.linuxtools.internal.rpm.createrepo.CreaterepoProject;
import org.eclipse.linuxtools.internal.rpm.createrepo.Messages;
import org.eclipse.linuxtools.internal.rpm.createrepo.tests.CreaterepoProjectTest;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotMultiPageEditor;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
import org.eclipse.swtbot.swt.finder.SWTBot;
import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
import org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory;
import org.eclipse.swtbot.swt.finder.waits.Conditions;
import org.junit.AfterClass;
import org.junit.Assume;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.osgi.framework.FrameworkUtil;
/**
* SWTBot tests for ImportRPMsPage. Import RPMs cannot be tested due to
* SWTBot not supporting native dialogs (File dialogs).
*/
@RunWith(SWTBotJunit4ClassRunner.class)
@Ignore
public class ImportRPMsPageTest {
private static final String TEST_RPM_LOC1 = ICreaterepoTestConstants.RPM_RESOURCE_LOC
.concat(ICreaterepoTestConstants.RPM1);
private static TestCreaterepoProject testProject;
private static SWTWorkbenchBot bot;
private static NullProgressMonitor monitor;
private static SWTBotView navigator;
private CreaterepoProject project;
private SWTBot importPageBot;
/**
* Initialize the test project.
*
* @throws CoreException
*/
@BeforeClass
public static void setUpBeforeClass() throws CoreException {
testProject = new TestCreaterepoProject();
assertTrue(testProject.getProject().exists());
bot = new SWTWorkbenchBot();
try {
bot.shell(ICreaterepoTestConstants.MAIN_SHELL).activate();
} catch (WidgetNotFoundException e) {
// cannot activate main shell, continue anyways
}
monitor = new NullProgressMonitor();
TestUtils.openResourcePerspective(bot);
navigator = TestUtils.enterProjectFolder(bot);
}
/**
* Delete the project when tests are done.
*
* @throws CoreException
*/
@AfterClass
public static void tearDownAfterClass() throws CoreException {
TestUtils.exitProjectFolder(bot, navigator);
testProject.dispose();
assertFalse(testProject.getProject().exists());
}
/**
* Get the CreaterepoProject at the beginning of each test, as
* well as import some test RPMs.
*
* @throws CoreException
* @throws IOException
*/
@Before
public void setUp() throws CoreException, IOException {
project = testProject.getCreaterepoProject();
assertNotNull(project);
URL rpmURL = FileLocator.find(FrameworkUtil
.getBundle(CreaterepoProjectTest.class), new Path(TEST_RPM_LOC1), null);
File rpmFile = new File(FileLocator.toFileURL(rpmURL).getPath());
assertTrue(rpmFile.exists());
project.importRPM(rpmFile);
// there should be 1 rpm every setup
assertEquals(1, project.getRPMs().size());
initializeImportPage();
}
/**
* Test out the remove RPMs button.
*/
@Test
public void testRemoveRPMs() {
// run in UI thread because accessing the tree in the import RPMs page
Display.getDefault().syncExec(() -> {
Tree tree = importPageBot.widget(WidgetMatcherFactory.widgetOfType(Tree.class));
assertNotNull(tree);
// current item count should be 1 (from the imported RPM)
assertEquals(1, tree.getItemCount());
importPageBot.button(Messages.ImportRPMsPage_buttonRemoveRPMs).click();
// not selecting a treeitem should do nothing to the tree contents
assertEquals(1, tree.getItemCount());
// select the first item
tree.select(tree.getItem(0));
importPageBot.button(Messages.ImportRPMsPage_buttonRemoveRPMs).click();
// item count should be 0 after selecting a tree item and pressing
// remove
assertEquals(0, tree.getItemCount());
try {
// make sure that the RPM was actually deleted from the project
assertEquals(0, project.getRPMs().size());
} catch (CoreException e) {
fail("Failed to get the RPMs from project"); //$NON-NLS-1$
}
});
}
/**
* Test to see if createrepo executed.
*
* @throws CoreException
*/
@Test
public void testCreaterepo() throws CoreException {
// assume that there is creatrepo version of >= 0.9.8
IStatus validVersion = Createrepo.isCorrectVersion();
Assume.assumeTrue(validVersion.isOK());
importPageBot.button(Messages.ImportRPMsPage_buttonCreateRepo).click();
// make the bot wait until the download job shell closes before proceeding the tests
importPageBot.waitUntil(Conditions.shellCloses(bot.shell(Messages.Createrepo_jobName)));
// assert that the content folder has more than just the RPM inside it
assertTrue(project.getContentFolder().members().length > 1);
// assert that the repodata folder exists within the content folder
assertTrue(project.getContentFolder().findMember(ICreaterepoTestConstants.REPODATA_FOLDER).exists());
// assert that the repomd.xml file was created (successful createrepo execution)
IFolder repodata = (IFolder) project.getContentFolder().findMember(ICreaterepoTestConstants.REPODATA_FOLDER);
assertTrue(repodata.findMember(ICreaterepoTestConstants.REPO_MD_NAME).exists());
}
/**
* Test if deleting/adding an RPM into content folder updates the RPM list.
*
* @throws CoreException
* @throws IOException
*/
@Test
public void testResourceChangeListener() throws CoreException, IOException {
// delete the contents of the content folder
for (IResource resource : project.getContentFolder().members()) {
resource.delete(true, monitor);
}
// run in UI thread because accessing the tree in the import RPMs page
Display.getDefault().syncExec(() -> {
Tree tree = importPageBot.widget(WidgetMatcherFactory.widgetOfType(Tree.class));
assertNotNull(tree);
// check items in tree are gone
assertEquals(0, tree.getItemCount());
});
// import a file again into the content folder
URL rpmURL = FileLocator.find(FrameworkUtil
.getBundle(CreaterepoProjectTest.class), new Path(TEST_RPM_LOC1), null);
final File rpmFile = new File(FileLocator.toFileURL(rpmURL).getPath());
assertTrue(rpmFile.exists());
project.importRPM(rpmFile);
// run in UI thread because accessing the tree in the import RPMs page
Display.getDefault().syncExec(() -> {
Tree tree = importPageBot.widget(WidgetMatcherFactory.widgetOfType(Tree.class));
assertNotNull(tree);
// check if items are in tree
assertEquals(1, tree.getItemCount());
assertEquals(rpmFile.getName(), tree.getItem(0).getText());
});
}
/**
* Helper method to help setup the test by opening the .repo file.
*/
private void initializeImportPage() {
SWTBotMultiPageEditor editor = TestUtils.openRepoFile(bot, navigator);
// activate repository page
editor.activatePage(Messages.ImportRPMsPage_title);
// make sure correct page is active
assertEquals(Messages.ImportRPMsPage_title, editor.getActivePageTitle());
importPageBot = editor.bot();
}
}