/**
* 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.aries.spifly.statictool;
import java.io.File;
import java.io.FileOutputStream;
import java.net.URL;
import java.util.Arrays;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import java.util.zip.ZipEntry;
import org.apache.aries.spifly.SpiFlyConstants;
import org.apache.aries.spifly.Streams;
import org.apache.aries.spifly.statictool.bundle.Test2Class;
import org.apache.aries.spifly.statictool.bundle.Test3Class;
import org.apache.aries.spifly.statictool.bundle.TestClass;
import org.junit.Assert;
import org.junit.Test;
public class RequirementTest {
@Test
public void testConsumerBundle() throws Exception {
String testClassFileName = TestClass.class.getName().replace('.', '/') + ".class";
URL testClassURL = getClass().getResource("/" + testClassFileName);
String test2ClassFileName = Test2Class.class.getName().replace('.', '/') + ".class";
URL test2ClassURL = getClass().getResource("/" + test2ClassFileName);
String test3ClassFileName = Test3Class.class.getName().replace('.', '/') + ".class";
URL test3ClassURL = getClass().getResource("/" + test3ClassFileName);
File jarFile = new File(System.getProperty("java.io.tmpdir") + "/testjar_" + System.currentTimeMillis() + ".jar");
File expectedFile = null;
try {
// Create the jarfile to be used for testing
Manifest mf = new Manifest();
Attributes mainAttributes = mf.getMainAttributes();
mainAttributes.putValue("Manifest-Version", "1.0");
mainAttributes.putValue("Bundle-ManifestVersion", "2.0");
mainAttributes.putValue("Bundle-SymbolicName", "testbundle");
mainAttributes.putValue("Foo", "Bar Bar");
mainAttributes.putValue("Import-Package", "org.foo.bar");
mainAttributes.putValue(SpiFlyConstants.REQUIRE_CAPABILITY,
"osgi.serviceloader; filter:=\"(osgi.serviceloader=org.apache.aries.spifly.mysvc.SPIProvider)\";cardinality:=multiple, " +
"osgi.extender; filter:=\"(osgi.extender=osgi.serviceloader.processor)\"");
JarOutputStream jos = new JarOutputStream(new FileOutputStream(jarFile), mf);
jos.putNextEntry(new ZipEntry(testClassFileName));
Streams.pump(testClassURL.openStream(), jos);
jos.putNextEntry(new ZipEntry(test2ClassFileName));
Streams.pump(test2ClassURL.openStream(), jos);
jos.putNextEntry(new ZipEntry(test3ClassFileName));
Streams.pump(test3ClassURL.openStream(), jos);
jos.close();
Main.main(jarFile.getCanonicalPath());
expectedFile = new File(jarFile.getParent(), jarFile.getName().replaceAll("[.]jar", "_spifly.jar"));
Assert.assertTrue("A processed separate bundle should have been created", expectedFile.exists());
// Check manifest in generated bundle.
JarFile transformedJarFile = new JarFile(expectedFile);
Manifest actualMF = transformedJarFile.getManifest();
Assert.assertEquals("1.0", actualMF.getMainAttributes().getValue("Manifest-Version"));
Assert.assertEquals("2.0", actualMF.getMainAttributes().getValue("Bundle-ManifestVersion"));
Assert.assertEquals("testbundle", actualMF.getMainAttributes().getValue("Bundle-SymbolicName"));
Assert.assertEquals("Bar Bar", actualMF.getMainAttributes().getValue("Foo"));
Assert.assertEquals("osgi.serviceloader; filter:=\"(osgi.serviceloader=org.apache.aries.spifly.mysvc.SPIProvider)\";cardinality:=multiple",
actualMF.getMainAttributes().getValue(SpiFlyConstants.REQUIRE_CAPABILITY));
Assert.assertNull("Should not generate this header when processing Require-Capability",
actualMF.getMainAttributes().getValue(SpiFlyConstants.PROCESSED_SPI_CONSUMER_HEADER));
String importPackage = actualMF.getMainAttributes().getValue("Import-Package");
Assert.assertTrue(
"org.foo.bar,org.apache.aries.spifly;version=\"[1.0.0,1.1.0)\"".equals(importPackage) ||
"org.apache.aries.spifly;version=\"[1.0.0,1.1.0)\",org.foo.bar".equals(importPackage));
JarFile initialJarFile = new JarFile(jarFile);
byte[] orgBytes = Streams.suck(initialJarFile.getInputStream(new ZipEntry(testClassFileName)));
byte[] nonTransBytes = Streams.suck(transformedJarFile.getInputStream(new ZipEntry(testClassFileName)));
Assert.assertArrayEquals(orgBytes, nonTransBytes);
byte[] orgBytes2 = Streams.suck(initialJarFile.getInputStream(new ZipEntry(test2ClassFileName)));
byte[] nonTransBytes2 = Streams.suck(transformedJarFile.getInputStream(new ZipEntry(test2ClassFileName)));
Assert.assertArrayEquals(orgBytes2, nonTransBytes2);
byte[] orgBytes3 = Streams.suck(initialJarFile.getInputStream(new ZipEntry(test3ClassFileName)));
byte[] transBytes3 = Streams.suck(transformedJarFile.getInputStream(new ZipEntry(test3ClassFileName)));
Assert.assertFalse("The transformed class should be different", Arrays.equals(orgBytes3, transBytes3));
initialJarFile.close();
transformedJarFile.close();
} finally {
jarFile.delete();
if (expectedFile != null)
expectedFile.delete();
}
}
}