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.interceptor;
019    
020    import junit.framework.TestCase;
021    import org.apache.commons.proxy.factory.cglib.CglibProxyFactory;
022    import org.apache.commons.proxy.util.Echo;
023    import org.apache.commons.proxy.util.EchoImpl;
024    import EDU.oswego.cs.dl.util.concurrent.Executor;
025    import EDU.oswego.cs.dl.util.concurrent.CountDown;
026    
027    public class TestExecutorInterceptor extends TestCase
028    {
029        public void testVoidMethod() throws Exception
030        {
031            final ExecutedEcho impl = new ExecutedEcho();
032            final OneShotExecutor executor = new OneShotExecutor();
033            final Echo proxy = ( Echo ) new CglibProxyFactory()
034                    .createInterceptorProxy( impl, new ExecutorInterceptor( executor ), new Class[] { Echo.class } );
035            proxy.echo();
036            executor.getLatch().acquire();
037            assertEquals( executor.getThread(), impl.getExecutionThread() );
038        }
039    
040        public void testNonVoidMethod() throws Exception
041        {
042            final ExecutedEcho impl = new ExecutedEcho();
043            final OneShotExecutor executor = new OneShotExecutor();
044            final Echo proxy = ( Echo ) new CglibProxyFactory()
045                    .createInterceptorProxy( impl, new ExecutorInterceptor( executor ), new Class[] { Echo.class } );
046            try
047            {
048                proxy.echoBack( "hello" );
049                fail();
050            }
051            catch( IllegalArgumentException e )
052            {
053            }
054        }
055    
056        public static class ExecutedEcho extends EchoImpl
057        {
058            private Thread executionThread;
059    
060            public void echo()
061            {
062                executionThread = Thread.currentThread();
063            }
064    
065            public Thread getExecutionThread()
066            {
067                return executionThread;
068            }
069        }
070    
071        private static class OneShotExecutor implements Executor
072        {
073            private Thread thread;
074            private CountDown latch = new CountDown( 1 );
075    
076            public void execute( final Runnable command )
077            {
078                thread = new Thread( new Runnable()
079                {
080                    public void run()
081                    {
082                        try
083                        {
084                            command.run();
085                        }
086                        finally
087                        {
088                            latch.release();
089                        }
090                    }
091                } );
092                thread.start();
093            }
094    
095            public Thread getThread()
096            {
097                return thread;
098            }
099    
100            public CountDown getLatch()
101            {
102                return latch;
103            }
104        }
105    }