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

import javax.security.jacc.URLPattern;

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

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

    private static void test_patternType(String p, int expected) {
        String description = "testPatternType:" + p;
        URLPattern u = new URLPattern(p);
        int result = u.patternType();
        if (result == expected) { 
            System.out.println("patternType: " + expected + " " +
                    result + " succeded " + u);
            stat.addStatus(description, stat.PASS);

        } else {
            System.out.println("patternType: " + expected + " " +
                    result + " failed   " + u);
            stat.addStatus(description, stat.FAIL);
        }
    }

    private static void test_compareTo(String p1, int p1Type,
            String p2, int p2Type) {
        String description = "testCompareTo:" +
            p1 + "-" + p1Type + "-" + p2 + "-" + p2Type;
        URLPattern u1 = new URLPattern(p1);
        URLPattern u2 = new URLPattern(p2);

        int expected = p1Type - p2Type;
        boolean unknown = false;
        if (expected == 0 && p1.compareTo(p2) != 0) unknown = true;
        expected = expected > 0 ? 1 : (expected < 0 ? -1 : 0);

        int result = u1.compareTo(u2);
        int inverse = u2.compareTo(u1);

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

    private static boolean get_impliesExpected(
            String p1, int p1Type, String p2, int p2Type) {
        boolean expected = false;
        switch(p1Type) {
        case URLPattern.PT_EXACT:
            if (p2Type == URLPattern.PT_EXACT && p1.equals(p2)) {
                expected = true;
            }
            break;
        case URLPattern.PT_DEFAULT:    
            expected = true;
            break;
        case URLPattern.PT_EXTENSION:
            if (p2Type == URLPattern.PT_EXTENSION && p1.equals(p2)) {
                expected = true;
            } else if (p2Type == URLPattern.PT_EXACT && 
                     p2.endsWith(p1.substring(1))) {
                expected = true;
            }
            break;
        case URLPattern.PT_PREFIX:
            if (p1.equals("/*")) {
                expected = true;
            } else if (p2.startsWith(p1.substring(0,p1.length()-2)) &&
                     (p2.length() == p1.length()-2 || 
                      p2.substring(p1.length()-2).startsWith("/"))) {
                expected = true;
            }
            break;
        }

        return expected;
    }

    private static void test_implies(
            String p1, int p1Type, String p2, int p2Type) {
        String description = "testImplies:" +
            p1 + "-" + p1Type + "-" + p2 + "-" + p2Type;
        URLPattern u1 = new URLPattern(p1);
        URLPattern u2 = new URLPattern(p2);

        boolean expected = get_impliesExpected(p1,p1Type,p2,p2Type);
        boolean expectedInverse = get_impliesExpected(p2,p2Type,p1,p1Type);

        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.PASS);
        } 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.FAIL);
        }
    }


    private static void test_equals(
            String p1, int p1Type, String p2, int p2Type) {
        String description = "testEquals:" + 
            p1 + "-" + p1Type + "-" + p2 + "-" + p2Type;
        URLPattern u1 = new URLPattern(p1);
        URLPattern u2 = new URLPattern(p2);

        boolean expected = (p1Type == p2Type) ? p1.compareTo(p2) == 0 : false;

        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    " + 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);
        }
    }

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

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

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

        for (int i=0; i<upArray.length; i++) { 
            test_patternType(upArray[i],upTypeArray[i]);
        }
    
        for (int i=0; i<upArray.length; i++) {
            for (int j=0; j<upArray.length; j++) {
                test_compareTo(upArray[i],upTypeArray[i],
                               upArray[j],upTypeArray[j]);
            }
        }
    
        for (int i=0; i<upArray.length; i++) {
            for (int j=0; j<upArray.length; j++) {
                test_implies(upArray[i],upTypeArray[i],
                             upArray[j],upTypeArray[j]);
            }
        }

        for (int i=0; i<upArray.length; i++) { 
            for (int j=0; j<upArray.length; j++) {
                test_equals(upArray[i],upTypeArray[i],
                             upArray[j],upTypeArray[j]);
            }
        }
    
        stat.printSummary(testSuite);
    }
}
