001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.commons.proxy.factory; 019 020 import org.apache.commons.proxy.ProxyFactory; 021 import org.apache.commons.proxy.exception.ProxyFactoryException; 022 import org.apache.commons.proxy.invoker.NullInvoker; 023 import org.apache.commons.proxy.provider.ConstantProvider; 024 import org.apache.commons.proxy.util.AbstractEcho; 025 import org.apache.commons.proxy.util.Echo; 026 import org.apache.commons.proxy.util.EchoImpl; 027 028 /** 029 * @author James Carman 030 * @since 1.0 031 */ 032 public abstract class AbstractSubclassingProxyFactoryTestCase extends AbstractProxyFactoryTestCase 033 { 034 protected AbstractSubclassingProxyFactoryTestCase( ProxyFactory factory ) 035 { 036 super( factory ); 037 } 038 039 public void testWithAbstractSuperclass() 040 { 041 final Echo echo = ( Echo )factory.createDelegatorProxy( new ConstantProvider( new EchoImpl() ), new Class[] { AbstractEcho.class } ); 042 assertEquals( "hello", echo.echoBack( "hello" ) ); 043 assertEquals( "helloworld", echo.echoBack( "hello", "world" ) ); 044 } 045 046 public void testCanProxy() 047 { 048 assertTrue( factory.canProxy( new Class[] { Echo.class } ) ); 049 assertTrue( factory.canProxy( new Class[] { EchoImpl.class } ) ); 050 assertFalse( factory.canProxy( new Class[] { FinalEcho.class } ) ); 051 assertTrue( factory.canProxy( new Class[] { FinalMethodEcho.class, Echo.class } ) ); 052 assertFalse( factory.canProxy( new Class[] { NoDefaultConstructorEcho.class } ) ); 053 assertTrue( factory.canProxy( new Class[] { ProtectedConstructorEcho.class } ) ); 054 assertFalse( factory.canProxy( new Class[] { InvisibleEcho.class } ) ); 055 assertFalse( factory.canProxy( new Class[] { Echo.class, EchoImpl.class, String.class } ) ); 056 } 057 058 public void testDelegatorWithSuperclass() 059 { 060 final Echo echo = ( Echo ) factory 061 .createDelegatorProxy( new ConstantProvider( new EchoImpl() ), new Class[] { Echo.class, EchoImpl.class } ); 062 assertTrue( echo instanceof EchoImpl ); 063 } 064 065 public void testInterceptorWithSuperclass() 066 { 067 final Echo echo = ( Echo ) factory 068 .createInterceptorProxy( new EchoImpl(), new NoOpMethodInterceptor(), new Class[] { Echo.class, EchoImpl.class } ); 069 assertTrue( echo instanceof EchoImpl ); 070 } 071 072 public void testInvocationHandlerWithSuperclass() 073 { 074 final Echo echo = ( Echo ) factory 075 .createInvokerProxy( new NullInvoker(), new Class[] { Echo.class, EchoImpl.class } ); 076 assertTrue( echo instanceof EchoImpl ); 077 } 078 079 public void testProxiesWithClashingFinalMethodInSuperclass() 080 { 081 final Class[] proxyClasses = new Class[]{Echo.class, FinalMethodEcho.class}; 082 Echo proxy = ( Echo )factory.createDelegatorProxy( new ConstantProvider( new EchoImpl() ), proxyClasses ); 083 assertEquals( "final", proxy.echoBack("echo") ); 084 085 proxy = ( Echo )factory.createInterceptorProxy( new EchoImpl(), new NoOpMethodInterceptor(), proxyClasses ); 086 assertEquals( "final", proxy.echoBack("echo") ); 087 088 proxy = ( Echo )factory.createInvokerProxy( new NullInvoker(), proxyClasses ); 089 assertEquals( "final", proxy.echoBack("echo") ); 090 } 091 092 public void testDelegatorWithMultipleSuperclasses() 093 { 094 try 095 { 096 factory.createDelegatorProxy( new ConstantProvider( new EchoImpl() ), 097 new Class[] { EchoImpl.class, String.class } ); 098 fail(); 099 } 100 catch( ProxyFactoryException e ) 101 { 102 } 103 } 104 105 public void testInterceptorWithMultipleSuperclasses() 106 { 107 try 108 { 109 factory.createInterceptorProxy( new EchoImpl(), new NoOpMethodInterceptor(), 110 new Class[] { EchoImpl.class, String.class } ); 111 fail(); 112 } 113 catch( ProxyFactoryException e ) 114 { 115 } 116 } 117 118 public void testInvocationHandlerWithMultipleSuperclasses() 119 { 120 try 121 { 122 factory.createInvokerProxy( new NullInvoker(), 123 new Class[] { EchoImpl.class, String.class } ); 124 fail(); 125 } 126 catch( ProxyFactoryException e ) 127 { 128 } 129 } 130 131 public static final class FinalEcho extends EchoImpl 132 { 133 } 134 135 public static class FinalMethodEcho extends EchoImpl 136 { 137 public final String echoBack( String message ) 138 { 139 return "final"; 140 } 141 } 142 143 public static class NoDefaultConstructorEcho extends EchoImpl 144 { 145 public NoDefaultConstructorEcho( String param ) 146 { 147 } 148 } 149 150 public static class ProtectedConstructorEcho extends EchoImpl 151 { 152 protected ProtectedConstructorEcho() 153 { 154 } 155 } 156 157 private static class InvisibleEcho extends EchoImpl 158 { 159 } 160 }