blob: 637465c39f8cbaba8e3c3255ce1ebe4485e11620 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2017 Code 9 and others.
*
* This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License 2.0 which accompanies this distribution, and is
* available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Code 9 - initial API and implementation
* IBM - ongoing development
******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.p2.metadata.IRequiredCapability;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.IRequirement;
import org.eclipse.equinox.p2.metadata.Version;
import org.eclipse.equinox.p2.publisher.IPublisherResult;
import org.eclipse.equinox.p2.publisher.actions.IAdditionalInstallableUnitAdvice;
import org.eclipse.equinox.p2.publisher.actions.ICapabilityAdvice;
import org.eclipse.equinox.p2.publisher.actions.ILicenseAdvice;
import org.eclipse.equinox.p2.publisher.actions.IPropertyAdvice;
import org.eclipse.equinox.p2.publisher.actions.IRootIUAdvice;
import org.eclipse.equinox.p2.publisher.actions.ITouchpointAdvice;
import org.eclipse.equinox.p2.publisher.actions.IUpdateDescriptorAdvice;
import org.eclipse.equinox.p2.publisher.actions.IVersionAdvice;
import org.eclipse.equinox.p2.publisher.actions.RootIUAction;
import org.eclipse.equinox.p2.publisher.actions.RootIUAdvice;
import org.eclipse.equinox.p2.publisher.actions.RootIUResultFilterAdvice;
import org.eclipse.equinox.p2.query.IQuery;
import org.eclipse.equinox.p2.query.MatchQuery;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
import org.eclipse.equinox.p2.tests.TestMetadataRepository;
public class RootIUActionTest extends ActionTest {
private static final int CONTAINS_A = 1;
private static final int CONTAINS_B = 2;
private static final int EMPTY = 0;
private static final int ALL = CONTAINS_A | CONTAINS_B;
private static final String ADVICE = "advice \t\t\t"; //$NON-NLS-1$
private static final String METADATA_REPOSITORY = "metadata repo \t\t"; //$NON-NLS-1$
private static final String PUBLISHER_RESULT = "publisher result \t"; //$NON-NLS-1$
protected static String iu_A = "iuA"; //$NON-NLS-1$
protected static String iu_B = "iuB"; //$NON-NLS-1$
private IMetadataRepository metadataRepository;
private String rootIU = "sdk"; //$NON-NLS-1$
private Version versionArg = Version.create("3.4.0.i0305"); //$NON-NLS-1$
private Collection<IRootIUAdvice> rootIUAdviceCollection;
public void testNullAdvice() throws Exception {
debug("\n**********************************"); //$NON-NLS-1$
debug(" null advice test"); //$NON-NLS-1$
setupMetadataRepository(EMPTY);
setupPublisherResult(EMPTY);
setupPublisherInfo();
testAction = new RootIUAction(rootIU, versionArg, rootIU);
assertEquals(Status.OK_STATUS, testAction.perform(publisherInfo, publisherResult, new NullProgressMonitor()));
confirmResultRequired(EMPTY);
cleanup();
}
public void testNullRepo() throws Exception {
debug("\n**********************************"); //$NON-NLS-1$
debug(" null repo test"); //$NON-NLS-1$
setupAdvice(CONTAINS_A);
setupPublisherResult(EMPTY);
setupPublisherInfo();
testAction = new RootIUAction(rootIU, versionArg, rootIU);
assertEquals(Status.OK_STATUS, testAction.perform(publisherInfo, publisherResult, new NullProgressMonitor()));
confirmResultRequired(EMPTY);
cleanup();
}
public void testIUAdviceAMetdataAResultB() throws Exception {
debug("\n**********************************"); //$NON-NLS-1$
debug(" advice (as iu) A"); //$NON-NLS-1$
setupAdvice(EMPTY);
Collection<Object> iuCollection = new ArrayList<>();
iuCollection.add(mockIU(iu_A, null));
rootIUAdviceCollection.add(new RootIUAdvice(iuCollection));
setupMetadataRepository(CONTAINS_A);
setupPublisherResult(EMPTY);
setupPublisherInfo();
testAction = new RootIUAction(rootIU, versionArg, rootIU);
assertEquals(Status.OK_STATUS, testAction.perform(publisherInfo, publisherResult, new NullProgressMonitor()));
confirmResultRequired(CONTAINS_A);
cleanup();
}
// @Test
// public void testIUAdviceAAdviceAMetadataAResultB() throws Exception {
// debug("\n**********************************"); //$NON-NLS-1$
// debug(" advice (as iu and String) A"); //$NON-NLS-1$
// setupAdvice(CONTAINS_A);
// Collection iuCollection = new ArrayList();
// iuCollection.add(mockIU(iu_A, null));
// rootIUAdviceCollection.add(new RootIUAdvice(iuCollection));
// setupMetadataRepository(CONTAINS_A);
// setupPublisherResult(EMPTY);
// setupPublisherInfo();
// testAction = new RootIUAction(rootIU, versionArg, rootIU);
//
// assertEquals(Status.OK_STATUS, testAction.perform(publisherInfo, publisherResult));
// confirmResultRequired(CONTAINS_A);
// cleanup();
// } //TODO: commented out while we determine bug: (bug not entered due to bug in reporting bugs)
public void testEmpty() throws Exception {
setupAndRunRootIUTest(EMPTY, EMPTY, EMPTY);
}
public void testAdviceA() throws Exception {
setupAndRunRootIUTest(CONTAINS_A, CONTAINS_A, EMPTY);
}
public void testAdviceAll() throws Exception {
setupAndRunRootIUTest(ALL, ALL, EMPTY);
}
public void testMetadataA() throws Exception {
setupAndRunRootIUTest(EMPTY, CONTAINS_A, EMPTY);
}
public void testMetadataAll() throws Exception {
setupAndRunRootIUTest(EMPTY, ALL, EMPTY);
}
public void testAdviceAMetadataB() throws Exception {
setupAndRunRootIUTest(CONTAINS_A, CONTAINS_B, EMPTY);
}
public void testResultA() throws Exception {
setupAndRunRootIUTest(EMPTY, EMPTY, CONTAINS_A);
}
public void testResultAll() throws Exception {
setupAndRunRootIUTest(EMPTY, EMPTY, ALL);
}
public void testAdviceAResultB() throws Exception {
setupAndRunRootIUTest(CONTAINS_A, EMPTY, CONTAINS_B);
}
public void testAdviceAllResultAll() throws Exception {
setupAndRunRootIUTest(ALL, EMPTY, ALL);
}
public void testAdviceAllMetadataAResultB() throws Exception {
setupAndRunRootIUTest(ALL, CONTAINS_A, CONTAINS_B);
}
public void testAdviceAllMetadataAllResultAll() throws Exception {
setupAndRunRootIUTest(ALL, ALL, ALL);
}
public void testResultFilterAdviceAllResultAll() throws Exception {
setupAndrunRootFilterIUTest(ALL, EMPTY, ALL);
}
public void testResultFilterAdviceAResultAll() throws Exception {
setupAndrunRootFilterIUTest(CONTAINS_A, EMPTY, ALL);
}
public void testResultFilterAdviceBResultAll() throws Exception {
setupAndrunRootFilterIUTest(CONTAINS_B, EMPTY, ALL);
}
public void testResultFilterAdviceEmptyResultAll() throws Exception {
setupAndrunRootFilterIUTest(EMPTY, EMPTY, ALL);
}
public void testResultFilterAdviceAllMetadataAll() throws Exception {
setupAndrunRootFilterIUTest(ALL, EMPTY, ALL);
}
public void testResultFilterAdviceAMetadataAll() throws Exception {
setupAndrunRootFilterIUTest(CONTAINS_A, EMPTY, ALL);
}
public void testResultFilterAdviceBMetadataAll() throws Exception {
setupAndrunRootFilterIUTest(CONTAINS_B, EMPTY, ALL);
}
public void testResultFilterAdviceEmptyMetadataAll() throws Exception {
setupAndrunRootFilterIUTest(EMPTY, EMPTY, ALL);
}
public void testResultFilterAdviceAllMetadataBResultA() throws Exception {
setupAndrunRootFilterIUTest(ALL, CONTAINS_B, CONTAINS_A);
}
public void testResultFilterAdviceBMetadataAResultB() throws Exception {
setupAndrunRootFilterIUTest(ALL, CONTAINS_A, CONTAINS_B);
}
private void setupAndRunRootIUTest(int advice, int metadataRepository, int publisherResult) {
debug("\n**********************************"); //$NON-NLS-1$
debug("RootIUTest"); //$NON-NLS-1$
setupAdvice(advice);
setupMetadataRepository(metadataRepository);
setupPublisherResult(publisherResult);
setupPublisherInfo();
debug(toResultString(ADVICE, advice));
debug(toResultString(METADATA_REPOSITORY, metadataRepository));
debug(toResultString(PUBLISHER_RESULT, publisherResult));
testAction = new RootIUAction(rootIU, versionArg, rootIU);
assertEquals(Status.OK_STATUS, testAction.perform(publisherInfo, this.publisherResult, new NullProgressMonitor()));
confirmResultRequired(advice & metadataRepository | advice & publisherResult);
cleanup();
}
private void setupAndrunRootFilterIUTest(int advice, int metadataRepository, int publisherResult) {
debug("\n**********************************"); //$NON-NLS-1$
debug("RootIUActionTest"); //$NON-NLS-1$
setupFilterAdvice(advice);
setupMetadataRepository(metadataRepository);
setupPublisherResult(publisherResult);
setupPublisherInfo();
debug(toResultString(ADVICE, advice));
debug(toResultString(METADATA_REPOSITORY, metadataRepository));
debug(toResultString(PUBLISHER_RESULT, publisherResult));
testAction = new RootIUAction(rootIU, versionArg, rootIU);
assertEquals(Status.OK_STATUS, testAction.perform(publisherInfo, this.publisherResult, new NullProgressMonitor()));
confirmResultRequired(advice & publisherResult);
cleanup();
}
private void setupFilterAdvice(int testSpec) {
IQuery<IInstallableUnit> query = null;
rootIUAdviceCollection = new ArrayList<>();
if ((testSpec & CONTAINS_A) > 0) {
query = new MatchQuery<>() {
@Override
public boolean isMatch(IInstallableUnit candidate) {
if (candidate.getId().equals(iu_A))
return true;
return false;
}
};
rootIUAdviceCollection.add(new RootIUResultFilterAdvice(query));
}
if ((testSpec & CONTAINS_B) > 0) {
query = new MatchQuery<>() {
@Override
public boolean isMatch(IInstallableUnit candidate) {
if (candidate.getId().equals(iu_B))
return true;
return false;
}
};
rootIUAdviceCollection.add(new RootIUResultFilterAdvice(query));
}
if ((testSpec & EMPTY) > 0) {
query = new MatchQuery<>() {
@Override
public boolean isMatch(IInstallableUnit candidate) {
return false;
}
};
rootIUAdviceCollection.add(new RootIUResultFilterAdvice(query));
}
}
private void confirmResultRequired(int testSpec) {
// checks that the results has a non root iu with required
// capabilities from the publisher result
ArrayList<IInstallableUnit> ius = new ArrayList<>(publisherResult.getIUs(rootIU, IPublisherResult.NON_ROOT));
assertTrue(ius.size() == 1);
IInstallableUnit iu = ius.get(0);
assertTrue(iu != null);
assertTrue(iu.getVersion().equals(versionArg));
Collection<IRequirement> required = iu.getRequirements();
if ((testSpec & EMPTY) > 0)
assertEquals(required.size(), 0);
String confirmedIUs = ""; //$NON-NLS-1$
int numConfirmed = 0;
if ((testSpec & CONTAINS_A) > 0) {
assertTrue(contains(required, iu_A));
confirmedIUs += iu_A + ' ';
numConfirmed++;
}
if ((testSpec & CONTAINS_B) > 0) {
assertTrue(contains(required, iu_B));
confirmedIUs += iu_B;
numConfirmed++;
}
if (numConfirmed != required.size()) {
debug("Not all required ius present / accounted for."); //$NON-NLS-1$
fail();
}
if (confirmedIUs.length() > 0)
debug("Confirmed \t\t " + confirmedIUs); //$NON-NLS-1$
else
debug("Confirmed \t\t Empty"); //$NON-NLS-1$
}
private boolean contains(Collection<IRequirement> required, String iu) {
for (IRequirement requirement : required) {
IRequiredCapability req = (IRequiredCapability) requirement;
if (req.getName().equalsIgnoreCase(iu))
return true;
}
return false;
}
public void setupPublisherResult(int testSpec) {
super.setupPublisherResult();
Collection<IInstallableUnit> ius = new ArrayList<>();
if ((testSpec & CONTAINS_A) > 0) {
ius.add(mockIU(iu_A, null));
}
if ((testSpec & CONTAINS_B) > 0) {
ius.add(mockIU(iu_B, null));
}
publisherResult.addIUs(ius, IPublisherResult.ROOT);
}
private void setupMetadataRepository(int testSpec) {
ArrayList<IInstallableUnit> repoContents = new ArrayList<>();
if ((testSpec & CONTAINS_A) > 0) {
repoContents.add(mockIU(iu_A, null));
}
if ((testSpec & CONTAINS_B) > 0) {
repoContents.add(mockIU(iu_B, null));
}
IInstallableUnit[] ius = repoContents.toArray(new IInstallableUnit[repoContents.size()]);
metadataRepository = new TestMetadataRepository(getAgent(), ius);
}
public void setupAdvice(int testSpec) {
Collection<Object> publishIUs = new ArrayList<>();
if ((testSpec & CONTAINS_A) > 0)
publishIUs.add(iu_A);
if ((testSpec & CONTAINS_B) > 0)
publishIUs.add(iu_B);
rootIUAdviceCollection = new ArrayList<>();
rootIUAdviceCollection.add(new RootIUAdvice(publishIUs));
}
@Override
public void insertPublisherInfoBehavior() {
when(publisherInfo.getAdvice(null, false, rootIU, versionArg, ICapabilityAdvice.class))
.thenReturn(new ArrayList<>());
when(publisherInfo.getAdvice(null, true, null, null, IRootIUAdvice.class)).thenReturn(rootIUAdviceCollection);
when(publisherInfo.getAdvice(null, true, null, null, IVersionAdvice.class)).thenReturn(null);
when(publisherInfo.getAdvice(null, false, rootIU, versionArg, ITouchpointAdvice.class))
.thenReturn(new ArrayList<>());
when(publisherInfo.getAdvice(null, false, rootIU, versionArg, IUpdateDescriptorAdvice.class))
.thenReturn(new ArrayList<>());
when(publisherInfo.getAdvice(null, false, rootIU, versionArg, IPropertyAdvice.class))
.thenReturn(new ArrayList<>());
when(publisherInfo.getAdvice(null, false, rootIU, versionArg, IAdditionalInstallableUnitAdvice.class))
.thenReturn(new ArrayList<>());
when(publisherInfo.getAdvice(null, true, rootIU, versionArg, ILicenseAdvice.class))
.thenReturn(new ArrayList<>());
when(publisherInfo.getMetadataRepository()).thenReturn(metadataRepository);
when(publisherInfo.getContextMetadataRepository()).thenReturn(null);
}
@Override
public void cleanup() {
super.cleanup();
rootIUAdviceCollection = null;
if (metadataRepository != null) {
metadataRepository.removeAll();
metadataRepository = null;
}
}
private String toResultString(String setup, int arg) {
return setup + toArgString(arg);
}
private String toArgString(int testSpec) {
if (testSpec == EMPTY)
return " Empty"; //$NON-NLS-1$
String result = " "; //$NON-NLS-1$
if ((testSpec & CONTAINS_A) > 0)
result += iu_A;
if ((testSpec & CONTAINS_B) > 0)
result += " " + iu_B; //$NON-NLS-1$
return result;
}
}