com.basistech.rosette.dm.test.OsgiTestUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.basistech.rosette.dm.test.OsgiTestUtil.java

Source

/*
* Copyright 2014 Basis Technology Corp.
*
* Licensed 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 com.basistech.rosette.dm.test;

import com.basistech.rosette.RosetteRuntimeException;
import com.google.common.collect.Lists;
import com.google.common.io.Resources;
import org.ops4j.pax.exam.Option;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.Properties;

import static org.ops4j.pax.exam.CoreOptions.junitBundles;
import static org.ops4j.pax.exam.CoreOptions.options;
import static org.ops4j.pax.exam.CoreOptions.provision;
import static org.ops4j.pax.exam.CoreOptions.systemPackages;
import static org.ops4j.pax.exam.CoreOptions.systemProperty;
import static org.ops4j.pax.exam.CoreOptions.url;
import static org.ops4j.pax.exam.CoreOptions.when;

/**
 * Reusable test code.
 */
public final class OsgiTestUtil {
    private OsgiTestUtil() {
        //
    }

    /**
     * Assume that a test has a dependencies.properties in the classpath, and use it to retrieve the version.
     * @param groupId maven group id
     * @param artifactId maven artifact id
     * @return the version string
     */
    public static String getDependencyVersion(String groupId, String artifactId) {
        URL depPropsUrl = Resources.getResource("META-INF/maven/dependencies.properties");
        Properties depProps = new Properties();
        try {
            depProps.load(Resources.asByteSource(depPropsUrl).openStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        String ver = (String) depProps.get(String.format("%s/%s/version", groupId, artifactId));
        if (ver == null) {
            throw new RosetteRuntimeException(String.format("No version available for %s:%s", groupId, artifactId));
        }
        ver = ver.replace("-SNAPSHOT", ".SNAPSHOT");
        return ver;
    }

    /**
     * This method builds an array of pax-exam configuration objects that form the common
     * configuration of Rosette OSGi bundle tests. A test's @Configuration method
     * may simply return these, or add others if needed.
     * @param projectBuildDirectory ${project.build.directory} -- this locates the main project bundle
     *                        in here and the dependency bundles in the 'bundles' subdirectory.
     * @param projectVersion ${project.version}
     * @param projectBaseBundleJarName The jar containing this project's bundle file name base, or null if
     *                                 this project is just testing other bundles. This method builds
     *                                 projectBuildDirectory/THIS-VERSION.jar
     * @param useFragmentBundle if true, expect there to be -root-fragment bundle in projectBuildDirectory, and install it.
     * @return
     */
    public static Option[] standardPaxExamConfig(File projectBuildDirectory, String projectVersion,
            String projectBaseBundleJarName, boolean useFragmentBundle) {

        List<String> bundleUrls = Lists.newArrayList();
        File bundleDir = new File(projectBuildDirectory, "bundles");
        File[] bundleFiles = bundleDir.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".jar");
            }
        });
        for (File bundleFile : bundleFiles) {
            try {
                bundleUrls.add(bundleFile.toURI().toURL().toExternalForm());
            } catch (MalformedURLException e) {
                throw new RuntimeException(e);
            }
        }

        if (projectBaseBundleJarName != null) {
            bundleUrls.add(String.format("file:%s/%s-%s.jar", projectBuildDirectory, projectBaseBundleJarName,
                    projectVersion));
        }

        String[] bundles = bundleUrls.toArray(new String[bundleUrls.size()]);

        String paxLoggingLevel = System.getProperty("bt.osgi.pax.logging.level", "WARN");

        return options(provision(bundles),
                when(useFragmentBundle).useOptions(url(String.format("file:%s/%s-%s-fragment-bundle.jar",
                        projectBuildDirectory, projectBaseBundleJarName, projectVersion)).noStart()),
                systemPackages(
                        // These two are needed for guava.
                        "sun.misc", "javax.annotation",
                        String.format("org.slf4j;version=\"%s\"", getDependencyVersion("org.slf4j", "slf4j-api"))

                ), junitBundles(), systemProperty("pax.exam.osgi.unresolved.fail").value("true"),
                systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value(paxLoggingLevel));
    }
}