/*
* 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.
*/
/**
* @author Boris V. Kuznetsov
* @version $Revision$
*/
package org.apache.harmony.security.tests.java.security;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.security.NoSuchAlgorithmException;
import java.security.Permission;
import java.security.Provider;
import java.security.Security;
import java.security.SecurityPermission;
import java.security.Provider.Service;
import java.util.Collection;
import java.util.ConcurrentModificationException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Set;
import java.util.Map.Entry;
import junit.framework.TestCase;
/**
* Tests for Provider constructor and methods
*
*/
public class ProviderTest extends TestCase {
/*
* Implementation note: The algorithm name ASH-1 might seem a bit strange,
* but since the algorithms cannot be uninstalled anymore we need to make
* sure there are not side-effects on other tests. Simply inserting SHA-1
* destroys the existing provider infrastructure.
*/
Provider[] storedProviders;
Provider p;
/*
* @see TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
storedProviders = Security.getProviders();
p = new MyProvider();
}
@Override
protected void tearDown() throws Exception {
p.remove("MessageDigest.ASH-1");
p.remove("MessageDigest.abc");
p.remove("Alg.Alias.MessageDigest.ASH1");
for (Provider p: Security.getProviders()) {
Security.removeProvider(p.getName());
}
for (Provider p: storedProviders) {
Security.addProvider(p);
}
super.tearDown();
}
/*
* Class under test for void Provider()
*/
public final void testProvider() {
if (!p.getProperty("Provider.id name").equals(
String.valueOf(p.getName()))) {
fail("Incorrect \"Provider.id name\" value");
}
if (!p.getProperty("Provider.id version").equals(
String.valueOf(p.getVersion()))) {
fail("Incorrect \"Provider.id version\" value");
}
if (!p.getProperty("Provider.id info").equals(
String.valueOf(p.getInfo()))) {
fail("Incorrect \"Provider.id info\" value");
}
if (!p.getProperty("Provider.id className").equals(
p.getClass().getName())) {
fail("Incorrect \"Provider.id className\" value");
}
}
public final void testClear() {
p.clear();
assertNull(p.getProperty("MessageDigest.SHA-1"));
}
/*
* Class under test for void Provider(String, double, String)
*/
public final void testProviderStringdoubleString() {
Provider p = new MyProvider("Provider name", 123.456, "Provider info");
assertEquals("Provider name", p.getName());
assertEquals(123.456, p.getVersion(), 0L);
assertEquals("Provider info", p.getInfo());
}
public final void testGetName() {
assertEquals("MyProvider", p.getName());
}
public final void testGetVersion() {
assertEquals(1.0, p.getVersion(), 0L);
}
public final void testGetInfo() {
assertEquals("Provider for testing", p.getInfo());
}
/*
* Class under test for void putAll(Map)
*/
public final void testPutAllMap() {
HashMap hm = new HashMap();
hm.put("MessageDigest.SHA-1", "aaa.bbb.ccc.ddd");
hm.put("Property 1", "value 1");
hm.put("serviceName.algName attrName", "attrValue");
hm.put("Alg.Alias.engineClassName.aliasName", "standardName");
p.putAll(hm);
if (!"value 1".equals(p.getProperty("Property 1").trim()) ||
!"attrValue".equals(p.getProperty("serviceName.algName attrName").trim()) ||
!"standardName".equals(p.getProperty("Alg.Alias.engineClassName.aliasName").trim()) ||
!"aaa.bbb.ccc.ddd".equals(p.getProperty("MessageDigest.SHA-1").trim()) ) {
fail("Incorrect property value");
}
}
/*
* Class under test for Set entrySet()
*/
public final void testEntrySet() {
p.put("MessageDigest.SHA-256", "aaa.bbb.ccc.ddd");
Set s = p.entrySet();
try {
s.clear();
fail("Must return unmodifiable set");
} catch (UnsupportedOperationException e) {
}
assertEquals("Incorrect set size", 8, s.size());
for (Iterator it = s.iterator(); it.hasNext();) {
Entry e = (Entry)it.next();
String key = (String)e.getKey();
String val = (String)e.getValue();
if (key.equals("MessageDigest.SHA-1") && val.equals("SomeClassName")) {
continue;
}
if (key.equals("Alg.Alias.MessageDigest.SHA1") && val.equals("SHA-1")) {
continue;
}
if (key.equals("MessageDigest.abc") && val.equals("SomeClassName")) {
continue;
}
if (key.equals("Provider.id className") && val.equals(p.getClass().getName())) {
continue;
}
if (key.equals("Provider.id name") && val.equals("MyProvider")) {
continue;
}
if (key.equals("MessageDigest.SHA-256") && val.equals("aaa.bbb.ccc.ddd")) {
continue;
}
if (key.equals("Provider.id version") && val.equals("1.0")) {
continue;
}
if (key.equals("Provider.id info") && val.equals("Provider for testing")) {
continue;
}
fail("Incorrect set");
}
}
public final void testForEach() {
p.put("MessageDigest.SHA-1", "aaa.bbb.ccc.ddd");
p.put("MessageDigest.abc", "value 1");
HashMap hm = new HashMap<>();
p.forEach((k,v)-> hm.put((String)k, (String)v));
assertEquals(p.size(), hm.size());
for(String key : hm.keySet()) {
assertEquals(p.get(key), hm.get(key));
}
}
public void testForEachNPE() throws Exception {
try {
p.forEach(null);
fail();
} catch(NullPointerException expected) {}
}
public void testForEachCME() throws Exception {
p.put("MessageDigest.SHA-1", "aaa.bbb.ccc.ddd");
p.put("MessageDigest.abc", "value 1");
try {
p.forEach(new java.util.function.BiConsumer