/*
* 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.mule.model;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mule.runtime.api.message.Message.of;
import static org.mule.tck.MuleTestUtils.getTestFlow;
import org.mule.runtime.core.DefaultEventContext;
import org.mule.runtime.core.DefaultMuleEventContext;
import org.mule.runtime.core.api.Event;
import org.mule.runtime.core.api.MuleEventContext;
import org.mule.runtime.core.api.construct.FlowConstruct;
import org.mule.runtime.core.api.model.InvocationResult;
import org.mule.runtime.core.api.model.resolvers.ExplicitMethodEntryPointResolver;
import org.mule.tck.junit4.AbstractMuleContextTestCase;
import org.mule.tck.testmodels.fruit.Apple;
import org.mule.tck.testmodels.fruit.Fruit;
import org.junit.Before;
import org.junit.Test;
public class ExplicitMethodEntryPointResolverTestCase extends AbstractMuleContextTestCase {
private FlowConstruct flowConstruct;
@Before
public void before() throws Exception {
flowConstruct = getTestFlow(muleContext);
}
@Test
public void testMethodSetPass() throws Exception {
ExplicitMethodEntryPointResolver resolver = new ExplicitMethodEntryPointResolver();
resolver.addMethod("someBusinessMethod");
final Event event = Event.builder(DefaultEventContext.create(flowConstruct, TEST_CONNECTOR_LOCATION))
.message(of("blah"))
.build();
MuleEventContext eventContext = new DefaultMuleEventContext(flowConstruct, event);
InvocationResult result =
resolver.invoke(new MultiplePayloadsTestObject(), eventContext, Event.builder(eventContext.getEvent()));
assertEquals(result.getState(), InvocationResult.State.SUCCESSFUL);
}
@Test
public void testMethodSetMatchFirst() throws Exception {
ExplicitMethodEntryPointResolver resolver = new ExplicitMethodEntryPointResolver();
resolver.addMethod("someBusinessMethod");
resolver.addMethod("someSetter");
final Event event = Event.builder(DefaultEventContext.create(flowConstruct, TEST_CONNECTOR_LOCATION))
.message(of("blah"))
.build();
MuleEventContext eventContext = new DefaultMuleEventContext(flowConstruct, event);
InvocationResult result =
resolver.invoke(new MultiplePayloadsTestObject(), eventContext, Event.builder(eventContext.getEvent()));
assertEquals(result.getState(), InvocationResult.State.SUCCESSFUL);
}
@Test
public void testMethodNotFound() throws Exception {
ExplicitMethodEntryPointResolver resolver = new ExplicitMethodEntryPointResolver();
resolver.addMethod("noMethod");
resolver.addMethod("noMethod2");
final Event event =
Event.builder(DefaultEventContext.create(flowConstruct, TEST_CONNECTOR_LOCATION)).message(of("blah")).build();
MuleEventContext eventContext = new DefaultMuleEventContext(flowConstruct, event);
InvocationResult result =
resolver.invoke(new MultiplePayloadsTestObject(), eventContext, Event.builder(eventContext.getEvent()));
assertEquals(result.getState(), InvocationResult.State.FAILED);
}
@Test
public void testNoMethodSet() throws Exception {
ExplicitMethodEntryPointResolver resolver = new ExplicitMethodEntryPointResolver();
try {
final Event event = Event.builder(DefaultEventContext.create(flowConstruct, TEST_CONNECTOR_LOCATION))
.message(of("blah"))
.build();
MuleEventContext eventContext = new DefaultMuleEventContext(flowConstruct, event);
InvocationResult result =
resolver.invoke(new MultiplePayloadsTestObject(), eventContext, Event.builder(eventContext.getEvent()));
fail("method property is not set, this should cause an error");
} catch (IllegalStateException e) {
// Expected
}
}
/**
* If a method with correct name is available then it should be used is the parameter type is assignable from the payload type
* and not just if there is an exact match. See MULE-3636.
*
* @throws Exception
*/
@Test
public void testMethodPropertyParameterAssignableFromPayload() throws Exception {
ExplicitMethodEntryPointResolver resolver = new ExplicitMethodEntryPointResolver();
resolver.addMethod("wash");
final Event event = Event.builder(DefaultEventContext.create(flowConstruct, TEST_CONNECTOR_LOCATION))
.message(of(new Apple()))
.build();
MuleEventContext ctx = new DefaultMuleEventContext(flowConstruct, event);
InvocationResult result = resolver.invoke(new TestFruitCleaner(), ctx, Event.builder(ctx.getEvent()));
assertEquals(result.getState(), InvocationResult.State.SUCCESSFUL);
}
/**
* If a method with correct name is available then it should be used even if one or more parameter types in the payload are
* null, as long as the parameter count matches.
*
* @throws Exception
*/
@Test
public void testMethodPropertyParameterNull() throws Exception {
ExplicitMethodEntryPointResolver resolver = new ExplicitMethodEntryPointResolver();
resolver.addMethod("someOtherBusinessMethod");
final Event event = Event.builder(DefaultEventContext.create(flowConstruct, TEST_CONNECTOR_LOCATION))
.message(of(new Object[] {null, "blah"}))
.build();
MuleEventContext eventContext = new DefaultMuleEventContext(flowConstruct, event);
InvocationResult result =
resolver.invoke(new MultiplePayloadsTestObject(), eventContext, Event.builder(eventContext.getEvent()));
assertEquals(result.getState(), InvocationResult.State.SUCCESSFUL);
}
public static class TestFruitCleaner {
public void wash(Fruit fruit) {
// dummy
}
public void polish(Fruit fruit) {
// dummy
}
}
}