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 *
38 */
39public class ProviderTest extends TestCase {
40
41    Provider p;
42
43    /*
44     * @see TestCase#setUp()
45     */
46    protected void setUp() throws Exception {
47        super.setUp();
48        p = new MyProvider();
49    }
50
51    /*
52     * Class under test for void Provider()
53     */
54    public final void testProvider() {
55        assertEquals("Provider.id name", p.getProperty("Provider.id name"),
56                String.valueOf(p.getName()));
57        assertEquals("Provider.id version", p
58                .getProperty("Provider.id version"), String.valueOf(p
59                .getVersion()));
60        assertEquals("Provider.id info", p.getProperty("Provider.id info"),
61                String.valueOf(p.getInfo()));
62        assertEquals("Provider.id className", p
63                .getProperty("Provider.id className"), p.getClass().getName());
64    }
65
66    public final void testClear() {
67        p.clear();
68        assertNull(p.getProperty("MessageDigest.SHA-1"));
69    }
70
71    /*
72     * Class under test for void Provider(String, double, String)
73     */
74    public final void testProviderStringdoubleString() {
75        Provider p = new MyProvider("Provider name", 123.456, "Provider info");
76
77        assertEquals("Provider name", p.getName());
78        assertEquals(123.456, p.getVersion(), 0L);
79        assertEquals("Provider info", p.getInfo());
80    }
81
82    public final void testGetName() {
83        assertEquals("MyProvider", p.getName());
84    }
85
86    public final void testGetVersion() {
87        assertEquals(1.0, p.getVersion(), 0L);
88    }
89
90    public final void testGetInfo() {
91        assertEquals("Provider for testing", p.getInfo());
92    }
93
94    /*
95     * Class under test for void putAll(Map)
96     */
97    public final void testPutAllMap() {
98        HashMap hm = new HashMap();
99        hm.put("MessageDigest.SHA-1", "aaa.bbb.ccc.ddd");
100        hm.put("Property 1", "value 1");
101        hm.put("serviceName.algName attrName", "attrValue");
102        hm.put("Alg.Alias.engineClassName.aliasName", "standardName");
103        p.putAll(hm);
104        if (!"value 1".equals(p.getProperty("Property 1").trim()) ||
105                !"attrValue".equals(p.getProperty("serviceName.algName attrName").trim()) ||
106                !"standardName".equals(p.getProperty("Alg.Alias.engineClassName.aliasName").trim()) ||
107                !"aaa.bbb.ccc.ddd".equals(p.getProperty("MessageDigest.SHA-1").trim()) ) {
108            fail("Incorrect property value");
109        }
110    }
111
112    /*
113     * Class under test for Set entrySet()
114     */
115    public final void testEntrySet() {
116        p.put("MessageDigest.SHA-256", "aaa.bbb.ccc.ddd");
117
118        Set s = p.entrySet();
119        try {
120            s.clear();
121            fail("Must return unmodifiable set");
122        } catch (UnsupportedOperationException e) {
123        }
124
125        assertEquals("Incorrect set size", 8, s.size());
126
127        for (Iterator it = s.iterator(); it.hasNext();) {
128            Entry e = (Entry)it.next();
129            String key = (String)e.getKey();
130            String val = (String)e.getValue();
131            if (key.equals("MessageDigest.SHA-1") && val.equals("SomeClassName")) {
132                continue;
133            }
134            if (key.equals("Alg.Alias.MessageDigest.SHA1") && val.equals("SHA-1")) {
135                continue;
136            }
137            if (key.equals("MessageDigest.abc") && val.equals("SomeClassName")) {
138                continue;
139            }
140            if (key.equals("Provider.id className") && val.equals(p.getClass().getName())) {
141                continue;
142            }
143            if (key.equals("Provider.id name") && val.equals("MyProvider")) {
144                continue;
145            }
146            if (key.equals("MessageDigest.SHA-256") && val.equals("aaa.bbb.ccc.ddd")) {
147                continue;
148            }
149            if (key.equals("Provider.id version") && val.equals("1.0")) {
150                continue;
151            }
152            if (key.equals("Provider.id info") && val.equals("Provider for testing")) {
153                continue;
154            }
155            fail("Incorrect set");
156        }
157    }
158
159    /*
160     * Class under test for Set keySet()
161     */
162    public final void testKeySet() {
163        p.put("MessageDigest.SHA-256", "aaa.bbb.ccc.ddd");
164
165        Set s = p.keySet();
166        try {
167            s.clear();
168        } catch (UnsupportedOperationException e) {
169        }
170        Set s1 = p.keySet();
171
172        assertNotSame(s, s1);
173        assertFalse(s1.isEmpty());
174        assertEquals(8, s1.size());
175
176        assertTrue(s1.contains("MessageDigest.SHA-256"));
177        assertTrue(s1.contains("MessageDigest.SHA-1"));
178        assertTrue(s1.contains("Alg.Alias.MessageDigest.SHA1"));
179        assertTrue(s1.contains("MessageDigest.abc"));
180        assertTrue(s1.contains("Provider.id info"));
181        assertTrue(s1.contains("Provider.id className"));
182        assertTrue(s1.contains("Provider.id version"));
183        assertTrue(s1.contains("Provider.id name"));
184    }
185
186    /*
187     * Class under test for Collection values()
188     */
189    public final void testValues() {
190        p.put("MessageDigest.SHA-256", "aaa.bbb.ccc.ddd");
191
192        Collection c = p.values();
193        try {
194            c.clear();
195        } catch (UnsupportedOperationException e) {
196        }
197        Collection c1 = p.values();
198
199        assertNotSame(c, c1);
200        assertFalse(c1.isEmpty());
201        assertEquals(8, c1.size());
202
203        assertTrue(c1.contains("MyProvider"));
204        assertTrue(c1.contains("aaa.bbb.ccc.ddd"));
205        assertTrue(c1.contains("Provider for testing"));
206        assertTrue(c1.contains("1.0"));
207        assertTrue(c1.contains("SomeClassName"));
208        assertTrue(c1.contains("SHA-1"));
209        assertTrue(c1.contains(p.getClass().getName()));
210    }
211
212    /*
213     * Class under test for Object put(Object, Object)
214     */
215    public final void testPutObjectObject() {
216        p.put("MessageDigest.SHA-1", "aaa.bbb.ccc.ddd");
217        p.put("Type.Algorithm", "className");
218        assertEquals("aaa.bbb.ccc.ddd", p.getProperty("MessageDigest.SHA-1")
219                .trim());
220
221        Set services = p.getServices();
222        assertEquals(3, services.size());
223
224        for (Iterator it = services.iterator(); it.hasNext();) {
225            Provider.Service s = (Provider.Service)it.next();
226            if ("Type".equals(s.getType()) &&
227                    "Algorithm".equals(s.getAlgorithm()) &&
228                    "className".equals(s.getClassName())) {
229                continue;
230            }
231            if ("MessageDigest".equals(s.getType()) &&
232                    "SHA-1".equals(s.getAlgorithm()) &&
233                    "aaa.bbb.ccc.ddd".equals(s.getClassName())) {
234                continue;
235            }
236            if ("MessageDigest".equals(s.getType()) &&
237                    "abc".equals(s.getAlgorithm()) &&
238                    "SomeClassName".equals(s.getClassName())) {
239                continue;
240            }
241            fail("Incorrect service");
242        }
243    }
244
245    /*
246     * Class under test for Object remove(Object)
247     */
248    public final void testRemoveObject() {
249        Object o = p.remove("MessageDigest.SHA-1");
250
251        assertEquals("SomeClassName", o);
252        assertNull(p.getProperty("MessageDigest.SHA-1"));
253        assertEquals(1, p.getServices().size());
254    }
255
256    public final void testService1() {
257        p.put("MessageDigest.SHA-1", "AnotherClassName");
258        Provider.Service s = p.getService("MessageDigest", "SHA-1");
259
260        assertEquals("AnotherClassName", s.getClassName());
261    }
262
263 /*
264    public final void testService2() {
265        Provider[] pp = Security.getProviders("MessageDigest.SHA-1");
266        if (pp == null) {
267            return;
268        }
269        Provider p2 = pp[0];
270        String old = p2.getProperty("MessageDigest.SHA-1");
271        try {
272            p2.put("MessageDigest.SHA-1", "AnotherClassName");
273            Provider.Service s = p2.getService("MessageDigest", "SHA-1");
274            if (!"AnotherClassName".equals(s.getClassName())) {
275                fail("Incorrect class name "+ s.getClassName());
276            }
277            try {
278                s.newInstance(null);
279                fail("No expected NoSuchAlgorithmException");
280            } catch (NoSuchAlgorithmException e) {
281            }
282        } finally {
283            p2.put("MessageDigest.SHA-1", old);
284        }
285    }
286*/
287    //Regression for HARMONY-2760.
288    public void testConstructor() {
289		MyProvider myProvider = new MyProvider(null, 1, null);
290		assertNull(myProvider.getName());
291		assertNull(myProvider.getInfo());
292		assertEquals("null", myProvider.getProperty("Provider.id name"));
293		assertEquals("null", myProvider.getProperty("Provider.id info"));
294	}
295
296    class MyProvider extends Provider {
297        MyProvider() {
298            super("MyProvider", 1.0, "Provider for testing");
299            put("MessageDigest.SHA-1", "SomeClassName");
300            put("MessageDigest.abc", "SomeClassName");
301            put("Alg.Alias.MessageDigest.SHA1", "SHA-1");
302        }
303
304        MyProvider(String name, double version, String info) {
305            super(name, version, info);
306        }
307    }
308}
309