[Thanks so much for the prompt reply @Ralph.]

In the plugin, I have certain behavior triggered by constants:

    if (Constants.ENABLE_THREADLOCALS) {
        return toJsonViaTla(logEvent);
    } else {
        return toJsonViaObjectPool(logEvent);
    }

To evaluate each case, I repeat my JUnit 4 tests as follows:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <skip>true</skip>
        </configuration>
        <executions>
            <!-- TLA-enabled execution -->
            <execution>
                <id>tla-enabled</id>
                <goals>
                    <goal>test</goal>
                </goals>
                <configuration>
                    <skip>${maven.test.skip}</skip>
                    <systemPropertyVariables>

<log4j2.enable.threadlocals>true</log4j2.enable.threadlocals>
                        <log4j2.is.webapp>false</log4j2.is.webapp>
                    </systemPropertyVariables>
                </configuration>
            </execution>
            <!-- TLA-disabled execution -->
            <execution>
                <id>tla-disabled</id>
                <goals>
                    <goal>test</goal>
                </goals>
                <configuration>
                    <skip>${maven.test.skip}</skip>
                    <systemPropertyVariables>

<log4j2.enable.threadlocals>false</log4j2.enable.threadlocals>
                        <log4j2.is.webapp>true</log4j2.is.webapp>
                    </systemPropertyVariables>
                </configuration>
            </execution>
        </executions>
    </plugin>

Prior to settling on a solution with maven-surefire-plugin, I tried
the following failed attempt:

    class PluginTest {

        @Test
        public void test_tla_triggered_behavior() {
            ...
        }

    }

    public class TlaEnabledPluginTest extends PluginTest {

        static {
            enableTla();
        }

        @BeforeClass
        public static void enableTla() {
            System.setProperty("log4j2.enable.threadlocals", "true");
            System.setProperty("log4j2.is.webapp", "false");
        }

    }

    public class TlaDisabledPluginTest extends PluginTest {

        static {
            disableTla();
        }

        @BeforeClass
        public static void disableTla() {
            System.setProperty("log4j2.enable.threadlocals", "false");
            System.setProperty("log4j2.is.webapp", "true");
        }

    }

Putting the failure of this approach aside, it also another
shortcoming: one cannot execute individual @Test methods in IDE.

Rather than all these hacks, I wish I would have received the
TLA-enabled flag in a Constants object placed within
l.core.config.Configuration that is injected into the plugin builder.
This way I could have reused my test methods with just different
Configuration parameters:

    if (config.getConstants().isTlaEnabled()) {
        return toJsonViaTla(logEvent);
    } else {
        return toJsonViaObjectPool(logEvent);
    }

    public class PluginTest {

        @Test
        public void test_tla_triggered_behavior() {

            Configuration tlaEnabledConfiguration = new DefaultConfiguration();
            tlaEnabledConfiguration.getConstants().setTlaEnabled(true);
            test_tla_triggered_behavior(tlaEnabledConfiguration);

            Configuration tlaDisabledConfiguration = new DefaultConfiguration();
            tlaEnabledConfiguration.getConstants().setTlaEnabled(false);
            test_tla_triggered_behavior(tlaDisabledConfiguration);
        }

        private void test_tla_triggered_behavior(Cofiguration config) {
            ...
        }

    }

Is this sufficient to demonstrate my case?

On Tue, Dec 31, 2019 at 10:52 PM Ralph Goers <ralph.go...@dslextreme.com> wrote:
>
> Can you provide a PR that demonstrates what you would like to do?  It is 
> easier for me to evaluate the pros and cons of that then guessing what the 
> implementation would look like.
>
> Ralph
>
> > On Dec 31, 2019, at 2:43 PM, Volkan Yazıcı <volkan.yaz...@gmail.com> wrote:
> >
> > A majority of the Log4j 2.0 constants are structured by means of
> > "public final" fields initialized via system properties. While this
> > serves great for accessibility, IMHO, becomes an obstacle for tests.
> > For instance, I have needed two maven-surefire-plugin executions for
> > log4j2-logstash-layout: one with TLA enabled and another one with TLA
> > disabled. I have tried invoking System.setProperty() to influence
> > these constants for tests via both "static { }" blocks and
> > @BeforeClass methods, but neither kicks in earlier than the Log4j
> > constant class initialization itself. Is it just me that couldn't get
> > it working or this approach indeed hampers testing? If the latter, for
> > Log4j 3.0, I propose using injection to pass configuration state
> > rather than accessing it via globals.
> >
>
>

Reply via email to