/*
 * 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 org.apache.qpid.proton.engine.impl.ssl;

import static org.junit.Assert.assertNotNull;

import java.net.URL;

import org.junit.Test;

public class SslEngineFacadeFactoryTest {

    private static final String PASSWORD = "unittest";

    @Test
    public void testCertifcateLoad() {
        String ipFile = resolveFilename("cert.pem.txt");
        SslEngineFacadeFactory factory = new SslEngineFacadeFactory();

        assertNotNull("Certificate was NULL", factory.readCertificate(ipFile));
    }

    @Test
    public void testLoadKey() {
        String keyFile = resolveFilename("key.pem.txt");
        SslEngineFacadeFactory factory = new SslEngineFacadeFactory();

        assertNotNull("Key was NULL", factory.readPrivateKey(keyFile, PASSWORD));
    }

    @Test
    public void testLoadUnencryptedPrivateKey(){
        String keyFile = resolveFilename("private-key-clear.pem.txt");
        SslEngineFacadeFactory factory = new SslEngineFacadeFactory();

        assertNotNull("Key was NULL", factory.readPrivateKey(keyFile, null));
    }

    @Test
    public void testLoadUnencryptedPKCS8PrivateKey(){
        String keyFile = resolveFilename("private-key-clear-pkcs8.pem.txt");
        SslEngineFacadeFactory factory = new SslEngineFacadeFactory();

        assertNotNull("Key was NULL", factory.readPrivateKey(keyFile, null));
    }

    private String resolveFilename(String testFilename) {
        URL resourceUri = this.getClass().getResource(testFilename);

        assertNotNull("Failed to load file: " + testFilename, resourceUri);

        String fName = resourceUri.getPath();

        return fName;
    }
}
