blob: b801380179dd30d5c5398ff08e00c641ef881094 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2009 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
* Code 9 - ongoing development
* EclipseSource - ongoing development
*******************************************************************************/
package org.eclipse.equinox.p2.tests.metadata.repository;
import org.eclipse.equinox.p2.core.ProvisionException;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.*;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository;
import org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepositoryFactory;
import org.eclipse.equinox.internal.p2.persistence.CompositeRepositoryState;
import org.eclipse.equinox.internal.provisional.p2.metadata.MetadataFactory;
import org.eclipse.equinox.internal.provisional.p2.metadata.Version;
import org.eclipse.equinox.internal.provisional.p2.metadata.MetadataFactory.InstallableUnitDescription;
import org.eclipse.equinox.internal.provisional.p2.metadata.query.*;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.query.IQueryResult;
import org.eclipse.equinox.p2.repository.IRepository;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
import org.eclipse.equinox.p2.tests.TestData;
import org.eclipse.equinox.p2.tests.core.CompoundQueryableTest.CompoundQueryTestProgressMonitor;
/**
* Test API of the local metadata repository implementation.
*/
public class CompositeMetadataRepositoryTest extends AbstractProvisioningTest {
private static final String TEST_KEY = "TestKey";
private static final String TEST_VALUE = "TestValue";
protected File repoLocation;
protected void setUp() throws Exception {
super.setUp();
repoLocation = new File(getTempFolder(), "CompositeMetadataRepositoryTest");
AbstractProvisioningTest.delete(repoLocation);
}
protected void tearDown() throws Exception {
getMetadataRepositoryManager().removeRepository(repoLocation.toURI());
delete(repoLocation);
super.tearDown();
}
public void testCompressedRepositoryCreation() {
createRepo(true);
File[] files = repoLocation.listFiles();
boolean jarFilePresent = false;
boolean xmlFilePresent = false;
// one of the files in the repository should be the content.xml.jar
for (int i = 0; i < files.length; i++) {
if ("compositeContent.jar".equalsIgnoreCase(files[i].getName())) {
jarFilePresent = true;
}
if ("compositeContent.xml".equalsIgnoreCase(files[i].getName())) {
xmlFilePresent = true;
}
}
if (!jarFilePresent) {
fail("Repository did not create JAR for compositeContent.xml");
}
if (xmlFilePresent) {
fail("Repository should not create compositeContent.xml");
}
}
public void testUncompressedRepositoryCreation() {
createRepo(false);
File[] files = repoLocation.listFiles();
boolean jarFilePresent = false;
// none of the files in the repository should be the content.xml.jar
for (int i = 0; i < files.length; i++) {
if ("compositeContent.jar".equalsIgnoreCase(files[i].getName())) {
jarFilePresent = true;
}
}
if (jarFilePresent) {
fail("Repository should not create JAR for compositeContent.xml");
}
}
public void testAddInstallableUnits() {
//create uncommpressed repo
CompositeMetadataRepository compRepo = createRepo(false);
//Try to add a new InstallableUnit.
try {
InstallableUnitDescription descriptor = new MetadataFactory.InstallableUnitDescription();
descriptor.setId("testIuId");
descriptor.setVersion(Version.create("3.2.1"));
IInstallableUnit iu = MetadataFactory.createInstallableUnit(descriptor);
compRepo.addInstallableUnits(new IInstallableUnit[] {iu});
fail("Should not be able to insert InstallableUnit");
} catch (UnsupportedOperationException e) {
//expected. fall through
}
}
public void testRemoveInstallableUnits() {
//create uncommpressed repo
CompositeMetadataRepository compRepo = createRepo(false);
//Try to remove an InstallableUnit.
try {
IQueryResult queryResult = compRepo.query(InstallableUnitQuery.ANY, null);
compRepo.removeInstallableUnits((IInstallableUnit[]) queryResult.toArray(IInstallableUnit.class), null);
fail("Should not be able to remove InstallableUnit");
} catch (UnsupportedOperationException e) {
//expected. fall through
}
}
public void testRemoveAll() {
//create uncommpressed repo
CompositeMetadataRepository compRepo = createRepo(false);
//Try to removeAll.
try {
compRepo.removeAll();
fail("Should not be able to removeAll()");
} catch (UnsupportedOperationException e) {
//expected. fall through
}
}
public void testGetProperties() {
IMetadataRepositoryManager manager = getMetadataRepositoryManager();
IMetadataRepository repo = null;
try {
repo = manager.createRepository(repoLocation.toURI(), "TestRepo", IMetadataRepositoryManager.TYPE_COMPOSITE_REPOSITORY, null);
} catch (ProvisionException e) {
fail("Cannot create repository: ", e);
}
Map properties = repo.getProperties();
//attempting to modify the properties should fail
try {
properties.put(TEST_KEY, TEST_VALUE);
fail("Should not allow setting property");
} catch (RuntimeException e) {
//expected
}
}
public void testSetProperty() {
IMetadataRepositoryManager manager = getMetadataRepositoryManager();
IMetadataRepository repo = null;
try {
repo = manager.createRepository(repoLocation.toURI(), "TestRepo", IMetadataRepositoryManager.TYPE_COMPOSITE_REPOSITORY, null);
} catch (ProvisionException e) {
fail("Cannot create repository: ", e);
}
Map properties = repo.getProperties();
assertTrue("1.0", !properties.containsKey(TEST_KEY));
repo.setProperty(TEST_KEY, TEST_VALUE);
//the previously obtained properties should not be affected by subsequent changes
assertTrue("1.1", !properties.containsKey(TEST_KEY));
properties = repo.getProperties();
assertTrue("1.2", properties.containsKey(TEST_KEY));
//going back to repo manager, should still get the new property
try {
repo = manager.loadRepository(repoLocation.toURI(), null);
} catch (ProvisionException e) {
fail("Cannot load repository: ", e);
}
properties = repo.getProperties();
assertTrue("1.3", properties.containsKey(TEST_KEY));
//setting a null value should remove the key
repo.setProperty(TEST_KEY, null);
properties = repo.getProperties();
assertTrue("1.4", !properties.containsKey(TEST_KEY));
}
public void testAddChild() {
//Setup: create an uncompressed repository
CompositeMetadataRepository compRepo = createRepo(false);
assertEquals("Initial Children size", 0, compRepo.getChildren().size());
File child = getTestData("1", "/testData/mirror/mirrorSourceRepo1 with space");
compRepo.addChild(child.toURI());
assertEquals("Children size with 1 child", 1, compRepo.getChildren().size());
IMetadataRepositoryManager metadataRepositoryManager = getMetadataRepositoryManager();
IMetadataRepository repo = null;
try {
repo = metadataRepositoryManager.loadRepository(child.toURI(), null);
} catch (ProvisionException e) {
fail("Unable to load repository for verification", e);
}
assertContentEquals("Verifying contents", compRepo, repo);
}
public void testRemoveChild() {
//Setup: create an uncompressed repository
CompositeMetadataRepository compRepo = createRepo(false);
assertEquals("Initial Children size", 0, compRepo.getChildren().size());
//Setup, populate the children
File child = getTestData("1", "/testData/mirror/mirrorSourceRepo1 with space");
compRepo.addChild(child.toURI());
assertEquals("Children size with 1 child", 1, compRepo.getChildren().size());
compRepo.removeChild(child.toURI());
assertEquals("Children size after remove", 0, compRepo.getChildren().size());
}
public void testAddRepeatChild() {
//Setup: create an uncompressed repository
CompositeMetadataRepository compRepo = createRepo(false);
assertEquals("Initial Children size", 0, compRepo.getChildren().size());
File child = getTestData("1", "/testData/mirror/mirrorSourceRepo1 with space");
compRepo.addChild(child.toURI());
assertEquals("Children size with 1 child", 1, compRepo.getChildren().size());
//Add the same repo again
compRepo.addChild(child.toURI());
//size should not change
assertEquals("Children size after repeat entry", 1, compRepo.getChildren().size());
}
public void testAddMultipleChildren() {
//Setup: create an uncompressed repository
CompositeMetadataRepository compRepo = createRepo(false);
assertEquals("Initial Children size", 0, compRepo.getChildren().size());
File child1 = getTestData("1", "/testData/mirror/mirrorSourceRepo1 with space");
compRepo.addChild(child1.toURI());
assertEquals("Children size with 1 child", 1, compRepo.getChildren().size());
File child2 = getTestData("2", "/testData/mirror/mirrorSourceRepo2");
compRepo.addChild(child2.toURI());
assertEquals("Children size with 2 children", 2, compRepo.getChildren().size());
IMetadataRepositoryManager metadataRepositoryManager = getMetadataRepositoryManager();
IMetadataRepository repo1 = null;
IMetadataRepository repo2 = null;
try {
repo1 = metadataRepositoryManager.loadRepository(child1.toURI(), null);
repo2 = metadataRepositoryManager.loadRepository(child2.toURI(), null);
} catch (ProvisionException e) {
fail("Unable to load repositories for verification", e);
}
assertContains("Assert child1's content is in composite repo", repo1, compRepo);
assertContains("Assert child2's content is in composite repo", repo2, compRepo);
//checks that the destination has the correct number of keys (no extras)
assertEquals("Assert correct number of IUs", getNumUnique(repo1.query(InstallableUnitQuery.ANY, null), repo2.query(InstallableUnitQuery.ANY, null)), queryResultSize(compRepo.query(InstallableUnitQuery.ANY, null)));
}
public void testRemoveNonexistantChild() {
//Setup: create an uncompressed repository
CompositeMetadataRepository compRepo = createRepo(false);
assertEquals("Initial Children size", 0, compRepo.getChildren().size());
//Setup, populate the children
File child = getTestData("1", "/testData/mirror/mirrorSourceRepo1 with space");
compRepo.addChild(child.toURI());
assertEquals("Children size with 1 child", 1, compRepo.getChildren().size());
File invalidChild = getTestData("2", "/testData/mirror/mirrorSourceRepo2");
compRepo.removeChild(invalidChild.toURI());
//Should not affect the size of children
assertEquals("Children size after remove", 1, compRepo.getChildren().size());
}
public void testRemoveAllChildren() {
//Setup: create an uncompressed repository
CompositeMetadataRepository compRepo = createRepo(false);
assertEquals("Initial Children size", 0, compRepo.getChildren().size());
File child1 = getTestData("1", "/testData/mirror/mirrorSourceRepo1 with space");
compRepo.addChild(child1.toURI());
assertEquals("Children size with 1 child", 1, compRepo.getChildren().size());
File child2 = getTestData("2", "/testData/mirror/mirrorSourceRepo2");
compRepo.addChild(child2.toURI());
assertEquals("Children size with 2 children", 2, compRepo.getChildren().size());
compRepo.removeAllChildren();
assertEquals("Children size after removeAllChildren", 0, compRepo.getChildren().size());
}
public void testValidate() {
//Setup: create an uncompressed repository
createRepo(false);
assertEquals("Verifying repository's status is OK", Status.OK_STATUS, (new CompositeMetadataRepositoryFactory()).validate(repoLocation.toURI(), null));
}
public void testLoadingRepositoryRemote() {
File knownGoodRepoLocation = getTestData("0.1", "/testData/metadataRepo/composite/good.remote");
CompositeMetadataRepository compRepo = null;
try {
compRepo = (CompositeMetadataRepository) getMetadataRepositoryManager().loadRepository(knownGoodRepoLocation.toURI(), null);
} catch (ProvisionException e) {
fail("0.99", e);
}
List children = compRepo.getChildren();
try {
//ensure children are correct
URI child1 = URIUtil.fromString("http://www.eclipse.org/foo");
assertTrue("1.0", children.contains(child1));
URI child2 = URIUtil.fromString("http://www.eclipse.org/bar");
assertTrue("1.1", children.contains(child2));
assertEquals("1.2", 2, children.size());
} catch (URISyntaxException e) {
fail("1.99", e);
}
//ensure correct properties
assertEquals("2.0", "metadata name", compRepo.getName());
Map properties = compRepo.getProperties();
assertEquals("2.1", 2, properties.size());
String timestamp = (String) properties.get(IRepository.PROP_TIMESTAMP);
assertNotNull("2.2", timestamp);
assertEquals("2.3", "1234", timestamp);
String compressed = (String) properties.get(IRepository.PROP_COMPRESSED);
assertNotNull("2.4", compressed);
assertFalse("2.5", Boolean.parseBoolean(compressed));
}
public void testLoadingRepositoryLocal() {
File testData = getTestData("0.5", "/testData/metadataRepo/composite/good.local");
copy("0.6", testData, repoLocation);
CompositeMetadataRepository compRepo = null;
try {
compRepo = (CompositeMetadataRepository) getMetadataRepositoryManager().loadRepository(repoLocation.toURI(), null);
} catch (ProvisionException e) {
fail("0.9", e);
}
List children = compRepo.getChildren();
//ensure children are correct
URI child1 = URIUtil.append(compRepo.getLocation(), "one");
assertTrue("1.0", children.contains(child1));
URI child2 = URIUtil.append(compRepo.getLocation(), "two");
assertTrue("1.1", children.contains(child2));
assertEquals("1.2", 2, children.size());
//ensure correct properties
assertEquals("2.0", "metadata name", compRepo.getName());
Map properties = compRepo.getProperties();
assertEquals("2.1", 2, properties.size());
String timestamp = (String) properties.get(IRepository.PROP_TIMESTAMP);
assertNotNull("2.2", timestamp);
assertEquals("2.3", "1234", timestamp);
String compressed = (String) properties.get(IRepository.PROP_COMPRESSED);
assertNotNull("2.4", compressed);
assertFalse("2.5", Boolean.parseBoolean(compressed));
}
public void testCompressedPersistence() {
persistenceTest(true);
}
public void testUncompressedPersistence() {
persistenceTest(false);
}
public void testSyntaxErrorWhileParsing() {
File badCompositeContent = getTestData("1", "/testData/metadataRepo/composite/Bad/syntaxError");
try {
getMetadataRepositoryManager().loadRepository(badCompositeContent.toURI(), null);
//Error while parsing expected
fail("Expected ProvisionException has not been thrown");
} catch (ProvisionException e) {
//expected.
//TODO more meaningful verification?
}
}
public void testMissingRequireattributeWhileParsing() {
File badCompositeContent = getTestData("0.1", "/testData/metadataRepo/composite/Bad/missingRequiredAttribute");
copy("0.2", badCompositeContent, repoLocation);
CompositeMetadataRepository compRepo = null;
try {
compRepo = (CompositeMetadataRepository) getMetadataRepositoryManager().loadRepository(repoLocation.toURI(), null);
} catch (ProvisionException e) {
fail("1.99", e);
}
assertEquals("2.0", 1, compRepo.getChildren().size());
}
public void testEnabledAndSystemValues() {
//Setup make repositories
File repo1Location = getTestFolder(getUniqueString());
File repo2Location = getTestFolder(getUniqueString());
File compRepoLocation = getTestFolder(getUniqueString());
CompositeMetadataRepository compRepo = null;
try {
getMetadataRepositoryManager().createRepository(repo1Location.toURI(), "Repo 1", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, null);
getMetadataRepositoryManager().createRepository(repo2Location.toURI(), "Repo 2", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, null);
//Only 1 child should be loaded in the manager
getMetadataRepositoryManager().removeRepository(repo2Location.toURI());
compRepo = (CompositeMetadataRepository) getMetadataRepositoryManager().createRepository(compRepoLocation.toURI(), "Composite Repo", IMetadataRepositoryManager.TYPE_COMPOSITE_REPOSITORY, null);
} catch (ProvisionException e) {
fail("Error creating repositories", e);
}
compRepo.addChild(repo1Location.toURI());
compRepo.addChild(repo2Location.toURI());
//force composite repository to load all children
compRepo.query(InstallableUnitQuery.ANY, new NullProgressMonitor());
assertTrue("Ensuring previously loaded repo is enabled", getMetadataRepositoryManager().isEnabled(repo1Location.toURI()));
String repo1System = getMetadataRepositoryManager().getRepositoryProperty(repo1Location.toURI(), IRepository.PROP_SYSTEM);
//if repo1System is null we want to fail
assertFalse("Ensuring previously loaded repo is not system", repo1System != null ? repo1System.equals(Boolean.toString(true)) : true);
assertFalse("Ensuring not previously loaded repo is not enabled", getMetadataRepositoryManager().isEnabled(repo2Location.toURI()));
String repo2System = getMetadataRepositoryManager().getRepositoryProperty(repo2Location.toURI(), IRepository.PROP_SYSTEM);
//if repo2System is null we want to fail
assertTrue("Ensuring not previously loaded repo is system", repo2System != null ? repo2System.equals(Boolean.toString(true)) : false);
}
public void testGetLatestIU() {
CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor();
URI location1;
URI location2;
try {
location1 = TestData.getFile("metadataRepo", "multipleversions1").toURI();
location2 = TestData.getFile("metadataRepo", "multipleversions2").toURI();
} catch (Exception e) {
fail("0.99", e);
return;
}
CompositeMetadataRepository compositeRepo = createRepo(false);
compositeRepo.addChild(location1);
compositeRepo.addChild(location2);
IQueryResult queryResult = compositeRepo.query(new LatestIUVersionQuery(), monitor);
assertEquals("1.0", 1, queryResultSize(queryResult));
assertEquals("1.1", Version.createOSGi(3, 0, 0), ((IInstallableUnit) queryResult.iterator().next()).getVersion());
assertTrue("1.2", monitor.isDone());
assertTrue("1.3", monitor.isWorkDone());
}
public void testGetLatestIULessThan3() {
CompoundQueryTestProgressMonitor monitor = new CompoundQueryTestProgressMonitor();
URI location1;
URI location2;
try {
location1 = TestData.getFile("metadataRepo", "multipleversions1").toURI();
location2 = TestData.getFile("metadataRepo", "multipleversions2").toURI();
} catch (Exception e) {
fail("0.99", e);
return;
}
CompositeMetadataRepository compositeRepo = createRepo(false);
compositeRepo.addChild(location1);
compositeRepo.addChild(location2);
PipedQuery cQuery = new PipedQuery(new MatchQuery() {
public boolean isMatch(Object candidate) {
if (candidate instanceof IInstallableUnit) {
IInstallableUnit iInstallableUnit = (IInstallableUnit) candidate;
if (iInstallableUnit.getVersion().compareTo(Version.createOSGi(3, 0, 0)) < 0)
return true;
}
return false;
}
}, new LatestIUVersionQuery());
IQueryResult queryResult = compositeRepo.query(cQuery, monitor);
assertEquals("1.0", 1, queryResultSize(queryResult));
assertEquals("1.1", Version.createOSGi(2, 2, 0), ((IInstallableUnit) queryResult.iterator().next()).getVersion());
assertTrue("1.2", monitor.isDone());
assertTrue("1.3", monitor.isWorkDone());
}
private void persistenceTest(boolean compressed) {
//Setup: create an uncompressed repository
CompositeMetadataRepository compRepo = createRepo(compressed);
//Add data. forces write to disk.
File child1 = getTestData("1", "/testData/mirror/mirrorSourceRepo1 with space");
compRepo.addChild(child1.toURI());
File child2 = getTestData("2", "/testData/mirror/mirrorSourceRepo2");
compRepo.addChild(child2.toURI());
//Assume success (covered by other tests)
//Remove repo from memory
IMetadataRepositoryManager metadataRepositoryManager = getMetadataRepositoryManager();
metadataRepositoryManager.removeRepository(repoLocation.toURI());
compRepo = null;
//load repository off disk
IMetadataRepository repo = null;
try {
repo = metadataRepositoryManager.loadRepository(repoLocation.toURI(), null);
} catch (ProvisionException e) {
fail("Could not load repository after removal", e);
}
assertTrue("loaded repository was of type CompositeMetadataRepository", repo instanceof CompositeMetadataRepository);
compRepo = (CompositeMetadataRepository) repo;
IMetadataRepository repo1 = null;
IMetadataRepository repo2 = null;
try {
repo1 = metadataRepositoryManager.loadRepository(child1.toURI(), null);
repo2 = metadataRepositoryManager.loadRepository(child2.toURI(), null);
} catch (ProvisionException e) {
fail("Unable to load repositories for verification", e);
}
assertContains("Assert child1's content is in composite repo", repo1, compRepo);
assertContains("Assert child2's content is in composite repo", repo2, compRepo);
//checks that the destination has the correct number of keys (no extras)
assertEquals("Assert correct number of IUs", getNumUnique(repo1.query(InstallableUnitQuery.ANY, null), repo2.query(InstallableUnitQuery.ANY, null)), queryResultSize(compRepo.query(InstallableUnitQuery.ANY, null)));
}
private CompositeMetadataRepository createRepo(boolean compressed) {
IMetadataRepositoryManager metadataRepositoryManager = getMetadataRepositoryManager();
Map properties = new HashMap();
properties.put(IRepository.PROP_COMPRESSED, compressed ? "true" : "false");
IMetadataRepository repo = null;
try {
repo = metadataRepositoryManager.createRepository(repoLocation.toURI(), "metadata name", IMetadataRepositoryManager.TYPE_COMPOSITE_REPOSITORY, properties);
} catch (ProvisionException e) {
fail("Could not create repository");
}
//esnure proper type of repository has been created
if (!(repo instanceof CompositeMetadataRepository))
fail("Repository is not a CompositeMetadataRepository");
return (CompositeMetadataRepository) repo;
}
/**
* Takes 2 collectors, compares them, and returns the number of unique keys
* Needed to verify that only the appropriate number of files have been transfered by the mirror application
*/
private int getNumUnique(IQueryResult c1, IQueryResult c2) {
Object[] repo1 = c1.toArray(IInstallableUnit.class);
Object[] repo2 = c2.toArray(IInstallableUnit.class);
//initialize to the size of both collectors
int numKeys = repo1.length + repo2.length;
for (int i = 0; i < repo1.length; i++) {
for (int j = 0; j < repo2.length; j++) {
if (isEqual((IInstallableUnit) repo1[i], (IInstallableUnit) repo2[j]))
numKeys--;
//identical keys has bee found, therefore the number of unique keys is one less than previously thought
}
}
return numKeys;
}
/*
* Ensure that we can create a non-local composite repository.
* Note that we had to change this test method when we changed the
* behaviour of the composite repos to aggressively load the children.
*/
public void testNonLocalRepo() {
try {
URI location = new URI("http://foo.org/in/memory");
URI childOne = new URI("http://foo.org/in/memory/one");
URI childTwo = new URI("http://foo.org/in/memory/two");
URI childThree = new URI("http://foo.org/in/memory/three");
CompositeMetadataRepository repository = createRepository(location, "in memory test");
repository.addChild(childOne);
repository.addChild(childTwo);
repository.addChild(childThree);
assertEquals("1.0", 3, repository.getChildren().size());
repository.removeChild(childTwo);
assertEquals("1.1", 2, repository.getChildren().size());
// add a child which already exists... should do nothing
repository.addChild(childOne);
assertEquals("1.2", 2, repository.getChildren().size());
// add the same child but with a relative URI. again it should do nothing
repository.addChild(new URI("one"));
assertEquals("1.3", 2, repository.getChildren().size());
} catch (URISyntaxException e) {
fail("99.0", e);
}
}
protected CompositeMetadataRepository createRepository(URI location, String name) {
CompositeMetadataRepositoryFactory factory = new CompositeMetadataRepositoryFactory();
factory.setAgent(getAgent());
return (CompositeMetadataRepository) factory.create(location, name, CompositeMetadataRepository.REPOSITORY_TYPE, null);
}
public void testRelativeChildren() {
// setup
File one = getTestData("0.0", "testData/testRepos/simple.1");
File two = getTestData("0.1", "testData/testRepos/simple.2");
File temp = getTempFolder();
copy("0.2", one, new File(temp, "one"));
copy("0.3", two, new File(temp, "two"));
// create the composite repository and add the children
URI location = new File(temp, "comp").toURI();
CompositeMetadataRepository repository = createRepository(location, "test");
try {
repository.addChild(new URI("../one"));
repository.addChild(new URI("../two"));
} catch (URISyntaxException e) {
fail("1.99", e);
}
// query the number of IUs
List children = repository.getChildren();
assertEquals("2.0", 2, children.size());
IQueryResult queryResult = repository.query(InstallableUnitQuery.ANY, getMonitor());
assertEquals("2.1", 2, queryResultSize(queryResult));
// ensure the child URIs are stored as relative
CompositeRepositoryState state = repository.toState();
URI[] childURIs = state.getChildren();
assertNotNull("3.0", childURIs);
assertEquals("3.1", 2, childURIs.length);
assertFalse("3.2", childURIs[0].isAbsolute());
assertFalse("3.3", childURIs[1].isAbsolute());
// cleanup
delete(temp);
}
public void testRelativeRemoveChild() {
try {
URI location = new URI("http://foo.org/in/memory");
URI one = new URI("one");
URI two = new URI("two");
CompositeMetadataRepository repository = createRepository(location, "in memory test");
repository.addChild(one);
repository.addChild(two);
List children = repository.getChildren();
assertEquals("1.0", 2, children.size());
// remove an absolute URI (child one should be first since order is important)
repository.removeChild((URI) children.iterator().next());
assertEquals("1.1", 1, repository.getChildren().size());
// remove a relative URI (child two)
repository.removeChild(two);
assertEquals("1.2", 0, repository.getChildren().size());
} catch (URISyntaxException e) {
fail("99.0", e);
}
}
}