Integration testing framework for OSGi applications running in Apache Karaf containers
—
Control over Karaf container runtime behavior including logging, debugging, console access, directory management, and system-level configuration. This capability provides essential options for test execution control and debugging support.
Control whether test runtime directories are preserved after test completion for debugging purposes.
/**
* Keep test runtime directories after test completion
* By default, Pax Exam deletes test directories after tests finish
* @return Option to preserve runtime directories
*/
public static Option keepRuntimeFolder();Usage Examples:
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.*;
@Configuration
public Option[] config() {
return new Option[] {
karafDistributionConfiguration(),
// Keep directories for debugging
keepRuntimeFolder(),
// Other configuration...
};
}Configure logging levels and behavior for the test container.
/**
* Set a specific log level for the container
* @param logLevel Log level to set
* @return Logging configuration option
*/
public static Option logLevel(LogLevel logLevel);
/**
* Get a log level option builder for advanced configuration
* @return LogLevelOption for fluent configuration
*/
public static LogLevelOption logLevel();
/**
* Prevent automatic modification of log configuration files
* By default, Pax Exam modifies logging configuration to add console output
* @return Option to preserve original log configuration
*/
public static Option doNotModifyLogConfiguration();Usage Examples:
import org.ops4j.pax.exam.karaf.options.LogLevelOption.LogLevel;
// Set specific log level
Option infoLogging = logLevel(LogLevel.INFO);
Option debugLogging = logLevel(LogLevel.DEBUG);
Option errorLogging = logLevel(LogLevel.ERROR);
// Use fluent configuration
Option fluentLogging = logLevel().logLevel(LogLevel.WARN);
// Prevent automatic log configuration changes
Option preserveLogging = doNotModifyLogConfiguration();
// Complete configuration
@Configuration
public Option[] config() {
return new Option[] {
karafDistributionConfiguration(),
logLevel(LogLevel.DEBUG),
doNotModifyLogConfiguration(), // Keep original log config
keepRuntimeFolder()
};
}Enable remote debugging support for the Karaf container to allow IDE attachment and debugging.
/**
* Enable debugging with default port 5005 and suspend VM until debugger attaches
* @return Debug configuration option
*/
public static Option debugConfiguration();
/**
* Enable debugging with custom port and suspend behavior
* @param port Debug port number
* @param hold Whether to suspend VM until debugger attaches
* @return Debug configuration option
*/
public static Option debugConfiguration(String port, boolean hold);Usage Examples:
// Default debug configuration (port 5005, suspend=true)
Option defaultDebug = debugConfiguration();
// Custom debug port without suspending
Option customDebug = debugConfiguration("8000", false);
// Debug with suspend for IDE attachment
Option suspendDebug = debugConfiguration("5005", true);
// Debug configuration in test
@Configuration
public Option[] config() {
return new Option[] {
karafDistributionConfiguration(),
debugConfiguration("8000", false), // Debug on port 8000, don't suspend
keepRuntimeFolder() // Keep for debugging
};
}Configure internal Pax Exam system behavior and bundle start levels.
/**
* Configure the internal invoker for Karaf integration tests
* @param invoker Probe invoker name for integration test communication
* @return System configuration option
*/
public static Option useOwnKarafExamSystemConfiguration(String invoker);
/**
* Configure start level for Pax Exam bundles
* @param startLevel Bundle start level for exam bundles
* @return Start level configuration option
*/
public static Option useOwnExamBundlesStartLevel(int startLevel);Usage Examples:
// Configure custom invoker
Option customInvoker = useOwnKarafExamSystemConfiguration("custom-invoker");
// Set exam bundles start level
Option examStartLevel = useOwnExamBundlesStartLevel(80);
// System configuration in test
@Configuration
public Option[] config() {
return new Option[] {
karafDistributionConfiguration(),
useOwnExamBundlesStartLevel(90), // High start level for exam bundles
useOwnKarafExamSystemConfiguration("test-invoker")
};
}Simple flag option to preserve test directories.
/**
* Option to keep runtime directories after test completion
*/
class KeepRuntimeFolderOption implements Option {
public KeepRuntimeFolderOption();
}Configurable logging level option with fluent interface.
/**
* Logging level configuration option
*/
class LogLevelOption implements Option {
// Log level enumeration
enum LogLevel {
TRACE, DEBUG, INFO, WARN, ERROR
}
public LogLevelOption();
public LogLevelOption(LogLevel logLevel);
public LogLevelOption logLevel(LogLevel logLevel);
public LogLevel getLogLevel();
}Flag option to prevent automatic log configuration changes.
/**
* Option to prevent automatic log configuration modifications
*/
class DoNotModifyLogOption implements Option {
public DoNotModifyLogOption();
}Internal system configuration for Pax Exam integration.
/**
* Configuration option for internal Pax Exam system behavior
*/
class KarafExamSystemConfigurationOption implements Option {
public KarafExamSystemConfigurationOption(String invoker);
public String getInvoker();
}Configuration for Pax Exam bundle start levels.
/**
* Start level configuration for Pax Exam bundles
*/
class ExamBundlesStartLevel implements Option {
public ExamBundlesStartLevel(int startLevel);
public int getStartLevel();
}Configuration optimized for development and debugging:
@Configuration
public Option[] developmentConfig() {
return new Option[] {
karafDistributionConfiguration()
.unpackDirectory(new File("target/exam"))
.useDeployFolder(true),
// Development settings
keepRuntimeFolder(), // Keep for inspection
logLevel(LogLevel.DEBUG), // Verbose logging
debugConfiguration("5005", true), // Enable debugging
doNotModifyLogConfiguration(), // Use custom log config
// Install development features
features("mvn:org.apache.karaf.features/standard/4.2.0/xml/features",
"ssh", "management", "webconsole")
};
}Configuration that mimics production environment:
@Configuration
public Option[] productionConfig() {
return new Option[] {
karafDistributionConfiguration()
.runEmbedded(false)
.useDeployFolder(false),
// Production-like settings
logLevel(LogLevel.WARN), // Minimal logging
useOwnExamBundlesStartLevel(100), // High start level
// Production features only
features("mvn:org.apache.karaf.features/standard/4.2.0/xml/features",
"scr", "log")
};
}Configuration tailored for specific test requirements:
@Configuration
public Option[] integrationTestConfig() {
return new Option[] {
karafDistributionConfiguration()
.directoryNameFormat("test-%s")
.unpackDirectory(new File("target/integration-tests")),
// Test-specific settings
keepRuntimeFolder(), // For test artifact inspection
logLevel(LogLevel.INFO), // Moderate logging
useOwnKarafExamSystemConfiguration("integration-invoker"),
// Test features
features("mvn:org.apache.karaf.features/standard/4.2.0/xml/features",
"scr", "http", "management")
};
}Configuration optimized for performance testing:
@Configuration
public Option[] performanceConfig() {
return new Option[] {
karafDistributionConfiguration()
.runEmbedded(true) // Faster startup
.useDeployFolder(false), // No hot deploy overhead
// Performance settings
logLevel(LogLevel.ERROR), // Minimal logging overhead
useOwnExamBundlesStartLevel(50), // Lower start level for speed
// Minimal features
features("mvn:org.apache.karaf.features/standard/4.2.0/xml/features",
"scr")
};
}Enable remote debugging for IDE attachment:
@Configuration
public Option[] debugConfig() {
return new Option[] {
karafDistributionConfiguration(),
// Debug configuration
debugConfiguration("8000", true), // Port 8000, wait for debugger
keepRuntimeFolder(), // Keep for debugging
logLevel(LogLevel.DEBUG), // Debug logging
// SSH access for debugging
features("mvn:org.apache.karaf.features/standard/4.2.0/xml/features",
"ssh", "management")
};
}
// IDE Debug Configuration:
// - Host: localhost
// - Port: 8000
// - Transport: Socket
// - Debugger Mode: AttachConfigure logging for comprehensive test analysis:
@Configuration
public Option[] logAnalysisConfig() {
return new Option[] {
karafDistributionConfiguration(),
// Preserve all test artifacts
keepRuntimeFolder(),
// Detailed logging without auto-modification
doNotModifyLogConfiguration(),
// Custom log configuration file with detailed patterns
replaceConfigurationFile(
"etc/org.ops4j.pax.logging.cfg",
new File("src/test/resources/detailed-logging.cfg")
)
};
}Runtime configuration operations handle errors for:
Most runtime configuration errors are detected at test startup and will cause immediate test failure with descriptive error messages.
Install with Tessl CLI
npx tessl i tessl/maven-org-ops4j-pax-exam--pax-exam-container-karaf