/*******************************************************************************
* 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.wizard.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.linuxtools.internal.rpm.createrepo.CreaterepoProjectNature;
import org.eclipse.linuxtools.internal.rpm.createrepo.ICreaterepoConstants;
import org.eclipse.linuxtools.internal.rpm.createrepo.IRepoFileConstants;
import org.eclipse.linuxtools.internal.rpm.createrepo.Messages;
import org.eclipse.linuxtools.internal.rpm.createrepo.form.tests.ICreaterepoTestConstants;
import org.eclipse.linuxtools.internal.rpm.createrepo.form.tests.TestUtils;
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
import org.junit.After;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* SWTBot tests for CreaterepoWizard.
*/
@RunWith(SWTBotJunit4ClassRunner.class)
public class CreaterepoWizardTest {
private static final String REPO_ID = "createrepo-test-repo"; //$NON-NLS-1$
private static final String REPO_FILE = REPO_ID.concat(".repo"); //$NON-NLS-1$
private static final String REPO_WIZARD_NAME = "Test repository for createrepo plugin"; //$NON-NLS-1$
private static final String REPO_WIZARD_URL = "http://www.example.com/test"; //$NON-NLS-1$
private static final String REPO_FILE_CONTENTS =
String.format("[%s]%s=%s%s=%s", REPO_ID, IRepoFileConstants.NAME, //$NON-NLS-1$
REPO_WIZARD_NAME, IRepoFileConstants.BASE_URL, REPO_WIZARD_URL);
private static SWTWorkbenchBot bot;
private static IWorkspaceRoot root;
private static NullProgressMonitor monitor;
private IProject project;
/**
* Setup the bot, monitor and workspace root.
*/
@BeforeClass
public static void setUpBeforeClass() {
bot = new SWTWorkbenchBot();
root = ResourcesPlugin.getWorkspace().getRoot();
monitor = new NullProgressMonitor();
try {
bot.shell(ICreaterepoTestConstants.MAIN_SHELL).activate();
} catch (WidgetNotFoundException e) {
// cannot activate main shell, continue anyways
}
}
/**
* Delete the project and its contents for each test itereation.
*
* @throws CoreException
*/
@After
public void tearDown() throws CoreException {
if (project != null && project.exists()) {
project.delete(true, true, monitor);
}
assertFalse(project.exists());
}
/**
* Go through the project creation wizard process of creating a new
* createrepo project.
*
* @throws CoreException
* @throws IOException
*/
@Test
public void testCreaterepoWizardProjectCreation() throws CoreException, IOException {
// go through the process of creating a new createrepo project
bot.menu(ICreaterepoTestConstants.FILE).menu(ICreaterepoTestConstants.NEW).menu(ICreaterepoTestConstants.OTHER).click();
SWTBotShell shell = bot.shell(ICreaterepoTestConstants.NEW);
shell.activate();
bot.text().setText(ICreaterepoTestConstants.CREATEREPO_PROJECT_WIZARD);
bot.waitUntil(new TestUtils.NodeAvailableAndSelect(bot.tree(), ICreaterepoTestConstants.CREATEREPO_PROJECT_CATEGORY, ICreaterepoTestConstants.CREATEREPO_PROJECT_WIZARD));
bot.button(ICreaterepoTestConstants.NEXT_BUTTON).click();
bot.textWithLabel(ICreaterepoTestConstants.PROJECT_NAME_LABEL).setText(ICreaterepoTestConstants.PROJECT_NAME);
bot.button(ICreaterepoTestConstants.NEXT_BUTTON).click();
bot.textWithLabel(Messages.CreaterepoNewWizardPageTwo_labelID).setText(REPO_ID);
bot.textWithLabel(Messages.CreaterepoNewWizardPageTwo_labelName).setText(REPO_WIZARD_NAME);
bot.textWithLabel(Messages.CreaterepoNewWizardPageTwo_labelURL).setText(REPO_WIZARD_URL);
bot.button(ICreaterepoTestConstants.FINISH_BUTTON).click();
// verify that project has been initialized properly
project = root.getProject(ICreaterepoTestConstants.PROJECT_NAME);
assertTrue(project.exists());
assertTrue(project.hasNature(CreaterepoProjectNature.CREATEREPO_NATURE_ID));
// 3 = .project + content folder + .repo file
assertEquals(3, project.members().length);
// contains the content folder and repo file
assertTrue(project.findMember(ICreaterepoConstants.CONTENT_FOLDER).exists());
assertTrue(project.findMember(REPO_FILE).exists());
// content folder has nothing in it
IFolder contentFolder = (IFolder) project.findMember(ICreaterepoConstants.CONTENT_FOLDER);
assertEquals(0, contentFolder.members().length);
// get the created .repo file contents
IFile repoFile = (IFile) project.findMember(REPO_FILE);
// repo file should not be empty
assertNotEquals(0, repoFile.getContents().available());
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(repoFile.getContents()));
String line;
while ((line = br.readLine()) != null) {
// disregards newline
sb.append(line);
}
assertEquals(REPO_FILE_CONTENTS, sb.toString());
}
}