jdk/test/java/security/misc/GetInstanceNullsEmpties.java
author wetmore
Mon, 31 Oct 2016 14:09:42 -0700
changeset 41826 b35ee9b35b09
permissions -rw-r--r--
4985694: Incomplete spec for most of the getInstances Reviewed-by: xuelei, mullan

/*
 * Copyright (c) 2016, 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.
 */

import java.security.*;
import java.security.cert.*;
import javax.crypto.*;
import javax.net.ssl.*;
import javax.security.auth.login.*;
import java.lang.reflect.*;
import java.util.Arrays;

/*
 * @test
 * @bug 4985694
 * @summary Incomplete spec for most of the getInstances
 */
/**
 * A simple test to see what is being thrown when null Strings are passed
 * to the various getInstance() methods.
 *
 * These tests use various algorithm names that don't exist (e.g. "FOO"
 * Ciphers). Just need something non-null for testing, as the tests will throw
 * exceptions before trying to instantiate a real object.
 */
public class GetInstanceNullsEmpties {

    private static final Provider SUN = Security.getProvider("SUN");

    /*
     * See if there are more than "expected" number of getInstance() methods,
     * which will indicate to developers that this test needs an update.
     */
    private static void checkNewMethods(Class<?> clazz, int expected)
            throws Exception {

        long found = Arrays.stream(clazz.getMethods())
                .filter(name -> name.getName().equals("getInstance"))
                .count();

        if (found != expected) {
            throw new Exception("Number of getInstance() mismatch: "
                    + expected + " expected, " + found + " found");
        }
    }

    /**
     * Main loop.
     */
    public static void main(String[] args) throws Exception {

        /*
         * JCA
         */
        testAlgorithmParameterGenerator();
        testAlgorithmParameters();
        testCertificateFactory();
        testCertPathBuilder();
        testCertPathValidator();
        testCertStore();
        testKeyFactory();
        testKeyPairGenerator();
        testKeyStore();
        testMessageDigest();
        testPolicy();
        testSecureRandom();
        testSignature();

        /*
         * JCE
         */
        testCipher();
        testExemptionMechanism();
        testKeyAgreement();
        testKeyGenerator();
        testMac();
        testSecretKeyFactory();

        /*
         * JSSE
         */
        testKeyManagerFactory();
        testSSLContext();
        testTrustManagerFactory();

        /*
         * JGSS
         *
         * KeyTab.getInstance doesn't take algorithm names, so we'll
         * ignore this one.
         */
        testConfiguration();

        System.out.println("\nTEST PASSED!");
    }

    private static Method getInstance(Class clazz, Class... args)
            throws Exception {
        boolean firstPrinted = false;

        System.out.print("\n" + clazz.getName() + "(");
        for (Class c : args) {
            System.out.print(firstPrinted
                    ? ", " + c.getName() : c.getName());
            firstPrinted = true;
        }
        System.out.println("):");

        return clazz.getMethod("getInstance", args);
    }

    private static void run(Method m, Class expectedException,
            Object... args) throws Exception {

        try {
            m.invoke(null, args);
            throw new Exception("Didn't throw exception");
        } catch (InvocationTargetException ite) {
            Throwable root = ite.getCause();
            if (root instanceof Exception) {
                Exception e = (Exception) root;
                if (expectedException.isInstance(e)) {
                    System.out.print("OK ");
                    return;
                } else {
                    System.out.println(
                        "Unexpected InvocationTargetException!");
                    throw e;
                }
            }
            throw ite;
        }
    }

    /*
     * Constants so lines aren't so long.
     */
    private static final Class STRING = String.class;
    private static final Class PROVIDER = Provider.class;

