/*
 * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.s1peqe.transaction.txnegative.client;

/*
 * Client.java
 *
 */

import javax.naming.*;
import javax.rmi.PortableRemoteObject;
import com.sun.ejte.ccl.reporter.SimpleReporterAdapter;
import javax.transaction.*;

public class Client {
    public SimpleReporterAdapter status;
    private UserTransaction             userTransaction;


    public Client() {
    status = new SimpleReporterAdapter("appserv-tests");
    try{
    userTransaction = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction");
    }catch(Exception ex) {
    	ex.printStackTrace();
    }
    }

    
    public static void main(String[] args) {
	System.out.println("\nStarting Txglobal Test Suite");
        Client client = new Client();

        // run the tests
        client.runTestClient();

    }
    public void runTestClient() {
	status.addDescription("This is to test the valid transaction exception!");
        try {
            System.out.println("START");

            /*Context initial = new InitialContext();

            Object objref = initial.lookup("java:comp/env/ejb/TestHung");
            com.sun.s1peqe.transaction.txnegative.ejb.test.TestHome thome = (com.sun.s1peqe.transaction.txhung.ejb.test.TestHome)PortableRemoteObject.narrow(objref, TestHome.class);

            com.sun.s1peqe.transaction.txnegative.ejb.test.TestRemote t = thome.create();
            boolean result=false;
            boolean xa = true;
            boolean nonxa = false;

            try {
                result = t.testA1(xa);
		System.out.println("TEST FAILED");
            } catch (javax.ejb.CreateException e) {
                System.out.println("CreateException");
		System.out.println("TEST FAILED");
            } catch (Exception e) {
		System.out.println("TEST PASSED");
            }
            if (!result) {
                status.addStatus("txnegative testA1 ", status.PASS);
            } else {
                status.addStatus("txnegative testA1 ", status.FAIL);
            }
	    result = false;

            try {
                result = t.testA1(nonxa);
		System.out.println("TEST FAILED");
            } catch (javax.ejb.CreateException e) {
                System.out.println("CreateException");
		System.out.println("TEST FAILED");
            } catch (Exception e) {
		System.out.println("TEST PASSED");
            }
            if (!result) {
                status.addStatus("txnegative testA2 ", status.PASS);
            } else {
                status.addStatus("txnegative testA2 ", status.FAIL);
            }*/
            boolean result=false;

            try {
		userTransaction.begin();
		userTransaction.begin();
		System.out.println("TEST FAILED");
            } catch (NotSupportedException ne) {
                System.out.println("NotSupportedException");
		System.out.println("TEST PASSED");
		result = true;
            } catch (SystemException ne) {
                System.out.println("SystemException");
		System.out.println("TEST PASSED");
		result = true;
            } catch (Exception e) {
		e.printStackTrace();
		System.out.println("TEST FAILED");
            }
            if (result) {
                status.addStatus("txnegative t1 ", status.PASS);
            } else {
                status.addStatus("txnegative t1 ", status.FAIL);
            }
	    result = false;
            try {
		userTransaction.commit();
		System.out.println("TEST FAILED");
            } catch (IllegalStateException ne) {
                System.out.println("IllegalStateException");
		System.out.println("TEST PASSED");
		result = true;
            } catch (SystemException ne) {
                System.out.println("SystemException");
		System.out.println("TEST PASSED");
		result = true;
            } catch (Exception e) {
		e.printStackTrace();
		System.out.println("TEST FAILED");
            }
            if (result) {
                status.addStatus("txnegative t2 ", status.PASS);
            } else {
                status.addStatus("txnegative t2 ", status.FAIL);
            }
	    result = false;
            try {
		userTransaction.rollback();
		System.out.println("TEST FAILED");
            } catch (IllegalStateException ne) {
                System.out.println("IllegalStateException");
		System.out.println("TEST PASSED");
		result = true;
            } catch (SystemException ne) {
                System.out.println("SystemException");
		System.out.println("TEST PASSED");
		result = true;
            } catch (Exception e) {
		e.printStackTrace();
		System.out.println("TEST FAILED");
            }
            if (result) {
                status.addStatus("txnegative t3 ", status.PASS);
            } else {
                status.addStatus("txnegative t3 ", status.FAIL);
            }
	    result = false;
            try {
		userTransaction.setRollbackOnly();
		System.out.println("TEST FAILED");
            } catch (IllegalStateException ne) {
                System.out.println("IllegalStateException");
		System.out.println("TEST PASSED");
		result = true;
            } catch (SystemException ne) {
                System.out.println("SystemException");
		System.out.println("TEST PASSED");
		result = true;
            } catch (Exception e) {
		e.printStackTrace();
		System.out.println("TEST FAILED");
            }
            if (result) {
                status.addStatus("txnegative t4 ", status.PASS);
            } else {
                status.addStatus("txnegative t4 ", status.FAIL);
            }



            System.out.println("FINISH");
            status.printSummary("txglobalID");

        } catch (Exception ex) {
            System.err.println("Caught an exception:");
            ex.printStackTrace();
            status.addStatus("txnegative testA1 ", status.FAIL);
        }
	}
    
}
