/**
 * 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
 * <p/>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p/>
 * 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.superbiz.telephone;

import junit.framework.TestCase;

import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Properties;

/**
 * @version $Rev$ $Date$
 */
public class TelephoneTest extends TestCase {

    //START SNIPPET: setup

    //Random port to avoid test conflicts
    private static final int port = Integer.parseInt(System.getProperty("ejbd.port", "" + org.apache.openejb.util.NetworkUtil.getNextAvailablePort()));

    @Override
    protected void setUp() throws Exception {
        final Properties properties = new Properties();
        properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.core.LocalInitialContextFactory");
        properties.setProperty("openejb.embedded.remotable", "true");

        //Just for this test we change the default port from 4204 to avoid conflicts
        properties.setProperty("ejbd.port", "" + port);

        // Uncomment these properties to change the defaults
        //properties.setProperty("ejbd.bind", "localhost");
        //properties.setProperty("ejbd.threads", "200");
        //properties.setProperty("ejbd.disabled", "false");
        //properties.setProperty("ejbd.only_from", "127.0.0.1,192.168.1.1");

        new InitialContext(properties);
    }
    //END SNIPPET: setup

    /**
     * Lookup the Telephone bean via its remote interface but using the LocalInitialContextFactory
     *
     * @throws Exception
     */
    //START SNIPPET: localcontext
    public void testTalkOverLocalNetwork() throws Exception {

        final Properties properties = new Properties();
        properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.core.LocalInitialContextFactory");
        final InitialContext localContext = new InitialContext(properties);

        final Telephone telephone = (Telephone) localContext.lookup("TelephoneBeanRemote");

        telephone.speak("Did you know I am talking directly through the embedded container?");

        assertEquals("Interesting.", telephone.listen());

        telephone.speak("Yep, I'm using the bean's remote interface but since the ejb container is embedded " +
                "in the same vm I'm just using the LocalInitialContextFactory.");

        assertEquals("Really?", telephone.listen());

        telephone.speak("Right, you really only have to use the RemoteInitialContextFactory if you're in a different vm.");

        assertEquals("Oh, of course.", telephone.listen());
    }
    //END SNIPPET: localcontext

    /**
     * Lookup the Telephone bean via its remote interface using the RemoteInitialContextFactory
     *
     * @throws Exception
     */
    //START SNIPPET: remotecontext
    public void testTalkOverRemoteNetwork() throws Exception {
        final Properties properties = new Properties();
        properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
        properties.setProperty(Context.PROVIDER_URL, "ejbd://localhost:" + port);
        final InitialContext remoteContext = new InitialContext(properties);

        final Telephone telephone = (Telephone) remoteContext.lookup("TelephoneBeanRemote");

        telephone.speak("Is this a local call?");

        assertEquals("No.", telephone.listen());

        telephone.speak("This would be a lot cooler if I was connecting from another VM then, huh?");

        assertEquals("I wondered about that.", telephone.listen());

        telephone.speak("I suppose I should hangup and call back over the LocalInitialContextFactory.");

        assertEquals("Good idea.", telephone.listen());

        telephone.speak("I'll remember this though in case I ever have to call you accross a network.");

        assertEquals("Definitely.", telephone.listen());
    }
    //END SNIPPET: remotecontext

}
