/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed 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 libcore.javax.crypto.spec;

import dalvik.annotation.BrokenTest;
import java.security.NoSuchAlgorithmException;
import tests.security.KeyAgreementHelper;
import tests.security.KeyPairGeneratorTest;

public class KeyPairGeneratorTestDH extends KeyPairGeneratorTest {

    public KeyPairGeneratorTestDH() {
        super("DH", new KeyAgreementHelper("DH"));
    }

    @BrokenTest("Takes ages due to DH computations. Disabling for now.")
    public void testKeyPairGenerator() throws NoSuchAlgorithmException {
        super.testKeyPairGenerator();
    }
}
