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










