/******************************************************************************* * Copyright (c) 2008, 2011 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.equinox.p2.tests.ui; import java.io.File; import java.net.URI; import java.util.Dictionary; import java.util.Hashtable; import org.eclipse.core.runtime.*; import org.eclipse.equinox.internal.p2.director.ProfileChangeRequest; import org.eclipse.equinox.internal.p2.ui.model.ProfileElement; import org.eclipse.equinox.internal.p2.ui.sdk.SimpleLicenseManager; import org.eclipse.equinox.p2.core.ProvisionException; import org.eclipse.equinox.p2.engine.*; import org.eclipse.equinox.p2.metadata.*; import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitDescription; import org.eclipse.equinox.p2.operations.ProfileModificationJob; import org.eclipse.equinox.p2.operations.ProvisioningSession; import org.eclipse.equinox.p2.repository.IRepositoryManager; import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager; import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager; import org.eclipse.equinox.p2.tests.AbstractProvisioningTest; import org.eclipse.equinox.p2.tests.TestActivator; import org.eclipse.equinox.p2.ui.*; import org.osgi.framework.Constants; import org.osgi.framework.ServiceRegistration; /** * Abstract class to set up the colocated UI test repo */ public abstract class AbstractProvisioningUITest extends AbstractProvisioningTest { protected static final String TEST_REPO_PATH = "testRepos/updateSite/"; protected static final String TESTPROFILE = "TestProfile"; protected static final String TOPLEVELIU = "TopLevelIU"; protected static final String TOPLEVELIU2 = "TopLevelIU2"; protected static final String NESTEDIU = "NestedIU"; protected static final String LOCKEDIU = "LockedIU"; protected static final String UNINSTALLEDIU = "UninstalledIU"; protected static final String CATEGORYIU = "CategoryIU"; protected IMetadataRepositoryManager metaManager; protected IArtifactRepositoryManager artifactManager; protected URI testRepoLocation; protected IProfile profile; protected ProfileElement profileElement; protected IInstallableUnit top1; protected IInstallableUnit top2; protected IInstallableUnit nested; protected IInstallableUnit locked; protected IInstallableUnit upgrade; protected IInstallableUnit uninstalled; protected IInstallableUnit category; private ProvisioningUI ui; private ServiceRegistration regLicenseManager; protected void setUp() throws Exception { super.setUp(); // create test profile profile = createProfile(TESTPROFILE); // copy of provisioning UI that uses a different profile ui = ProvisioningUI.getDefaultUI(); ui = new ProvisioningUI(ui.getSession(), TESTPROFILE, ui.getPolicy()); ui.getOperationRunner().suppressRestart(true); ui.getPolicy().setRepositoriesVisible(false); // register alternate services SimpleLicenseManager manager = new SimpleLicenseManager(TESTPROFILE); Dictionary<String, Object> properties = new Hashtable<String, Object>(5); properties.put(Constants.SERVICE_RANKING, new Integer(1)); regLicenseManager = TestActivator.getContext().registerService(LicenseManager.class.getName(), manager, properties); profileElement = new ProfileElement(null, TESTPROFILE); install((top1 = createIU(TOPLEVELIU, Version.create("1.0.0"))), true, false); install((top2 = createIU(TOPLEVELIU2)), true, false); install((nested = createIU(NESTEDIU)), false, false); install((locked = createIU(LOCKEDIU)), true, true); uninstalled = createIU(UNINSTALLEDIU); IUpdateDescriptor update = MetadataFactory.createUpdateDescriptor(TOPLEVELIU, new VersionRange("[1.0.0, 1.0.0]"), 0, "update description"); upgrade = createIU(TOPLEVELIU, Version.createOSGi(2, 0, 0), null, NO_REQUIRES, NO_PROVIDES, NO_PROPERTIES, null, NO_TP_DATA, false, update, NO_REQUIRES); category = createNamedIU(CATEGORYIU, CATEGORYIU, Version.create("1.0.0"), true); createTestMetdataRepository(new IInstallableUnit[] {top1, top2, uninstalled, upgrade}); metaManager = (IMetadataRepositoryManager) getAgent().getService(IMetadataRepositoryManager.SERVICE_NAME); artifactManager = (IArtifactRepositoryManager) getAgent().getService(IArtifactRepositoryManager.SERVICE_NAME); File site = new File(TestActivator.getTestDataFolder().toString(), TEST_REPO_PATH); testRepoLocation = site.toURI(); metaManager.addRepository(testRepoLocation); artifactManager.addRepository(testRepoLocation); } protected void tearDown() throws Exception { super.tearDown(); metaManager.removeRepository(testRepoLocation); artifactManager.removeRepository(testRepoLocation); regLicenseManager.unregister(); } protected boolean managerContains(IRepositoryManager<?> manager, URI location) { URI[] locations = manager.getKnownRepositories(IRepositoryManager.REPOSITORIES_ALL); for (int i = 0; i < locations.length; i++) { if (locations[i].equals(location)) return true; } return false; } protected ProvisioningSession getSession() { return ui.getSession(); } protected ProvisioningUI getProvisioningUI() { return ui; } protected Policy getPolicy() { return ui.getPolicy(); } protected IStatus install(IInstallableUnit iu, boolean root, boolean lock) throws ProvisionException { ProfileChangeRequest req = new ProfileChangeRequest(profile); req.add(iu); if (root) { req.setInstallableUnitProfileProperty(iu, IProfile.PROP_PROFILE_ROOT_IU, Boolean.toString(true)); } if (lock) { req.setInstallableUnitProfileProperty(iu, IProfile.PROP_PROFILE_LOCKED_IU, new Integer(IProfile.LOCK_UNINSTALL | IProfile.LOCK_UPDATE).toString()); } // Use an empty provisioning context to prevent repo access ProvisioningContext context = new ProvisioningContext(getAgent()); context.setMetadataRepositories(new URI[] {}); IProvisioningPlan plan = getPlanner(getSession().getProvisioningAgent()).getProvisioningPlan(req, context, getMonitor()); if (plan.getStatus().getSeverity() == IStatus.ERROR || plan.getStatus().getSeverity() == IStatus.CANCEL) return plan.getStatus(); return getSession().performProvisioningPlan(plan, PhaseSetFactory.createDefaultPhaseSet(), new ProvisioningContext(getAgent()), getMonitor()); } protected IInstallableUnit createNamedIU(String id, String name, Version version, boolean isCategory) { InstallableUnitDescription iu = new MetadataFactory.InstallableUnitDescription(); iu.setId(id); iu.setVersion(version); iu.setProperty(IInstallableUnit.PROP_NAME, name); if (isCategory) iu.setProperty(InstallableUnitDescription.PROP_TYPE_CATEGORY, Boolean.toString(true)); return MetadataFactory.createInstallableUnit(iu); } protected ProfileModificationJob getLongTestOperation() { return new ProfileModificationJob("Test Operation", getSession(), TESTPROFILE, null, null) { public IStatus runModal(IProgressMonitor monitor) { while (true) { // spin unless cancelled if (monitor.isCanceled()) return Status.CANCEL_STATUS; } } }; } }