blob: 2bbbd356c6d97441e0ddc87d962a450e99e3969f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2010 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
*******************************************************************************/
package org.eclipse.equinox.p2.tests.metadata.repository;
import java.io.File;
import java.net.URI;
import java.util.*;
import org.eclipse.equinox.internal.provisional.p2.core.eventbus.*;
import org.eclipse.equinox.internal.provisional.p2.repository.RepositoryEvent;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.metadata.*;
import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitDescription;
import org.eclipse.equinox.p2.query.IQueryResult;
import org.eclipse.equinox.p2.query.QueryUtil;
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.repository.spi.RepositoryReference;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
/**
* Test API of the local metadata repository implementation.
*/
public class LocalMetadataRepositoryTest 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();
String tempDir = System.getProperty("java.io.tmpdir");
repoLocation = new File(tempDir, "LocalMetadataRepositoryTest");
AbstractProvisioningTest.delete(repoLocation);
repoLocation.mkdir();
}
protected void tearDown() throws Exception {
getMetadataRepositoryManager().removeRepository(repoLocation.toURI());
delete(repoLocation);
super.tearDown();
}
public void testCompressedRepository() throws ProvisionException {
IMetadataRepositoryManager manager = getMetadataRepositoryManager();
Map properties = new HashMap();
properties.put(IRepository.PROP_COMPRESSED, "true");
IMetadataRepository repo = manager.createRepository(repoLocation.toURI(), "TestRepo", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, properties);
InstallableUnitDescription descriptor = new MetadataFactory.InstallableUnitDescription();
descriptor.setId("testIuId");
descriptor.setVersion(Version.create("3.2.1"));
IInstallableUnit iu = MetadataFactory.createInstallableUnit(descriptor);
repo.addInstallableUnits(Arrays.asList(iu));
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 ("content.jar".equalsIgnoreCase(files[i].getName())) {
jarFilePresent = true;
}
if ("content.xml".equalsIgnoreCase(files[i].getName())) {
xmlFilePresent = true;
}
}
if (!jarFilePresent) {
fail("Repository did not create JAR for content.xml");
}
if (xmlFilePresent) {
fail("Repository should not create content.xml");
}
}
public void testGetProperties() throws ProvisionException {
IMetadataRepositoryManager manager = getMetadataRepositoryManager();
IMetadataRepository repo = manager.createRepository(repoLocation.toURI(), "TestRepo", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, null);
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() throws ProvisionException {
IMetadataRepositoryManager manager = getMetadataRepositoryManager();
IMetadataRepository repo = manager.createRepository(repoLocation.toURI(), "TestRepo", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, null);
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
repo = manager.loadRepository(repoLocation.toURI(), null);
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 testAddRemoveIUs() throws ProvisionException {
IMetadataRepositoryManager manager = getMetadataRepositoryManager();
IMetadataRepository repo = manager.createRepository(repoLocation.toURI(), "TestRepo", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, null);
IInstallableUnit iu = createIU("foo");
repo.addInstallableUnits(Arrays.asList(iu));
IQueryResult result = repo.query(QueryUtil.createIUQuery((String) null), getMonitor());
assertEquals("1.0", 1, queryResultSize(result));
repo.removeAll();
result = repo.query(QueryUtil.createIUQuery((String) null), getMonitor());
assertTrue("1.1", result.isEmpty());
}
public void testRemoveByQuery() throws ProvisionException {
IMetadataRepositoryManager manager = getMetadataRepositoryManager();
IMetadataRepository repo = manager.createRepository(repoLocation.toURI(), "TestRepo", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, null);
IInstallableUnit iu = createIU("foo");
IInstallableUnit iu2 = createIU("bar");
repo.addInstallableUnits(Arrays.asList(iu, iu2));
IQueryResult result = repo.query(QueryUtil.createIUQuery((String) null), getMonitor());
assertEquals("1.0", 2, queryResultSize(result));
repo.removeInstallableUnits(Arrays.asList(iu));
result = repo.query(QueryUtil.createIUQuery((String) null), getMonitor());
assertEquals("1.1", 1, queryResultSize(result));
repo.removeInstallableUnits(Arrays.asList(iu2));
result = repo.query(QueryUtil.createIUQuery((String) null), getMonitor());
assertTrue("1.2", result.isEmpty());
}
public void testUncompressedRepository() throws ProvisionException {
IMetadataRepositoryManager manager = getMetadataRepositoryManager();
Map properties = new HashMap();
properties.put(IRepository.PROP_COMPRESSED, "false");
IMetadataRepository repo = manager.createRepository(repoLocation.toURI(), "TestRepo", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, properties);
InstallableUnitDescription descriptor = new MetadataFactory.InstallableUnitDescription();
descriptor.setId("testIuId");
descriptor.setVersion(Version.create("3.2.1"));
IInstallableUnit iu = MetadataFactory.createInstallableUnit(descriptor);
repo.addInstallableUnits(Arrays.asList(iu));
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 ("content.jar".equalsIgnoreCase(files[i].getName())) {
jarFilePresent = true;
}
}
if (jarFilePresent) {
fail("Repository should not create JAR for content.xml");
}
}
/**
* Tests loading a repository that has a reference to itself as a disabled repository.
* @throws MalformedURLException
* @throws ProvisionException
*/
public void testLoadSelfReference() throws ProvisionException {
//setup a repository that has a reference to itself in disabled state
IMetadataRepositoryManager manager = getMetadataRepositoryManager();
Map properties = new HashMap();
properties.put(IRepository.PROP_COMPRESSED, "false");
final URI repoURI = repoLocation.toURI();
IMetadataRepository repo = manager.createRepository(repoURI, "testLoadSelfReference", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, properties);
repo.addReferences(Collections.singletonList(new RepositoryReference(repoURI, "testNick", IRepository.TYPE_METADATA, IRepository.NONE)));
final int[] callCount = new int[] {0};
final boolean[] wasEnabled = new boolean[] {false};
//add a listener to ensure we receive add events with the repository enabled
ProvisioningListener listener = new SynchronousProvisioningListener() {
public void notify(EventObject o) {
if (!(o instanceof RepositoryEvent))
return;
RepositoryEvent event = (RepositoryEvent) o;
if (event.getKind() != RepositoryEvent.ADDED)
return;
if (!event.getRepositoryLocation().equals(repoURI))
return;
wasEnabled[0] = event.isRepositoryEnabled();
callCount[0]++;
}
};
final IProvisioningEventBus eventBus = getEventBus();
eventBus.addListener(listener);
try {
//now remove and reload the repository
manager.removeRepository(repoURI);
repo = manager.loadRepository(repoURI, null);
assertTrue("1.0", manager.isEnabled(repoURI));
assertTrue("1.1", wasEnabled[0]);
assertEquals("1.2", 1, callCount[0]);
} finally {
eventBus.removeListener(listener);
}
}
public void testRefreshSelfReference() throws ProvisionException {
//setup a repository that has a reference to itself in disabled state
IMetadataRepositoryManager manager = getMetadataRepositoryManager();
Map properties = new HashMap();
properties.put(IRepository.PROP_COMPRESSED, "false");
final URI repoURL = repoLocation.toURI();
IMetadataRepository repo = manager.createRepository(repoURL, "testRefreshSelfReference", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, properties);
repo.addReferences(Collections.singletonList(new RepositoryReference(repoURL, "testNick", IRepository.TYPE_METADATA, IRepository.NONE)));
final int[] callCount = new int[] {0};
final boolean[] wasEnabled = new boolean[] {false};
//add a listener to ensure we receive add events with the repository enabled
ProvisioningListener listener = new SynchronousProvisioningListener() {
public void notify(EventObject o) {
if (!(o instanceof RepositoryEvent))
return;
RepositoryEvent event = (RepositoryEvent) o;
if (event.getKind() != RepositoryEvent.ADDED)
return;
if (!event.getRepositoryLocation().equals(repoURL))
return;
wasEnabled[0] = event.isRepositoryEnabled();
callCount[0]++;
}
};
getEventBus().addListener(listener);
try {
//ensure refreshing the repository doesn't disable it
manager.refreshRepository(repoURL, null);
assertTrue("1.0", manager.isEnabled(repoURL));
assertTrue("1.1", wasEnabled[0]);
assertEquals("1.2", 1, callCount[0]);
} finally {
getEventBus().removeListener(listener);
}
}
}