/*
 * Copyright (c) 2018, 2019 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,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

package org.eclipse.persistence.testing.tests.corba;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.eclipse.persistence.internal.helper.Helper;
import org.eclipse.persistence.testing.framework.TestModel;
import org.eclipse.persistence.testing.framework.TestSuite;
import org.eclipse.persistence.testing.tests.security.corba.SecurityWhileConvertingToMethodTest;
import org.eclipse.persistence.testing.tests.security.corba.SecurityWhileConvertingToMethodTest.ConvertMethodAbstractSession;
import org.eclipse.persistence.testing.tests.security.corba.SecurityWhileConvertingToMethodTest.ConvertMethodNoArg;
import org.eclipse.persistence.testing.tests.security.corba.SecurityWhileConvertingToMethodTest.ConvertMethodSession;
import org.eclipse.persistence.testing.tests.sessionsxml.corba.SessionsXMLSchemaSunCORBATransportConfigTest;

public class CorbaTestModel extends TestModel {

    @Override
    public void addTests() {
        if (!getTests().isEmpty()) {
            return;
        }
        addTest(getValidationSecurityTestSuite());
        addTest(new SessionsXMLSchemaSunCORBATransportConfigTest());
        List<String> tests = new ArrayList<>();
        if (!"com.sun.enterprise.naming.SerialInitContextFactory".equals(System.getProperty("java.naming.factory.initial"))) {
            // Running this model on GlassFish/with GlassFish-Corba implementation is not supported
            // as it uses jndi lookup
            // see https://www.eclipse.org/eclipselink/documentation/2.7/solutions/scaling002.htm#TLADG1228
            tests.add("org.eclipse.persistence.testing.tests.remote.rmi.IIOP.RMIIIOPRemoteModel");
        }
        tests.add("org.eclipse.persistence.testing.tests.remote.suncorba.SunCORBARemoteModel");

        for (int index = 0; index < tests.size(); ++index) {
            try {
                addTest((TestModel) Class.forName(tests.get(index)).newInstance());
            } catch (Throwable exception) {
                System.out.println("Failed to set up " + tests.get(index) + " \n" + exception);
                // exception.printStackTrace();
            }
        }

        // Sort the tests alphabetically.
        Collections.sort(this.getTests(), new Comparator<Object>() {
            @Override
            public int compare(Object left, Object right) {
                return Helper.getShortClassName(left.getClass()).compareTo(Helper.getShortClassName(right.getClass()));
            }
        });
    }

    /**
     * Return the JUnit suite to allow JUnit runner to find it.
     */
    public static junit.framework.TestSuite suite() {
        CorbaTestModel model = new CorbaTestModel();
        model.setName("CorbaTestModel");
        model.setDescription("This model runs all of the CORBA tests.");
        model.addTests();

        return model;
    }

    public static TestSuite getValidationSecurityTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("Validation Security Tests");
        suite.setDescription("This suite includes Validation tests on security (Tests originally in validation model)");

        suite.addTest(new SecurityWhileConvertingToMethodTest(ConvertMethodNoArg.class));//ian added
        suite.addTest(new SecurityWhileConvertingToMethodTest(ConvertMethodSession.class));//ian added
        suite.addTest(new SecurityWhileConvertingToMethodTest(ConvertMethodAbstractSession.class));//ian added

        return suite;
    }

}
