/*
 * 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.s1asdev.jdbc.jdbcjmsauth.client;

import javax.naming.*;
import java.rmi.*;
import java.util.*;
import javax.rmi.PortableRemoteObject;

import com.sun.s1asdev.jdbc.jdbcjmsauth.ejb.*;
import com.sun.ejte.ccl.reporter.SimpleReporterAdapter;

public class Client {
    static SimpleReporterAdapter stat =
        new SimpleReporterAdapter();

    public static void main(String[] args)
        throws Exception {

        stat.addDescription("JDBC JMS Authentication tests");
        Client c = new Client();
        c.doJdbcTests();
        c.doJmsTests();

        stat.printSummary();
    }

    private void doJdbcTests() throws Exception {

        InitialContext ic = new InitialContext();
        Object objRef = ic.lookup("java:comp/env/ejb/SimpleBMPHome");
        SimpleBMPHome simpleBMPHome = (SimpleBMPHome)
            PortableRemoteObject.narrow(objRef, SimpleBMPHome.class);

        SimpleBMP simpleBMP = simpleBMPHome.create();
        String testSuite = "JDBCJmsAuth-JDBC ";
        System.out.println(" jdbc tests 3 & 7 will fail with Derby");
        System.out.println("-----------------------------------------------");
        System.out.println("          JDBC Tests ");
        System.out.println("-----------------------------------------------");
        System.out.println("app auth : getting connection w/o user/pass");
        System.out.print("Should NOT get a connection : " );
        if ( simpleBMP.test1() ) {
            stat.addStatus(testSuite+" test1 ", stat.PASS);
            //System.out.println("PASS");
        } else {
            stat.addStatus(testSuite+" test1 ", stat.FAIL);
            //System.out.println("FAIL");
        }

        System.out.println("-----------------------------------------------");
        System.out.println("app auth : getting connection w/ user/pass");
        System.out.print("Should get a connection : " );
        if ( simpleBMP.test2() ) {
            //System.out.println("PASS");
            stat.addStatus(testSuite+" test2 ", stat.PASS);
        } else {
            stat.addStatus(testSuite+" test2 ", stat.FAIL);
            //System.out.println("FAIL");
        }

        System.out.println("-----------------------------------------------");
        System.out.println("app auth : getting connection w/  wrong user/pass");
        System.out.print("Should NOT get a connection : " );
        if ( simpleBMP.test3() ) {
            //System.out.println("PASS");
            stat.addStatus(testSuite + " test3 ", stat.PASS);
        } else {
            stat.addStatus(testSuite + " test3 ", stat.FAIL);
            //System.out.println("FAIL");
        }

        System.out.println("-----------------------------------------------");
        System.out.println("app auth : getting connection w/ correct then wrong user/pass");
        System.out.print("Should get a connection then NOT get a connection : " );
        if ( simpleBMP.test4() ) {
            //System.out.println("PASS");
            stat.addStatus(testSuite + " test4 ", stat.PASS);
        } else {
            stat.addStatus(testSuite + " test4 ", stat.FAIL);
            //System.out.println("FAIL");
        }

        System.out.println("-----------------------------------------------");
        System.out.println("container auth : getting connection w/o user/pass");
        System.out.print("Should get a connection : " );
        if ( simpleBMP.test5() ) {
            //System.out.println("PASS");
            stat.addStatus(testSuite+" test5 ", stat.PASS);
        } else {
            stat.addStatus(testSuite+" test5 ", stat.FAIL);
            //System.out.println("FAIL");
        }

        System.out.println("-----------------------------------------------");
        System.out.println("container auth : getting connection w/ user/pass");
        System.out.print("Should get a connection : " );
        if ( simpleBMP.test6() ) {
            //System.out.println("PASS");
            stat.addStatus(testSuite+" test6 ", stat.PASS);
        } else {
            stat.addStatus(testSuite+" test6 ", stat.FAIL);
            //System.out.println("FAIL");
        }

        System.out.println("-----------------------------------------------");
        System.out.println("container auth : getting connection w/ wrong user/pass");
        System.out.print("Should NOT get a connection : " );
        if ( simpleBMP.test7() ) {
            //System.out.println("PASS");
            stat.addStatus(testSuite + " test7 ", stat.PASS);
        } else {
            stat.addStatus(testSuite + " test7 ", stat.FAIL);
            //System.out.println("FAIL");
        }
    }

    private void doJmsTests() throws Exception {
        InitialContext ic = new InitialContext();

        Object obj = ic.lookup("java:comp/env/ejb/JmsAuthHome");
        JmsAuthHome jmsAuthHome = (JmsAuthHome)
            PortableRemoteObject.narrow( obj, JmsAuthHome.class );
        JmsAuth jmsAuth = jmsAuthHome.create();

        String testSuite = "JDBCJmsAuth-JMS";

        System.out.println("-----------------------------------------------");
        System.out.println("          JMS tests ");
        System.out.println("-----------------------------------------------");
        System.out.println("app auth : getting connection w/ user/pass");
        System.out.print("Should get a connection : " );
        if ( jmsAuth.test1() ) {
            //System.out.println("PASS");
            stat.addStatus(testSuite + " test1 ", stat.PASS );
        } else {
            stat.addStatus(testSuite + " test1 ", stat.FAIL );
            //System.out.println("FAIL");
        }

        System.out.println("-----------------------------------------------");
        System.out.println("app auth : getting connection w/o user/pass");
        System.out.print("Should get a connection : " );
               if ( jmsAuth.test2() ) {
            //System.out.println("PASS");
            stat.addStatus(testSuite + " test2 ", stat.PASS );
        } else {
            stat.addStatus(testSuite + " test2 ", stat.FAIL );
            //System.out.println("FAIL");
        }

        System.out.println("-----------------------------------------------");
        System.out.println("app auth : getting connection w/  wrong user/pass");
        System.out.print("Should NOT get a connection : " );
        if ( jmsAuth.test3() ) {
            //System.out.println("PASS");
            stat.addStatus(testSuite + " test3 ", stat.PASS );
        } else {
            stat.addStatus(testSuite + " test3 ", stat.FAIL );
            //System.out.println("FAIL");
        }

        System.out.println("-----------------------------------------------");
        System.out.println("app auth : getting connection w/ correct then wrong user/pass");
        System.out.print("Should get a connection then NOT get a connection : " );
               if ( jmsAuth.test4() ) {
            //System.out.println("PASS");
            stat.addStatus(testSuite + " test4 ", stat.PASS );
        } else {
            stat.addStatus(testSuite + " test4 ", stat.FAIL );
            //System.out.println("FAIL");
        }

        System.out.println("-----------------------------------------------");
        System.out.println("container auth : getting connection w/o user/pass");
        System.out.print("Should get a connection : " );
               if ( jmsAuth.test5() ) {
            //System.out.println("PASS");
            stat.addStatus(testSuite + " test5 ", stat.PASS );
        } else {
            stat.addStatus(testSuite + " test5 ", stat.FAIL );
            //System.out.println("FAIL");
        }

        System.out.println("-----------------------------------------------");
        System.out.println("container auth : getting connection w/ user/pass");
        System.out.print("Should get a connection : " );
               if ( jmsAuth.test6() ) {
            //System.out.println("PASS");
            stat.addStatus(testSuite + " test6 ", stat.PASS );
        } else {
            stat.addStatus(testSuite + " test6 ", stat.FAIL );
            //System.out.println("FAIL");
        }
/*
        System.out.println("-----------------------------------------------");
        System.out.println("container auth : getting connection w/ wrong user/pass");
        System.out.print("Should NOT get a connection : " );
               if ( jmsAuth.test7() ) {
            //System.out.println("PASS");
            stat.addStatus(testSuite + " jms-test7 ", stat.PASS );
        } else {
            stat.addStatus(testSuite + " jms-test7 ", stat.FAIL );
            //System.out.println("FAIL");
        }
*/
        System.out.println("-----------------------------------------------");
    }
}
