1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17
18/**
19 * @author Boris V. Kuznetsov
20 */
21
22package org.apache.harmony.security.tests.java.security;
23
24import java.security.*;
25
26import java.util.Collection;
27import java.util.HashMap;
28import java.util.Iterator;
29import java.util.Set;
30import java.util.Map.Entry;
31
32import junit.framework.TestCase;
33
34
35/**
36 * Tests for <code>Provider</code> constructor and methods
37 */
38public class ProviderTest extends TestCase {
39
40    Provider p;
41
42    /*
43    * @see TestCase#setUp()
44    */
45    protected void setUp() throws Exception {
46        super.setUp();
47        p = new MyProvider();
48    }
49
50    /*
51    * Class under test for void Provider()
52    */
53    public final void testProvider() {
54        assertEquals("Provider.id name", p.getProperty("Provider.id name"),
55                String.valueOf(p.getName()));
56        assertEquals("Provider.id version", p
57                .getProperty("Provider.id version"), String.valueOf(p
58                .getVersion()));
59        assertEquals("Provider.id info", p.getProperty("Provider.id info"),
60                String.valueOf(p.getInfo()));
61        assertEquals("Provider.id className", p
62                .getProperty("Provider.id className"), p.getClass().getName());
63    }
64
65    public final void testClear() {
66        p.clear();
67        assertNull(p.getProperty("MessageDigest.SHA-1"));
68    }
69
70    /*
71     * Class under test for void Provider(String, double, String)
72     */
73    public final void testProviderStringdoubleString() {
74        Provider p = new MyProvider("Provider name", 123.456, "Provider info");
75
76        assertEquals("Provider name", p.getName());
77        assertEquals(123.456, p.getVersion(), 0L);
78        assertEquals("Provider info", p.getInfo());
79    }
80
81    public final void testGetName() {
82        assertEquals("MyProvider", p.getName());
83    }
84
85    public final void testGetVersion() {
86        assertEquals(1.0, p.getVersion(), 0L);
87    }
88
89    public final void testGetInfo() {
90        assertEquals("Provider for testing", p.getInfo());
91    }
92
93    /*
94     * Class under test for void putAll(Map)
95     */
96    public final void testPutAllMap() {
97        HashMap hm = new HashMap();
98        hm.put("MessageDigest.SHA-1", "aaa.bbb.ccc.ddd");
99        hm.put("Property 1", "value 1");
100        hm.put("serviceName.algName attrName", "attrValue");
101        hm.put("Alg.Alias.engineClassName.aliasName", "standardName");
102        p.putAll(hm);
103        if (!"value 1".equals(p.getProperty("Property 1").trim()) ||
104                !"attrValue".equals(p.getProperty("serviceName.algName attrName").trim()) ||
105                !"standardName".equals(p.getProperty("Alg.Alias.engineClassName.aliasName").trim()) ||
106                !"aaa.bbb.ccc.ddd".equals(p.getProperty("MessageDigest.SHA-1").trim())) {
107            fail("Incorrect property value");
108        }
109    }
110
111    /*
112     * Class under test for Set entrySet()
113     */
114    public final void testEntrySet() {
115        p.put("MessageDigest.SHA-256", "aaa.bbb.ccc.ddd");
116
117        Set s = p.entrySet();
118        try {
119            s.clear();
120            fail("Must return unmodifiable set");
121        } catch (UnsupportedOperationException e) {
122        }
123
124        assertEquals("Incorrect set size", 8, s.size());
125
126        for (Iterator it = s.iterator(); it.hasNext(); ) {
127            Entry e = (Entry) it.next();
128            String key = (String) e.getKey();
129            String val = (String) e.getValue();
130            if (key.equals("MessageDigest.SHA-1") && val.equals("SomeClassName")) {
131                continue;
132            }
133            if (key.equals("Alg.Alias.MessageDigest.SHA1") && val.equals("SHA-1")) {
134                continue;
135            }
136            if (key.equals("MessageDigest.abc") && val.equals("SomeClassName")) {
137                continue;
138            }
139            if (key.equals("Provider.id className") && val.equals(p.getClass().getName())) {
140                continue;
141            }
142            if (key.equals("Provider.id name") && val.equals("MyProvider")) {
143                continue;
144            }
145            if (key.equals("MessageDigest.SHA-256") && val.equals("aaa.bbb.ccc.ddd")) {
146                continue;
147            }
148            if (key.equals("Provider.id version") && val.equals("1.0")) {
149                continue;
150            }
151            if (key.equals("Provider.id info") && val.equals("Provider for testing")) {
152                continue;
153            }
154            fail("Incorrect set");
155        }
156    }
157
158    /*
159     * Class under test for Set keySet()
160     */
161    public final void testKeySet() {
162        p.put("MessageDigest.SHA-256", "aaa.bbb.ccc.ddd");
163
164        Set s = p.keySet();
165        try {
166            s.clear();
167        } catch (UnsupportedOperationException e) {
168        }
169        Set s1 = p.keySet();
170
171        assertNotSame(s, s1);
172        assertFalse(s1.isEmpty());
173        assertEquals(8, s1.size());
174
175        assertTrue(s1.contains("MessageDigest.SHA-256"));
176        assertTrue(s1.contains("MessageDigest.SHA-1"));
177        assertTrue(s1.contains("Alg.Alias.MessageDigest.SHA1"));
178        assertTrue(s1.contains("MessageDigest.abc"));
179        assertTrue(s1.contains("Provider.id info"));
180        assertTrue(s1.contains("Provider.id className"));
181        assertTrue(s1.contains("Provider.id version"));
182        assertTrue(s1.contains("Provider.id name"));
183    }
184
185    /*
186     * Class under test for Collection values()
187     */
188    public final void testValues() {
189        p.put("MessageDigest.SHA-256", "aaa.bbb.ccc.ddd");
190
191        Collection c = p.values();
192        try {
193            c.clear();
194        } catch (UnsupportedOperationException e) {
195        }
196        Collection c1 = p.values();
197
198        assertNotSame(c, c1);
199        assertFalse(c1.isEmpty());
200        assertEquals(8, c1.size());
201
202        assertTrue(c1.contains("MyProvider"));
203        assertTrue(c1.contains("aaa.bbb.ccc.ddd"));
204        assertTrue(c1.contains("Provider for testing"));
205        assertTrue(c1.contains("1.0"));
206        assertTrue(c1.contains("SomeClassName"));
207        assertTrue(c1.contains("SHA-1"));
208        assertTrue(c1.contains(p.getClass().getName()));
209    }
210
211    /*
212     * Class under test for Object put(Object, Object)
213     */
214    public final void testPutObjectObject() {
215        p.put("MessageDigest.SHA-1", "aaa.bbb.ccc.ddd");
216        p.put("Type.Algorithm", "className");
217        assertEquals("aaa.bbb.ccc.ddd", p.getProperty("MessageDigest.SHA-1")
218                .trim());
219
220        Set services = p.getServices();
221        assertEquals(3, services.size());
222
223        for (Iterator it = services.iterator(); it.hasNext(); ) {
224            Provider.Service s = (Provider.Service) it.next();
225            if ("Type".equals(s.getType()) &&
226                    "Algorithm".equals(s.getAlgorithm()) &&
227                    "className".equals(s.getClassName())) {
228                continue;
229            }
230            if ("MessageDigest".equals(s.getType()) &&
231                    "SHA-1".equals(s.getAlgorithm()) &&
232                    "aaa.bbb.ccc.ddd".equals(s.getClassName())) {
233                continue;
234            }
235            if ("MessageDigest".equals(s.getType()) &&
236                    "abc".equals(s.getAlgorithm()) &&
237                    "SomeClassName".equals(s.getClassName())) {
238                continue;
239            }
240            fail("Incorrect service");
241        }
242    }
243
244    /*
245     * Class under test for Object remove(Object)
246     */
247    public final void testRemoveObject() {
248        Object o = p.remove("MessageDigest.SHA-1");
249
250        assertEquals("SomeClassName", o);
251        assertNull(p.getProperty("MessageDigest.SHA-1"));
252        assertEquals(1, p.getServices().size());
253    }
254
255    public final void testService1() {
256        p.put("MessageDigest.SHA-1", "AnotherClassName");
257        Provider.Service s = p.getService("MessageDigest", "SHA-1");
258
259        assertEquals("AnotherClassName", s.getClassName());
260    }
261
262    /*
263        public final void testService2() {
264            Provider[] pp = Security.getProviders("MessageDigest.SHA-1");
265            if (pp == null) {
266                return;
267            }
268            Provider p2 = pp[0];
269            String old = p2.getProperty("MessageDigest.SHA-1");
270            try {
271                p2.put("MessageDigest.SHA-1", "AnotherClassName");
272                Provider.Service s = p2.getService("MessageDigest", "SHA-1");
273                if (!"AnotherClassName".equals(s.getClassName())) {
274                    fail("Incorrect class name "+ s.getClassName());
275                }
276                try {
277                    s.newInstance(null);
278                    fail("No expected NoSuchAlgorithmException");
279                } catch (NoSuchAlgorithmException e) {
280                }
281            } finally {
282                p2.put("MessageDigest.SHA-1", old);
283            }
284        }
285    */
286    //Regression for HARMONY-2760.
287    public void testConstructor() {
288        MyProvider myProvider = new MyProvider(null, 1, null);
289        assertNull(myProvider.getName());
290        assertNull(myProvider.getInfo());
291        assertEquals("null", myProvider.getProperty("Provider.id name"));
292        assertEquals("null", myProvider.getProperty("Provider.id info"));
293    }
294
295    class MyProvider extends Provider {
296        MyProvider() {
297            super("MyProvider", 1.0, "Provider for testing");
298            put("MessageDigest.SHA-1", "SomeClassName");
299            put("MessageDigest.abc", "SomeClassName");
300            put("Alg.Alias.MessageDigest.SHA1", "SHA-1");
301        }
302
303        MyProvider(String name, double version, String info) {
304            super(name, version, info);
305        }
306    }
307}
308