/*
 * 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 jakarta.security.jacc;

import jakarta.security.jacc.URLPattern;
import jakarta.security.jacc.URLPatternSpec;
import java.util.StringTokenizer;

import com.sun.ejte.ccl.reporter.SimpleReporterAdapter;

public class TestURLPatternSpec {
    private static SimpleReporterAdapter stat =
            new SimpleReporterAdapter("appserv-tests");
    private static String testSuite = "Sec::JACC API testURLPatternSpec ";

    private static boolean test_constructor(
            String p, boolean expectedToSucceed) {
        boolean result = expectedToSucceed;

        try {
            URLPatternSpec u = new URLPatternSpec(p);

            if (expectedToSucceed) {
                System.out.println("constructor( ): " + expectedToSucceed +
                    " succeded " + u.toString());
            } else {
                System.out.println("constructor( ): " + expectedToSucceed +
                    " failed   " + u.toString());
                result = false;
            }
        } catch (Throwable t) {
            if (!expectedToSucceed) {
                System.out.println("constructor(e): " + expectedToSucceed +
                     " succeded " + p);
            } else {
                result = false;
                System.out.println("constructor(e): " + expectedToSucceed +
                     " failed   " + p);
                t.printStackTrace();
            }
        }
        return result;
    }

    private static void test_getURLPattern(String s) {
        URLPatternSpec u = new URLPatternSpec(s);

        String result = u.getURLPattern();

        String expected = s;
        int colon = s.indexOf(":");
        if (colon > 0) {
            expected = s.substring(0,colon);
        }

        if (result.equals(expected)) {
            System.out.println("getURLPattern: succeded " + expected + " " +
                    result + " " + s);
        } else {
            System.out.println("getURLPattern: failed  " + expected + " " +
                    result + " " + s);
        }
    }

    private static void test_equals(
            String p1, String p2, boolean expected) {

        String description = "testEquals:" + p1 + "-" + p2 + "-" + expected;
        URLPatternSpec u1 = new URLPatternSpec(p1);
        URLPatternSpec u2 = new URLPatternSpec(p2);

        boolean result = u1.equals(u2);
        boolean inverse = u2.equals(u1);

        if (result == inverse) {
            if (result == true && (!u1.implies(u2) || !u2.implies(u1))) {
                System.out.println("equals(<->): " + expected + " " +
                        result + " failed    " +
                        "\t" + u1.implies(u2) + u2.implies(u1)+" "+
                        "\t" + u2 + "\t" + u1);
                stat.addStatus(description, stat.FAIL);
            } else if (result == expected) {
                System.out.println("equals(-->): " + expected + " " +
                        result + " succeded " + u1 + "\t" + u2);
                stat.addStatus(description, stat.PASS);
            } else {
                System.out.println("equals(-->): " + expected + " " +
                        result + " failed    " + u1 + "\t" + u2);
                stat.addStatus(description, stat.FAIL);
            }
        } else {
            System.out.println("equals(<--): " + result + " " +
                    inverse + " failed    " + u2 + "\t" + u1);
            stat.addStatus(description, stat.FAIL);
        }
    }

    private static void test_hashCode(String s1) {
        String description = "testHashCode:" + s1;
        URLPatternSpec u1 = new URLPatternSpec(s1);

        int result = u1.hashCode();
        int again  = u1.hashCode();

        StringBuffer s2;

        int colon = s1.indexOf(":");

        if (colon > 0) {
            s2 = new StringBuffer(s1.substring(0,colon+1));

            String list = s1.substring(colon);

            StringTokenizer tokenizer = new StringTokenizer(list,":");

            int count = tokenizer.countTokens();
            String s2Array[] = new String[count];
            for (int i=count; i>0; i--) {
                s2Array[i-1] = tokenizer.nextToken();
            }

            for (int i=0; i<count; i++) {
                if (i!=0) {
                    s2.append(":");
                }
                s2.append(s2Array[i]);
            }
            //include empty string if it is there
            if (s1.startsWith(":") || s1.endsWith(":")) {
                s2.append(":");
            }
        } else {
            s2 = new StringBuffer(s1);
        }

        URLPatternSpec u2 = new URLPatternSpec(s2.toString());
        int other = u2.hashCode();
        if (result == again && result == other) {
            System.out.println("hashCode: " + result + " " +
                    again + " " + other + " succeded " + s1 +
                    " " + u2.toString());
            stat.addStatus(description, stat.PASS);
        } else {
            System.out.println("hashCode: " + result + " " +
                again + " " + other + " failed " + s1 +
                " " + u2.toString());
            stat.addStatus(description, stat.FAIL);
        }
    }

    private static void test_implies(String p1, String p2,
            boolean expected, boolean expectedInverse) {
        String description = "testImplies:" +
            p1 + "-" + p2 + "-" + expected + "-" + expectedInverse;
        URLPatternSpec u1 = new URLPatternSpec(p1);
        URLPatternSpec u2 = new URLPatternSpec(p2);

        boolean result = u1.implies(u2);
        boolean inverse = u2.implies(u1);

        if (result != expected) {
                 System.out.println("implies(->): " + expected + " " + result +
                    " succeded " + u1 + "\t" + u2);
            stat.addStatus(description, stat.FAIL);
        } else if (inverse != expectedInverse) {
            System.out.println("implies(<-): " + expectedInverse + " " +
                    inverse + " failed    " + u2 + "\t" + u1);
            stat.addStatus(description, stat.FAIL);
        } else {
            System.out.println("implies(->): " + expected + " " + result +
                    " failed    " + u1 + "\t" + u2);
            stat.addStatus(description, stat.PASS);
        }
    }

    public static void main ( String[] args ) {
        stat.addDescription(testSuite);

        String pArray[] = {
            "/a/c",
            "/a/b/c.jsp",
            "/a/c/*",
            "/a/*",
            "/*",
            /* COMMENTED OUT! "//*",*/
            "*.jsp",
            "*.asp",
            "/",
            /* COMMENTED OUT! ,"//" */
            ""
        };

        int pTypeArray[] = {
            URLPattern.PT_EXACT,
            URLPattern.PT_EXACT,
            URLPattern.PT_PREFIX,
            URLPattern.PT_PREFIX,
            URLPattern.PT_PREFIX,
            /* COMMENTED OUT! URLPattern.PT_PREFIX, */
            URLPattern.PT_EXTENSION,
            URLPattern.PT_EXTENSION,
            URLPattern.PT_DEFAULT,
            /* COMMENTED OUT! ,URLPattern.PT_DEFAULT */
            URLPattern.PT_EXACT
        };

        for (int i=0; i<pArray.length; i++) {

            if (!test_constructor(pArray[i],true)) {
                break;
            }
            StringBuffer s = new StringBuffer(pArray[i]);

            test_getURLPattern(s.toString());
            test_hashCode(s.toString());

            URLPattern ui = new URLPattern(pArray[i]);

            for (int j=0; j<pArray.length; j++) {

                boolean result = false;

                URLPattern uj = new URLPattern(pArray[j]);

                if (j==i || uj.implies(ui)) {
                    result = test_constructor(s.toString() + ":" +
                                     pArray[j],false);
                } else {
                    switch(pTypeArray[i]) {
                    case URLPattern.PT_EXACT:
                        result = test_constructor(s.toString() + ":" +
                                pArray[j],false);
                        break;
                    case URLPattern.PT_DEFAULT:
                        result = test_constructor(s.toString() + ":" +
                                pArray[j],true);
                        break;
                    case URLPattern.PT_EXTENSION:
                        if (pTypeArray[j] == URLPattern.PT_PREFIX) {
                            result = test_constructor(s.toString() + ":" +
                                    pArray[j],true);
                        } else if (pTypeArray[j] == URLPattern.PT_EXACT) {
                            if (pArray[j].endsWith(pArray[i].substring(1))) {
                                result = test_constructor(s.toString() + ":" +
                                        pArray[j],true);
                            } else {
                                result = test_constructor(s.toString() + ":" +
                                        pArray[j],false);
                            }
                        } else {
                            result = test_constructor(s.toString() + ":" +
                                    pArray[j],false);
                        }
                        break;
                    case URLPattern.PT_PREFIX:
                        if (pTypeArray[j] == URLPattern.PT_EXACT ||
                                pTypeArray[j] == URLPattern.PT_PREFIX) {

                            if (ui.implies(uj)) {
                                result = test_constructor(s.toString() + ":" +
                                        pArray[j],true);
                            } else {
                                result = test_constructor(s.toString() + ":" +
                                        pArray[j],false);
                            }
                        } else {
                            result = test_constructor(s.toString() + ":" +
                                    pArray[j],false);
                        }
                        break;
                   }
               }

               if (result) {

                   String old = s.toString();
                   s.append(":" + pArray[j]);
                   String New = s.toString();

                   test_getURLPattern(New);

                   test_hashCode(New);

                   test_equals(old,old,true);
                   test_equals(New,New,true);

                   URLPatternSpec os = new URLPatternSpec(old);
                   URLPatternSpec ns = new URLPatternSpec(New);

                   if (os.toString().equals(ns.toString())) {
                       test_equals(New,old,true);
                       test_implies(New,old,true,true);
                   }
                   else {
                       test_equals(New,old,false);
                       test_implies(New,old,false,true);
                   }
                }
            }
        }
        stat.printSummary(testSuite);
    }
}










