You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by vy...@apache.org on 2021/07/09 13:38:06 UTC

[logging-log4j2] 02/05: Consolidate ReadOnlyStringMapResolver tests.

This is an automated email from the ASF dual-hosted git repository.

vy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 8ef3a376542139564b1818a992201b63e4efbb22
Author: Volkan Yazici <vo...@gmail.com>
AuthorDate: Wed Jul 7 10:52:28 2021 +0200

    Consolidate ReadOnlyStringMapResolver tests.
---
 .../template/json/JsonTemplateLayoutTest.java      | 341 --------------------
 .../resolver/ReadOnlyStringMapResolverTest.java    | 348 ++++++++++++++++++++-
 2 files changed, 347 insertions(+), 342 deletions(-)

diff --git a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java
index 28ba22d..b2ae188 100644
--- a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java
+++ b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java
@@ -329,47 +329,6 @@ class JsonTemplateLayoutTest {
     }
 
     @Test
-    void test_MapMessage_keyed_access() {
-
-        // Create the event template.
-        final String key = "list";
-        final String eventTemplate = writeJson(asMap(
-                "typedValue", asMap(
-                        "$resolver", "map",
-                        "key", key),
-                "stringifiedValue", asMap(
-                        "$resolver", "map",
-                        "key", key,
-                        "stringified", true)));
-
-        // Create the layout.
-        final JsonTemplateLayout layout = JsonTemplateLayout
-                .newBuilder()
-                .setConfiguration(CONFIGURATION)
-                .setEventTemplate(eventTemplate)
-                .build();
-
-        // Create the log event with a MapMessage.
-        final List<Integer> value = Arrays.asList(1, 2);
-        final StringMapMessage mapMessage = new StringMapMessage()
-                .with(key, value);
-        final LogEvent logEvent = Log4jLogEvent
-                .newBuilder()
-                .setLoggerName(LOGGER_NAME)
-                .setLevel(Level.INFO)
-                .setMessage(mapMessage)
-                .setTimeMillis(System.currentTimeMillis())
-                .build();
-
-        // Check the serialized event.
-        usingSerializedLogEventAccessor(layout, logEvent, accessor -> {
-            assertThat(accessor.getObject("typedValue")).isEqualTo(value);
-            assertThat(accessor.getString("stringifiedValue")).isEqualTo(String.valueOf(value));
-        });
-
-    }
-
-    @Test
     void test_message_fallbackKey() {
 
         // Create the event template.
@@ -707,306 +666,6 @@ class JsonTemplateLayoutTest {
     }
 
     @Test
-    void test_mdc_key_access() {
-
-        // Create the log event.
-        final SimpleMessage message = new SimpleMessage("Hello, World!");
-        final StringMap contextData = new SortedArrayStringMap();
-        final String mdcDirectlyAccessedKey = "mdcKey1";
-        final String mdcDirectlyAccessedValue = "mdcValue1";
-        contextData.putValue(mdcDirectlyAccessedKey, mdcDirectlyAccessedValue);
-        final String mdcDirectlyAccessedNullPropertyKey = "mdcKey2";
-        contextData.putValue(mdcDirectlyAccessedNullPropertyKey, null);
-        final LogEvent logEvent = Log4jLogEvent
-                .newBuilder()
-                .setLoggerName(LOGGER_NAME)
-                .setLevel(Level.INFO)
-                .setMessage(message)
-                .setContextData(contextData)
-                .build();
-
-        // Check the serialized event.
-        testReadOnlyStringMapKeyAccess(
-                mdcDirectlyAccessedKey,
-                mdcDirectlyAccessedValue,
-                mdcDirectlyAccessedNullPropertyKey,
-                logEvent,
-                "mdc");
-
-    }
-
-    @Test
-    public void test_map_key_access() {
-
-        // Create the log event.
-        final String directlyAccessedKey = "mapKey1";
-        final String directlyAccessedValue = "mapValue1";
-        final String directlyAccessedNullPropertyKey = "mapKey2";
-        final Message message = new StringMapMessage()
-                .with(directlyAccessedKey, directlyAccessedValue);
-        final LogEvent logEvent = Log4jLogEvent
-                .newBuilder()
-                .setLoggerName(LOGGER_NAME)
-                .setLevel(Level.INFO)
-                .setMessage(message)
-                .build();
-
-        // Check the serialized event.
-        testReadOnlyStringMapKeyAccess(
-                directlyAccessedKey,
-                directlyAccessedValue,
-                directlyAccessedNullPropertyKey,
-                logEvent,
-                "map");
-
-    }
-
-    private static void testReadOnlyStringMapKeyAccess(
-            final String directlyAccessedKey,
-            final String directlyAccessedValue,
-            final String directlyAccessedNullPropertyKey,
-            final LogEvent logEvent,
-            final String resolverName) {
-
-        // Create the event template.
-        String eventTemplate = writeJson(asMap(
-                directlyAccessedKey, asMap(
-                        "$resolver", resolverName,
-                        "key", directlyAccessedKey),
-                directlyAccessedNullPropertyKey, asMap(
-                        "$resolver", resolverName,
-                        "key", directlyAccessedNullPropertyKey)));
-
-        // Create the layout.
-        final JsonTemplateLayout layout = JsonTemplateLayout
-                .newBuilder()
-                .setConfiguration(CONFIGURATION)
-                .setStackTraceEnabled(true)
-                .setEventTemplate(eventTemplate)
-                .build();
-
-        // Check the serialized event.
-        usingSerializedLogEventAccessor(layout, logEvent, accessor -> {
-            assertThat(accessor.getString(directlyAccessedKey)).isEqualTo(directlyAccessedValue);
-            assertThat(accessor.getString(directlyAccessedNullPropertyKey)).isNull();
-        });
-
-    }
-
-    @Test
-    void test_mdc_pattern() {
-
-        // Create the log event.
-        final SimpleMessage message = new SimpleMessage("Hello, World!");
-        final StringMap contextData = new SortedArrayStringMap();
-        final String mdcPatternMatchedKey = "mdcKey1";
-        final String mdcPatternMatchedValue = "mdcValue1";
-        contextData.putValue(mdcPatternMatchedKey, mdcPatternMatchedValue);
-        final String mdcPatternMismatchedKey = "mdcKey2";
-        final String mdcPatternMismatchedValue = "mdcValue2";
-        contextData.putValue(mdcPatternMismatchedKey, mdcPatternMismatchedValue);
-        final LogEvent logEvent = Log4jLogEvent
-                .newBuilder()
-                .setLoggerName(LOGGER_NAME)
-                .setLevel(Level.INFO)
-                .setMessage(message)
-                .setContextData(contextData)
-                .build();
-
-        // Check the serialized event.
-        testReadOnlyStringMapPattern(
-                mdcPatternMatchedKey,
-                mdcPatternMatchedValue,
-                mdcPatternMismatchedKey,
-                logEvent,
-                "mdc");
-
-    }
-
-    @Test
-    public void test_map_pattern() {
-
-        // Create the log event.
-        final String patternMatchedKey = "mapKey1";
-        final String patternMatchedValue = "mapValue1";
-        final String patternMismatchedKey = "mapKey2";
-        final String patternMismatchedValue = "mapValue2";
-        final Message message = new StringMapMessage()
-                .with(patternMatchedKey, patternMatchedValue)
-                .with(patternMismatchedKey, patternMismatchedValue);
-        final LogEvent logEvent = Log4jLogEvent
-                .newBuilder()
-                .setLoggerName(LOGGER_NAME)
-                .setLevel(Level.INFO)
-                .setMessage(message)
-                .build();
-
-        // Check the serialized event.
-        testReadOnlyStringMapPattern(
-                patternMatchedKey,
-                patternMatchedValue,
-                patternMismatchedKey,
-                logEvent,
-                "map");
-
-    }
-
-    private static void testReadOnlyStringMapPattern(
-            final String patternMatchedKey,
-            final String patternMatchedValue,
-            final String patternMismatchedKey,
-            final LogEvent logEvent,
-            final String resolverName) {
-
-        // Create the event template.
-        final String mapFieldName = "map";
-        final String eventTemplate = writeJson(asMap(
-                mapFieldName, asMap(
-                        "$resolver", resolverName,
-                        "pattern", patternMatchedKey)));
-
-        // Create the layout.
-        final JsonTemplateLayout layout = JsonTemplateLayout
-                .newBuilder()
-                .setConfiguration(CONFIGURATION)
-                .setStackTraceEnabled(true)
-                .setEventTemplate(eventTemplate)
-                .build();
-
-        // Check the serialized event.
-        usingSerializedLogEventAccessor(layout, logEvent, accessor -> {
-            assertThat(accessor.getString(new String[]{mapFieldName, patternMatchedKey})).isEqualTo(patternMatchedValue);
-            assertThat(accessor.exists(new String[]{mapFieldName, patternMismatchedKey})).isFalse();
-        });
-
-    }
-
-    @Test
-    void test_mdc_flatten() {
-
-        // Create the log event.
-        final SimpleMessage message = new SimpleMessage("Hello, World!");
-        final StringMap contextData = new SortedArrayStringMap();
-        final String mdcPatternMatchedKey = "mdcKey1";
-        final String mdcPatternMatchedValue = "mdcValue1";
-        contextData.putValue(mdcPatternMatchedKey, mdcPatternMatchedValue);
-        final String mdcPatternMismatchedKey = "mdcKey2";
-        final String mdcPatternMismatchedValue = "mdcValue2";
-        contextData.putValue(mdcPatternMismatchedKey, mdcPatternMismatchedValue);
-        final LogEvent logEvent = Log4jLogEvent
-                .newBuilder()
-                .setLoggerName(LOGGER_NAME)
-                .setLevel(Level.INFO)
-                .setMessage(message)
-                .setContextData(contextData)
-                .build();
-
-        // Check the serialized event.
-        testReadOnlyStringMapFlatten(
-                mdcPatternMatchedKey,
-                mdcPatternMatchedValue,
-                mdcPatternMismatchedKey,
-                logEvent,
-                "mdc");
-
-    }
-
-    @Test
-    public void test_map_flatten() {
-
-        // Create the log event.
-        final String patternMatchedKey = "mapKey1";
-        final String patternMatchedValue = "mapValue1";
-        final String patternMismatchedKey = "mapKey2";
-        final String patternMismatchedValue = "mapValue2";
-        final Message message = new StringMapMessage()
-                .with(patternMatchedKey, patternMatchedValue)
-                .with(patternMismatchedKey, patternMismatchedValue);
-        final LogEvent logEvent = Log4jLogEvent
-                .newBuilder()
-                .setLoggerName(LOGGER_NAME)
-                .setLevel(Level.INFO)
-                .setMessage(message)
-                .build();
-
-        // Check the serialized event.
-        testReadOnlyStringMapFlatten(
-                patternMatchedKey,
-                patternMatchedValue,
-                patternMismatchedKey,
-                logEvent,
-                "map");
-
-    }
-
-    private static void testReadOnlyStringMapFlatten(
-            final String patternMatchedKey,
-            final String patternMatchedValue,
-            final String patternMismatchedKey,
-            final LogEvent logEvent,
-            final String resolverName) {
-
-        // Create the event template.
-        final String prefix = "_map.";
-        final String eventTemplate = writeJson(asMap(
-                "ignoredFieldName", asMap(
-                        "$resolver", resolverName,
-                        "pattern", patternMatchedKey,
-                        "flatten", asMap("prefix", prefix))));
-
-        // Create the layout.
-        final JsonTemplateLayout layout = JsonTemplateLayout
-                .newBuilder()
-                .setConfiguration(CONFIGURATION)
-                .setStackTraceEnabled(true)
-                .setEventTemplate(eventTemplate)
-                .build();
-
-        // Check the serialized event.
-        usingSerializedLogEventAccessor(layout, logEvent, accessor -> {
-            assertThat(accessor.getString(prefix + patternMatchedKey)).isEqualTo(patternMatchedValue);
-            assertThat(accessor.exists(prefix + patternMismatchedKey)).isFalse();
-        });
-
-    }
-
-    @Test
-    void test_MapResolver() {
-
-        // Create the log event.
-        final StringMapMessage message = new StringMapMessage().with("key1", "val1");
-        final LogEvent logEvent = Log4jLogEvent
-                .newBuilder()
-                .setLoggerName(LOGGER_NAME)
-                .setLevel(Level.INFO)
-                .setMessage(message)
-                .build();
-
-        // Create the event template node with map values.
-        final String eventTemplate = writeJson(asMap(
-                "mapValue1", asMap(
-                        "$resolver", "map",
-                        "key", "key1"),
-                "mapValue2", asMap(
-                        "$resolver", "map",
-                        "key", "key?")));
-
-        // Create the layout.
-        final JsonTemplateLayout layout = JsonTemplateLayout
-                .newBuilder()
-                .setConfiguration(CONFIGURATION)
-                .setEventTemplate(eventTemplate)
-                .build();
-
-        // Check serialized event.
-        usingSerializedLogEventAccessor(layout, logEvent, accessor -> {
-            assertThat(accessor.getString("mapValue1")).isEqualTo("val1");
-            assertThat(accessor.getString("mapValue2")).isNull();
-        });
-
-    }
-
-    @Test
     void test_StringMapMessage() {
 
         // Create the log event.
diff --git a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/resolver/ReadOnlyStringMapResolverTest.java b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/resolver/ReadOnlyStringMapResolverTest.java
index baaedef..921e153 100644
--- a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/resolver/ReadOnlyStringMapResolverTest.java
+++ b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/resolver/ReadOnlyStringMapResolverTest.java
@@ -1,13 +1,34 @@
+/*
+ * 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.apache.logging.log4j.layout.template.json.resolver;
 
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.layout.template.json.JsonTemplateLayout;
+import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.message.SimpleMessage;
+import org.apache.logging.log4j.message.StringMapMessage;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
 import org.apache.logging.log4j.util.StringMap;
 import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.util.Arrays;
+import java.util.List;
 import java.util.regex.PatternSyntaxException;
 
 import static org.apache.logging.log4j.layout.template.json.TestHelpers.*;
@@ -57,7 +78,7 @@ class ReadOnlyStringMapResolverTest {
                 "replacement cannot be provided without a pattern");
     }
 
-    private void verifyConfigFailure(
+    private static void verifyConfigFailure(
             final String eventTemplate,
             final Class<? extends Throwable> failureClass,
             final String failureMessage) {
@@ -104,4 +125,329 @@ class ReadOnlyStringMapResolverTest {
 
     }
 
+    @Test
+    void test_mdc_key_access() {
+
+        // Create the log event.
+        final SimpleMessage message = new SimpleMessage("Hello, World!");
+        final StringMap contextData = new SortedArrayStringMap();
+        final String mdcDirectlyAccessedKey = "mdcKey1";
+        final String mdcDirectlyAccessedValue = "mdcValue1";
+        contextData.putValue(mdcDirectlyAccessedKey, mdcDirectlyAccessedValue);
+        final String mdcDirectlyAccessedNullPropertyKey = "mdcKey2";
+        contextData.putValue(mdcDirectlyAccessedNullPropertyKey, null);
+        final LogEvent logEvent = Log4jLogEvent
+                .newBuilder()
+                .setMessage(message)
+                .setContextData(contextData)
+                .build();
+
+        // Check the serialized event.
+        testReadOnlyStringMapKeyAccess(
+                mdcDirectlyAccessedKey,
+                mdcDirectlyAccessedValue,
+                mdcDirectlyAccessedNullPropertyKey,
+                logEvent,
+                "mdc");
+
+    }
+
+    @Test
+    public void test_map_key_access() {
+
+        // Create the log event.
+        final String directlyAccessedKey = "mapKey1";
+        final String directlyAccessedValue = "mapValue1";
+        final String directlyAccessedNullPropertyKey = "mapKey2";
+        final Message message = new StringMapMessage()
+                .with(directlyAccessedKey, directlyAccessedValue);
+        final LogEvent logEvent = Log4jLogEvent
+                .newBuilder()
+                .setMessage(message)
+                .build();
+
+        // Check the serialized event.
+        testReadOnlyStringMapKeyAccess(
+                directlyAccessedKey,
+                directlyAccessedValue,
+                directlyAccessedNullPropertyKey,
+                logEvent,
+                "map");
+
+    }
+
+    private static void testReadOnlyStringMapKeyAccess(
+            final String directlyAccessedKey,
+            final String directlyAccessedValue,
+            final String directlyAccessedNullPropertyKey,
+            final LogEvent logEvent,
+            final String resolverName) {
+
+        // Create the event template.
+        String eventTemplate = writeJson(asMap(
+                directlyAccessedKey, asMap(
+                        "$resolver", resolverName,
+                        "key", directlyAccessedKey),
+                directlyAccessedNullPropertyKey, asMap(
+                        "$resolver", resolverName,
+                        "key", directlyAccessedNullPropertyKey)));
+
+        // Create the layout.
+        final JsonTemplateLayout layout = JsonTemplateLayout
+                .newBuilder()
+                .setConfiguration(CONFIGURATION)
+                .setStackTraceEnabled(true)
+                .setEventTemplate(eventTemplate)
+                .build();
+
+        // Check the serialized event.
+        usingSerializedLogEventAccessor(layout, logEvent, accessor -> {
+            assertThat(accessor.getString(directlyAccessedKey)).isEqualTo(directlyAccessedValue);
+            assertThat(accessor.getString(directlyAccessedNullPropertyKey)).isNull();
+        });
+
+    }
+
+    @Test
+    void test_mdc_pattern() {
+
+        // Create the log event.
+        final SimpleMessage message = new SimpleMessage("Hello, World!");
+        final StringMap contextData = new SortedArrayStringMap();
+        final String mdcPatternMatchedKey = "mdcKey1";
+        final String mdcPatternMatchedValue = "mdcValue1";
+        contextData.putValue(mdcPatternMatchedKey, mdcPatternMatchedValue);
+        final String mdcPatternMismatchedKey = "mdcKey2";
+        final String mdcPatternMismatchedValue = "mdcValue2";
+        contextData.putValue(mdcPatternMismatchedKey, mdcPatternMismatchedValue);
+        final LogEvent logEvent = Log4jLogEvent
+                .newBuilder()
+                .setMessage(message)
+                .setContextData(contextData)
+                .build();
+
+        // Check the serialized event.
+        testReadOnlyStringMapPattern(
+                mdcPatternMatchedKey,
+                mdcPatternMatchedValue,
+                mdcPatternMismatchedKey,
+                logEvent,
+                "mdc");
+
+    }
+
+    @Test
+    public void test_map_pattern() {
+
+        // Create the log event.
+        final String patternMatchedKey = "mapKey1";
+        final String patternMatchedValue = "mapValue1";
+        final String patternMismatchedKey = "mapKey2";
+        final String patternMismatchedValue = "mapValue2";
+        final Message message = new StringMapMessage()
+                .with(patternMatchedKey, patternMatchedValue)
+                .with(patternMismatchedKey, patternMismatchedValue);
+        final LogEvent logEvent = Log4jLogEvent
+                .newBuilder()
+                .setMessage(message)
+                .build();
+
+        // Check the serialized event.
+        testReadOnlyStringMapPattern(
+                patternMatchedKey,
+                patternMatchedValue,
+                patternMismatchedKey,
+                logEvent,
+                "map");
+
+    }
+
+    private static void testReadOnlyStringMapPattern(
+            final String patternMatchedKey,
+            final String patternMatchedValue,
+            final String patternMismatchedKey,
+            final LogEvent logEvent,
+            final String resolverName) {
+
+        // Create the event template.
+        final String mapFieldName = "map";
+        final String eventTemplate = writeJson(asMap(
+                mapFieldName, asMap(
+                        "$resolver", resolverName,
+                        "pattern", patternMatchedKey)));
+
+        // Create the layout.
+        final JsonTemplateLayout layout = JsonTemplateLayout
+                .newBuilder()
+                .setConfiguration(CONFIGURATION)
+                .setStackTraceEnabled(true)
+                .setEventTemplate(eventTemplate)
+                .build();
+
+        // Check the serialized event.
+        usingSerializedLogEventAccessor(layout, logEvent, accessor -> {
+            assertThat(accessor.getString(new String[]{mapFieldName, patternMatchedKey})).isEqualTo(patternMatchedValue);
+            assertThat(accessor.exists(new String[]{mapFieldName, patternMismatchedKey})).isFalse();
+        });
+
+    }
+
+    @Test
+    void test_mdc_flatten() {
+
+        // Create the log event.
+        final SimpleMessage message = new SimpleMessage("Hello, World!");
+        final StringMap contextData = new SortedArrayStringMap();
+        final String mdcPatternMatchedKey = "mdcKey1";
+        final String mdcPatternMatchedValue = "mdcValue1";
+        contextData.putValue(mdcPatternMatchedKey, mdcPatternMatchedValue);
+        final String mdcPatternMismatchedKey = "mdcKey2";
+        final String mdcPatternMismatchedValue = "mdcValue2";
+        contextData.putValue(mdcPatternMismatchedKey, mdcPatternMismatchedValue);
+        final LogEvent logEvent = Log4jLogEvent
+                .newBuilder()
+                .setMessage(message)
+                .setContextData(contextData)
+                .build();
+
+        // Check the serialized event.
+        testReadOnlyStringMapFlatten(
+                mdcPatternMatchedKey,
+                mdcPatternMatchedValue,
+                mdcPatternMismatchedKey,
+                logEvent,
+                "mdc");
+
+    }
+
+    @Test
+    public void test_map_flatten() {
+
+        // Create the log event.
+        final String patternMatchedKey = "mapKey1";
+        final String patternMatchedValue = "mapValue1";
+        final String patternMismatchedKey = "mapKey2";
+        final String patternMismatchedValue = "mapValue2";
+        final Message message = new StringMapMessage()
+                .with(patternMatchedKey, patternMatchedValue)
+                .with(patternMismatchedKey, patternMismatchedValue);
+        final LogEvent logEvent = Log4jLogEvent
+                .newBuilder()
+                .setMessage(message)
+                .build();
+
+        // Check the serialized event.
+        testReadOnlyStringMapFlatten(
+                patternMatchedKey,
+                patternMatchedValue,
+                patternMismatchedKey,
+                logEvent,
+                "map");
+
+    }
+
+    private static void testReadOnlyStringMapFlatten(
+            final String patternMatchedKey,
+            final String patternMatchedValue,
+            final String patternMismatchedKey,
+            final LogEvent logEvent,
+            final String resolverName) {
+
+        // Create the event template.
+        final String prefix = "_map.";
+        final String eventTemplate = writeJson(asMap(
+                "ignoredFieldName", asMap(
+                        "$resolver", resolverName,
+                        "pattern", patternMatchedKey,
+                        "flatten", asMap("prefix", prefix))));
+
+        // Create the layout.
+        final JsonTemplateLayout layout = JsonTemplateLayout
+                .newBuilder()
+                .setConfiguration(CONFIGURATION)
+                .setStackTraceEnabled(true)
+                .setEventTemplate(eventTemplate)
+                .build();
+
+        // Check the serialized event.
+        usingSerializedLogEventAccessor(layout, logEvent, accessor -> {
+            assertThat(accessor.getString(prefix + patternMatchedKey)).isEqualTo(patternMatchedValue);
+            assertThat(accessor.exists(prefix + patternMismatchedKey)).isFalse();
+        });
+
+    }
+
+    @Test
+    void test_MapResolver() {
+
+        // Create the log event.
+        final StringMapMessage message = new StringMapMessage().with("key1", "val1");
+        final LogEvent logEvent = Log4jLogEvent
+                .newBuilder()
+                .setMessage(message)
+                .build();
+
+        // Create the event template node with map values.
+        final String eventTemplate = writeJson(asMap(
+                "mapValue1", asMap(
+                        "$resolver", "map",
+                        "key", "key1"),
+                "mapValue2", asMap(
+                        "$resolver", "map",
+                        "key", "key?")));
+
+        // Create the layout.
+        final JsonTemplateLayout layout = JsonTemplateLayout
+                .newBuilder()
+                .setConfiguration(CONFIGURATION)
+                .setEventTemplate(eventTemplate)
+                .build();
+
+        // Check serialized event.
+        usingSerializedLogEventAccessor(layout, logEvent, accessor -> {
+            assertThat(accessor.getString("mapValue1")).isEqualTo("val1");
+            assertThat(accessor.getString("mapValue2")).isNull();
+        });
+
+    }
+
+    @Test
+    void test_MapMessage_keyed_access() {
+
+        // Create the event template.
+        final String key = "list";
+        final String eventTemplate = writeJson(asMap(
+                "typedValue", asMap(
+                        "$resolver", "map",
+                        "key", key),
+                "stringifiedValue", asMap(
+                        "$resolver", "map",
+                        "key", key,
+                        "stringified", true)));
+
+        // Create the layout.
+        final JsonTemplateLayout layout = JsonTemplateLayout
+                .newBuilder()
+                .setConfiguration(CONFIGURATION)
+                .setEventTemplate(eventTemplate)
+                .build();
+
+        // Create the log event with a MapMessage.
+        final List<Integer> value = Arrays.asList(1, 2);
+        final StringMapMessage mapMessage = new StringMapMessage()
+                .with(key, value);
+        final LogEvent logEvent = Log4jLogEvent
+                .newBuilder()
+                .setMessage(mapMessage)
+                .setTimeMillis(System.currentTimeMillis())
+                .build();
+
+        // Check the serialized event.
+        usingSerializedLogEventAccessor(layout, logEvent, accessor -> {
+            assertThat(accessor.getObject("typedValue")).isEqualTo(value);
+            assertThat(accessor.getString("stringifiedValue")).isEqualTo(String.valueOf(value));
+        });
+
+    }
+
 }