Skip to content

Commit 8ac2eec

Browse files
committed
Use internal logging mechanism that prints to stdout if log4j is not configured
1 parent c87c85c commit 8ac2eec

14 files changed

Lines changed: 177 additions & 113 deletions

File tree

core/src/main/java/org/microshed/testing/ApplicationEnvironment.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323
import java.util.ServiceLoader;
2424
import java.util.Set;
2525

26-
import org.slf4j.Logger;
27-
import org.slf4j.LoggerFactory;
26+
import org.microshed.testing.internal.InternalLogger;
2827

2928
/**
3029
* Defines an approach for configuring and starting the test enviornment. Examples of a test environment might be:
@@ -81,15 +80,14 @@ public static ApplicationEnvironment load() {
8180
}
8281
}
8382

84-
Logger LOG = LoggerFactory.getLogger(ApplicationEnvironment.class);
83+
InternalLogger LOG = InternalLogger.get(ApplicationEnvironment.class);
8584

8685
// If nothing explicitly defined in sysprops or env, check ServiceLoader
8786
Set<ApplicationEnvironment> envs = new HashSet<>();
8887
ServiceLoader.load(ApplicationEnvironment.class).forEach(envs::add);
8988
Optional<ApplicationEnvironment> selectedEnv = envs.stream()
9089
.map(env -> {
91-
if (LOG.isDebugEnabled())
92-
LOG.debug("Found ApplicationEnvironment " + env.getClass() + " with priority=" + env.getPriority() + ", available=" + env.isAvailable());
90+
LOG.debug("Found ApplicationEnvironment " + env.getClass() + " with priority=" + env.getPriority() + ", available=" + env.isAvailable());
9391
return env;
9492
})
9593
.filter(env -> env.isAvailable())
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/**
2+
*
3+
*/
4+
package org.microshed.testing.internal;
5+
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
9+
public class InternalLogger {
10+
11+
private static boolean checkedEnabled;
12+
private static boolean loggingEnabled;
13+
14+
private static boolean isLog4jEnabled() {
15+
if (!checkedEnabled) {
16+
checkedEnabled = true;
17+
ClassLoader tccl = Thread.currentThread().getContextClassLoader();
18+
loggingEnabled = tccl.getResource("log4j.properties") != null ||
19+
tccl.getResource("log4j.xml") != null ||
20+
System.getProperty("log4j.configuration") != null;
21+
}
22+
return loggingEnabled;
23+
}
24+
25+
public static InternalLogger get(Class<?> clazz) {
26+
return new InternalLogger(clazz);
27+
}
28+
29+
public final boolean LOG_ENABLED = isLog4jEnabled();
30+
public final Logger log;
31+
32+
private InternalLogger(Class<?> clazz) {
33+
if (LOG_ENABLED)
34+
log = LoggerFactory.getLogger(clazz);
35+
else
36+
log = null;
37+
}
38+
39+
public void debug(String msg) {
40+
if (LOG_ENABLED)
41+
log.debug(msg);
42+
// No-op if SLF4j is not enabled
43+
}
44+
45+
public void debug(String msg, Throwable t) {
46+
if (LOG_ENABLED)
47+
log.debug(msg, t);
48+
// No-op if SLF4j is not enabled
49+
}
50+
51+
public void info(String msg) {
52+
if (LOG_ENABLED)
53+
log.info(msg);
54+
else
55+
System.out.println("[INFO] " + msg);
56+
}
57+
58+
public void warn(String msg) {
59+
if (LOG_ENABLED)
60+
log.warn(msg);
61+
else
62+
System.out.println("[WARN] " + msg);
63+
}
64+
65+
public void warn(String msg, Throwable t) {
66+
if (LOG_ENABLED)
67+
log.warn(msg, t);
68+
else {
69+
System.out.println("[WARN] " + msg);
70+
t.printStackTrace();
71+
}
72+
}
73+
74+
public void error(String msg) {
75+
if (LOG_ENABLED)
76+
log.error(msg);
77+
else
78+
System.out.println("[ERROR] " + msg);
79+
}
80+
81+
public void error(String msg, Throwable t) {
82+
if (LOG_ENABLED)
83+
log.error(msg, t);
84+
else {
85+
System.out.println("[ERROR] " + msg);
86+
t.printStackTrace();
87+
}
88+
}
89+
90+
}

