/* * Copyright 2002-2013 the original author or authors. * * Licensed 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.springframework.data.gemfire.function.execution; /** * @author David Turanski * */ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.lang.reflect.AccessibleObject; import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; import java.util.Map; import org.aopalliance.intercept.MethodInvocation; import org.junit.Before; import org.junit.Test; import org.springframework.data.gemfire.function.annotation.FunctionId; /** * * @author David Turanski * */ public class GemfireFunctionProxyFactoryBeanTests { private GemfireFunctionOperations functionOperations; @Before public void setUp() { functionOperations = mock(GemfireFunctionOperations.class); } @Test public void testInvokeAndExtractWithAnnotatedFunctionId() throws Throwable { GemfireFunctionProxyFactoryBean proxy = new GemfireFunctionProxyFactoryBean(IFoo.class,functionOperations); MethodInvocation invocation = new TestInvocation(IFoo.class).withMethodNameAndArgTypes("oneArg",String.class); int results = 1; when(functionOperations.executeAndExtract("oneArg",invocation.getArguments())).thenReturn(results); Object result = proxy.invoke(invocation); verify(functionOperations).executeAndExtract("oneArg",invocation.getArguments()); assertTrue(result.getClass().getName(), result instanceof Integer); assertEquals(1,result); } @SuppressWarnings({ "rawtypes" }) @Test public void testInvoke() throws Throwable { GemfireFunctionProxyFactoryBean proxy = new GemfireFunctionProxyFactoryBean(IFoo.class, functionOperations); MethodInvocation invocation = new TestInvocation(IFoo.class).withMethodNameAndArgTypes("collections",List.class); List results = Arrays.asList(new Integer[]{1,2,3}); when(functionOperations.executeAndExtract("collections",invocation.getArguments())).thenReturn(results); Object result = proxy.invoke(invocation); verify(functionOperations).executeAndExtract("collections",invocation.getArguments()); ; assertTrue(result instanceof List); assertEquals(3,((List<?>)result).size()); } static class TestInvocation implements MethodInvocation { private Class<?>[] argTypes; private Class<?> clazz; private String methodName; private Object[] arguments; public TestInvocation(Class<?> clazz) { this.clazz = clazz; } public TestInvocation withArguments(Object ...arguments){ this.arguments = arguments; return this; } public TestInvocation withMethodNameAndArgTypes(String methodName,Class<?>... argTypes) { this.methodName = methodName; this.argTypes = argTypes; return this; } /* (non-Javadoc) * @see org.aopalliance.intercept.Invocation#getArguments() */ @Override public Object[] getArguments() { // TODO Auto-generated method stub return this.arguments; } /* (non-Javadoc) * @see org.aopalliance.intercept.Joinpoint#proceed() */ @Override public Object proceed() throws Throwable { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see org.aopalliance.intercept.Joinpoint#getThis() */ @Override public Object getThis() { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see org.aopalliance.intercept.Joinpoint#getStaticPart() */ @Override public AccessibleObject getStaticPart() { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see org.aopalliance.intercept.MethodInvocation#getMethod() */ @Override public Method getMethod() { Method method = null; try { method = clazz.getMethod(methodName, argTypes); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } return method; } } public interface IFoo { @FunctionId("oneArg") public abstract Integer oneArg(String key); public abstract Integer twoArg(String akey, String bkey); public abstract List<Integer> collections(List<Integer> args); public abstract Map<String, Integer> getMapWithNoArgs(); } }