/*
 * Copyright (C) 2007 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 org.apache.harmony.tests.javax.net.ssl;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContextSpi;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSessionContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.KeyManager;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import java.security.KeyManagementException;

import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.Security;

import junit.framework.TestCase;

import org.apache.harmony.xnet.tests.support.SSLContextSpiImpl;

public class SSLContextSpiTest extends TestCase {

    /**
     * javax.net.ssl.SSLContextSpi#SSLContextSpi()
     */
    public void test_Constructor() {
        try {
            SSLContextSpiImpl ssl = new SSLContextSpiImpl();
            assertTrue(ssl instanceof SSLContextSpi);
        } catch (Exception e) {
            fail("Unexpected exception " + e.toString());
        }
    }

    /**
     * javax.net.ssl.SSLContextSpi#engineCreateSSLEngine()
     * Verify exception when SSLContextSpi object wasn't initialiazed.
     */
    public void test_engineCreateSSLEngine_01() {
        SSLContextSpiImpl ssl = new SSLContextSpiImpl();
        try {
            SSLEngine sleng = ssl.engineCreateSSLEngine();
            fail("RuntimeException wasn't thrown");
        } catch (RuntimeException re) {
            String str = re.getMessage();
            if (!str.equals("Not initialiazed"))
                fail("Incorrect exception message: " + str);
        } catch (Exception e) {
            fail("Incorrect exception " + e + " was thrown");
        }
    }

    /**
     * javax.net.ssl.SSLContextSpi#engineCreateSSLEngine(String host, int port)
     * Verify exception when SSLContextSpi object wasn't initialiazed.
     */
    public void test_engineCreateSSLEngine_02() {
        int[] invalid_port = {Integer.MIN_VALUE, -65535, -1, 65536, Integer.MAX_VALUE};
        SSLContextSpiImpl ssl = new SSLContextSpiImpl();
        try {
            SSLEngine sleng = ssl.engineCreateSSLEngine("localhost", 1080);
            fail("RuntimeException wasn't thrown");
        } catch (RuntimeException re) {
            String str = re.getMessage();
            if (!str.equals("Not initialiazed"))
                fail("Incorrect exception message: " + str);
        } catch (Exception e) {
            fail("Incorrect exception " + e + " was thrown");
        }

        for (int i = 0; i < invalid_port.length; i++) {
            try {
                SSLEngine sleng = ssl.engineCreateSSLEngine("localhost", invalid_port[i]);
                fail("IllegalArgumentException wasn't thrown");
            } catch (IllegalArgumentException iae) {
                //expected
            }
        }
    }

    /**
     * SSLContextSpi#engineGetClientSessionContext()
     * SSLContextSpi#engineGetServerSessionContext()
     * SSLContextSpi#engineGetServerSocketFactory()
     * SSLContextSpi#engineGetSocketFactory()
     * Verify exception when SSLContextSpi object wasn't initialiazed.
     */
    public void test_commonTest_01() {
        SSLContextSpiImpl ssl = new SSLContextSpiImpl();

        try {
            SSLSessionContext slsc = ssl.engineGetClientSessionContext();
            fail("RuntimeException wasn't thrown");
        } catch (RuntimeException re) {
            String str = re.getMessage();
            if (!str.equals("Not initialiazed"))
                fail("Incorrect exception message: " + str);
        } catch (Exception e) {
            fail("Incorrect exception " + e + " was thrown");
        }

        try {
            SSLSessionContext slsc = ssl.engineGetServerSessionContext();
            fail("RuntimeException wasn't thrown");
        } catch (RuntimeException re) {
            String str = re.getMessage();
            if (!str.equals("Not initialiazed"))
                fail("Incorrect exception message: " + str);
        } catch (Exception e) {
            fail("Incorrect exception " + e + " was thrown");
        }

        try {
            SSLServerSocketFactory sssf = ssl.engineGetServerSocketFactory();
            fail("RuntimeException wasn't thrown");
        } catch (RuntimeException re) {
            String str = re.getMessage();
            if (!str.equals("Not initialiazed"))
                fail("Incorrect exception message: " + str);
        } catch (Exception e) {
            fail("Incorrect exception " + e + " was thrown");
        }

        try {
            SSLSocketFactory ssf = ssl.engineGetSocketFactory();
            fail("RuntimeException wasn't thrown");
        } catch (RuntimeException re) {
            String str = re.getMessage();
            if (!str.equals("Not initialiazed"))
                fail("Incorrect exception message: " + str);
        } catch (Exception e) {
            fail("Incorrect exception " + e + " was thrown");
        }
    }

    /**
     * SSLContextSpi#engineInit(KeyManager[] km, TrustManager[] tm, SecureRandom sr)
     */
    public void test_engineInit() {
        SSLContextSpiImpl ssl = new SSLContextSpiImpl();
        String defaultAlgorithm = Security.getProperty("ssl.KeyManagerFactory.algorithm");
        try {
            KeyManagerFactory kmf = KeyManagerFactory.getInstance(defaultAlgorithm);
            char[] pass = "password".toCharArray();
            kmf.init(null, pass);
            KeyManager[] km = kmf.getKeyManagers();
            defaultAlgorithm = Security.getProperty("ssl.TrustManagerFactory.algorithm");
            TrustManagerFactory trustMF = TrustManagerFactory.getInstance(defaultAlgorithm);
            KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
            ks.load(null, null);
            trustMF.init(ks);
            TrustManager[] tm = trustMF.getTrustManagers();
            SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
            try {
                ssl.engineInit(km, tm, sr);
            } catch (KeyManagementException kme) {
                fail(kme + " was throw for engineInit method");
            }
            try {
                ssl.engineInit(km, tm, null);
                fail("KeyManagementException wasn't thrown");
            } catch (KeyManagementException kme) {
                //expected
            }
        } catch (Exception ex) {
            fail(ex + " unexpected exception");
        }
    }

    /**
     * SSLContextSpi#engineCreateSSLEngine()
     * SSLContextSpi#engineCreateSSLEngine(String host, int port)
     * SSLContextSpi#engineGetClientSessionContext()
     * SSLContextSpi#engineGetServerSessionContext()
     * SSLContextSpi#engineGetServerSocketFactory()
     * SSLContextSpi#engineGetSocketFactory()
     */
    public void test_commonTest_02() {
        SSLContextSpiImpl ssl = new SSLContextSpiImpl();
        String defaultAlgorithm = Security.getProperty("ssl.KeyManagerFactory.algorithm");
        try {
            KeyManagerFactory kmf = KeyManagerFactory.getInstance(defaultAlgorithm);
            char[] pass = "password".toCharArray();
            kmf.init(null, pass);
            KeyManager[] km = kmf.getKeyManagers();
            defaultAlgorithm = Security.getProperty("ssl.TrustManagerFactory.algorithm");
            TrustManagerFactory trustMF = TrustManagerFactory.getInstance(defaultAlgorithm);
            KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
            ks.load(null, null);
            trustMF.init(ks);
            TrustManager[] tm = trustMF.getTrustManagers();
            SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
            ssl.engineInit(km, tm, sr);
        } catch (Exception ex) {
            fail(ex + " unexpected exception");
        }

        try {
            assertNotNull("Subtest_01: Object is NULL", ssl.engineCreateSSLEngine());
            SSLEngine sleng = ssl.engineCreateSSLEngine("localhost", 1080);
            assertNotNull("Subtest_02: Object is NULL", sleng);
            assertEquals(sleng.getPeerPort(), 1080);
            assertEquals(sleng.getPeerHost(), "localhost");
            assertNull("Subtest_03: Object not NULL", ssl.engineGetClientSessionContext());
            assertNull("Subtest_04: Object not NULL", ssl.engineGetServerSessionContext());
            assertNull("Subtest_05: Object not NULL", ssl.engineGetServerSocketFactory());
            assertNull("Subtest_06: Object not NULL", ssl.engineGetSocketFactory());
        } catch (Exception e) {
            fail("Unexpected exception " + e);
        }
    }

}