core/src/main/java/org/microshed/testing/jaxrs/JsonBProvider.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,15 @@
3636
import javax.ws.rs.ext.MessageBodyWriter;
3737
import javax.ws.rs.ext.Provider;
3838

39-
import org.slf4j.Logger;
40-
import org.slf4j.LoggerFactory;
39+
import org.microshed.testing.internal.InternalLogger;
4140

4241
@Provider
4342
@Produces({ "*/*" })
4443
@Consumes({ "*/*" })
4544
public class JsonBProvider implements MessageBodyWriter<Object>, MessageBodyReader<Object> {
4645

4746
private static final Jsonb jsonb = JsonbBuilder.create();
48-
private static final Logger LOGGER = LoggerFactory.getLogger(JsonBProvider.class);
47+
private static final InternalLogger LOG = InternalLogger.get(JsonBProvider.class);
4948

5049
@Override
5150
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
@@ -56,7 +55,7 @@ public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotati
5655
public Object readFrom(Class<Object> clazz, Type genericType, Annotation[] annotations,
5756
MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException {
5857
String stringResult = convertStreamToString(entityStream);
59-
LOGGER.info("Response from server: " + stringResult);
58+
LOG.info("Response from server: " + stringResult);
6059
return jsonb.fromJson(stringResult, genericType);
6160
}
6261

@@ -76,7 +75,7 @@ public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotat
7675
public void writeTo(Object obj, Class<?> type, Type genericType, Annotation[] annotations,
7776
MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
7877
String strData = jsonb.toJson(obj);
79-
LOGGER.info("Sending data to server: " + strData);
78+
LOG.info("Sending data to server: " + strData);
8079
jsonb.toJson(obj, entityStream);
8180
}
8281
}

core/src/main/java/org/microshed/testing/jaxrs/RestClientBuilder.java

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,15 @@
3636
import org.junit.platform.commons.support.AnnotationSupport;
3737
import org.junit.platform.commons.support.ReflectionSupport;
3838
import org.microshed.testing.ApplicationEnvironment;
39-
import org.slf4j.Logger;
40-
import org.slf4j.LoggerFactory;
39+
import org.microshed.testing.internal.InternalLogger;
4140

4241
/**
4342
* A builder class for creating REST Client instances based on JAX-RS interfaces
4443
* or concrete classes
4544
*/
4645
public class RestClientBuilder {
4746

48-
static final Logger LOGGER = LoggerFactory.getLogger(RestClientBuilder.class);
47+
private static final InternalLogger LOG = InternalLogger.get(RestClientBuilder.class);
4948

5049
private String appContextRoot;
5150
private String jaxrsPath;
@@ -89,7 +88,7 @@ public RestClientBuilder withJwt(String jwt) {
8988
throw new IllegalArgumentException("Cannot configure JWT and Basic Auth on the same REST client");
9089
this.jwt = jwt;
9190
headers.put("Authorization", "Bearer " + jwt);
92-
LOGGER.debug("Using provided JWT auth header: " + jwt);
91+
LOG.debug("Using provided JWT auth header: " + jwt);
9392
return this;
9493
}
9594

@@ -106,7 +105,7 @@ public RestClientBuilder withBasicAuth(String user, String password) {
106105
String unEncoded = user + ":" + password;
107106
this.basicAuth = Base64.getEncoder().encodeToString(unEncoded.getBytes(StandardCharsets.UTF_8));
108107
headers.put("Authorization", "Basic " + basicAuth);
109-
LOGGER.debug("Using provided Basic auth header: " + unEncoded + " --> " + basicAuth);
108+
LOG.debug("Using provided Basic auth header: " + unEncoded + " --> " + basicAuth);
110109
return this;
111110
}
112111

@@ -119,7 +118,7 @@ public RestClientBuilder withHeader(String key, String value) {
119118
if (jwt != null)
120119
throw new IllegalArgumentException("Cannot configure JWT and Basic Auth on the same REST client");
121120
headers.put(key, value);
122-
LOGGER.debug("Using provided header " + key + "=" + value);
121+
LOG.debug("Using provided header " + key + "=" + value);
123122
return this;
124123
}
125124

@@ -145,7 +144,7 @@ public <T> T build(Class<T> clazz) {
145144

146145
JAXRSClientFactoryBean bean = new org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean();
147146
String basePath = join(appContextRoot, jaxrsPath);
148-
LOGGER.info("Building rest client for " + clazz + " with base path: " + basePath + " and providers: " + providers);
147+
LOG.info("Building rest client for " + clazz + " with base path: " + basePath + " and providers: " + providers);
149148
bean.setResourceClass(clazz);
150149
bean.setProviders(providers);
151150
bean.setAddress(basePath);
@@ -166,14 +165,14 @@ private static String locateApplicationPath(Class<?> clazz) {
166165
AnnotationSupport.isAnnotated(c, ApplicationPath.class),
167166
n -> true);
168167
if (appClasses.size() == 0) {
169-
LOGGER.debug("no classes implementing Application found in pkg: " + resourcePackage);
168+
LOG.debug("no classes implementing Application found in pkg: " + resourcePackage);
170169
// If not found, check under the 3rd package, so com.foo.bar.*
171170
// Classpath scanning can be expensive, so we jump straight to the 3rd package from root instead
172171
// of recursing up one package at a time and scanning the entire CP for each step
173172
String[] pkgs = resourcePackage.split("\\.");
174173
if (pkgs.length > 3) {
175174
String checkPkg = pkgs[0] + '.' + pkgs[1] + '.' + pkgs[2];
176-
LOGGER.debug("checking in pkg: " + checkPkg);
175+
LOG.debug("checking in pkg: " + checkPkg);
177176
appClasses = ReflectionSupport.findAllClassesInPackage(checkPkg,
178177
c -> Application.class.isAssignableFrom(c) &&
179178
AnnotationSupport.isAnnotated(c, ApplicationPath.class),
@@ -182,8 +181,8 @@ private static String locateApplicationPath(Class<?> clazz) {
182181
}
183182

184183
if (appClasses.size() == 0) {
185-
LOGGER.info("No classes implementing 'javax.ws.rs.core.Application' found on classpath to set as context root for " + clazz +
186-
". Defaulting context root to '/'");
184+
LOG.info("No classes implementing 'javax.ws.rs.core.Application' found on classpath to set as context root for " + clazz +
185+
". Defaulting context root to '/'");
187186
return "";
188187
}
189188

@@ -193,11 +192,11 @@ private static String locateApplicationPath(Class<?> clazz) {
193192
.get();
194193
ApplicationPath appPath = AnnotationSupport.findAnnotation(selectedClass, ApplicationPath.class).get();
195194
if (appClasses.size() > 1) {
196-
LOGGER.warn("Found multiple classes implementing 'javax.ws.rs.core.Application' on classpath: " + appClasses +
197-
". Setting context root to the first class discovered (" + selectedClass.getCanonicalName() + ") with path: " +
198-
appPath.value());
195+
LOG.warn("Found multiple classes implementing 'javax.ws.rs.core.Application' on classpath: " + appClasses +
196+
". Setting context root to the first class discovered (" + selectedClass.getCanonicalName() + ") with path: " +
197+
appPath.value());
199198
}
200-
LOGGER.debug("Using ApplicationPath of '" + appPath.value() + "'");
199+
LOG.debug("Using ApplicationPath of '" + appPath.value() + "'");
201200
return appPath.value();
202201
}
203202

core/src/main/java/org/microshed/testing/jupiter/MicroShedTestExtension.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,14 @@
3535
import org.junit.platform.commons.support.AnnotationSupport;
3636
import org.microshed.testing.ApplicationEnvironment;
3737
import org.microshed.testing.SharedContainerConfig;
38+
import org.microshed.testing.internal.InternalLogger;
3839
import org.microshed.testing.jaxrs.BasicAuthConfig;
3940
import org.microshed.testing.jaxrs.RESTClient;
4041
import org.microshed.testing.jaxrs.RestClientBuilder;
4142
import org.microshed.testing.jwt.JwtBuilder;
4243
import org.microshed.testing.jwt.JwtConfig;
4344
import org.microshed.testing.kafka.KafkaConsumerClient;
4445
import org.microshed.testing.kafka.KafkaProducerClient;
45-
import org.slf4j.Logger;
46-
import org.slf4j.LoggerFactory;
4746

4847
/**
4948
* JUnit Jupiter extension that is applied whenever the <code>@MicroProfileTest</code> is used on a test class.
@@ -52,7 +51,7 @@
5251
*/
5352
class MicroShedTestExtension implements BeforeAllCallback {
5453

55-
static final Logger LOG = LoggerFactory.getLogger(MicroShedTestExtension.class);
54+
private static final InternalLogger LOG = InternalLogger.get(MicroShedTestExtension.class);
5655

5756
@Override
5857
public void beforeAll(ExtensionContext context) throws Exception {

modules/liberty/src/main/java/org/testcontainers/containers/liberty/LibertyAdapter.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,17 @@
3131

3232
import org.junit.jupiter.api.extension.ExtensionConfigurationException;
3333
import org.microshed.testing.ApplicationEnvironment;
34+
import org.microshed.testing.internal.InternalLogger;
3435
import org.microshed.testing.testcontainers.ApplicationContainer;
3536
import org.microshed.testing.testcontainers.config.HollowTestcontainersConfiguration;
3637
import org.microshed.testing.testcontainers.config.TestcontainersConfiguration;
3738
import org.microshed.testing.testcontainers.spi.ServerAdapter;
38-
import org.slf4j.Logger;
39-
import org.slf4j.LoggerFactory;
4039
import org.testcontainers.containers.GenericContainer;
4140
import org.testcontainers.images.builder.ImageFromDockerfile;
4241

4342
public class LibertyAdapter implements ServerAdapter {
4443

45-
static final Logger LOG = LoggerFactory.getLogger(LibertyAdapter.class);
44+
static final InternalLogger LOG = InternalLogger.get(LibertyAdapter.class);
4645

4746
private static String BASE_DOCKER_IMAGE = "openliberty/open-liberty:full-java8-openj9-ubi";
4847
private static final String CONFIG_FILE_PROP = "MICROSHED_TEST_LIBERTY_CONFIG_FILE";

modules/quarkus/src/main/java/org/microshed/testing/quarkus/QuarkusConfiguration.java

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,17 @@
2626
import org.junit.jupiter.api.extension.ExtensionConfigurationException;
2727
import org.microshed.testing.ApplicationEnvironment;
2828
import org.microshed.testing.ManuallyStartedConfiguration;
29+
import org.microshed.testing.internal.InternalLogger;
2930
import org.microshed.testing.jupiter.MicroShedTest;
3031
import org.microshed.testing.jwt.JwtBuilder;
3132
import org.microshed.testing.jwt.JwtConfig;
3233
import org.microshed.testing.testcontainers.config.TestcontainersConfiguration;
3334
import org.microshed.testing.testcontainers.internal.ContainerGroup;
34-
import org.slf4j.Logger;
35-
import org.slf4j.LoggerFactory;
3635
import org.testcontainers.containers.GenericContainer;
3736

3837
public class QuarkusConfiguration extends TestcontainersConfiguration {
3938

40-
private static final Logger LOG = LoggerFactory.getLogger(QuarkusConfiguration.class);
39+
private static final InternalLogger LOG = InternalLogger.get(QuarkusConfiguration.class);
4140

4241
@Override
4342
public boolean isAvailable() {
@@ -87,8 +86,7 @@ public String getApplicationURL() {
8786
// String testUrl = (String) TestHTTPResourceManager.getMethod("getUri").invoke(null);
8887
// return testUrl;
8988
} catch (Throwable e) {
90-
if (LOG.isDebugEnabled())
91-
LOG.debug("Unable to determine Quarkus application URL", e);
89+
LOG.debug("Unable to determine Quarkus application URL", e);
9290
return "";
9391
}
9492
}
@@ -140,8 +138,7 @@ private void autoConfigureJwt() {
140138
System.setProperty("mp.jwt.verify.publickey", JwtBuilder.getPublicKey());
141139
System.setProperty("mp.jwt.verify.issuer", JwtConfig.DEFAULT_ISSUER);
142140
System.setProperty("quarkus.smallrye-jwt.enabled", "true");
143-
if (LOG.isDebugEnabled())
144-
LOG.debug("Configuring mp.jwt.verify.publickey=" + JwtBuilder.getPublicKey());
141+
LOG.debug("Configuring mp.jwt.verify.publickey=" + JwtBuilder.getPublicKey());
145142
}
146143

147144
private void autoConfigureDatabases() {
@@ -160,14 +157,11 @@ private void autoConfigureDatabases() {
160157
System.setProperty("quarkus.datasource.url", jdbcUrl);
161158
System.setProperty("quarkus.datasource.username", (String) JdbcContainerClass.getMethod("getUsername").invoke(db));
162159
System.setProperty("quarkus.datasource.password", (String) JdbcContainerClass.getMethod("getPassword").invoke(db));
163-
if (LOG.isInfoEnabled())
164-
LOG.info("Set quarkus.datasource.url to: " + jdbcUrl);
160+
LOG.info("Set quarkus.datasource.url to: " + jdbcUrl);
165161
} else if (jdbcContainers.size() > 1) {
166-
if (LOG.isInfoEnabled())
167-
LOG.info("Located multiple JdbcDatabaseContainer instances. Unable to auto configure quarkus.datasource.* properties");
162+
LOG.info("Located multiple JdbcDatabaseContainer instances. Unable to auto configure quarkus.datasource.* properties");
168163
} else {
169-
if (LOG.isDebugEnabled())
170-
LOG.debug("No JdbcDatabaseContainer instances found in configuration");
164+
LOG.debug("No JdbcDatabaseContainer instances found in configuration");
171165
}
172166
} catch (ClassNotFoundException | LinkageError ignore) {
173167
// Testcontainers JDBC not on the classpath
@@ -190,14 +184,11 @@ private void autoConfigureKafka() {
190184
GenericContainer<?> kafka = kafkaContainers.get(0);
191185
String bootstrapServers = (String) KafkaContainerClass.getMethod("getBootstrapServers").invoke(kafka);
192186
System.setProperty(KAFKA_PROP, bootstrapServers);
193-
if (LOG.isInfoEnabled())
194-
LOG.info("Set " + KAFKA_PROP + "=" + bootstrapServers);
187+
LOG.info("Set " + KAFKA_PROP + "=" + bootstrapServers);
195188
} else if (kafkaContainers.size() > 1) {
196-
if (LOG.isInfoEnabled())
197-
LOG.info("Located multiple KafkaContainer instances. Unable to auto configure '" + KAFKA_PROP + "' property");
189+
LOG.info("Located multiple KafkaContainer instances. Unable to auto configure '" + KAFKA_PROP + "' property");
198190
} else {
199-
if (LOG.isDebugEnabled())
200-
LOG.debug("No KafkaContainer instances found in configuration");
191+
LOG.debug("No KafkaContainer instances found in configuration");
201192
}
202193
} catch (ClassNotFoundException | LinkageError ignore) {
203194
// Testcontainers Kafka not on the classpath
@@ -219,14 +210,11 @@ private void autoConfigureMongoDB() {
219210
GenericContainer<?> mongo = mongoContainers.get(0);
220211
String mongoHost = mongo.getContainerIpAddress() + ':' + mongo.getFirstMappedPort();
221212
System.setProperty("quarkus.mongodb.hosts", mongoHost);
222-
if (LOG.isInfoEnabled())
223-
LOG.info("Set quarkus.mongodb.hosts=" + mongoHost);
213+
LOG.info("Set quarkus.mongodb.hosts=" + mongoHost);
224214
} else if (mongoContainers.size() > 1) {
225-
if (LOG.isInfoEnabled())
226-
LOG.info("Located multiple MongoDB instances. Unable to auto configure 'quarkus.mongodb.hosts' property");
215+
LOG.info("Located multiple MongoDB instances. Unable to auto configure 'quarkus.mongodb.hosts' property");
227216
} else {
228-
if (LOG.isDebugEnabled())
229-
LOG.debug("No KafkaContainer instances found in configuration");
217+
LOG.debug("No KafkaContainer instances found in configuration");
230218
}
231219
} catch (Exception e) {
232220
LOG.debug("Unable to configure Quarkus with MongoDB container", e);

0 commit comments

Comments
 (0)