/*
 * 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);
    }
}










