From 9f091156e66eaf5b842b76dba0b977ad3a5d4013 Mon Sep 17 00:00:00 2001 From: Levin Kerschberger Date: Mon, 9 Sep 2024 15:59:31 +0200 Subject: [PATCH] test: added tests for MatcherChainBuilder and CustomElementMatchers --- .../matcher/CustomElementMatchers.java | 5 + ...nBuilder.java => MatcherChainBuilder.java} | 10 +- .../agent/resolver/scope/ScopeResolver.java | 6 +- .../resolver/ConfigurationResolverTest.java | 2 +- .../matcher/CustomElementMatchersTest.java | 29 ++++ .../matcher/MatcherChainBuilderTest.java | 137 ++++++++++++++++++ 6 files changed, 184 insertions(+), 5 deletions(-) rename src/main/java/rocks/inspectit/gepard/agent/resolver/matcher/{MethodMatcherChainBuilder.java => MatcherChainBuilder.java} (77%) create mode 100644 src/test/java/rocks/inspectit/gepard/agent/resolver/matcher/CustomElementMatchersTest.java create mode 100644 src/test/java/rocks/inspectit/gepard/agent/resolver/matcher/MatcherChainBuilderTest.java diff --git a/src/main/java/rocks/inspectit/gepard/agent/resolver/matcher/CustomElementMatchers.java b/src/main/java/rocks/inspectit/gepard/agent/resolver/matcher/CustomElementMatchers.java index 35a628d..17e3805 100644 --- a/src/main/java/rocks/inspectit/gepard/agent/resolver/matcher/CustomElementMatchers.java +++ b/src/main/java/rocks/inspectit/gepard/agent/resolver/matcher/CustomElementMatchers.java @@ -22,6 +22,11 @@ public class CustomElementMatchers { * the name settings are available. */ public static ElementMatcher.Junction nameIs(String methodName) { + + if(methodName.isEmpty()){ + return null; + } + return new NameMatcher<>(new StringMatcher(methodName, StringMatcher.Mode.EQUALS_FULLY)); } } diff --git a/src/main/java/rocks/inspectit/gepard/agent/resolver/matcher/MethodMatcherChainBuilder.java b/src/main/java/rocks/inspectit/gepard/agent/resolver/matcher/MatcherChainBuilder.java similarity index 77% rename from src/main/java/rocks/inspectit/gepard/agent/resolver/matcher/MethodMatcherChainBuilder.java rename to src/main/java/rocks/inspectit/gepard/agent/resolver/matcher/MatcherChainBuilder.java index aed6fdb..6f5ed33 100644 --- a/src/main/java/rocks/inspectit/gepard/agent/resolver/matcher/MethodMatcherChainBuilder.java +++ b/src/main/java/rocks/inspectit/gepard/agent/resolver/matcher/MatcherChainBuilder.java @@ -5,13 +5,21 @@ import net.bytebuddy.matcher.ElementMatcher; /** + * This class is a copy InspectIT Ocelot: + * MatcherChainBuilder + * + *

Original Author: The InspectIT Ocelot team + * + *

Date Copied: 09.09.2024 + * Helper class for building and linking {@link ElementMatcher}s. All methods are null-safe. Adding * a null matcher will not have an effect on the matcher in construction. * * @param The matchers generic type. Most of the time it will be TypeDescription or * MethodDescription. */ -public class MethodMatcherChainBuilder { +public class MatcherChainBuilder { private ElementMatcher.Junction matcher = null; diff --git a/src/main/java/rocks/inspectit/gepard/agent/resolver/scope/ScopeResolver.java b/src/main/java/rocks/inspectit/gepard/agent/resolver/scope/ScopeResolver.java index a6d13ea..a1e8849 100644 --- a/src/main/java/rocks/inspectit/gepard/agent/resolver/scope/ScopeResolver.java +++ b/src/main/java/rocks/inspectit/gepard/agent/resolver/scope/ScopeResolver.java @@ -10,7 +10,7 @@ import rocks.inspectit.gepard.agent.internal.configuration.model.instrumentation.Scope; import rocks.inspectit.gepard.agent.resolver.ConfigurationHolder; import rocks.inspectit.gepard.agent.resolver.matcher.CustomElementMatchers; -import rocks.inspectit.gepard.agent.resolver.matcher.MethodMatcherChainBuilder; +import rocks.inspectit.gepard.agent.resolver.matcher.MatcherChainBuilder; /** * This class is used to resolve the {@link Scope} based on the {@link Scope} List, contained in the @@ -100,8 +100,8 @@ private List collectMethodNames(List scopes) { */ private ElementMatcher.Junction buildMatcherForMethods( List methodNames) { - MethodMatcherChainBuilder matcherChainBuilder = - new MethodMatcherChainBuilder<>(); + MatcherChainBuilder matcherChainBuilder = + new MatcherChainBuilder<>(); methodNames.forEach( methodName -> matcherChainBuilder.or(CustomElementMatchers.nameIs(methodName))); return matcherChainBuilder.build(); diff --git a/src/test/java/rocks/inspectit/gepard/agent/resolver/ConfigurationResolverTest.java b/src/test/java/rocks/inspectit/gepard/agent/resolver/ConfigurationResolverTest.java index d258ab2..5500c6f 100644 --- a/src/test/java/rocks/inspectit/gepard/agent/resolver/ConfigurationResolverTest.java +++ b/src/test/java/rocks/inspectit/gepard/agent/resolver/ConfigurationResolverTest.java @@ -136,7 +136,7 @@ private InspectitConfiguration createConfiguration(List scopes) { * * @param enabled the status of the scope for this test class * @param methodNames the method names to be instrumented - * @return the scope with the current class as scope + * @return the scope with the current class as fqn */ private Scope createScope(boolean enabled, List methodNames) { return new Scope(TEST_TYPE.getName(), methodNames, enabled); diff --git a/src/test/java/rocks/inspectit/gepard/agent/resolver/matcher/CustomElementMatchersTest.java b/src/test/java/rocks/inspectit/gepard/agent/resolver/matcher/CustomElementMatchersTest.java new file mode 100644 index 0000000..47a6b71 --- /dev/null +++ b/src/test/java/rocks/inspectit/gepard/agent/resolver/matcher/CustomElementMatchersTest.java @@ -0,0 +1,29 @@ +package rocks.inspectit.gepard.agent.resolver.matcher; + +import net.bytebuddy.description.NamedElement; +import net.bytebuddy.matcher.ElementMatcher; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class CustomElementMatchersTest { + @Nested + public class NameIs { + + @Test + public void emptyNameReturnsNull() { + String method = ""; + ElementMatcher.Junction result = CustomElementMatchers.nameIs(method); + assertNull(result); + } + + @Test + public void validNameMatcherIsReturned () { + String method = "testMethod"; + ElementMatcher.Junction result = CustomElementMatchers.nameIs(method); + assertNotNull(result); + } + } + +} \ No newline at end of file diff --git a/src/test/java/rocks/inspectit/gepard/agent/resolver/matcher/MatcherChainBuilderTest.java b/src/test/java/rocks/inspectit/gepard/agent/resolver/matcher/MatcherChainBuilderTest.java new file mode 100644 index 0000000..c29ad2d --- /dev/null +++ b/src/test/java/rocks/inspectit/gepard/agent/resolver/matcher/MatcherChainBuilderTest.java @@ -0,0 +1,137 @@ +package rocks.inspectit.gepard.agent.resolver.matcher; + +import net.bytebuddy.matcher.ElementMatcher; +import net.bytebuddy.matcher.ElementMatchers; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import static net.bytebuddy.matcher.ElementMatchers.not; +import static org.junit.jupiter.api.Assertions.*; + +class MatcherChainBuilderTest { + private MatcherChainBuilder builder; + + private ElementMatcher.Junction anyMatcher = ElementMatchers.any(); + + @BeforeEach + public void beforeEach() { + builder = new MatcherChainBuilder<>(); + } + + @Nested + public class Or { + + @Test + public void nullMatcher() { + builder.or(null); + + assertNull(builder.build()); + assertTrue(builder.isEmpty()); + } + + @Test + public void singleMatcher() { + builder.or(anyMatcher); + + Assertions.assertEquals(builder.build(), anyMatcher); + assertFalse(builder.isEmpty()); + } + + @Test + public void multipleMatcher() { + builder.or(anyMatcher); + builder.or(anyMatcher); + + assertEquals(builder.build(), anyMatcher.or(anyMatcher)); + } + + @Test + public void nullOnNotEmpty() { + builder.or(anyMatcher); + builder.or(null); + + assertEquals(builder.build(), anyMatcher); + } + } + + @Nested + public class And { + + @Test + public void nullMatcher() { + builder.and(null); + + assertNull(builder.build()); + assertTrue(builder.isEmpty()); + } + + @Test + public void singleMatcher() { + builder.and(anyMatcher); + + assertEquals(builder.build(), anyMatcher); + assertFalse(builder.isEmpty()); + } + + @Test + public void multipleMatcher() { + builder.and(anyMatcher); + builder.and(anyMatcher); + + assertEquals(builder.build(), anyMatcher.and(anyMatcher)); + } + + @Test + public void nullOnNotEmpty() { + builder.and(anyMatcher); + builder.and(null); + + assertEquals(builder.build(), anyMatcher); + } + + @Test + public void conditionalTrue() { + builder.and(true, anyMatcher); + + assertEquals(builder.build(), anyMatcher); + } + + @Test + public void conditionalFalse() { + builder.and(false, anyMatcher); + + assertEquals(builder.build(), not(anyMatcher)); + } + + @Test + public void conditionalFalseOnNotEmpty() { + builder.and(anyMatcher); + builder.and(false, anyMatcher); + + assertEquals(builder.build(), anyMatcher.and(not(anyMatcher))); + } + } + + @Nested + public class IsEmpty { + + @Test + public void empty() { + boolean result = builder.isEmpty(); + + assertTrue(result); + } + + @Test + public void notEmpty() { + builder.and(ElementMatchers.any()); + + boolean result = builder.isEmpty(); + + assertFalse(result); + } + } + +} \ No newline at end of file