package aQute.bnd.deployer.repository;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.GZIPInputStream;
import java.util.zip.ZipException;
import aQute.bnd.osgi.Jar;
import aQute.bnd.osgi.JarResource;
import aQute.bnd.osgi.Processor;
import aQute.bnd.service.RepositoryPlugin;
import aQute.bnd.service.RepositoryPlugin.PutResult;
import aQute.lib.io.IO;
import junit.framework.TestCase;
import test.lib.MockRegistry;
import test.repository.FailingGeneratingProvider;
import test.repository.NonGeneratingProvider;
@SuppressWarnings("resource")
public class TestLocalIndexGeneration extends TestCase {
private Processor reporter;
private LocalIndexedRepo repo;
private File outputDir;
private HashMap<String,String> config;
protected void setUp() throws Exception {
// Ensure output directory exists and is empty
outputDir = IO.getFile("generated/tmp/test/" + getName());
IO.delete(outputDir);
if (!outputDir.exists() && !outputDir.mkdirs()) {
throw new IOException("Could not create directory " + outputDir);
}
// Setup the repo
reporter = new Processor();
repo = new LocalIndexedRepo();
config = new HashMap<String,String>();
config.put("local", outputDir.getAbsolutePath());
config.put("type", "R5");
config.put("pretty", "true");
repo.setProperties(config);
repo.setReporter(reporter);
}
@Override
protected void tearDown() throws Exception {
IO.delete(outputDir);
assertEquals(0, reporter.getErrors().size());
assertEquals(0, reporter.getWarnings().size());
}
public void testInitiallyEmpty() throws Exception {
List<String> list = repo.list(".*");
assertNotNull(list);
assertEquals(0, list.size());
}
public void testDeployBundle() throws Exception {
PutResult r = repo.put(
new BufferedInputStream(
new FileInputStream("testdata/bundles/name.njbartlett.osgi.emf.minimal-2.6.1.jar")),
new RepositoryPlugin.PutOptions());
File deployedFile = new File(r.artifact);
assertEquals(
IO.getFile(outputDir, "name.njbartlett.osgi.emf.minimal/name.njbartlett.osgi.emf.minimal-2.6.1.jar")
.getAbsolutePath(),
deployedFile.getAbsolutePath());
File indexFile = IO.getFile(outputDir, "index.xml");
assertTrue(indexFile.exists());
File indexFileSha = IO.getFile(outputDir, "index.xml.sha");
assertTrue(indexFileSha.exists());
AbstractIndexedRepo repo2 = createRepoForIndex(indexFile);
File[] files = repo2.get("name.njbartlett.osgi.emf.minimal", null);
assertNotNull(files);
assertEquals(1, files.length);
assertEquals(deployedFile.getAbsoluteFile(), files[0]);
}
public void testOverwrite() throws Exception {
config.put("overwrite", "false");
repo.setProperties(config);
PutResult r = repo.put(
new BufferedInputStream(
new FileInputStream("testdata/bundles/name.njbartlett.osgi.emf.minimal-2.6.1.jar")),
new RepositoryPlugin.PutOptions());
File originalFile = new File(r.artifact);
assertEquals(
IO.getFile(outputDir, "name.njbartlett.osgi.emf.minimal/name.njbartlett.osgi.emf.minimal-2.6.1.jar")
.getAbsolutePath(),
originalFile.getAbsolutePath());
Jar newJar = new Jar(IO.getFile("testdata/bundles/name.njbartlett.osgi.emf.minimal-2.6.1.jar"));
Jar dummyJar = new Jar(IO.getFile("testdata/bundles/dummybundle.jar"));
newJar.putResource("testOverwrite/dummybundle.jar", new JarResource(dummyJar));
newJar.write("testdata/bundles/name.njbartlett.osgi.emf.minimal-2.6.1-testOverwrite.jar");
r = repo.put(
new BufferedInputStream(new FileInputStream(
"testdata/bundles/name.njbartlett.osgi.emf.minimal-2.6.1-testOverwrite.jar")),
new RepositoryPlugin.PutOptions());
IO.delete(IO.getFile("testdata/bundles/name.njbartlett.osgi.emf.minimal-2.6.1-testOverwrite.jar"));
assertNull(r.artifact);
}
public void testInvalidContentProvider() throws Exception {
LocalIndexedRepo repo = new LocalIndexedRepo();
Map<String,String> config = new HashMap<String,String>();
config.put("local", outputDir.getAbsolutePath());
config.put("type", "Rubbish");
repo.setProperties(config);
repo.setReporter(reporter);
repo.put(
new BufferedInputStream(
new FileInputStream("testdata/bundles/name.njbartlett.osgi.emf.minimal-2.6.1.jar")),
new RepositoryPlugin.PutOptions());
assertEquals(0, reporter.getErrors().size());
assertTrue(reporter.getWarnings().size() > 0);
reporter.clear();
}
public void testNonGeneratingProvider() throws Exception {
MockRegistry registry = new MockRegistry();
registry.addPlugin(new NonGeneratingProvider());
LocalIndexedRepo repo = new LocalIndexedRepo();
repo.setRegistry(registry);
repo.setReporter(reporter);
Map<String,String> config = new HashMap<String,String>();
config.put("local", outputDir.getAbsolutePath());
config.put("type", "Nongenerating");
repo.setProperties(config);
repo.put(
new BufferedInputStream(
new FileInputStream("testdata/bundles/name.njbartlett.osgi.emf.minimal-2.6.1.jar")),
new RepositoryPlugin.PutOptions());
assertEquals(0, reporter.getErrors().size());
assertTrue(reporter.getWarnings().size() > 0);
reporter.clear();
}
public void testFailToGenerate() throws Exception {
MockRegistry registry = new MockRegistry();
registry.addPlugin(new FailingGeneratingProvider());
LocalIndexedRepo repo = new LocalIndexedRepo();
repo.setRegistry(registry);
repo.setReporter(reporter);
Map<String,String> config = new HashMap<String,String>();
config.put("local", outputDir.getAbsolutePath());
config.put("type", "Fail");
repo.setProperties(config);
repo.put(
new BufferedInputStream(
new FileInputStream("testdata/bundles/name.njbartlett.osgi.emf.minimal-2.6.1.jar")),
new RepositoryPlugin.PutOptions());
assertTrue(reporter.getErrors().size() > 0);
assertEquals(0, reporter.getWarnings().size());
reporter.clear();
}
public void testValidGZipFile() throws Exception {
// The test now uses a normal text file
// PutResult r = repo.put(new BufferedInputStream(new FileInputStream(
// "testdata/bundles/name.njbartlett.osgi.emf.minimal-2.6.1.jar")), new
// RepositoryPlugin.PutOptions());
// File deployedFile = new File(r.artifact);
//
// File indexFile = IO.getFile(outputDir, "index.xml");
// assertTrue(indexFile.exists());
//
// try {
// InputStream gzip = new FileInputStream(indexFile);
// assertTrue(gzip.read() > -1);
// }
// finally {
// IO.delete(new File(r.artifact));
// IO.delete(indexFile);
// }
}
public void testUncompressedIndexFile() throws Exception {
repo = new LocalIndexedRepo();
config = new HashMap<String,String>();
config.put("local", outputDir.getAbsolutePath());
config.put("type", "R5");
config.put("pretty", "true");
config.put("compressed", "false");
repo.setProperties(config);
repo.setReporter(reporter);
PutResult r = repo.put(
new BufferedInputStream(
new FileInputStream("testdata/bundles/name.njbartlett.osgi.emf.minimal-2.6.1.jar")),
new RepositoryPlugin.PutOptions());
File deployedFile = new File(r.artifact);
File compressedIndexFile = IO.getFile(outputDir, "index.xml.gz");
assertFalse(compressedIndexFile.exists());
File prettyIndexFile = IO.getFile(outputDir, "index.xml");
assertTrue(prettyIndexFile.exists());
try {
GZIPInputStream gzip = new GZIPInputStream(new FileInputStream(prettyIndexFile));
fail("expected opening gzip on index file would fail because it should be uncompressed");
} catch (ZipException ze) {} finally {
IO.delete(new File(r.artifact));
IO.delete(prettyIndexFile);
}
}
// UTILS
private static AbstractIndexedRepo createRepoForIndex(File index) {
FixedIndexedRepo newRepo = new FixedIndexedRepo();
Map<String,String> config = new HashMap<String,String>();
config.put("locations", index.getAbsoluteFile().toURI().toString());
newRepo.setProperties(config);
return newRepo;
}
}