This is an automated email from the ASF dual-hosted git repository. ppa pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push: new b000d591d71 IGNITE-17512 Ability to load test logger configuration and test properties from the classpath (#10193) b000d591d71 is described below commit b000d591d718feb02ccce0c73a1daeb796b7b87a Author: Pavel Pereslegin <xxt...@gmail.com> AuthorDate: Thu Aug 18 12:27:55 2022 +0300 IGNITE-17512 Ability to load test logger configuration and test properties from the classpath (#10193) --- modules/core/pom.xml | 11 ++++ modules/core/src/test/config/examples.properties | 2 +- modules/core/src/test/config/log4j2-test.xml | 7 ++- modules/core/src/test/config/log4j2-test.xml~ | 63 ------------------- .../apache/ignite/testframework/GridTestUtils.java | 18 ++++++ .../testframework/config/GridTestProperties.java | 73 +++++++++++++--------- .../common/GridCommonAbstractTestSelfTest.java | 15 +++++ 7 files changed, 94 insertions(+), 95 deletions(-) diff --git a/modules/core/pom.xml b/modules/core/pom.xml index 455a01d0127..9913700b807 100644 --- a/modules/core/pom.xml +++ b/modules/core/pom.xml @@ -219,6 +219,17 @@ <testResource> <directory>src/test/resources</directory> </testResource> + <testResource> + <directory>src/test/config</directory> + <includes> + <include>log4j2-test.xml</include> + <include>tests.properties</include> + </includes> + <!-- Hide the test logger configuration from the log4j autoconfigurator + in case the user starts Ignite with test.jar on the classpath. --> + <targetPath>${project.build.testOutputDirectory}/test/config</targetPath> + </testResource> + </testResources> <plugins> diff --git a/modules/core/src/test/config/examples.properties b/modules/core/src/test/config/examples.properties index cca6862d10d..b30280c130f 100644 --- a/modules/core/src/test/config/examples.properties +++ b/modules/core/src/test/config/examples.properties @@ -15,4 +15,4 @@ # limitations under the License. # -DataRegionExample=examples/config/example-data-regions.xml \ No newline at end of file +DataRegionExample=examples/config/example-data-regions.xml diff --git a/modules/core/src/test/config/log4j2-test.xml b/modules/core/src/test/config/log4j2-test.xml index e1056be1f58..ee2104f38d3 100644 --- a/modules/core/src/test/config/log4j2-test.xml +++ b/modules/core/src/test/config/log4j2-test.xml @@ -82,7 +82,12 @@ <Logger name="org.eclipse.jetty" level="INFO"/> <Root level="INFO"> - <AppenderRef ref="FILE" level="DEBUG"/> + <!-- + Uncomment to enable log output to file. + --> + <!-- + <AppenderRef ref="FILE" level="DEBUG"/> + --> <AppenderRef ref="CONSOLE" level="DEBUG"/> <AppenderRef ref="CONSOLE_ERR" level="WARN"/> </Root> diff --git a/modules/core/src/test/config/log4j2-test.xml~ b/modules/core/src/test/config/log4j2-test.xml~ deleted file mode 100644 index 4222b0c1bfa..00000000000 --- a/modules/core/src/test/config/log4j2-test.xml~ +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - 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. ---> -<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" - "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd"> -<Configuration status="debug" strict="true" name="XMLConfigTest" - packages="org.apache.ignite.logger.log4j2"> - <Filter type="ThresholdFilter" level="TRACE"/> - <Appenders> - <Appender type="Console" name="CONSOLE_ERR"> - </Appender> - <Routing name="Routing"> - <Routes pattern="$${ctx:ROUTINGKEY}"> - <Route key="$${ctx:ROUTINGKEY}"> - <RollingFile name="Rolling-default" fileName="work/log/default.log" - filePattern="work/log/${date:yyyy-MM}/default-%d{yyyy-MM-dd}-%i.log.gz"> - <PatternLayout> - <pattern>[%d{ABSOLUTE}][%-5p][%t][%c{1}] %m%n</pattern> - </PatternLayout> - <Policies> - <TimeBasedTriggeringPolicy interval="6" modulate="true" /> - <SizeBasedTriggeringPolicy size="10 MB" /> - </Policies> - </RollingFile> - </Route> - <Route> - <RollingFile name="Rolling-${ctx:ROUTINGKEY}" fileName="work/log/ignite-${ctx:ROUTINGKEY}.log" - filePattern="work/log/${date:yyyy-MM}/ignite-${ctx:ROUTINGKEY}-%d{yyyy-MM-dd}-%i.log.gz"> - <PatternLayout> - <pattern>[%d{ABSOLUTE}][%-5p] $${ctx:nodeidmsg}[%t][%c{1}]%msg%n</pattern> - </PatternLayout> - <Policies> - <TimeBasedTriggeringPolicy interval="6" modulate="true" /> - <SizeBasedTriggeringPolicy size="10 MB" /> - </Policies> - </RollingFile> - </Route> - </Routes> - </Routing> - </Appenders> - <Loggers> - <Logger name="org.springframework" level="warn"/> - <Logger name="rg.eclipse.jetty" level="warn"/> - <Logger name="org.eclipse.jetty.util.log" level="warn"/> - <Logger name="org.eclipse.jetty.util.component" level="warn"/> - <Logger name="com.amazonaws" level="warn"/> - <Root level="TRACE"> - <AppenderRef ref="Routing"/> - </Root> - </Loggers> -</Configuration> diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java index 31c4b9200e6..d6585b7224d 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java @@ -78,6 +78,7 @@ import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; +import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.Ignition; import org.apache.ignite.cache.query.annotations.QuerySqlFunction; import org.apache.ignite.cluster.ClusterNode; @@ -99,6 +100,7 @@ import org.apache.ignite.internal.processors.cache.distributed.near.GridNearCach import org.apache.ignite.internal.processors.odbc.ClientListenerProcessor; import org.apache.ignite.internal.processors.port.GridPortRecord; import org.apache.ignite.internal.util.GridBusyLock; +import org.apache.ignite.internal.util.IgniteUtils; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.lang.GridAbsClosure; import org.apache.ignite.internal.util.lang.GridAbsPredicate; @@ -123,6 +125,7 @@ import org.apache.ignite.testframework.junits.GridAbstractTest; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.IgniteSystemProperties.IGNITE_HOME; import static org.apache.ignite.internal.processors.cache.persistence.file.FilePageStoreManager.DFLT_STORE_DIR; import static org.apache.ignite.ssl.SslContextFactory.DFLT_KEY_ALGORITHM; import static org.apache.ignite.ssl.SslContextFactory.DFLT_SSL_PROTOCOL; @@ -1280,6 +1283,21 @@ public final class GridTestUtils { } } + /** + * Initialize {@link IgniteSystemProperties#IGNITE_HOME IGNITE_HOME} system property. + */ + public static void initTestProjectHome() { + String igniteHome = U.getIgniteHome(); + + if (F.isEmpty(igniteHome)) { + igniteHome = new File(System.getProperty("user.dir"), "ignite").getAbsolutePath(); + + IgniteUtils.setIgniteHome(igniteHome); + + U.warn(null, '"' + IGNITE_HOME + "\" system property was automatically set to " + igniteHome); + } + } + /** * @return Ignite home. * @throws Exception If failed. diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/config/GridTestProperties.java b/modules/core/src/test/java/org/apache/ignite/testframework/config/GridTestProperties.java index edadc65e077..85cbca4c3fb 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/config/GridTestProperties.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/config/GridTestProperties.java @@ -18,9 +18,10 @@ package org.apache.ignite.testframework.config; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.net.URI; +import java.net.URL; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -30,12 +31,13 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.ignite.binary.BinaryBasicNameMapper; import org.apache.ignite.binary.BinaryTypeConfiguration; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.testframework.GridTestUtils; import org.apache.logging.log4j.core.config.Configurator; import org.apache.logging.log4j.core.config.LoggerConfig; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.testframework.GridTestUtils.initTestProjectHome; + /** * Loads test properties from {@code config} folder under tests. * The property structure is as follows: @@ -58,11 +60,17 @@ import org.jetbrains.annotations.Nullable; * </ul> */ public final class GridTestProperties { + /** */ + public static final String DEFAULT_LOG4J_FILE = "log4j2-test.xml"; + /** */ public static final String TESTS_PROP_FILE = "tests.properties"; /** */ - public static final String TESTS_CFG_PATH = "modules/core/src/test/config"; + private static final String TEST_CONFIG_DIR = "/test/config/"; + + /** */ + private static final String TESTS_CFG_PATH = "modules/core/src" + TEST_CONFIG_DIR; /** */ private static final Pattern PROP_REGEX = Pattern.compile("[@$]\\{[^@${}]+\\}"); @@ -93,16 +101,14 @@ public final class GridTestProperties { /** */ static { - // Initialize IGNITE_HOME system property. - U.getIgniteHome(); + initTestProjectHome(); // Load default properties. - File cfgFile = getTestConfigurationFile(null, TESTS_PROP_FILE); + URI cfgFile = getTestConfigurationFile(null, TESTS_PROP_FILE); - assert cfgFile != null && cfgFile.exists(); - assert !cfgFile.isDirectory(); + assert cfgFile != null; - dfltProps = Collections.unmodifiableMap(loadFromFile(new HashMap<String, String>(), cfgFile)); + dfltProps = Collections.unmodifiableMap(loadFromResource(new HashMap<>(), cfgFile)); if ("false".equals(System.getProperty("IGNITE_TEST_PROP_DISABLE_LOG4J", "false"))) { String user = System.getProperty("user.name"); @@ -128,14 +134,14 @@ public final class GridTestProperties { String cfgFile = System.getProperty("IGNITE_TEST_PROP_LOG4J_FILE"); if (cfgFile == null) - cfgFile = "log4j2-test.xml"; + cfgFile = DEFAULT_LOG4J_FILE; - File log4jFile = getTestConfigurationFile(user, cfgFile); + URI log4jFile = getTestConfigurationFile(user, cfgFile); if (log4jFile == null) log4jFile = getTestConfigurationFile(null, cfgFile); - Configurator.initialize(LoggerConfig.ROOT, log4jFile.getAbsolutePath()); + Configurator.initialize(LoggerConfig.ROOT, GridTestProperties.class.getClassLoader(), log4jFile); System.out.println("Configured log4j2 from: " + log4jFile); } @@ -145,6 +151,16 @@ public final class GridTestProperties { // No-op. } + /** */ + public static URI findTestResource(String res) { + URL resUrl = GridTestProperties.class.getResource(TEST_CONFIG_DIR + res); + + if (resUrl == null) + return null; + + return URI.create(resUrl.toExternalForm()); + } + /** * @return Default properties. */ @@ -265,10 +281,10 @@ public final class GridTestProperties { * @return Loaded properties. */ private static Map<String, String> loadProperties(Map<String, String> props, String dir) { - File cfg = getTestConfigurationFile(dir, TESTS_PROP_FILE); + URI cfg = getTestConfigurationFile(dir, TESTS_PROP_FILE); if (cfg != null) - loadFromFile(props, cfg); + loadFromResource(props, cfg); return props; } @@ -278,7 +294,7 @@ public final class GridTestProperties { * @param fileName File name. * @return Configuration file for given user. */ - @Nullable private static File getTestConfigurationFile(@Nullable String user, String fileName) { + @Nullable private static URI getTestConfigurationFile(@Nullable String user, String fileName) { String path = TESTS_CFG_PATH; if (user != null) @@ -291,36 +307,33 @@ public final class GridTestProperties { if (file != null && file.exists()) { assert !file.isDirectory(); - return file; + return file.toURI(); } - return null; + return user == null ? findTestResource(fileName) : null; } /** * @param props Initial properties. - * @param file Property file. + * @param resource File resource location. * @return Loaded properties. */ - private static Map<String, String> loadFromFile(Map<String, String> props, File file) { - try { - - try (InputStream in = new FileInputStream(file)) { - Properties fileProps = new Properties(); + private static Map<String, String> loadFromResource(Map<String, String> props, URI resource) { + try (InputStream in = resource.toURL().openStream()) { + Properties fileProps = new Properties(); - fileProps.load(in); + fileProps.load(in); - for (Entry<Object, Object> prop : fileProps.entrySet()) - props.put((String)prop.getKey(), (String)prop.getValue()); + for (Entry<Object, Object> prop : fileProps.entrySet()) + props.put((String)prop.getKey(), (String)prop.getValue()); - for (Entry<String, String> prop : props.entrySet()) - prop.setValue(substituteProperties(prop.getValue())); - } + for (Entry<String, String> prop : props.entrySet()) + prop.setValue(substituteProperties(prop.getValue())); } catch (IOException e) { e.printStackTrace(); - assert false : "Failed to load test configuration properties: " + file; + assert false : "Failed to load test configuration properties: " + resource; } return props; diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTestSelfTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTestSelfTest.java index 5a7e9bb2c0d..4a031129df4 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTestSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTestSelfTest.java @@ -19,12 +19,27 @@ package org.apache.ignite.testframework.junits.common; import java.util.Arrays; import java.util.HashMap; +import java.util.function.Consumer; +import org.apache.ignite.testframework.config.GridTestProperties; import org.junit.Test; +import static org.apache.ignite.testframework.config.GridTestProperties.findTestResource; + /** * */ public class GridCommonAbstractTestSelfTest extends GridCommonAbstractTest { + /** + * + */ + @Test + public void testResourceLocation() { + Consumer<String> check = (res) -> assertNotNull("Required resource not found: " + res, findTestResource(res)); + + check.accept(GridTestProperties.TESTS_PROP_FILE); + check.accept(GridTestProperties.DEFAULT_LOG4J_FILE); + } + /** * */