blob: 09822b9dc609872f8fafda832a5faebbf59ae9bb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.sling.commons.osgi;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarInputStream;
import java.util.jar.Manifest;
import org.junit.Test;
public class BundleFileProcessorTest {
private static void closeQuietly(Closeable c) {
try {
c.close();
} catch(IOException ignore) {
}
}
@Test
public void testBSNRenaming() throws IOException {
File tempDir = new File(System.getProperty("java.io.tmpdir"));
// Just take any bundle from the maven deps as an example...
File originalFile = getMavenArtifactFile(getMavenRepoRoot(), "com.google.guava", "guava", "15.0");
File generatedFile = new BSNRenamer(originalFile, tempDir, "org.acme.baklava.guava").process();
try {
compareJarContents(originalFile, generatedFile);
JarFile jfOrg = null;
JarFile jfNew = null;
try {
jfOrg = new JarFile(originalFile);
jfNew = new JarFile(generatedFile);
Manifest mfOrg = jfOrg.getManifest();
Manifest mfNew = jfNew.getManifest();
Attributes orgAttrs = mfOrg.getMainAttributes();
Attributes newAttrs = mfNew.getMainAttributes();
for (Object key : orgAttrs.keySet()) {
String orgVal = orgAttrs.getValue(key.toString());
String newVal = newAttrs.getValue(key.toString());
if ("Bundle-SymbolicName".equals(key.toString())) {
assertEquals("Should have recorded the original Bundle-SymbolicName",
orgVal, newAttrs.getValue("X-Original-Bundle-SymbolicName"));
assertEquals("org.acme.baklava.guava", newVal);
} else {
assertEquals("Different keys: " + key, orgVal, newVal);
}
}
} finally {
closeQuietly(jfOrg);
closeQuietly(jfNew);
}
} finally {
assertTrue("Unable to delete temporary file", generatedFile.delete());
}
}
private static void compareJarContents(File orgJar, File actualJar) throws IOException {
JarInputStream jis1 = null;
JarInputStream jis2 = null;
try {
jis1 = new JarInputStream(new FileInputStream(orgJar));
jis2 = new JarInputStream(new FileInputStream(actualJar));
JarEntry je1 = null;
while ((je1 = jis1.getNextJarEntry()) != null) {
if (je1.isDirectory())
continue;
JarEntry je2 = null;
while((je2 = jis2.getNextJarEntry()) != null) {
if (!je2.isDirectory())
break;
}
assertEquals(je1.getName(), je2.getName());
assertEquals(je1.getSize(), je2.getSize());
try {
byte[] buf1 = streamToByteArray(jis1);
byte[] buf2 = streamToByteArray(jis2);
assertArrayEquals("Contents not equal: " + je1.getName(), buf1, buf2);
} finally {
jis1.closeEntry();
jis2.closeEntry();
}
}
} finally {
closeQuietly(jis1);
closeQuietly(jis2);
}
}
private static byte [] streamToByteArray(InputStream is) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BundleFileProcessor.pumpStream(is, baos);
return baos.toByteArray();
}
private static File getMavenArtifactFile(File repoRoot, String gid, String aid, String ver) {
return new File(repoRoot, gid.replace('.', '/') + '/' + aid + '/' + ver + '/' + aid + '-' + ver + ".jar");
}
private static File getMavenRepoRoot() throws IOException {
URL res = BundleFileProcessorTest.class.getClassLoader().getResource(
Test.class.getName().replace('.', '/') + ".class");
String u = res.toExternalForm();
if (u.startsWith("jar:"))
u = u.substring(4);
int idx = u.indexOf("junit");
if (idx < 0)
throw new IllegalStateException("Cannot infer maven repo root: " + res);
return new File(new URL(u.substring(0, idx)).getFile());
}
}