/*
 * Copyright 2017 The Mifos Initiative
 *
 * 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 io.mifos.core.lang.security;

import org.junit.Assert;
import org.junit.Test;

public class RsaKeyPairFactoryTest {

  public RsaKeyPairFactoryTest() {
    super();
  }

  @Test
  public void shouldCreateRsaKeys() throws Exception {
    final RsaKeyPairFactory.KeyPairHolder keyPairHolder = RsaKeyPairFactory.createKeyPair();
    Assert.assertNotNull(keyPairHolder);
    Assert.assertNotNull(keyPairHolder.getTimestamp());
    Assert.assertNotNull(keyPairHolder.publicKey());
    Assert.assertNotNull(keyPairHolder.privateKey());
  }
}