    private static void testAlgorithmParameterGenerator() throws Exception {
        Class clazz = AlgorithmParameterGenerator.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testAlgorithmParameters() throws Exception {
        Class clazz = AlgorithmParameters.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testCertPathBuilder() throws Exception {
        Class clazz = CertPathBuilder.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testCertPathValidator() throws Exception {
        Class clazz = CertPathValidator.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testCertStore() throws Exception {
        Class clazz = CertStore.class;
        Method m;
        CertStoreParameters csp = () -> null;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING, CertStoreParameters.class);
        run(m, NullPointerException.class, (Object) null, csp);
        run(m, NoSuchAlgorithmException.class, "", csp);

        m = getInstance(clazz, STRING, CertStoreParameters.class, STRING);
        run(m, NullPointerException.class, null, csp, "SUN");
        run(m, NoSuchAlgorithmException.class, "", csp, "SUN");
        run(m, IllegalArgumentException.class, "FOO", csp, null);
        run(m, IllegalArgumentException.class, "FOO", csp, "");

        m = getInstance(clazz, STRING, CertStoreParameters.class, PROVIDER);
        run(m, NullPointerException.class, null, csp, SUN);
        run(m, NoSuchAlgorithmException.class, "", csp, SUN);
        run(m, IllegalArgumentException.class, "FOO", csp, null);
    }

    private static void testCertificateFactory() throws Exception {
        Class clazz = CertificateFactory.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, CertificateException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, CertificateException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, CertificateException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testCipher() throws Exception {
        Class clazz = Cipher.class;
        Method m;

        checkNewMethods(clazz, 3);

        /*
         * Note the Cipher API is spec'd to throw a NoSuchAlgorithmException
         * for a null transformation.
         */
        m = getInstance(clazz, STRING);
        run(m, NoSuchAlgorithmException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NoSuchAlgorithmException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NoSuchAlgorithmException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testConfiguration() throws Exception {
        Class clazz = Configuration.class;
        Method m;
        Configuration.Parameters cp = new Configuration.Parameters() {
        };

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING, Configuration.Parameters.class);
        run(m, NullPointerException.class, (Object) null, cp);
        run(m, NoSuchAlgorithmException.class, "", cp);

        m = getInstance(clazz, STRING, Configuration.Parameters.class, STRING);
        run(m, NullPointerException.class, null, cp, "SUN");
        run(m, NoSuchAlgorithmException.class, "", cp, "SUN");
        run(m, IllegalArgumentException.class, "FOO", cp, null);
        run(m, IllegalArgumentException.class, "FOO", cp, "");

        m = getInstance(clazz, STRING, Configuration.Parameters.class,
                PROVIDER);
        run(m, NullPointerException.class, null, cp, SUN);
        run(m, NoSuchAlgorithmException.class, "", cp, SUN);
        run(m, IllegalArgumentException.class, "FOO", cp, null);
    }

    private static void testExemptionMechanism() throws Exception {
        Class clazz = ExemptionMechanism.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testKeyAgreement() throws Exception {
        Class clazz = KeyAgreement.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testKeyFactory() throws Exception {
        Class clazz = KeyFactory.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testKeyGenerator() throws Exception {
        Class clazz = KeyGenerator.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testKeyManagerFactory() throws Exception {
        Class clazz = KeyManagerFactory.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testKeyPairGenerator() throws Exception {
        Class clazz = KeyPairGenerator.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testKeyStore() throws Exception {
        Class clazz = KeyStore.class;
        Method m;

        /*
         * There are actually two additional getInstance() methods with File
         * as the first parameter.
         */
        checkNewMethods(clazz, 5);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, KeyStoreException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, KeyStoreException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, KeyStoreException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testMac() throws Exception {
        Class clazz = Mac.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testMessageDigest() throws Exception {
        Class clazz = MessageDigest.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testPolicy() throws Exception {
        Class clazz = Policy.class;
        Method m;
        Policy.Parameters pp = new Policy.Parameters() {
        };

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING, Policy.Parameters.class);
        run(m, NullPointerException.class, (Object) null, pp);
        run(m, NoSuchAlgorithmException.class, "", pp);

        m = getInstance(clazz, STRING, Policy.Parameters.class, STRING);
        run(m, NullPointerException.class, null, pp, "SUN");
        run(m, NoSuchAlgorithmException.class, "", pp, "SUN");
        run(m, IllegalArgumentException.class, "FOO", pp, null);
        run(m, IllegalArgumentException.class, "FOO", pp, "");

        m = getInstance(clazz, STRING, Policy.Parameters.class, PROVIDER);
        run(m, NullPointerException.class, null, pp, SUN);
        run(m, NoSuchAlgorithmException.class, "", pp, SUN);
        run(m, IllegalArgumentException.class, "FOO", pp, null);
    }

    private static void testSSLContext() throws Exception {
        Class clazz = SSLContext.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testSecretKeyFactory() throws Exception {
        Class clazz = SecretKeyFactory.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testSecureRandom() throws Exception {
        Class clazz = SecureRandom.class;
        Method m;
        SecureRandomParameters srp = new SecureRandomParameters() {
        };

        checkNewMethods(clazz, 6);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);

        m = getInstance(clazz, STRING, SecureRandomParameters.class);
        run(m, NullPointerException.class, (Object) null, srp);
        run(m, NoSuchAlgorithmException.class, "", srp);

        m = getInstance(clazz, STRING, SecureRandomParameters.class, STRING);
        run(m, NullPointerException.class, null, srp, "SUN");
        run(m, NoSuchAlgorithmException.class, "", srp, "SUN");
        run(m, IllegalArgumentException.class, "FOO", srp, null);
        run(m, IllegalArgumentException.class, "FOO", srp, "");

        m = getInstance(clazz, STRING, SecureRandomParameters.class, PROVIDER);
        run(m, NullPointerException.class, null, srp, SUN);
        run(m, NoSuchAlgorithmException.class, "", srp, SUN);
        run(m, IllegalArgumentException.class, "FOO", srp, null);
    }

    private static void testSignature() throws Exception {
        Class clazz = Signature.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }

    private static void testTrustManagerFactory() throws Exception {
        Class clazz = TrustManagerFactory.class;
        Method m;

        checkNewMethods(clazz, 3);

        m = getInstance(clazz, STRING);
        run(m, NullPointerException.class, (Object) null);
        run(m, NoSuchAlgorithmException.class, "");

        m = getInstance(clazz, STRING, STRING);
        run(m, NullPointerException.class, null, "SUN");
        run(m, NoSuchAlgorithmException.class, "", "SUN");
        run(m, IllegalArgumentException.class, "FOO", null);
        run(m, IllegalArgumentException.class, "FOO", "");

        m = getInstance(clazz, STRING, PROVIDER);
        run(m, NullPointerException.class, null, SUN);
        run(m, NoSuchAlgorithmException.class, "", SUN);
        run(m, IllegalArgumentException.class, "FOO", null);
    }
}