001/*
002 *  Licensed to the Apache Software Foundation (ASF) under one
003 *  or more contributor license agreements.  See the NOTICE file
004 *  distributed with this work for additional information
005 *  regarding copyright ownership.  The ASF licenses this file
006 *  to you under the Apache License, Version 2.0 (the
007 *  "License"); you may not use this file except in compliance
008 *  with the License.  You may obtain a copy of the License at
009 *
010 *    http://www.apache.org/licenses/LICENSE-2.0
011 *
012 *  Unless required by applicable law or agreed to in writing,
013 *  software distributed under the License is distributed on an
014 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 *  KIND, either express or implied.  See the License for the
016 *  specific language governing permissions and limitations
017 *  under the License.
018 *
019 */
020package org.apache.mina.filter.util;
021
022import static org.junit.Assert.assertEquals;
023
024import java.util.ArrayList;
025import java.util.List;
026
027import org.apache.mina.core.filterchain.IoFilter;
028import org.apache.mina.core.filterchain.IoFilterEvent;
029import org.apache.mina.core.session.DummySession;
030import org.apache.mina.core.session.IdleStatus;
031import org.apache.mina.core.session.IoEventType;
032import org.apache.mina.core.session.IoSession;
033import org.apache.mina.core.write.DefaultWriteRequest;
034import org.apache.mina.core.write.WriteRequest;
035import org.easymock.EasyMock;
036import org.junit.Before;
037import org.junit.Test;
038
039/**
040 * Tests {@link CommonEventFilter}.
041 *
042 * @author <a href="http://mina.apache.org">Apache MINA Project</a>
043 */
044
045public class WrappingFilterTest {
046    private IoSession session;
047
048    private IoFilter.NextFilter nextFilter;
049
050    @Before
051    public void setUp() throws Exception {
052        /*
053         * Create the mocks.
054         */
055        session = new DummySession();
056        nextFilter = EasyMock.createMock(IoFilter.NextFilter.class);
057        //nextFilter = (IoFilter.NextFilter) mockNextFilter.getClass();
058    }
059
060    @Test
061    public void testFilter() throws Exception {
062        MyWrappingFilter wrappingFilter = new MyWrappingFilter();
063
064        /* record expectations */
065        Object message1 = "message one";
066        Object message2 = "message two";
067        WriteRequest writeRequest1 = new DefaultWriteRequest("test1");
068        WriteRequest writeRequest2 = new DefaultWriteRequest("test2");
069        Throwable cause = new Throwable("testing");
070
071        nextFilter.sessionCreated(session);
072        nextFilter.sessionOpened(session);
073        nextFilter.sessionIdle(session, IdleStatus.READER_IDLE);
074        nextFilter.messageReceived(session, message1);
075        nextFilter.messageSent(session, writeRequest1);
076        nextFilter.messageSent(session, writeRequest2);
077        nextFilter.messageReceived(session, message2);
078        nextFilter.filterWrite(session, writeRequest1);
079        nextFilter.filterClose(session);
080        nextFilter.exceptionCaught(session, cause);
081        nextFilter.sessionClosed(session);
082
083        /* replay */
084        EasyMock.replay(nextFilter);
085        wrappingFilter.sessionCreated(nextFilter, session);
086        wrappingFilter.sessionOpened(nextFilter, session);
087        wrappingFilter.sessionIdle(nextFilter, session, IdleStatus.READER_IDLE);
088        wrappingFilter.messageReceived(nextFilter, session, message1);
089        wrappingFilter.messageSent(nextFilter, session, writeRequest1);
090        wrappingFilter.messageSent(nextFilter, session, writeRequest2);
091        wrappingFilter.messageReceived(nextFilter, session, message2);
092        wrappingFilter.filterWrite(nextFilter, session, writeRequest1);
093        wrappingFilter.filterClose(nextFilter, session);
094        wrappingFilter.exceptionCaught(nextFilter, session, cause);
095        wrappingFilter.sessionClosed(nextFilter, session);
096
097        /* verify */
098        EasyMock.verify(nextFilter);
099
100        /* check event lists */
101        assertEquals(11, wrappingFilter.eventsBefore.size());
102        assertEquals(IoEventType.SESSION_CREATED, wrappingFilter.eventsBefore.get(0));
103        assertEquals(IoEventType.SESSION_OPENED, wrappingFilter.eventsBefore.get(1));
104        assertEquals(IoEventType.SESSION_IDLE, wrappingFilter.eventsBefore.get(2));
105        assertEquals(IoEventType.MESSAGE_RECEIVED, wrappingFilter.eventsBefore.get(3));
106        assertEquals(IoEventType.MESSAGE_SENT, wrappingFilter.eventsBefore.get(4));
107        assertEquals(IoEventType.MESSAGE_SENT, wrappingFilter.eventsBefore.get(5));
108        assertEquals(IoEventType.MESSAGE_RECEIVED, wrappingFilter.eventsBefore.get(6));
109        assertEquals(IoEventType.WRITE, wrappingFilter.eventsBefore.get(7));
110        assertEquals(IoEventType.CLOSE, wrappingFilter.eventsBefore.get(8));
111        assertEquals(IoEventType.EXCEPTION_CAUGHT, wrappingFilter.eventsBefore.get(9));
112        assertEquals(IoEventType.SESSION_CLOSED, wrappingFilter.eventsBefore.get(10));
113        assertEquals(wrappingFilter.eventsBefore, wrappingFilter.eventsAfter);
114    }
115
116    private static class MyWrappingFilter extends CommonEventFilter {
117        List<IoEventType> eventsBefore = new ArrayList<IoEventType>();
118
119        List<IoEventType> eventsAfter = new ArrayList<IoEventType>();
120
121        /**
122         * Default constructor
123         */
124        public MyWrappingFilter() {
125            super();
126        }
127
128        @Override
129        protected void filter(IoFilterEvent event) {
130            eventsBefore.add(event.getType());
131            event.fire();
132            eventsAfter.add(event.getType());
133        }
134    }
135}