Skip to content

Instantly share code, notes, and snippets.

@steinarb
Created October 7, 2017 09:23
Show Gist options
  • Save steinarb/42a269df682e69ce6fb3c413ca91baa6 to your computer and use it in GitHub Desktop.
Save steinarb/42a269df682e69ce6fb3c413ca91baa6 to your computer and use it in GitHub Desktop.
Pax-exam test that fails because it can't get the BundleContext
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="fildele.application">
<feature name="fildele" description="filedele file sharing web application" version="1.0.0.SNAPSHOT">
<feature prerequisite="false" dependency="false">pax-http-whiteboard</feature>
<bundle start-level="80">mvn:no.priv.bang.fildele/fildele.application/1.0.0-SNAPSHOT</bundle>
<bundle start-level="80">mvn:com.vaadin/vaadin-shared/8.1.5</bundle>
<bundle start-level="80">mvn:org.jsoup/jsoup/1.8.3</bundle>
<bundle start-level="80">mvn:com.vaadin.external/gentyref/1.2.0.vaadin1</bundle>
<bundle start-level="80">mvn:com.vaadin/vaadin-server/8.1.5</bundle>
<bundle start-level="80">mvn:com.vaadin/vaadin-push/8.1.5</bundle>
<bundle start-level="80">mvn:com.vaadin/vaadin-client-compiled/8.1.5</bundle>
<bundle start-level="80">mvn:com.vaadin/vaadin-themes/8.1.5</bundle>
</feature>
</features>
package no.priv.bang.fildele.tests;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import static org.ops4j.pax.exam.CoreOptions.*;
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.*;
import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.URL;
import javax.inject.Inject;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.PaxExam;
import org.ops4j.pax.exam.karaf.options.LogLevelOption.LogLevel;
import org.ops4j.pax.exam.options.MavenArtifactUrlReference;
import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
import org.ops4j.pax.exam.spi.reactors.PerClass;
@RunWith(PaxExam.class)
@ExamReactorStrategy(PerClass.class)
public class FildeleIntegrationTest {
public static final String RMI_SERVER_PORT = "44446";
public static final String RMI_REG_PORT = "1101";
//@Inject
private Servlet servlet;
@Configuration
public Option[] config() {
final String jmxPort = freePortAsString();
final String httpPort = freePortAsString();
final String httpsPort = freePortAsString();
final MavenArtifactUrlReference karafUrl = maven().groupId("org.apache.karaf").artifactId("apache-karaf-minimal").type("zip").versionAsInProject();
final MavenArtifactUrlReference fildeleFeatureRepo = maven().groupId("no.priv.bang.fildele").artifactId("fildele.application").versionAsInProject().type("xml").classifier("features");
final MavenArtifactUrlReference mockitoUrl = maven().groupId("org.mockito").artifactId("mockito-core").versionAsInProject();
return options(
karafDistributionConfiguration().frameworkUrl(karafUrl).unpackDirectory(new File("target/exam")).useDeployFolder(false).runEmbedded(true),
configureConsole().ignoreLocalConsole().ignoreRemoteShell(),
systemTimeout(240000),
keepRuntimeFolder(),
logLevel(LogLevel.DEBUG),
editConfigurationFilePut("etc/org.apache.karaf.management.cfg", "rmiRegistryPort", RMI_REG_PORT),
editConfigurationFilePut("etc/org.apache.karaf.management.cfg", "rmiServerPort", RMI_SERVER_PORT),
editConfigurationFilePut("etc/org.ops4j.pax.web.cfg", "org.osgi.service.http.port", httpPort),
editConfigurationFilePut("etc/org.ops4j.pax.web.cfg", "org.osgi.service.http.port.secure", httpsPort),
replaceConfigurationFile("etc/org.ops4j.pax.logging.cfg", getConfigFile("/etc/org.ops4j.pax.logging.cfg")),
systemProperty("org.ops4j.pax.logging.DefaultSer‌​viceLog.level").value("DEBUG"),
vmOptions("-Dtest-jmx-port=" + jmxPort),
mavenBundle(mockitoUrl),
junitBundles(),
features(fildeleFeatureRepo, "fildele"));
}
@Test
public void testServlet() throws ServletException, IOException {
HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);
servlet.service(request, response);
}
public File getConfigFile(String path) {
URL res = this.getClass().getResource(path);
if (res == null) {
throw new RuntimeException("Config resource " + path + " not found");
}
return new File(res.getFile());
}
static int freePort() {
try (final ServerSocket serverSocket = new ServerSocket(0)) {
serverSocket.setReuseAddress(true);
final int port = serverSocket.getLocalPort();
return port;
} catch (final IOException e) {
throw new IllegalStateException(e);
}
}
static String freePortAsString() {
return Integer.toString(freePort());
}
}
################################################################################
#
# 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.
#
################################################################################
# Common pattern layout for appenders
log4j2.pattern = %d{ISO8601} | %-5p | %-16t | %-32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
# Root logger
log4j2.rootLogger.level = INFO
# uncomment to use asynchronous loggers, which require mvn:com.lmax/disruptor/3.3.2 library
#log4j2.rootLogger.type = asyncRoot
#log4j2.rootLogger.includeLocation = false
log4j2.rootLogger.appenderRefs = RollingFile, PaxOsgi, Console
log4j2.rootLogger.appenderRef.RollingFile.ref = RollingFile
log4j2.rootLogger.appenderRef.PaxOsgi.ref = PaxOsgi
log4j2.rootLogger.appenderRef.Console.ref = Console
log4j2.rootLogger.appenderRef.Console.filter.threshold.type = ThresholdFilter
log4j2.rootLogger.appenderRef.Console.filter.threshold.level = ${karaf.log.console:-OFF}
# Appenders configuration
log4j2.appenders = console, rolling, osgi
# CONSOLE appender not used by default
log4j2.appender.console.type = Console
log4j2.appender.console.name = Console
log4j2.appender.console.layout.type = PatternLayout
log4j2.appender.console.layout.pattern = ${log4j2.pattern}
# File appender
log4j2.appender.rolling.type = RollingRandomAccessFile
log4j2.appender.rolling.name = RollingFile
log4j2.appender.rolling.fileName = ${karaf.data}/log/karaf.log
log4j2.appender.rolling.filePattern = ${karaf.data}/log/karaf.log.%i
# uncomment to not force a disk flush
#log4j2.appender.rolling.immediateFlush = false
log4j2.appender.rolling.append = true
log4j2.appender.rolling.layout.type = PatternLayout
log4j2.appender.rolling.layout.pattern = ${log4j2.pattern}
log4j2.appender.rolling.policies.type = Policies
log4j2.appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
log4j2.appender.rolling.policies.size.size = 16MB
# OSGi appender
log4j2.appender.osgi.type = PaxOsgi
log4j2.appender.osgi.name = PaxOsgi
log4j2.appender.osgi.filter = *
# help with identification of maven-related problems with pax-url-aether
#log4j2.logger.aether.name = shaded.org.eclipse.aether
#log4j2.logger.aether.level = TRACE
#log4j2.logger.http-headers.name = shaded.org.apache.http.headers
#log4j2.logger.http-headers.level = DEBUG
#log4j2.logger.maven.name = org.ops4j.pax.url.mvn
#log4j2.logger.maven.level = TRACE
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment