diff --git a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/util/WellKnownClasses.java b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/util/WellKnownClasses.java index 7512d1b0212..5c5b91cd66d 100644 --- a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/util/WellKnownClasses.java +++ b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/util/WellKnownClasses.java @@ -107,6 +107,7 @@ public class WellKnownClasses { "java.time.LocalDate", "java.time.LocalDateTime", "java.util.UUID", + "java.net.URI", "java.io.File", "sun.nio.fs.UnixPath", "sun.nio.fs.WindowsPath")); diff --git a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/SubStringExpression.java b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/SubStringExpression.java index 1c566a5591e..9788fc977ee 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/SubStringExpression.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/SubStringExpression.java @@ -20,17 +20,29 @@ public SubStringExpression(ValueExpression source, int startIndex, int endInd @Override public Value evaluate(ValueReferenceResolver valueRefResolver) { Value sourceValue = source != null ? source.evaluate(valueRefResolver) : Value.nullValue(); + if (sourceValue.isUndefined()) { + throw new EvaluationException( + "Cannot evaluate the expression for undefined value", PrettyPrintVisitor.print(this)); + } + if (sourceValue.isNull()) { + throw new EvaluationException( + "Cannot evaluate the expression for null value", PrettyPrintVisitor.print(this)); + } if (sourceValue.getValue() instanceof String) { String sourceStr = (String) sourceValue.getValue(); - try { - return (Value) Value.of(sourceStr.substring(startIndex, endIndex)); - } catch (StringIndexOutOfBoundsException ex) { - throw new EvaluationException(ex.getMessage(), PrettyPrintVisitor.print(this), ex); - } + return internalEvaluate(sourceStr); } return Value.undefined(); } + private Value internalEvaluate(String sourceStr) { + try { + return (Value) Value.of(sourceStr.substring(startIndex, endIndex)); + } catch (StringIndexOutOfBoundsException ex) { + throw new EvaluationException(ex.getMessage(), PrettyPrintVisitor.print(this), ex); + } + } + @Override public R accept(Visitor visitor) { return visitor.visit(this); diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/EndsWithExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/EndsWithExpressionTest.java index 2b4c74a3752..17a6b1c07f1 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/EndsWithExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/EndsWithExpressionTest.java @@ -12,10 +12,13 @@ import com.datadog.debugger.el.values.StringValue; import datadog.trace.bootstrap.debugger.el.ValueReferenceResolver; import datadog.trace.bootstrap.debugger.el.Values; +import java.net.URI; import org.junit.jupiter.api.Test; class EndsWithExpressionTest { private final ValueReferenceResolver resolver = RefResolverHelper.createResolver(this); + // used to ref lookup + URI uri = URI.create("https://www.datadoghq.com"); @Test void nullExpression() { @@ -46,4 +49,11 @@ void stringExpression() { assertFalse(expression.evaluate(resolver)); assertEquals("endsWith(\"abc\", \"ab\")", print(expression)); } + + @Test + void stringPrimitives() { + EndsWithExpression expression = new EndsWithExpression(DSL.ref("uri"), new StringValue(".com")); + assertTrue(expression.evaluate(resolver)); + assertEquals("endsWith(uri, \".com\")", print(expression)); + } } diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/MatchesExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/MatchesExpressionTest.java index b4afe7e1a10..23cfc0c7c66 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/MatchesExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/MatchesExpressionTest.java @@ -9,10 +9,13 @@ import com.datadog.debugger.el.values.StringValue; import datadog.trace.bootstrap.debugger.el.ValueReferenceResolver; import datadog.trace.bootstrap.debugger.el.Values; +import java.net.URI; import org.junit.jupiter.api.Test; class MatchesExpressionTest { private final ValueReferenceResolver resolver = RefResolverHelper.createResolver(this); + // used to ref lookup + URI uri = URI.create("https://www.datadoghq.com"); @Test void nullExpression() { @@ -49,4 +52,12 @@ void stringExpression() { assertFalse(expression.evaluate(resolver)); assertEquals("matches(\"abc\", \"[def]+\")", print(expression)); } + + @Test + void stringPrimitives() { + MatchesExpression expression = + new MatchesExpression(DSL.ref("uri"), new StringValue("^https?://w{3}\\.datadoghq\\.com$")); + assertTrue(expression.evaluate(resolver)); + assertEquals("matches(uri, \"^https?://w{3}\\.datadoghq\\.com$\")", print(expression)); + } } diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/StartsWithExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/StartsWithExpressionTest.java index 7c9a2347afb..0626dc1d6ff 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/StartsWithExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/StartsWithExpressionTest.java @@ -9,10 +9,13 @@ import com.datadog.debugger.el.values.StringValue; import datadog.trace.bootstrap.debugger.el.ValueReferenceResolver; import datadog.trace.bootstrap.debugger.el.Values; +import java.net.URI; import org.junit.jupiter.api.Test; class StartsWithExpressionTest { private final ValueReferenceResolver resolver = RefResolverHelper.createResolver(this); + // used to ref lookup + URI uri = URI.create("https://www.datadoghq.com"); @Test void nullExpression() { @@ -44,4 +47,12 @@ void stringExpression() { assertFalse(expression.evaluate(resolver)); assertEquals("startsWith(\"abc\", \"bc\")", print(expression)); } + + @Test + void stringPrimitives() { + StartsWithExpression expression = + new StartsWithExpression(DSL.ref("uri"), new StringValue("https")); + assertTrue(expression.evaluate(resolver)); + assertEquals("startsWith(uri, \"https\")", print(expression)); + } } diff --git a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/SubStringExpressionTest.java b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/SubStringExpressionTest.java index bcaaa730974..57c2ddb8291 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/SubStringExpressionTest.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/test/java/com/datadog/debugger/el/expressions/SubStringExpressionTest.java @@ -3,31 +3,40 @@ import static com.datadog.debugger.el.PrettyPrintVisitor.print; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; import com.datadog.debugger.el.DSL; import com.datadog.debugger.el.EvaluationException; import com.datadog.debugger.el.RefResolverHelper; import datadog.trace.bootstrap.debugger.el.ValueReferenceResolver; import datadog.trace.bootstrap.debugger.el.Values; +import java.net.URI; import org.junit.jupiter.api.Test; public class SubStringExpressionTest { private final ValueReferenceResolver resolver = RefResolverHelper.createResolver(this); + // used to ref lookup + URI uri = URI.create("https://www.datadoghq.com"); + Object nullValue = null; @Test void nullExpression() { - SubStringExpression expression = new SubStringExpression(null, 0, 0); - assertTrue(expression.evaluate(resolver).isUndefined()); - assertEquals("substring(null, 0, 0)", print(expression)); + SubStringExpression expression1 = new SubStringExpression(null, 0, 0); + EvaluationException evaluationException = + assertThrows(EvaluationException.class, () -> expression1.evaluate(resolver)); + assertEquals("substring(null, 0, 0)", evaluationException.getExpr()); + SubStringExpression expression2 = new SubStringExpression(DSL.ref("nullValue"), 0, 0); + evaluationException = + assertThrows(EvaluationException.class, () -> expression2.evaluate(resolver)); + assertEquals("substring(nullValue, 0, 0)", evaluationException.getExpr()); } @Test void undefinedExpression() { SubStringExpression expression = new SubStringExpression(DSL.value(Values.UNDEFINED_OBJECT), 0, 0); - assertTrue(expression.evaluate(resolver).isUndefined()); - assertEquals("substring(UNDEFINED, 0, 0)", print(expression)); + EvaluationException evaluationException = + assertThrows(EvaluationException.class, () -> expression.evaluate(resolver)); + assertEquals("substring(UNDEFINED, 0, 0)", evaluationException.getExpr()); } @Test @@ -44,4 +53,11 @@ void stringOutOfBoundsExpression() { assertThrows(EvaluationException.class, () -> expression.evaluate(resolver)); assertEquals("substring(\"abc\", 0, 10)", evaluationException.getExpr()); } + + @Test + void stringPrimitives() { + SubStringExpression expression = new SubStringExpression(DSL.ref("uri"), 0, 5); + assertEquals("https", expression.evaluate(resolver).getValue()); + assertEquals("substring(uri, 0, 5)", print(expression)); + } }