From 30a84635271e763938764e59b70421857eb575e6 Mon Sep 17 00:00:00 2001 From: Lukasz Dywicki Date: Sat, 24 Aug 2013 12:03:20 +0200 Subject: [PATCH] Change KarafTestContainer to rely directly on options and KarafPropertiesFile class --- .../container/internal/ExamFeaturesFile.java | 4 +- .../internal/KarafPropertiesFile.java | 27 +++++++- .../internal/KarafTestContainer.java | 54 +++++++++------ .../karaf/options/KarafBootFeatureOption.java | 14 ++++ ...afDistributionConfigurationFileOption.java | 16 ++++- .../options/KarafDistributionOption.java | 9 ++- .../options/KarafFeatureRepositoryOption.java | 11 ++++ .../karaf/options/LogCategoryLevelOption.java | 12 ++++ .../exam/karaf/options/LogLevelOption.java | 13 ++-- .../container/karaf/KarafOptionsTest.java | 65 +++++++++++++++++++ pom.xml | 25 +++++++ 11 files changed, 219 insertions(+), 31 deletions(-) create mode 100644 containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafBootFeatureOption.java create mode 100644 containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafFeatureRepositoryOption.java create mode 100644 containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/LogCategoryLevelOption.java create mode 100644 containers/pax-exam-container-karaf/src/test/java/org/ops4j/pax/exam/container/karaf/KarafOptionsTest.java diff --git a/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/container/internal/ExamFeaturesFile.java b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/container/internal/ExamFeaturesFile.java index 9c6584ced..1bf690fd5 100644 --- a/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/container/internal/ExamFeaturesFile.java +++ b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/container/internal/ExamFeaturesFile.java @@ -112,9 +112,9 @@ public void writeToFile(File featuresXmlFile) throws IOException { public void adaptDistributionToStartExam(File karafHome, File featuresXmlFile) throws IOException { KarafPropertiesFile karafPropertiesFile = new KarafPropertiesFile(karafHome, Constants.FEATURES_CFG_LOCATION); karafPropertiesFile.load(); - String finalFilePath = ",file:" + featuresXmlFile.toString().replaceAll("\\\\", "/").replaceAll(" ", "%20"); + String finalFilePath = "file:" + featuresXmlFile.toString().replaceAll("\\\\", "/").replaceAll(" ", "%20"); karafPropertiesFile.extend("featuresRepositories", finalFilePath); - karafPropertiesFile.extend("featuresBoot", ",exam"); + karafPropertiesFile.extend("featuresBoot", "exam"); karafPropertiesFile.store(); } diff --git a/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/container/internal/KarafPropertiesFile.java b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/container/internal/KarafPropertiesFile.java index a69c2246f..4aabfb033 100644 --- a/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/container/internal/KarafPropertiesFile.java +++ b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/container/internal/KarafPropertiesFile.java @@ -23,6 +23,10 @@ import java.util.Properties; import org.apache.commons.io.FileUtils; +import org.ops4j.pax.exam.karaf.options.KarafDistributionConfigurationFileExtendOption; +import org.ops4j.pax.exam.karaf.options.KarafDistributionConfigurationFileOption; +import org.ops4j.pax.exam.karaf.options.KarafDistributionConfigurationFilePutOption; +import org.ops4j.pax.exam.karaf.options.KarafDistributionConfigurationFileReplacementOption; public class KarafPropertiesFile { @@ -50,12 +54,16 @@ public void put(String key, String value) { properties.put(key, value); } - public void extend(String key, String value) { + public void extend(String key, String separator, String value) { if (properties.get(key) == null) { properties.put(key, value); return; } - properties.put(key, properties.get(key) + value); + properties.put(key, properties.get(key) + separator + value); + } + + public void extend(String key, String value) { + extend(key, ",", value); } public String get(String key) { @@ -75,4 +83,19 @@ public void replace(File source) { } } + /** + * Method used for delegating handling of the options to karaf property file. + * + * @param option Option to be applied for given configuration file. + */ + public void handle(KarafDistributionConfigurationFileOption option) { + if (option instanceof KarafDistributionConfigurationFilePutOption) { + put(option.getKey(), option.getValue()); + } else if (option instanceof KarafDistributionConfigurationFileExtendOption) { + extend(option.getKey(), option.getSeparator(), option.getValue()); + } else if (option instanceof KarafDistributionConfigurationFileReplacementOption) { + replace(((KarafDistributionConfigurationFileReplacementOption) option).getSource()); + } + } + } diff --git a/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/container/internal/KarafTestContainer.java b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/container/internal/KarafTestContainer.java index 03ef3e344..60e15ba00 100644 --- a/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/container/internal/KarafTestContainer.java +++ b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/container/internal/KarafTestContainer.java @@ -62,6 +62,7 @@ import org.ops4j.pax.exam.karaf.container.internal.runner.Runner; import org.ops4j.pax.exam.karaf.options.DoNotModifyLogOption; import org.ops4j.pax.exam.karaf.options.ExamBundlesStartLevel; +import org.ops4j.pax.exam.karaf.options.KarafBootFeatureOption; import org.ops4j.pax.exam.karaf.options.KarafDistributionBaseConfigurationOption; import org.ops4j.pax.exam.karaf.options.KarafDistributionConfigurationConsoleOption; import org.ops4j.pax.exam.karaf.options.KarafDistributionConfigurationFileExtendOption; @@ -69,11 +70,14 @@ import org.ops4j.pax.exam.karaf.options.KarafDistributionConfigurationFilePutOption; import org.ops4j.pax.exam.karaf.options.KarafDistributionConfigurationFileReplacementOption; import org.ops4j.pax.exam.karaf.options.KarafExamSystemConfigurationOption; +import org.ops4j.pax.exam.karaf.options.KarafFeatureRepositoryOption; import org.ops4j.pax.exam.karaf.options.KarafFeaturesOption; import org.ops4j.pax.exam.karaf.options.KeepRuntimeFolderOption; +import org.ops4j.pax.exam.karaf.options.LogCategoryLevelOption; import org.ops4j.pax.exam.karaf.options.LogLevelOption; import org.ops4j.pax.exam.karaf.options.configs.CustomProperties; import org.ops4j.pax.exam.karaf.options.configs.FeaturesCfg; +import org.ops4j.pax.exam.karaf.options.configs.LoggingCfg; import org.ops4j.pax.exam.options.BootClasspathLibraryOption; import org.ops4j.pax.exam.options.BootDelegationOption; import org.ops4j.pax.exam.options.ProvisionOption; @@ -189,6 +193,7 @@ public synchronized TestContainer start() { String[] fileEndings = new String[] { "jar", "war", "zip", "kar", "xml" }; updateLogProperties(karafHome, subsystem); + updateLogCategoryProperties(karafHome, subsystem); updateUserSetProperties(karafHome, subsystem); setupExamProperties(karafHome, subsystem); makeScriptsInBinExec(karafBin); @@ -423,7 +428,7 @@ else if (optionToApply instanceof KarafDistributionConfigurationFileReplacementO } else { karafPropertiesFile - .extend(optionToApply.getKey(), optionToApply.getValue()); + .extend(optionToApply.getKey(), optionToApply.getSeparator(), optionToApply.getValue()); } } if (!store) { @@ -470,18 +475,14 @@ private Collection configure private Collection extractFileOptionsBasedOnFeaturesScannerOptions( ExamSystem subsystem) { ArrayList retVal = Lists.newArrayList(); - KarafFeaturesOption[] featuresOptions = subsystem - .getOptions(KarafFeaturesOption.class); + KarafFeaturesOption[] featuresOptions = subsystem.getOptions(KarafFeaturesOption.class); + for (KarafFeaturesOption featuresOption : featuresOptions) { - String url = featuresOption.getURL(); - retVal.add(new KarafDistributionConfigurationFileExtendOption(FeaturesCfg.REPOSITORIES, - "," + url)); - StringBuilder buffer = new StringBuilder(); + retVal.add(new KarafFeatureRepositoryOption(featuresOption.getURL())); + for (String feature : featuresOption.getFeatures()) { - buffer.append(","); - buffer.append(feature); + retVal.add(new KarafBootFeatureOption(feature)); } - retVal.add(new KarafDistributionConfigurationFileExtendOption(FeaturesCfg.BOOT, buffer.toString())); } return retVal; } @@ -503,18 +504,31 @@ private void updateLogProperties(File karafHome, ExamSystem _system) throws IOEx LOGGER.info("Log file should not be modified by the test framework"); return; } - String realLogLevel = retrieveRealLogLevel(_system); - File customPropertiesFile = new File(karafHome + "/etc/org.ops4j.pax.logging.cfg"); - Properties karafPropertyFile = new Properties(); - karafPropertyFile.load(new FileInputStream(customPropertiesFile)); - karafPropertyFile.put("log4j.rootLogger", realLogLevel + ", out, stdout, osgi:*"); - karafPropertyFile.store(new FileOutputStream(customPropertiesFile), "updated by pax-exam"); - } - private String retrieveRealLogLevel(ExamSystem _system) { LogLevelOption[] logLevelOptions = _system.getOptions(LogLevelOption.class); - return logLevelOptions != null && logLevelOptions.length != 0 ? logLevelOptions[0] - .getLogLevel().toString() : "WARN"; + if (logLevelOptions != null && logLevelOptions.length == 1) { + KarafPropertiesFile karafPropertyFile = new KarafPropertiesFile(karafHome, LoggingCfg.FILE_PATH); + karafPropertyFile.load(); + karafPropertyFile.handle(logLevelOptions[0]); + karafPropertyFile.store(); + } + } + + private void updateLogCategoryProperties(File karafHome, ExamSystem _system) throws IOException { + DoNotModifyLogOption[] modifyLog = _system.getOptions(DoNotModifyLogOption.class); + if (modifyLog != null && modifyLog.length != 0) { + LOGGER.info("Log file should not be modified by the test framework"); + return; + } + + KarafPropertiesFile karafPropertyFile = new KarafPropertiesFile(karafHome, LoggingCfg.FILE_PATH); + karafPropertyFile.load(); + + for (LogCategoryLevelOption option : _system.getOptions(LogCategoryLevelOption.class)) { + karafPropertyFile.handle(option); + } + + karafPropertyFile.store(); } private String[] buildKarafClasspath(File karafHome) { diff --git a/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafBootFeatureOption.java b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafBootFeatureOption.java new file mode 100644 index 000000000..619344280 --- /dev/null +++ b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafBootFeatureOption.java @@ -0,0 +1,14 @@ +package org.ops4j.pax.exam.karaf.options; + +import org.ops4j.pax.exam.karaf.options.configs.FeaturesCfg; + +public class KarafBootFeatureOption extends KarafDistributionConfigurationFileExtendOption { + + public KarafBootFeatureOption(String name) { + super(FeaturesCfg.BOOT, name); + } + + public KarafBootFeatureOption(String name, String version) { + super(FeaturesCfg.BOOT, name + ";version=" + version); + } +} diff --git a/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafDistributionConfigurationFileOption.java b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafDistributionConfigurationFileOption.java index ff658290c..a38aea999 100644 --- a/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafDistributionConfigurationFileOption.java +++ b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafDistributionConfigurationFileOption.java @@ -27,15 +27,25 @@ public abstract class KarafDistributionConfigurationFileOption implements Option private String configurationFilePath; private String key; private String value; + private String separator; public KarafDistributionConfigurationFileOption(ConfigurationPointer pointer, String value) { - this(pointer.getConfigurationFilePath(), pointer.getKey(), value); + this(pointer.getConfigurationFilePath(), pointer.getKey(), value, null); + } + + public KarafDistributionConfigurationFileOption(ConfigurationPointer pointer, String value, String separator) { + this(pointer.getConfigurationFilePath(), pointer.getKey(), value, separator); } public KarafDistributionConfigurationFileOption(String configurationFilePath, String key, String value) { + this(configurationFilePath, key, value, null); + } + + public KarafDistributionConfigurationFileOption(String configurationFilePath, String key, String value, String separator) { this.configurationFilePath = configurationFilePath; this.key = key; this.value = value; + this.separator = separator; } public KarafDistributionConfigurationFileOption(String configurationFilePath) { @@ -54,4 +64,8 @@ public String getValue() { return value; } + public String getSeparator() { + return separator; + } + } diff --git a/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafDistributionOption.java b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafDistributionOption.java index ee4443820..ab2038bdd 100644 --- a/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafDistributionOption.java +++ b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafDistributionOption.java @@ -250,12 +250,19 @@ public static Option logLevel(LogLevel logLevel) { return new LogLevelOption(logLevel); } + /** + * Specify given log level for category. + */ + public static Option logCategoryLevel(String category, LogLevel logLevel) { + return new LogCategoryLevelOption(category, logLevel); + } + /** * A very simple and convinient method to set a specific log level without the need of configure * the specific option itself. */ public static LogLevelOption logLevel() { - return new LogLevelOption(); + return new LogLevelOption(LogLevel.WARN); } /** diff --git a/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafFeatureRepositoryOption.java b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafFeatureRepositoryOption.java new file mode 100644 index 000000000..ae17987bd --- /dev/null +++ b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/KarafFeatureRepositoryOption.java @@ -0,0 +1,11 @@ +package org.ops4j.pax.exam.karaf.options; + +import org.ops4j.pax.exam.karaf.options.configs.FeaturesCfg; + +public class KarafFeatureRepositoryOption extends KarafDistributionConfigurationFileExtendOption { + + public KarafFeatureRepositoryOption(String url) { + super(FeaturesCfg.REPOSITORIES, url); + } + +} diff --git a/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/LogCategoryLevelOption.java b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/LogCategoryLevelOption.java new file mode 100644 index 000000000..9a3a981ca --- /dev/null +++ b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/LogCategoryLevelOption.java @@ -0,0 +1,12 @@ +package org.ops4j.pax.exam.karaf.options; + +import org.ops4j.pax.exam.karaf.options.LogLevelOption.LogLevel; +import org.ops4j.pax.exam.karaf.options.configs.LoggingCfg; + +public class LogCategoryLevelOption extends KarafDistributionConfigurationFilePutOption { + + public LogCategoryLevelOption(String category, LogLevel level) { + super(LoggingCfg.FILE_PATH, "log4j.logger." + category, level.toString()); + } + +} diff --git a/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/LogLevelOption.java b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/LogLevelOption.java index 863b22810..6b236f07e 100644 --- a/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/LogLevelOption.java +++ b/containers/pax-exam-container-karaf/src/main/java/org/ops4j/pax/exam/karaf/options/LogLevelOption.java @@ -16,25 +16,28 @@ */ package org.ops4j.pax.exam.karaf.options; -import org.ops4j.pax.exam.Option; +import org.ops4j.pax.exam.karaf.options.configs.LoggingCfg; /** * While the log-level could also be configured using the config options in the configuration files we also provide a * more easy option here. */ -public class LogLevelOption implements Option { +public class LogLevelOption extends KarafDistributionConfigurationFilePutOption { public static enum LogLevel { TRACE, DEBUG, INFO, WARN, ERROR } + public final static String DEFAULT_APPENDERS = "out, stdout, osgi:*"; + private LogLevel logLevel; - public LogLevelOption() { + public LogLevelOption(LogLevel level) { + this(level, DEFAULT_APPENDERS); } - public LogLevelOption(LogLevel logLevel) { - this.logLevel = logLevel; + public LogLevelOption(LogLevel level, String appenders) { + super(LoggingCfg.ROOT_LOGGER, level + "," + appenders); } public LogLevelOption logLevel(LogLevel _logLevel) { diff --git a/containers/pax-exam-container-karaf/src/test/java/org/ops4j/pax/exam/container/karaf/KarafOptionsTest.java b/containers/pax-exam-container-karaf/src/test/java/org/ops4j/pax/exam/container/karaf/KarafOptionsTest.java new file mode 100644 index 000000000..3bb24efac --- /dev/null +++ b/containers/pax-exam-container-karaf/src/test/java/org/ops4j/pax/exam/container/karaf/KarafOptionsTest.java @@ -0,0 +1,65 @@ +/* + * 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.ops4j.pax.exam.container.karaf; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; +import static org.ops4j.pax.exam.CoreOptions.maven; +import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.configureConsole; +import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.karafDistributionConfiguration; +import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.logCategoryLevel; +import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.logLevel; + +import java.io.File; + +import javax.inject.Inject; + +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.osgi.framework.BundleContext; + +@RunWith(PaxExam.class) +public class KarafOptionsTest { + + @Inject + private BundleContext bc; + + @Configuration + public Option[] config() { + return new Option[] { + karafDistributionConfiguration() + .frameworkUrl(maven("org.apache.karaf", "apache-karaf", "2.3.2").type("zip")) + .karafVersion("2.3.2").useDeployFolder(false).unpackDirectory(new File("target/karaf")), + configureConsole().ignoreLocalConsole().startRemoteShell(), + logLevel(LogLevel.INFO), + logCategoryLevel("org.apache.aries", LogLevel.ERROR), + logCategoryLevel("org.apache.felix", LogLevel.ERROR), + }; + } + + @Test + public void checkKarafSystemService() throws Exception { + assertThat(bc, is(notNullValue())); + } + +} diff --git a/pom.xml b/pom.xml index b9e837071..586c7f084 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,31 @@ OPS4J Pax Exam (Reactor POM) + + core + + + build/pax-exam-checkstyle-rules + pom + core/pax-exam + core/pax-exam-spi + core/pax-exam-extender-service + core/pax-exam-inject + core/pax-exam-invoker-junit + core/pax-exam-invoker-servlet + core/pax-exam-servlet-bridge + core/pax-exam-cdi + core/pax-exam-spring + core/pax-exam-cm + core/pax-exam-link-mvn + core/pax-exam-link-assembly + core/pax-exam-container-rbc + core/pax-exam-container-rbc-client + + + + + default