/*
 * JOnAS: Java(TM) Open Application Server
 * Copyright (C) 1999 Bull S.A.
 * Contact: jonas-team@objectweb.org
 * 
 * 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 2.1 of the License, or 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
 *
 * --------------------------------------------------------------------------
 * $Id$
 * --------------------------------------------------------------------------
 */

package org.objectweb.jonas.jtests.clients.j2eeca;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import javax.transaction.UserTransaction;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.objectweb.jonas.jtests.beans.j2eeca.transactedCA;
import org.objectweb.jonas.jtests.beans.j2eeca.transactedCAHome;
import org.objectweb.jonas.jtests.util.JTestCase;

/**
 * Tests Jonas Connector Architecture Local Transaction.
 * F_transactionTests tests Jonas CA Local Transaction
 */

public class F_transactionTest extends JTestCase {

    private static UserTransaction utx = null;

    static Context ctx = null;

    // Lookup bean home

    protected static String BEAN_HOME = "transactedCAHome";
    protected static transactedCAHome home = null;
    private static final String RAR_JNDI_NAME = "FictionalLoTransaction";
    final public int CLOSE_HANDLE = 0;
    final public int CLOSE_PHYSICAL = 1;
    public int CloseType = 0;
    static transactedCA bean = null;
    public String UseBeans="j2eeca";
    
    public F_transactionTest(String name) {
        super(name);
    }

    protected void setUp() {
        super.setUp();
        try {
    	    // get JNDI initial context

            if (ctx == null) {
	            ctx = new InitialContext();
            }

	        // We want to start transactions from client: get UserTransaction

            if (utx == null) {
	            utx = (UserTransaction) ctx.lookup("javax.transaction.UserTransaction");
            }

            if (home == null) {
    	        useBeans(UseBeans, false);
            }
            getBean();
            assertTrue (6 == 6);

	    } catch (Exception e) {
	        fail("Cannot lookup UserTransaction in setUp: " +e);
        }
    }
    private void getBean() throws Exception {
        // Connecting to transactedCAHome thru JNDI

        if (home == null) {
	        home = (transactedCAHome)PortableRemoteObject.narrow(
							    ctx.lookup(BEAN_HOME),
							    transactedCAHome.class);
            bean = home.create();
        }
    }
    protected void tearDown() throws Exception {
        //bean.closeUp(CloseType);
    }
    protected void startUp(String testName) {
	    try {
	        bean.method1(RAR_JNDI_NAME, testName);
	    } catch (Exception ee) {
	        ee.printStackTrace();
	        System.exit(2);
	    }
    }

// test list ****************************************************

    /**
    Test Local Transaction with component-managed demarcation.
    
    The application component uses a transaction demarcation API specific 
    to an EIS. The resource adapter needs to notify the application server of 
    the events (transaction begin, commit, and rollback) related to the local 
    transaction. An application server uses this part of the contract.

     */
    public void testTransaction1() {
        CloseType=CLOSE_PHYSICAL;
        startUp("testTransaction1");
        try {
            bean.beginLoTransaction();
            assertTrue (6 == 6);
            bean.closeUp(CloseType);
            bean.commitLoTransaction();
            assertTrue (6 == 6);
        } catch (Exception e) {
            assertTrue(6==7);
        }
    }

    public void testTransaction2() {
        CloseType=CLOSE_PHYSICAL;
        startUp("testTransaction2");
        try {
            bean.closeUp(CloseType);
            bean.commitLoTransaction();
            assertTrue (6 == 7);
        } catch (Exception e) {
            assertTrue(6==6); // should get here
        }
    }

    public static Test suite() {
        return new TestSuite(F_transactionTest.class);
    }

    public static void main (String args[]) {

        String testtorun = null;

        // Get args

        for (int argn = 0; argn < args.length; argn++) {

            String s_arg = args[argn];
            Integer i_arg;

            if (s_arg.equals("-n")) {
                testtorun = args[++argn];
            }
        }

        if (testtorun == null) {
            junit.textui.TestRunner.run(suite());
        } else {
            junit.textui.TestRunner.run(new F_transactionTest(testtorun));
        }
    }
}
