com.bt.aloha.media.convedia.conference.MaxConferenceDurationTerminationTest.java Source code

Java tutorial

Introduction

Here is the source code for com.bt.aloha.media.convedia.conference.MaxConferenceDurationTerminationTest.java

Source

/*
 * Aloha Open Source SIP Application Server- https://trac.osmosoft.com/Aloha
 *
 * Copyright (c) 2008, British Telecommunications plc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License as published by the Free Software
 * Foundation; either version 3.0 of the License, or (at your option) any later
 * version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License along
 * with this library; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

package com.bt.aloha.media.convedia.conference;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.easymock.classextension.EasyMock;
import org.junit.Before;
import org.junit.Test;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import com.bt.aloha.collections.memory.InMemoryHousekeepingCollectionImpl;
import com.bt.aloha.media.conference.collections.ConferenceCollection;
import com.bt.aloha.media.conference.collections.ConferenceCollectionImpl;
import com.bt.aloha.media.conference.state.ConferenceInfo;
import com.bt.aloha.media.conference.state.ConferenceState;
import com.bt.aloha.media.conference.state.ConferenceTerminationCause;

public class MaxConferenceDurationTerminationTest {

    private final static int FIVE_MINUTES_IN_MILLISECONDS = 300000;
    private final static int TWO_MINUTES = 2;
    private ConferenceInfo conferenceInfoInPast;
    private ConferenceInfo conferenceInfoInFuture;
    private ConferenceInfo conferenceInfoNoMaxDuration;
    private ConferenceCollection conferenceCollection;
    private MaxConferenceDurationTermination maxConferenceDurationTermination;
    private Log log = LogFactory.getLog(this.getClass());
    private boolean endConferenceCalled = false;
    private boolean terminateCalled = false;

    @Before
    public void setup() {
        maxConferenceDurationTermination = new MaxConferenceDurationTermination();
        conferenceCollection = new ConferenceCollectionImpl(
                new InMemoryHousekeepingCollectionImpl<ConferenceInfo>());
        conferenceInfoInPast = new ConferenceInfo("conferenceBean", "a:1", 5, TWO_MINUTES);
        long startTime = System.currentTimeMillis() - FIVE_MINUTES_IN_MILLISECONDS;
        log.debug(String.format("TEST: start time: %s", startTime));
        if (!conferenceInfoInPast.setStartTime(startTime))
            throw new RuntimeException("couldn't set time in the past for some reason");
        conferenceInfoInPast.updateConferenceState(ConferenceState.Active);

        conferenceInfoInFuture = new ConferenceInfo("conferenceBean", "a:1", 5, TWO_MINUTES);
        conferenceInfoInFuture.updateConferenceState(ConferenceState.Active);

        conferenceInfoNoMaxDuration = new ConferenceInfo("conferenceBean", "a:1", 5, 0);
        conferenceInfoNoMaxDuration.updateConferenceState(ConferenceState.Active);

        endConferenceCalled = false;
        terminateCalled = false;
    }

    // create a conference that should have already been terminated and initalise the termination class
    // this should go through the collection and terminate any conferences that should have expired.
    @Test
    public void testInitializeWithTermination() {
        //setup
        conferenceCollection.add(conferenceInfoInPast);
        maxConferenceDurationTermination.setConferenceCollection(conferenceCollection);
        ConferenceBean conferenceBean = EasyMock.createMock(ConferenceBean.class);
        conferenceBean.endConference(conferenceInfoInPast.getId(),
                ConferenceTerminationCause.MaximumDurationExceeded);
        EasyMock.replay(conferenceBean);
        maxConferenceDurationTermination.setConferenceBean(conferenceBean);
        ThreadPoolTaskExecutor te = new ThreadPoolTaskExecutor();
        te.initialize();
        maxConferenceDurationTermination.setTaskExecutor(te);

        //act
        maxConferenceDurationTermination.runTask();
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } // allow time for thread to run

        //assert
        EasyMock.verify(conferenceBean);
    }

    // create a conference that should be terminated in the future, assert that the call isn't removed
    // from the conference collection
    @Test
    public void testInitialiseWithoutTermination() {
        // setup
        terminateCalled = false;
        conferenceCollection.add(conferenceInfoInFuture);
        maxConferenceDurationTermination.setConferenceCollection(conferenceCollection);
        ConferenceBean conferenceBean = EasyMock.createMock(ConferenceBean.class);
        EasyMock.replay(conferenceBean);
        maxConferenceDurationTermination.setConferenceBean(conferenceBean);
        final String callId = conferenceInfoInFuture.getId();

        MaxConferenceDurationScheduler maxConferenceDurationScheduler = new MaxConferenceDurationScheduler() {
            public void cancelTerminateConference(ConferenceInfo conferenceInfo) {
                // do nothing
            }

            public void terminateConferenceAfterMaxDuration(ConferenceInfo conferenceInfo,
                    ConferenceBean conferenceBean) {
                terminateCalled = true;
                if (conferenceInfo.getId() != callId)
                    throw new RuntimeException("unexpected call id");
            }
        };
        maxConferenceDurationTermination.setMaxConferenceDurationScheduler(maxConferenceDurationScheduler);

        //act
        maxConferenceDurationTermination.initialize();

        //assert
        EasyMock.verify(conferenceBean);
        assertTrue(terminateCalled);
    }

    // when a call has no max duration set, treat as infinite and do not terminate
    @Test
    public void testInitialiseWithNoLimit() {
        // setup
        conferenceCollection.add(conferenceInfoNoMaxDuration);
        maxConferenceDurationTermination.setConferenceCollection(conferenceCollection);
        ConferenceBean conferenceBean = new ConferenceBeanImpl() {
            @Override
            public void endConference(String conferenceId, ConferenceTerminationCause terminationCause) {
                endConferenceCalled = true;
            }
        };
        maxConferenceDurationTermination.setConferenceBean(conferenceBean);
        MaxConferenceDurationScheduler maxConferenceDurationScheduler = new MaxConferenceDurationScheduler() {
            public void cancelTerminateConference(ConferenceInfo conferenceInfo) {
                // do nothing
            }

            public void terminateConferenceAfterMaxDuration(ConferenceInfo conferenceInfo,
                    ConferenceBean conferenceBean) {
                terminateCalled = true;
            }
        };
        maxConferenceDurationTermination.setMaxConferenceDurationScheduler(maxConferenceDurationScheduler);

        // act
        maxConferenceDurationTermination.initialize();

        // assert
        assertFalse(terminateCalled);
        assertFalse(endConferenceCalled);
    }

    // ensure that we deal with any exceptions thrown by the conference bean
    @Test
    public void testInitializeConferenceBeanException() {
        //setup
        endConferenceCalled = false;
        conferenceCollection.add(conferenceInfoInPast);
        maxConferenceDurationTermination.setConferenceCollection(conferenceCollection);
        ConferenceBean conferenceBean = new ConferenceBeanImpl() {

            @Override
            public void endConference(String conferenceId, ConferenceTerminationCause terminationCause) {
                endConferenceCalled = true;
                throw new IllegalArgumentException("no call found");
            }

        };
        maxConferenceDurationTermination.setConferenceBean(conferenceBean);

        //act
        maxConferenceDurationTermination.initialize();

        //assert
        assertTrue(endConferenceCalled);
    }

    // ensure that we deal with any exceptions thrown by the termination scheduler
    @Test
    public void testInitialiseSchedulerException() {
        // setup
        terminateCalled = false;
        conferenceCollection.add(conferenceInfoInFuture);
        maxConferenceDurationTermination.setConferenceCollection(conferenceCollection);
        ConferenceBean conferenceBean = EasyMock.createMock(ConferenceBean.class);
        EasyMock.replay(conferenceBean);
        maxConferenceDurationTermination.setConferenceBean(conferenceBean);

        MaxConferenceDurationScheduler maxConferenceDurationScheduler = new MaxConferenceDurationScheduler() {
            public void cancelTerminateConference(ConferenceInfo conferenceInfo) {
                // do nothing
            }

            public void terminateConferenceAfterMaxDuration(ConferenceInfo conferenceInfo,
                    ConferenceBean conferenceBean) {
                terminateCalled = true;
                throw new RuntimeException("unexpected call id");
            }
        };
        maxConferenceDurationTermination.setMaxConferenceDurationScheduler(maxConferenceDurationScheduler);

        //act
        maxConferenceDurationTermination.initialize();

        //assert
        EasyMock.verify(conferenceBean);
        assertTrue(terminateCalled);
    }
}