/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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.kie.osgi.compiler; import org.assertj.core.api.Assertions; import org.junit.Assert; import org.junit.Test; import org.kie.api.KieServices; import org.kie.api.builder.ReleaseId; import org.mockito.Mockito; import org.osgi.framework.Bundle; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; import java.util.List; public class OsgiKieModuleTest { @Test public void testAcceptsValidOsgiBundleURLs() { // Felix format assertAcceptsStringAsOsgiBundleUrL("bundle://something"); // Equinox format assertAcceptsStringAsOsgiBundleUrL("bundleresource://something"); // Equinox + blueprint format assertAcceptsStringAsOsgiBundleUrL("bundleentry://something"); // other possible formats starting with "bundle" assertAcceptsStringAsOsgiBundleUrL("bundle-something://something-else"); } @Test public void testRejectsInvalidOsgiBundleUrls() { assertRejectsStringAsOsgiBundleUrRL("something://else"); assertRejectsStringAsOsgiBundleUrRL("mybundle://invalid"); } @Test public void testParsingOfBundleIdFromOsgiURL() { // Felix bundle URL assertBundleIdCorrectlyParsed("bundle://130.0:1/", "130"); // Equinox bundle URL assertBundleIdCorrectlyParsed("bundleresource://151.fwk495985218/", "151"); // invalid bundle URL results in "null" assertBundleIdCorrectlyParsed("invalid-bundle-url", null); } @Test public void testGatherResourcesFromWARBundle() throws Exception { KieServices kieServices = KieServices.Factory.get(); Bundle bundleMock = Mockito.mock(Bundle.class); final List<URL> urls = new ArrayList<URL>(); // we only care about the path, the file does not have to exist // can't mock java.net.URL, because it is a final class urls.add(new URL("file:///META-INF/kmodule.xml")); urls.add(new URL("file:///WEB-INF/classes/org/org.kie/osgi/SomePOJO.class")); urls.add(new URL("file:///WEB-INF/classes/org/org.kie/osgi/some-process.bpmn2")); Enumeration<URL> resourcesEnumMock = new Enumeration<URL>() { int currentIndex = 0; @Override public boolean hasMoreElements() { return currentIndex < urls.size(); } @Override public URL nextElement() { return urls.get(currentIndex++); } }; Mockito.when(bundleMock.findEntries("", "*", true)).thenReturn(resourcesEnumMock); ReleaseId releaseId = kieServices.newReleaseId("org.org.kie.osgi.compiler", "osgi-kie-module-test", "1.0.0.Final"); OsgiKieModule kmodule = OsgiKieModule.create(releaseId, null, bundleMock); Collection<String> fileNames = kmodule.getFileNames(); Assertions.assertThat(fileNames).hasSize(3); Assertions.assertThat(fileNames).contains("META-INF/kmodule.xml", "org/drools/osgi/SomePOJO.class", "org/drools/osgi/some-process.bpmn2"); } private void assertAcceptsStringAsOsgiBundleUrL(String str) { Assert.assertTrue("String '" + str + "' not recognized as OSGi bundle URL!", OsgiKieModule.isOsgiBundleUrl(str)); } private void assertRejectsStringAsOsgiBundleUrRL(String str) { Assert.assertFalse("Invalid string '" + str + "' recognized as OSGi bundle URL!", OsgiKieModule.isOsgiBundleUrl(str)); } private void assertBundleIdCorrectlyParsed(String bundleUrl, String expectedBundleId) { Assert.assertEquals(expectedBundleId, OsgiKieModule.parseBundleId(bundleUrl)); } }