/* * Copyright 2014 Netflix, Inc. * * 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 com.netflix.ribbon.proxy; import com.netflix.ribbon.RibbonRequest; import com.netflix.ribbon.RibbonResourceFactory; import com.netflix.ribbon.http.HttpResourceGroup; import com.netflix.ribbon.proxy.processor.AnnotationProcessorsProvider; import com.netflix.ribbon.proxy.sample.MovieServiceInterfaces.SampleMovieService; import com.netflix.ribbon.proxy.sample.MovieServiceInterfaces.SampleMovieServiceWithResourceGroupNameAnnotation; import io.netty.buffer.ByteBuf; import io.reactivex.netty.protocol.http.client.HttpClient; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.easymock.annotation.Mock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import static com.netflix.ribbon.proxy.Utils.methodByName; import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.expect; import static org.powermock.api.easymock.PowerMock.*; import static org.junit.Assert.*; /** * @author Tomasz Bak */ @RunWith(PowerMockRunner.class) @PrepareForTest({RibbonDynamicProxy.class, MethodTemplateExecutor.class}) public class RibbonDynamicProxyTest { @Mock private HttpResourceGroup httpResourceGroupMock; @Mock private ProxyHttpResourceGroupFactory httpResourceGroupFactoryMock; @Mock private RibbonRequest ribbonRequestMock; @Mock private HttpClient<ByteBuf, ByteBuf> httpClientMock; @Before public void setUp() throws Exception { expect(httpResourceGroupFactoryMock.createResourceGroup()).andReturn(httpResourceGroupMock); } @Test(expected = IllegalArgumentException.class) public void testAcceptsInterfaceOnly() throws Exception { RibbonDynamicProxy.newInstance(Object.class, null); } @Test public void testSetupWithExplicitResourceGroupObject() throws Exception { replayAll(); RibbonDynamicProxy.newInstance(SampleMovieServiceWithResourceGroupNameAnnotation.class, httpResourceGroupMock); } @Test public void testSetupWithResourceGroupNameInAnnotation() throws Exception { mockStatic(ProxyHttpResourceGroupFactory.class); expectNew(ProxyHttpResourceGroupFactory.class, new Class[]{ClassTemplate.class, RibbonResourceFactory.class, AnnotationProcessorsProvider.class }, anyObject(), anyObject(), anyObject()).andReturn(httpResourceGroupFactoryMock); replayAll(); RibbonDynamicProxy.newInstance(SampleMovieServiceWithResourceGroupNameAnnotation.class); } @Test public void testTypedClientGetWithPathParameter() throws Exception { initializeSampleMovieServiceMocks(); replayAll(); SampleMovieService service = RibbonDynamicProxy.newInstance(SampleMovieService.class, httpResourceGroupMock); RibbonRequest<ByteBuf> ribbonMovie = service.findMovieById("123"); assertNotNull(ribbonMovie); } @Test public void testPlainObjectInvocations() throws Exception { initializeSampleMovieServiceMocks(); replayAll(); SampleMovieService service = RibbonDynamicProxy.newInstance(SampleMovieService.class, httpResourceGroupMock); assertFalse(service.equals(this)); assertEquals(service.toString(), "RibbonDynamicProxy{...}"); } private void initializeSampleMovieServiceMocks() { MethodTemplateExecutor tgMock = createMock(MethodTemplateExecutor.class); expect(tgMock.executeFromTemplate(anyObject(Object[].class))).andReturn(ribbonRequestMock); Map<Method, MethodTemplateExecutor> tgMap = new HashMap<Method, MethodTemplateExecutor>(); tgMap.put(methodByName(SampleMovieService.class, "findMovieById"), tgMock); mockStatic(MethodTemplateExecutor.class); expect(MethodTemplateExecutor.from(httpResourceGroupMock, SampleMovieService.class, AnnotationProcessorsProvider.DEFAULT)).andReturn(tgMap); } }