blob: 7146ae529080cfd8e80acea3024f9ac57016edbd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.commons.proxy2;
import org.apache.commons.proxy2.exception.ProxyFactoryException;
import org.apache.commons.proxy2.invoker.NullInvoker;
import org.apache.commons.proxy2.provider.ConstantProvider;
import org.apache.commons.proxy2.util.AbstractEcho;
import org.apache.commons.proxy2.util.Echo;
import org.apache.commons.proxy2.util.EchoImpl;
import org.junit.Test;
import java.util.Date;
import static org.junit.Assert.*;
/**
* @author James Carman
* @since 1.0
*/
@SuppressWarnings("serial")
public abstract class AbstractSubclassingProxyFactoryTestCase extends AbstractProxyFactoryTestCase
{
//----------------------------------------------------------------------------------------------------------------------
// Fields
//----------------------------------------------------------------------------------------------------------------------
private static final Class<?>[] DATE_ONLY = new Class[]{Date.class};
//----------------------------------------------------------------------------------------------------------------------
// Other Methods
//----------------------------------------------------------------------------------------------------------------------
@Test
public void testCanProxy()
{
assertTrue(factory.canProxy(new Class[]{Echo.class}));
assertTrue(factory.canProxy(new Class[]{EchoImpl.class}));
assertFalse(factory.canProxy(new Class[]{FinalEcho.class}));
assertTrue(factory.canProxy(new Class[]{FinalMethodEcho.class, Echo.class}));
assertFalse(factory.canProxy(new Class[]{NoDefaultConstructorEcho.class}));
assertTrue(factory.canProxy(new Class[]{ProtectedConstructorEcho.class}));
assertFalse(factory.canProxy(new Class[]{InvisibleEcho.class}));
assertFalse(factory.canProxy(new Class[]{Echo.class, EchoImpl.class, String.class}));
}
@Test
public void testDelegatorEquals() throws Exception
{
final EqualsEcho echo = new EqualsEcho("text");
final Echo proxy1 = factory.createDelegatorProxy(new ConstantProvider<Echo>(echo),
new Class[]{EqualsEcho.class});
final Echo proxy2 = factory.createDelegatorProxy(new ConstantProvider<Echo>(echo),
new Class[]{EqualsEcho.class});
assertEquals(proxy1, proxy1);
assertFalse(proxy1.equals(proxy2));
assertFalse(proxy2.equals(proxy1));
}
@Test(expected = ProxyFactoryException.class)
public void testDelegatorWithMultipleSuperclasses()
{
factory.createDelegatorProxy(new ConstantProvider<EchoImpl>(new EchoImpl()),
new Class[]{EchoImpl.class, String.class});
}
@Test
public void testDelegatorWithSuperclass()
{
final Echo echo = factory
.createDelegatorProxy(new ConstantProvider<EchoImpl>(new EchoImpl()), new Class[]{Echo.class, EchoImpl.class});
assertTrue(echo instanceof EchoImpl);
}
@Test
public void testInterceptorEquals()
{
final EqualsEcho echo = new EqualsEcho("text");
final Echo proxy1 = factory.createInterceptorProxy(echo,
new NoOpMethodInterceptor(), new Class[]{EqualsEcho.class});
final Echo proxy2 = factory.createInterceptorProxy(echo,
new NoOpMethodInterceptor(), new Class[]{EqualsEcho.class});
assertEquals(proxy1, proxy1);
assertFalse(proxy1.equals(proxy2));
assertFalse(proxy2.equals(proxy1));
}
@Test(expected = ProxyFactoryException.class)
public void testInterceptorWithMultipleSuperclasses()
{
factory.createInterceptorProxy(new EchoImpl(), new NoOpMethodInterceptor(),
new Class[]{EchoImpl.class, String.class});
}
@Test
public void testInterceptorWithSuperclass()
{
final Echo echo = factory
.createInterceptorProxy(new EchoImpl(), new NoOpMethodInterceptor(), new Class[]{Echo.class, EchoImpl.class});
assertTrue(echo instanceof EchoImpl);
}
@Test(expected = ProxyFactoryException.class)
public void testInvocationHandlerWithMultipleSuperclasses()
{
factory.createInvokerProxy(new NullInvoker(),
new Class[]{EchoImpl.class, String.class});
}
@Test
public void testInvokerEquals() throws Exception
{
final Date proxy1 = factory.createInvokerProxy(new InvokerTester(), DATE_ONLY);
final Date proxy2 = factory.createInvokerProxy(new InvokerTester(), DATE_ONLY);
assertEquals(proxy1, proxy1);
assertFalse(proxy1.equals(proxy2));
assertFalse(proxy2.equals(proxy1));
}
@Test
public void testInvokerWithSuperclass()
{
final Echo echo = factory
.createInvokerProxy(new NullInvoker(), new Class[]{Echo.class, EchoImpl.class});
assertTrue(echo instanceof EchoImpl);
}
@Test
public void testProxiesWithClashingFinalMethodInSuperclass()
{
final Class<?>[] proxyClasses = new Class[]{Echo.class, FinalMethodEcho.class};
Echo proxy = factory.createDelegatorProxy(new ConstantProvider<EchoImpl>(new EchoImpl()), proxyClasses);
assertEquals("final", proxy.echoBack("echo"));
proxy = factory.createInterceptorProxy(new EchoImpl(), new NoOpMethodInterceptor(), proxyClasses);
assertEquals("final", proxy.echoBack("echo"));
proxy = factory.createInvokerProxy(new NullInvoker(), proxyClasses);
assertEquals("final", proxy.echoBack("echo"));
}
@Test
public void testWithAbstractSuperclass()
{
final Echo echo = factory.createDelegatorProxy(new ConstantProvider<EchoImpl>(new EchoImpl()), new Class[]{AbstractEcho.class});
assertEquals("hello", echo.echoBack("hello"));
assertEquals("helloworld", echo.echoBack("hello", "world"));
}
//----------------------------------------------------------------------------------------------------------------------
// Inner Classes
//----------------------------------------------------------------------------------------------------------------------
public static class EqualsEcho extends EchoImpl
{
@SuppressWarnings("unused")
private final String text;
protected EqualsEcho()
{
this("testing");
}
public EqualsEcho(String text)
{
this.text = text;
}
}
public static final class FinalEcho extends EchoImpl
{
}
public static class FinalMethodEcho extends EchoImpl
{
public final String echoBack(String message)
{
return "final";
}
}
private static class InvisibleEcho extends EchoImpl
{
}
public static class NoDefaultConstructorEcho extends EchoImpl
{
public NoDefaultConstructorEcho(String param)
{
}
}
public static class ProtectedConstructorEcho extends EchoImpl
{
protected ProtectedConstructorEcho()
{
}
}
}