/*
 * 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.logging.log4j.osgi.tests;

import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.logging.log4j.osgi.tests.junit.BundleTestInfo;
import org.apache.logging.log4j.osgi.tests.junit.OsgiTestRule;
import org.junit.Before;
import org.junit.Rule;
import org.osgi.framework.BundleContext;
import org.osgi.framework.launch.FrameworkFactory;

/**
 * Subclasses can tests a basic setup in an OSGi container.
 */
public abstract class AbstractOsgiTest {

    private BundleContext bundleContext;

    private final BundleTestInfo bundleTestInfo;

    private Path here;

    @Rule
    public OsgiTestRule osgi = new OsgiTestRule(getFactory());

    /**
     * Constructs a test for a given bundle.
     */
    public AbstractOsgiTest() {
        super();
        this.bundleTestInfo = new BundleTestInfo();
    }

    /**
     * Called before each @Test.
     */
    @Before
    public void before() {
        bundleContext = osgi.getFramework().getBundleContext();
        here = Paths.get(".").toAbsolutePath().normalize();
    }

    public BundleContext getBundleContext() {
        return bundleContext;
    }

    public BundleTestInfo getBundleTestInfo() {
        return bundleTestInfo;
    }

    protected abstract FrameworkFactory getFactory();

    public Path getHere() {
        return here;
    }

}
