Integration testing framework for OSGi applications running in Apache Karaf containers
—
Comprehensive system for modifying Karaf configuration files during test setup. This capability provides fine-grained control over Karaf's configuration files, supporting put, extend, and replace operations with both string-based paths and type-safe configuration pointers.
Add or replace configuration values in Karaf configuration files. Put operations will either add new keys or overwrite existing values.
/**
* Put/replace a configuration value using file path and key
* @param configurationFilePath Path to configuration file relative to karaf.home
* @param key Configuration property key
* @param value Configuration property value
* @return Configuration option
*/
public static Option editConfigurationFilePut(String configurationFilePath, String key, Object value);
/**
* Put/replace a configuration value using a type-safe pointer
* @param configurationPointer Reference to configuration file and key
* @param value Configuration property value
* @return Configuration option
*/
public static Option editConfigurationFilePut(ConfigurationPointer configurationPointer, Object value);
/**
* Put multiple configuration values from a properties file
* @param configurationFilePath Path to target configuration file
* @param source Properties file containing values to put
* @param keysToUseFromSource Specific keys to use (all keys if not specified)
* @return Array of configuration options
*/
public static Option[] editConfigurationFilePut(String configurationFilePath, File source, String... keysToUseFromSource);Usage Examples:
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.*;
import org.ops4j.pax.exam.karaf.options.configs.ManagementCfg;
// Put using string paths
Option jmxPort = editConfigurationFilePut(
"etc/org.apache.karaf.management.cfg",
"rmiRegistryPort",
"1099"
);
// Put using type-safe pointers
Option jmxPortSafe = editConfigurationFilePut(
ManagementCfg.RMI_REGISTRY_PORT,
"1099"
);
// Put from properties file
File configSource = new File("test-config.properties");
Option[] multipleConfigs = editConfigurationFilePut(
"etc/system.properties",
configSource,
"karaf.name", "org.osgi.framework.bootdelegation"
);Extend existing configuration values rather than replacing them. Extend operations append to existing values (e.g., "a=b" becomes "a=b,c").
/**
* Extend a configuration value using file path and key
* @param configurationFilePath Path to configuration file relative to karaf.home
* @param key Configuration property key
* @param value Value to append to existing configuration
* @return Configuration option
*/
public static Option editConfigurationFileExtend(String configurationFilePath, String key, Object value);
/**
* Extend a configuration value using a type-safe pointer
* @param configurationPointer Reference to configuration file and key
* @param value Value to append to existing configuration
* @return Configuration option
*/
public static Option editConfigurationFileExtend(ConfigurationPointer configurationPointer, Object value);
/**
* Extend multiple configuration values from a properties file
* @param configurationFilePath Path to target configuration file
* @param source Properties file containing values to extend
* @param keysToUseFromSource Specific keys to use (all keys if not specified)
* @return Array of configuration options
*/
public static Option[] editConfigurationFileExtend(String configurationFilePath, File source, String... keysToUseFromSource);Usage Examples:
import org.ops4j.pax.exam.karaf.options.configs.CustomProperties;
// Extend system packages
Option extendSystemPackages = editConfigurationFileExtend(
"etc/config.properties",
"org.osgi.framework.system.packages.extra",
"com.example.api,com.example.util"
);
// Extend using type-safe pointer
Option extendSystemPackagesSafe = editConfigurationFileExtend(
CustomProperties.SYSTEM_PACKAGES_EXTRA,
"com.example.api,com.example.util"
);
// Extend boot delegation
Option extendBootDelegation = editConfigurationFileExtend(
CustomProperties.BOOTDELEGATION,
"sun.*,com.sun.*"
);Replace entire configuration files with custom versions during test setup.
/**
* Replace an entire configuration file with a custom version
* @param configurationFilePath Path to configuration file to replace
* @param source File containing replacement content
* @return Configuration option
*/
public static Option replaceConfigurationFile(String configurationFilePath, File source);Usage Examples:
// Replace logging configuration
File customLoggingConfig = new File("src/test/resources/custom-logging.cfg");
Option replaceLogging = replaceConfigurationFile(
"etc/org.ops4j.pax.logging.cfg",
customLoggingConfig
);
// Replace system properties
File customSystemProps = new File("src/test/resources/system.properties");
Option replaceSystemProps = replaceConfigurationFile(
"etc/system.properties",
customSystemProps
);Implementation classes for configuration file modifications.
/**
* Abstract base class for configuration file modifications
*/
abstract class KarafDistributionConfigurationFileOption implements Option {
public KarafDistributionConfigurationFileOption(ConfigurationPointer pointer, Object value);
public KarafDistributionConfigurationFileOption(String configurationFilePath, String key, Object value);
public KarafDistributionConfigurationFileOption(String configurationFilePath);
public String getConfigurationFilePath();
public String getKey();
public Object getValue();
}
/**
* Put/replace configuration file operation
*/
class KarafDistributionConfigurationFilePutOption extends KarafDistributionConfigurationFileOption {
public KarafDistributionConfigurationFilePutOption(String configurationFilePath, String key, Object value);
public KarafDistributionConfigurationFilePutOption(ConfigurationPointer pointer, Object value);
}
/**
* Extend configuration file operation
*/
class KarafDistributionConfigurationFileExtendOption extends KarafDistributionConfigurationFileOption {
public KarafDistributionConfigurationFileExtendOption(String configurationFilePath, String key, Object value);
public KarafDistributionConfigurationFileExtendOption(ConfigurationPointer pointer, Object value);
}
/**
* Replace configuration file operation
*/
class KarafDistributionConfigurationFileReplacementOption extends KarafDistributionConfigurationFileOption {
public KarafDistributionConfigurationFileReplacementOption(String configurationFilePath, File source);
public File getSource();
}Pre-defined configuration pointers for common Karaf configuration files, providing type safety and avoiding magic strings.
/**
* Type-safe reference to configuration file and key
*/
class ConfigurationPointer {
public ConfigurationPointer(String configurationFilePath, String key);
public String getConfigurationFilePath();
public String getKey();
}CustomProperties - etc/config.properties:
class CustomProperties {
public static final String FILE_PATH = "etc/config.properties";
public static final ConfigurationPointer KARAF_FRAMEWORK; // Framework type (felix/equinox)
public static final ConfigurationPointer SYSTEM_PACKAGES_EXTRA; // System packages extra
public static final ConfigurationPointer BOOTDELEGATION; // Boot delegation packages
}FeaturesCfg - etc/org.apache.karaf.features.cfg:
class FeaturesCfg {
public static final String FILE_PATH = "etc/org.apache.karaf.features.cfg";
public static final ConfigurationPointer REPOSITORIES; // Features repositories list
public static final ConfigurationPointer BOOT; // Features to install at boot
}LoggingCfg - etc/org.ops4j.pax.logging.cfg:
class LoggingCfg {
public static final String FILE_PATH = "etc/org.ops4j.pax.logging.cfg";
public static final ConfigurationPointer ROOT_LOGGER; // Root logger configuration
}ManagementCfg - etc/org.apache.karaf.management.cfg:
class ManagementCfg {
public static final String FILE_PATH = "etc/org.apache.karaf.management.cfg";
public static final ConfigurationPointer RMI_REGISTRY_PORT; // RMI registry port
public static final ConfigurationPointer RMI_SERVER_PORT; // RMI server port
}SystemProperties - etc/system.properties:
class SystemProperties {
public static final String FILE_PATH = "etc/system.properties";
public static final ConfigurationPointer KARAF_NAME; // Karaf instance name
}UsersProperties - etc/users.properties:
class UsersProperties {
public static final String FILE_PATH = "etc/users.properties";
public static final ConfigurationPointer KARAF_USER; // Default karaf user
}WebCfg - etc/org.ops4j.pax.web.cfg:
class WebCfg {
public static final String FILE_PATH = "etc/org.ops4j.pax.web.cfg";
public static final ConfigurationPointer HTTP_PORT; // HTTP service port
}JreProperties - etc/jre.properties:
class JreProperties {
public static final String FILE_PATH = "etc/jre.properties";
}@Configuration
public Option[] config() {
return new Option[] {
karafDistributionConfiguration(),
// Set JMX ports
editConfigurationFilePut(ManagementCfg.RMI_REGISTRY_PORT, "1099"),
editConfigurationFilePut(ManagementCfg.RMI_SERVER_PORT, "44444"),
// Extend system packages
editConfigurationFileExtend(
CustomProperties.SYSTEM_PACKAGES_EXTRA,
"com.example.api,com.example.util"
),
// Replace logging configuration
replaceConfigurationFile(
"etc/org.ops4j.pax.logging.cfg",
new File("src/test/resources/test-logging.cfg")
)
};
}// Load multiple configurations from properties file
File testConfig = new File("src/test/resources/test.properties");
Option[] systemConfigs = editConfigurationFilePut(
"etc/system.properties",
testConfig,
"karaf.name", "karaf.base", "java.protocol.handler.pkgs"
);Configuration file operations throw IllegalStateException for:
Install with Tessl CLI
npx tessl i tessl/maven-org-ops4j-pax-exam--pax-exam-container-karaf