blob: 5e3ef3241edf5bafab16c72e35291a861cc32c90 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2017 EclipseSource 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:
* EclipseSource - initial API and implementation
******************************************************************************/
package org.eclipse.equinox.p2.tests.metadata.repository;
import java.io.*;
import java.lang.reflect.Field;
import java.net.URI;
import java.util.*;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.Version;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.IRunnableWithProgress;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
/**
* This tests Batch Execution for Metadata Repositories
*/
public class BatchExecuteMetadataRepositoryTest extends AbstractProvisioningTest {
//metadata repository to remove on tear down
private File repositoryFile = null;
private URI repositoryURI = null;
protected Collection<IInstallableUnit> createIUInCollection(String id, Version version) {
IInstallableUnit iu = createIU(id, version);
Collection<IInstallableUnit> result = new ArrayList<>(1);
result.add(iu);
return result;
}
boolean fileContainsString(URI location, String string) throws IOException {
StringBuffer buffer = new StringBuffer();
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(new File(location)));
while (reader.ready())
buffer.append(reader.readLine());
return buffer.toString().contains(string);
} finally {
if (reader != null)
reader.close();
}
}
/*
* This tests that in the normal case, the batch process runs fine
*/
public void testAdd() {
try {
repositoryFile = getTempFolder();
repositoryURI = repositoryFile.toURI();
Map properties = new HashMap();
final LocalMetadataRepository repo = (LocalMetadataRepository) getMetadataRepositoryManager().createRepository(repositoryURI, "My Repo", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, properties);
final URI contentXML = new URI(repositoryFile.toURI().toString() + "/content.xml");
IStatus status = repo.executeBatch(monitor -> {
repo.addInstallableUnits(createIUInCollection("foo", Version.emptyVersion));
try {
assertFalse("1.0", fileContainsString(contentXML, "foo"));
} catch (IOException e) {
fail("0.99");
}
}, new NullProgressMonitor());
assertTrue(status.isOK());
assertTrue("1.0", fileContainsString(contentXML, "foo"));
assertEquals("2.0", 1, repo.query(QueryUtil.createIUQuery("foo"), new NullProgressMonitor()).toSet().size());
} catch (Exception e) {
fail("Test failed", e);
}
}
/*
* This tests 3 adds
*/
public void testMultiAdd() {
try {
repositoryFile = getTempFolder();
repositoryURI = repositoryFile.toURI();
Map properties = new HashMap();
final LocalMetadataRepository repo = (LocalMetadataRepository) getMetadataRepositoryManager().createRepository(repositoryURI, "My Repo", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, properties);
final URI contentXML = new URI(repositoryFile.toURI().toString() + "/content.xml");
IStatus status = repo.executeBatch(monitor -> {
repo.addInstallableUnits(createIUInCollection("foo", Version.emptyVersion));
repo.addInstallableUnits(createIUInCollection("bar", Version.emptyVersion));
repo.addInstallableUnits(createIUInCollection("baz", Version.emptyVersion));
try {
assertFalse("1.0", fileContainsString(contentXML, "foo"));
assertFalse("1.0", fileContainsString(contentXML, "bar"));
assertFalse("1.0", fileContainsString(contentXML, "baz"));
} catch (IOException e) {
fail("0.99");
}
}, new NullProgressMonitor());
assertTrue(status.isOK());
assertEquals("1.0", 1, repo.query(QueryUtil.createIUQuery("foo"), new NullProgressMonitor()).toSet().size());
assertEquals("1.1", 1, repo.query(QueryUtil.createIUQuery("bar"), new NullProgressMonitor()).toSet().size());
assertEquals("1.2", 1, repo.query(QueryUtil.createIUQuery("baz"), new NullProgressMonitor()).toSet().size());
assertTrue("2.0", fileContainsString(contentXML, "foo"));
assertTrue("2.1", fileContainsString(contentXML, "bar"));
assertTrue("2.2", fileContainsString(contentXML, "baz"));
} catch (Exception e) {
fail("Test failed", e);
}
}
/*
* This tests multiple adds with an exception thrown. Makes sure that the descriptors are added
*/
public void testMultiAddWithException() {
try {
repositoryFile = getTempFolder();
repositoryURI = repositoryFile.toURI();
Map properties = new HashMap();
final LocalMetadataRepository repo = (LocalMetadataRepository) getMetadataRepositoryManager().createRepository(repositoryURI, "My Repo", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, properties);
final URI contentXML = new URI(repositoryFile.toURI().toString() + "/content.xml");
IStatus status = repo.executeBatch(monitor -> {
repo.addInstallableUnits(createIUInCollection("foo", Version.emptyVersion));
repo.addInstallableUnits(createIUInCollection("bar", Version.emptyVersion));
throw new RuntimeException();
}, new NullProgressMonitor());
assertFalse(status.isOK());
assertEquals("1.0", 1, repo.query(QueryUtil.createIUQuery("foo"), new NullProgressMonitor()).toSet().size());
assertEquals("1.1", 1, repo.query(QueryUtil.createIUQuery("bar"), new NullProgressMonitor()).toSet().size());
assertTrue("2.0", fileContainsString(contentXML, "foo"));
assertTrue("2.1", fileContainsString(contentXML, "bar"));
} catch (Exception e) {
fail("Test failed", e);
}
}
/*
* This tests multiple adds with an exception thrown. Makes sure that the descriptors are added
*/
public void testAddAndRemove() {
try {
repositoryFile = getTempFolder();
repositoryURI = repositoryFile.toURI();
Map properties = new HashMap();
final LocalMetadataRepository repo = (LocalMetadataRepository) getMetadataRepositoryManager().createRepository(repositoryURI, "My Repo", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, properties);
final URI contentXML = new URI(repositoryFile.toURI().toString() + "/content.xml");
IStatus status = repo.executeBatch(monitor -> {
Collection<IInstallableUnit> foo = createIUInCollection("foo", Version.emptyVersion);
repo.addInstallableUnits(foo);
repo.addInstallableUnits(createIUInCollection("bar", Version.emptyVersion));
repo.removeInstallableUnits(foo);
}, new NullProgressMonitor());
assertTrue(status.isOK());
assertEquals("1.0", 0, repo.query(QueryUtil.createIUQuery("foo"), new NullProgressMonitor()).toSet().size());
assertEquals("1.1", 1, repo.query(QueryUtil.createIUQuery("bar"), new NullProgressMonitor()).toSet().size());
assertFalse("2.0", fileContainsString(contentXML, "foo"));
assertTrue("2.1", fileContainsString(contentXML, "bar"));
} catch (Exception e) {
fail("Test failed", e);
}
}
/*
* This tests multiple adds with an exception thrown. Makes sure that the descriptors are added
*/
public void testMultiAddAndRemove() {
try {
repositoryFile = getTempFolder();
repositoryURI = repositoryFile.toURI();
Map properties = new HashMap();
final LocalMetadataRepository repo = (LocalMetadataRepository) getMetadataRepositoryManager().createRepository(repositoryURI, "My Repo", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, properties);
final URI contentXML = new URI(repositoryFile.toURI().toString() + "/content.xml");
IStatus status = repo.executeBatch(monitor -> {
repo.addInstallableUnits(createIUInCollection("1", Version.emptyVersion));
repo.addInstallableUnits(createIUInCollection("2", Version.emptyVersion));
repo.addInstallableUnits(createIUInCollection("3", Version.emptyVersion));
Collection<IInstallableUnit> foo = createIUInCollection("foo", Version.emptyVersion);
repo.addInstallableUnits(foo);
repo.addInstallableUnits(createIUInCollection("bar", Version.emptyVersion));
repo.removeInstallableUnits(foo);
}, new NullProgressMonitor());
assertTrue(status.isOK());
assertEquals("1.0", 4, repo.query(QueryUtil.createIUAnyQuery(), new NullProgressMonitor()).toSet().size());
assertFalse("2.0", fileContainsString(contentXML, "foo"));
} catch (Exception e) {
fail("Test failed", e);
}
}
/*
* This tests that in the normal case, the batch process runs fine
*/
public void testBatchProcessingOK() {
try {
repositoryFile = getTempFolder();
repositoryURI = repositoryFile.toURI();
Map properties = new HashMap();
final LocalMetadataRepository repo = (LocalMetadataRepository) getMetadataRepositoryManager().createRepository(repositoryURI, "My Repo", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, properties);
IStatus status = repo.executeBatch(monitor -> {
// empty
}, new NullProgressMonitor());
assertTrue(status.isOK());
} catch (Exception e) {
fail("Test failed", e);
}
}
class FailingSimpleMetadataRepository extends LocalMetadataRepository {
boolean executeBatch = false;
/**
* @param repositoryName
* @param location
* @param properties
*/
public FailingSimpleMetadataRepository() {
super(getAgent());
}
@Override
public IStatus executeBatch(IRunnableWithProgress runnable, IProgressMonitor monitor) {
executeBatch = true;
return super.executeBatch(runnable, monitor);
}
@Override
public void save() {
if (executeBatch)
throw new RuntimeException("foo");
}
}
/*
* This tests that exceptions are properly propagated for a SimpleMetadataRepository
*/
public void testBatchProcessingExceptionsSimple() {
try {
LocalMetadataRepository simpleMetadataRepository = new FailingSimpleMetadataRepository();
IStatus status = simpleMetadataRepository.executeBatch(monitor -> {
throw new RuntimeException("bar");
}, new NullProgressMonitor());
assertFalse(status.isOK());
assertEquals("foo", status.getException().getMessage());
assertEquals(1, status.getChildren().length);
assertEquals("bar", status.getChildren()[0].getMessage());
} catch (Exception e) {
fail("Test failed", e);
}
}
/*
* This tests that exceptions are properly propagated for a SimpleMetadataRepository
*/
public void testBatchProcessingSaveExceptionSimple() {
try {
LocalMetadataRepository simpleMetadataRepository = new FailingSimpleMetadataRepository();
IStatus status = simpleMetadataRepository.executeBatch(monitor -> {
// empty
}, new NullProgressMonitor());
assertFalse(status.isOK());
assertEquals("foo", status.getException().getMessage());
} catch (Exception e) {
fail("Test failed", e);
}
}
class TrackSavignSimpleMetadataRepository extends LocalMetadataRepository {
boolean executeBatch = false;
public boolean didSave = false;
/**
* @param repositoryName
* @param location
* @param properties
*/
public TrackSavignSimpleMetadataRepository() {
super(getAgent());
}
@Override
public IStatus executeBatch(IRunnableWithProgress runnable, IProgressMonitor monitor) {
executeBatch = true;
return super.executeBatch(runnable, monitor);
}
@Override
public void save() {
if (executeBatch)
didSave = true;
}
}
/*
* This test ensure that a repository did in fact save the results,
* if there was no exception
*/
public void testBatchProcessingTrackSaving() {
try {
TrackSavignSimpleMetadataRepository simpleMetadataRepository = new TrackSavignSimpleMetadataRepository();
simpleMetadataRepository.executeBatch(monitor -> {
//do nothing;
}, new NullProgressMonitor());
assertTrue(simpleMetadataRepository.didSave);
} catch (Exception e) {
fail("Test failed", e);
}
}
/*
* This test ensures that a repository did in fact save the results, even
* if there was an exception
*/
public void testBatchProcessingTrackSavingException() {
try {
TrackSavignSimpleMetadataRepository simpleMetadataRepository = new TrackSavignSimpleMetadataRepository();
simpleMetadataRepository.executeBatch(monitor -> {
throw new RuntimeException();
}, new NullProgressMonitor());
assertTrue(simpleMetadataRepository.didSave);
} catch (Exception e) {
fail("Test failed", e);
}
}
/*
* This test ensures that the simple repository resets the disableSave flag
* even if there is an exception
*/
public void testDisableSaveFlagResetSimple() {
try {
repositoryFile = getTempFolder();
repositoryURI = repositoryFile.toURI();
Map properties = new HashMap();
final LocalMetadataRepository repo = (LocalMetadataRepository) getMetadataRepositoryManager().createRepository(repositoryURI, "My Repo", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, properties);
repo.executeBatch(monitor -> {
throw new RuntimeException();
}, new NullProgressMonitor());
Field field = LocalMetadataRepository.class.getDeclaredField("disableSave");
field.setAccessible(true);
boolean disableSave = field.getBoolean(repo);
assertFalse("1.0", disableSave);
} catch (Exception e) {
fail("Test failed", e);
}
}
/*
* This test ensure that the simple metadata repository disables the
* save flag during the batch process
*/
public void testDisableSaveFlagDuringExecutionSimple() {
try {
repositoryFile = getTempFolder();
repositoryURI = repositoryFile.toURI();
Map properties = new HashMap();
final LocalMetadataRepository repo = (LocalMetadataRepository) getMetadataRepositoryManager().createRepository(repositoryURI, "My Repo", IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, properties);
repo.executeBatch(monitor -> {
Field field;
try {
field = LocalMetadataRepository.class.getDeclaredField("disableSave");
field.setAccessible(true);
boolean disableSave = field.getBoolean(repo);
assertTrue("1.0", disableSave);
} catch (SecurityException e1) {
fail("1.1" + e1.getMessage());
} catch (NoSuchFieldException e2) {
// TODO Auto-generated catch block
fail("1.2" + e2.getMessage());
} catch (IllegalArgumentException e3) {
fail("1.2" + e3.getMessage());
} catch (IllegalAccessException e4) {
fail("1.2" + e4.getMessage());
}
}, new NullProgressMonitor());
} catch (Exception e) {
fail("Test failed", e);
}
}
}