/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package javax.xml.crypto.test.dsig;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.security.Security;
import javax.xml.crypto.KeySelector;

import javax.xml.crypto.test.KeySelectors;

import static org.junit.Assert.assertTrue;

/**
 * This is a testcase to validate all the W3C xmldsig C14N11 testcases.
 *
 */
public class C14N11Test {

    private SignatureValidator validator;
    private File dir;
    private KeySelector sks;
    private static String[] vendors = { "IAIK", "IBM", "ORCL", "SUN", "UPC" };

    static {
        Security.insertProviderAt
            (new org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI(), 1);
    }

    public C14N11Test() throws Exception {
        String fs = System.getProperty("file.separator");
        String base = System.getProperty("basedir") == null ? "./": System.getProperty("basedir");
        dir = new File(base + fs + "src/test/resources" + fs
            + "org" + fs + "w3c" + fs + "www" + fs
            + "interop" + fs + "xmldsig" + fs + "c14n11");
        validator = new SignatureValidator(dir);
        sks = new KeySelectors.SecretKeySelector("secret".getBytes(StandardCharsets.US_ASCII));
    }

    @org.junit.Test
    public void test_xmlid_1() throws Exception {
        test_c14n11("xmlid-1");
    }

    @org.junit.Test
    public void test_xmlid_2() throws Exception {
        test_c14n11("xmlid-2");
    }

    @org.junit.Test
    public void test_xmlspace_1() throws Exception {
        test_c14n11("xmlspace-1");
    }

    @org.junit.Test
    public void test_xmlspace_2() throws Exception {
        test_c14n11("xmlspace-2");
    }

    @org.junit.Test
    public void test_xmlspace_3() throws Exception {
        test_c14n11("xmlspace-3");
    }

    @org.junit.Test
    public void test_xmlspace_4() throws Exception {
        test_c14n11("xmlspace-4");
    }

    @org.junit.Test
    public void test_xmllang_1() throws Exception {
        test_c14n11("xmllang-1");
    }

    @org.junit.Test
    public void test_xmllang_2() throws Exception {
        test_c14n11("xmllang-2");
    }

    @org.junit.Test
    public void test_xmllang_3() throws Exception {
        test_c14n11("xmllang-3");
    }

    @org.junit.Test
    public void test_xmllang_4() throws Exception {
        test_c14n11("xmllang-4");
    }

    @org.junit.Test
    public void test_xmlbase_prop_1() throws Exception {
        test_c14n11("xmlbase-prop-1");
    }

    @org.junit.Test
    public void test_xmlbase_prop_2() throws Exception {
        test_c14n11("xmlbase-prop-2");
    }

    @org.junit.Test
    public void test_xmlbase_prop_3() throws Exception {
        test_c14n11("xmlbase-prop-3");
    }

    @org.junit.Test
    public void test_xmlbase_prop_4() throws Exception {
        test_c14n11("xmlbase-prop-4");
    }

    @org.junit.Test
    public void test_xmlbase_prop_5() throws Exception {
        test_c14n11("xmlbase-prop-5");
    }

    @org.junit.Test
    public void test_xmlbase_prop_6() throws Exception {
        test_c14n11("xmlbase-prop-6");
    }

    @org.junit.Test
    public void test_xmlbase_prop_7() throws Exception {
        test_c14n11("xmlbase-prop-7");
    }

    @org.junit.Test
    public void test_xmlbase_c14n11spec_102() throws Exception {
        String[] vendors = {"IAIK", "IBM", "ORCL", "SUN", "UPC"};
        test_c14n11("xmlbase-c14n11spec-102", vendors);
    }

    @org.junit.Test
    public void test_xmlbase_c14n11spec2_102() throws Exception {
        String[] vendors = {"IAIK", "IBM", "ORCL", "SUN"};
        test_c14n11("xmlbase-c14n11spec2-102", vendors);
    }

    @org.junit.Test
    public void test_xmlbase_c14n11spec3_103() throws Exception {
        String[] vendors = {"IAIK", "IBM", "ORCL", "SUN", "UPC"};
        test_c14n11("xmlbase-c14n11spec3-103", vendors);
    }

    private void test_c14n11(String test) throws Exception {
        for (int i = 0; i < vendors.length; i++) {
            String file = test + "-" + vendors[i] + ".xml";
            // System.out.println("Validating " + file);
            boolean coreValidity = validator.validate(file, sks);
            assertTrue(file + " failed core validation", coreValidity);
        }
    }

    private void test_c14n11(String test, String[] vendors) throws Exception {
        for (int i = 0; i < vendors.length; i++) {
            String file = test + "-" + vendors[i] + ".xml";
            // System.out.println("Validating " + file);
            boolean coreValidity = validator.validate(file, sks);
            assertTrue(file + " failed core validation", coreValidity);
        }
    }
}
