/******************************************************************************* * 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.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.linuxtools.internal.rpm.createrepo.Activator; import org.eclipse.linuxtools.internal.rpm.createrepo.CreaterepoCommandCreator; import org.eclipse.linuxtools.internal.rpm.createrepo.CreaterepoPreferenceConstants; import org.eclipse.linuxtools.internal.rpm.createrepo.CreaterepoProject; import org.eclipse.linuxtools.internal.rpm.createrepo.ICreaterepoChecksums; import org.eclipse.linuxtools.internal.rpm.createrepo.ICreaterepoCompressionTypes; import org.eclipse.linuxtools.internal.rpm.createrepo.form.tests.TestCreaterepoProject; import org.eclipse.ui.preferences.ScopedPreferenceStore; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.osgi.service.prefs.BackingStoreException; /** * Tests for CreaterepoCommandCreator class. This checks if the commands * are properly generated from preferences. */ public class CreaterepoCommandCreatorTest { private static TestCreaterepoProject testProject; private CreaterepoProject project; /** * Initialize the project. * * @throws Exception */ @BeforeClass public static void setUpBeforeClass() throws Exception { testProject = new TestCreaterepoProject(); assertTrue(testProject.getProject().exists()); } /** * Delete the project when tests are done. * * @throws CoreException */ @AfterClass public static void tearDownAfterClass() throws Exception { testProject.dispose(); assertFalse(testProject.getProject().exists()); } /** * Get the CreaterepoProject at the beginning of each test. * * @throws CoreException */ @Before public void setUp() throws Exception { project = testProject.getCreaterepoProject(); assertNotNull(project); } /** * Clear the preferences after each test. * * @throws BackingStoreException */ @After public void tearDown() throws Exception { IEclipsePreferences pref = project.getEclipsePreferences(); pref.clear(); pref.flush(); testProject.restoreDefaults(); assertEquals(0, pref.keys().length); } /** * Preference set should be shown in the command arguments created. * * @throws BackingStoreException */ @Test public void testCommandArgumentsWorkspacePreferences() { setWorkspacePreferences(); CreaterepoCommandCreator commandCreator = new CreaterepoCommandCreator(project.getEclipsePreferences()); List<String> commands = commandCreator.getCommands(); assertFalse(commands.isEmpty()); String switchesToAdd = createStringFromList(commands); // waldo should not be found assertEquals(0, findCommandSwitch(switchesToAdd, "waldo")); //$NON-NLS-1$ // deltas was not set assertEquals(0, findCommandSwitch(switchesToAdd, "--deltas")); //$NON-NLS-1$ // these switches can be found set in setWorkspacePreferences() assertEquals(1, findCommandSwitch(switchesToAdd, "--simple-md-filenames")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--no-database")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--skip-symlinks")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--pretty")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--workers\\s+\\d+")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--checkts")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--changelog-limit\\s+\\d+")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--checksum\\s+\\S+")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--compress-type\\s+\\S+")); //$NON-NLS-1$ // intentionally put multiple occurences of a switch that should only occur once String testDuplicate = "--changelog-limit 31 --changelog-limit 5 --changelog-limit 2"; //$NON-NLS-1$ assertTrue(findCommandSwitch(testDuplicate, "--changelog-limit\\s+\\d+") > 1); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--no-database")); //$NON-NLS-1$ } /** * Set test workspace preferences. */ private static void setWorkspacePreferences() { IPreferenceStore prefStore = Activator.getDefault().getPreferenceStore(); // --simple-md-filenames prefStore.setValue(CreaterepoPreferenceConstants.PREF_UNIQUE_MD_NAME, false); // --no-database prefStore.setValue(CreaterepoPreferenceConstants.PREF_GENERATE_DB, false); // --skip-symlinks prefStore.setValue(CreaterepoPreferenceConstants.PREF_IGNORE_SYMLINKS, true); // --pretty prefStore.setValue(CreaterepoPreferenceConstants.PREF_PRETTY_XML, true); // --workers 73 prefStore.setValue(CreaterepoPreferenceConstants.PREF_WORKERS, 73); // --checkts prefStore.setValue(CreaterepoPreferenceConstants.PREF_CHECK_TS, true); // --changelog-limit 31 prefStore.setValue(CreaterepoPreferenceConstants.PREF_CHANGELOG_LIMIT, 31); // --checksum md5 prefStore.setValue(CreaterepoPreferenceConstants.PREF_CHECKSUM, ICreaterepoChecksums.MD5); // --compress-type gz prefStore.setValue(CreaterepoPreferenceConstants.PREF_COMPRESSION_TYPE, ICreaterepoCompressionTypes.GZ); } /** * Preference set should be shown in the command arguments created. * * @throws BackingStoreException */ @Test public void testCommandArgumentsProjectPreferences() throws BackingStoreException { setProjectPreferences(); CreaterepoCommandCreator commandCreator = new CreaterepoCommandCreator(project.getEclipsePreferences()); List<String> commands = commandCreator.getCommands(); assertFalse(commands.isEmpty()); String switchesToAdd = createStringFromList(commands); // waldo should not be found assertEquals(0, findCommandSwitch(switchesToAdd, "waldo")); //$NON-NLS-1$ // make sure that the workspace preference is using --simple-md-filenames assertFalse(Activator.getDefault().getPreferenceStore().getBoolean(CreaterepoPreferenceConstants.PREF_UNIQUE_MD_NAME)); // make sure project properties are being used assertTrue(Activator.isProjectPrefEnabled()); // simple should not be found because project properties are enabled and the project properties set // it as unique assertEquals(0, findCommandSwitch(switchesToAdd, "--simple-md-filenames")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--unique-md-filenames")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--no-database")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--skip-symlinks")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--workers\\s+\\d+")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--checkts")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--changelog-limit\\s+\\d+")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--checksum\\s+\\S+")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--compress-type\\s+\\S+")); //$NON-NLS-1$ assertTrue(Activator.isDeltaPrefEnabled()); assertEquals(1, findCommandSwitch(switchesToAdd, "--deltas")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--num-deltas\\s+\\d+")); //$NON-NLS-1$ assertEquals(1, findCommandSwitch(switchesToAdd, "--max-delta-rpm-size\\s+\\d+")); //$NON-NLS-1$ // 2 directories were specified assertEquals(2, findCommandSwitch(switchesToAdd, "--oldpackagedirs\\s+\\S+")); //$NON-NLS-1$ // 4 distro tags were specified assertEquals(4, findCommandSwitch(switchesToAdd, "--distro\\s+\\S+")); //$NON-NLS-1$ // no content tags were specified, but it is left over from removing a content tag in the metadata page // it should not appear assertEquals(0, findCommandSwitch(switchesToAdd, "--content\\s+\\S+")); //$NON-NLS-1$ // pretty setting was not set assertEquals(0, findCommandSwitch(switchesToAdd, "--pretty")); //$NON-NLS-1$ } /** * Set test project preferences. * * @throws BackingStoreException */ private void setProjectPreferences() throws BackingStoreException { // enable use of project preferences IPreferenceStore prefStore = new ScopedPreferenceStore(InstanceScope.INSTANCE, Activator.PLUGIN_ID); prefStore.setValue(CreaterepoPreferenceConstants.PREF_GENERAL_ENABLED, true); // --simple-md-filenames should not be used because project properties are enabled prefStore.setValue(CreaterepoPreferenceConstants.PREF_UNIQUE_MD_NAME, false); // set the project preferences IEclipsePreferences pref = project.getEclipsePreferences(); // --unique-md-filenames pref.putBoolean(CreaterepoPreferenceConstants.PREF_UNIQUE_MD_NAME, true); // --no-database pref.putBoolean(CreaterepoPreferenceConstants.PREF_GENERATE_DB, false); // --skip-symlinks pref.putBoolean(CreaterepoPreferenceConstants.PREF_IGNORE_SYMLINKS, true); // --pretty pref.putBoolean(CreaterepoPreferenceConstants.PREF_PRETTY_XML, false); // --workers 13 pref.putInt(CreaterepoPreferenceConstants.PREF_WORKERS, 13); // --checkts pref.putBoolean(CreaterepoPreferenceConstants.PREF_CHECK_TS, true); // --changelog-limit 37 pref.putInt(CreaterepoPreferenceConstants.PREF_CHANGELOG_LIMIT, 37); // --checksum sha512 pref.put(CreaterepoPreferenceConstants.PREF_CHECKSUM, ICreaterepoChecksums.SHA512); // --compress-type xz pref.put(CreaterepoPreferenceConstants.PREF_COMPRESSION_TYPE, ICreaterepoCompressionTypes.XZ); // enable deltas // --deltas prefStore.setValue(CreaterepoPreferenceConstants.PREF_DELTA_ENABLE, true); // --num-deltas 13 pref.putInt(CreaterepoPreferenceConstants.PREF_NUM_DELTAS, 13); // --max-delta-rpm-size 37 pref.putInt(CreaterepoPreferenceConstants.PREF_MAX_DELTA_SIZE, 37); // --oldpackagedirs /tmp --oldpackagedirs /home pref.put(CreaterepoPreferenceConstants.PREF_OLD_PACKAGE_DIRS, "/tmp;/home"); //$NON-NLS-1$ // --distro cpeid,distrotag --distro tag2 --distro tag3 --distro tag4 pref.put(CreaterepoPreferenceConstants.PREF_DISTRO_TAG, "cpeid,distrotag;tag2;tag3;tag4"); //$NON-NLS-1$ pref.put(CreaterepoPreferenceConstants.PREF_CONTENT_TAG, ""); //$NON-NLS-1$ pref.flush(); } /** * Create a string from a given list of strings. * * @param list A list of strings. * @return A string. */ private static String createStringFromList(List<String> list) { String str = ""; //$NON-NLS-1$ if (!list.isEmpty()) { for (String temp : list) { if (!temp.isEmpty()) { str = str.concat(temp).concat(" "); //$NON-NLS-1$ } } str = str.trim(); } return str; } /** * Try and find if a command string has a specific switch in it. * * @param command The command string. * @param switchPattern The switch to look for. * @return 0 if switch cannot be found, 1 if single found, >1 if multiple found. */ private static int findCommandSwitch(String command, String switchPattern) { int matches = 0; Pattern pattern = Pattern.compile(switchPattern, Pattern.CASE_INSENSITIVE); Matcher variableMatcher = pattern.matcher(command); while (variableMatcher.find()) { matches++; } return matches; } }