/*
 * Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/**
 * @test
 * @bug 4414263
 * @summary Make sure PolicyNode.getPolicyQualifiers() returns
 *      Set of PolicyQualifierInfos.
 */
import java.io.File;
import java.io.FileInputStream;
import java.security.cert.*;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class GetPolicyQualifiers {

    public static void main(String[] args) throws Exception {

        CertificateFactory cf = CertificateFactory.getInstance("X.509", "SUN");
        File f = new File(System.getProperty("test.src", "."), "speech2speech");
        X509Certificate mostTrustedCaCert = (X509Certificate)
            cf.generateCertificate(new FileInputStream(f));
        Set trustAnchors = Collections.singleton(
            new TrustAnchor(mostTrustedCaCert, null));
        f = new File(System.getProperty("test.src", "."), "speech2eve");
        X509Certificate eeCert = (X509Certificate)
            cf.generateCertificate(new FileInputStream(f));
        CertPathValidator cpv = CertPathValidator.getInstance("PKIX", "SUN");
        PKIXParameters params = new PKIXParameters(trustAnchors);
        params.setPolicyQualifiersRejected(false);
        params.setRevocationEnabled(false);
        List certList = Collections.singletonList(eeCert);
        CertPath cp = cf.generateCertPath(certList);
        PKIXCertPathValidatorResult result =
            (PKIXCertPathValidatorResult) cpv.validate(cp, params);

        PolicyNode policyTree = result.getPolicyTree();
        Iterator children = policyTree.getChildren();
        PolicyNode child = (PolicyNode) children.next();
        Set policyQualifiers = child.getPolicyQualifiers();
        Iterator i = policyQualifiers.iterator();
        while (i.hasNext()) {
            Object next = i.next();
            if (!(next instanceof PolicyQualifierInfo))
                throw new Exception("not a PolicyQualifierInfo");
        }

        params.setPolicyQualifiersRejected(true);
        try {
            result = (PKIXCertPathValidatorResult) cpv.validate(cp, params);
            throw new Exception("Validation of CertPath containing critical " +
                "qualifiers should have failed when policyQualifiersRejected " +
                "flag is true");
        } catch (CertPathValidatorException cpve) {
            if (cpve.getReason() != PKIXReason.INVALID_POLICY) {
                throw new Exception("unexpected reason: " + cpve.getReason());
            }
        }
    }
}
