/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.core.el.function;
import static java.util.Optional.empty;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.mule.mvel2.CompileException;
import org.mule.mvel2.ParserConfiguration;
import org.mule.runtime.api.lifecycle.InitialisationException;
import org.mule.runtime.api.metadata.DataType;
import org.mule.runtime.api.metadata.TypedValue;
import org.mule.runtime.core.api.Event;
import org.mule.runtime.core.api.MuleContext;
import org.mule.runtime.core.api.TransformationService;
import org.mule.runtime.core.api.el.ExpressionExecutor;
import org.mule.runtime.core.internal.message.InternalMessage;
import org.mule.runtime.core.api.transformer.TransformerException;
import org.mule.runtime.core.context.notification.DefaultFlowCallStack;
import org.mule.runtime.core.el.context.MessageContext;
import org.mule.runtime.core.el.mvel.MVELExpressionExecutor;
import org.mule.runtime.core.el.mvel.MVELExpressionLanguageContext;
import org.mule.tck.junit4.AbstractMuleTestCase;
import org.mule.tck.size.SmallTest;
import java.util.Date;
import java.util.regex.Pattern;
import org.junit.Before;
import org.junit.Test;
@SmallTest
public class RegexExpressionLanguageFunctionTestCase extends AbstractMuleTestCase {
protected ExpressionExecutor<MVELExpressionLanguageContext> expressionExecutor;
protected MVELExpressionLanguageContext context;
protected RegexExpressionLanguageFuntion regexFuntion;
protected MuleContext muleContext;
private Event event;
private Event.Builder eventBuilder;
private InternalMessage message;
@Before
public void setup() throws InitialisationException {
ParserConfiguration parserConfiguration = new ParserConfiguration();
expressionExecutor = new MVELExpressionExecutor(parserConfiguration);
muleContext = mock(MuleContext.class);
context = new MVELExpressionLanguageContext(parserConfiguration, muleContext);
regexFuntion = new RegexExpressionLanguageFuntion();
context.declareFunction("regex", regexFuntion);
}
@Test
public void testReturnNullWhenDoesNotMatches() throws Exception {
addMessageToContextWithPayload("TEST");
Object result = regexFuntion.call(new Object[] {"'TESTw+TEST'"}, context);
assertNull(result);
}
@Test
public void testReturnNullWhenDoesNotMatchesMVEL() throws Exception {
addMessageToContextWithPayload("TEST");
Object result = expressionExecutor.execute("regex('TESTw+TEST')", context);
assertNull(result);
}
@Test
public void testReturnsPayloadWhenMatchesIfNoCaptureGroupDefined() throws Exception {
addMessageToContextWithPayload("TESTfooTEST");
Object result = regexFuntion.call(new Object[] {"TEST\\w+TEST"}, context);
assertEquals("TESTfooTEST", result);
}
@Test
public void testReturnsPayloadWhenMatchesIfNoCaptureGroupDefinedMVEL() throws Exception {
addMessageToContextWithPayload("TESTfooTEST");
Object result = expressionExecutor.execute("regex('TEST\\\\w+TEST')", context);
assertEquals("TESTfooTEST", result);
}
@Test
public void testReturnsMatchedValueIfCaptureGroupDefined() throws Exception {
addMessageToContextWithPayload("TESTfooTEST");
Object result = regexFuntion.call(new Object[] {"TEST(\\w+)TEST"}, context);
assertEquals("foo", result);
}
@Test
public void testReturnsMatchedValueIfCaptureGroupDefinedMVEL() throws Exception {
addMessageToContextWithPayload("TESTfooTEST");
Object result = expressionExecutor.execute("regex('TEST(\\\\w+)TEST')", context);
assertEquals("foo", result);
}
@Test
public void testReturnsMultipleValuesIfMultipleCaptureGroupDefine() throws Exception {
addMessageToContextWithPayload("TESTfooTESTbar");
Object result = regexFuntion.call(new Object[] {"TEST(\\w+)TEST(\\w+)"}, context);
assertTrue(result instanceof String[]);
String[] values = (String[]) result;
assertEquals(2, values.length);
assertEquals("foo", values[0]);
assertEquals("bar", values[1]);
}
@Test
public void testReturnsMultipleValuesIfMultipleCaptureGroupDefineMVEL() throws Exception {
addMessageToContextWithPayload("TESTfooTESTbar");
Object result = expressionExecutor.execute("regex('TEST(\\\\w+)TEST(\\\\w+)')", context);
assertTrue(result instanceof String[]);
String[] values = (String[]) result;
assertEquals(2, values.length);
assertEquals("foo", values[0]);
assertEquals("bar", values[1]);
}
@Test
public void testReturnsPayloadWhenMatchesIfNoCaptureGroupDefinedTextArgument() throws Exception {
Object result = regexFuntion.call(new Object[] {"TEST\\w+TEST", "TESTfooTEST"}, context);
assertEquals("TESTfooTEST", result);
}
@Test
public void testReturnsPayloadWhenMatchesIfNoCaptureGroupDefinedTextArgumentMVEL() throws Exception {
Object result = expressionExecutor.execute("regex('TEST\\\\w+TEST','TESTfooTEST')", context);
assertEquals("TESTfooTEST", result);
}
@Test
public void testReturnsPayloadWhenMatchesIfNoCaptureGroupDefinedTextAndFlagsArgument() throws Exception {
Object result = regexFuntion.call(new Object[] {"test\\w+test", "TESTfooTEST", Pattern.CASE_INSENSITIVE}, context);
assertEquals("TESTfooTEST", result);
}
@Test
public void testReturnsPayloadWhenMatchesIfNoCaptureGroupDefinedTextAndFlagsArgumentMVEL() throws Exception {
Object result =
expressionExecutor.execute("regex('test\\\\w+test','TESTfooTEST', java.util.regex.Pattern.CASE_INSENSITIVE)", context);
assertEquals("TESTfooTEST", result);
}
@Test(expected = IllegalArgumentException.class)
public void testInvalidNullRegex() throws Exception {
regexFuntion.call(new Object[] {null}, context);
}
@Test(expected = CompileException.class)
public void testInvalidNullRegexMVEL() throws Exception {
expressionExecutor.execute("regex(null)", context);
}
@Test(expected = IllegalArgumentException.class)
public void testInvalidNonStringRegex() throws Exception {
regexFuntion.call(new Object[] {new Date()}, context);
}
@Test(expected = CompileException.class)
public void testInvalidNonStringRegexMVEL() throws Exception {
expressionExecutor.execute("regex(new Date())", context);
}
@Test(expected = IllegalArgumentException.class)
public void testInvalidNullText() throws Exception {
regexFuntion.call(new Object[] {"TESTw+TEST", null}, context);
}
@Test(expected = CompileException.class)
public void testInvalidNullTextMVEL() throws Exception {
expressionExecutor.execute("regex('TESTw+TEST',null)", context);
}
@Test(expected = IllegalArgumentException.class)
public void testInvalidNonStringText() throws Exception {
regexFuntion.call(new Object[] {"TESTw+TEST", new Date()}, context);
}
@Test(expected = CompileException.class)
public void testInvalidNonStringTextMVEL() throws Exception {
expressionExecutor.execute("regex('TESTw+TEST',new Date())", context);
}
@Test(expected = IllegalArgumentException.class)
public void testInvalidNonIntFlags() throws Exception {
regexFuntion.call(new Object[] {"TESTw+TEST", "text", "foo"}, context);
}
@Test(expected = CompileException.class)
public void testInvalidNonIntFlagsMVEL() throws Exception {
expressionExecutor.execute("regex('TESTw+TEST','text','foo')", context);
}
protected void addMessageToContextWithPayload(String payload) throws TransformerException {
event = mock(Event.class);
when(event.getFlowCallStack()).thenReturn(new DefaultFlowCallStack());
when(event.getError()).thenReturn(empty());
eventBuilder = Event.builder(event);
message = mock(InternalMessage.class);
when(event.getMessage()).thenAnswer(invocation -> message);
InternalMessage transformedMessage = mock(InternalMessage.class, RETURNS_DEEP_STUBS);
when(transformedMessage.getPayload()).thenReturn(new TypedValue<Object>(payload, DataType.fromObject(payload)));
TransformationService transformationService = mock(TransformationService.class);
when(muleContext.getTransformationService()).thenReturn(transformationService);
when(transformationService.transform(any(InternalMessage.class), any(DataType.class))).thenReturn(transformedMessage);
context.addFinalVariable("message", new MessageContext(event, eventBuilder, muleContext));
}
}