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.MessageDigest;
25import java.security.Provider;
26import java.security.Security;
27
28import org.apache.harmony.security.tests.support.MyMessageDigest1;
29import org.apache.harmony.security.tests.support.MyMessageDigest2;
30
31import junit.framework.TestCase;
32
33/**
34 * Tests for <code>MessageDigest</code> constructor and methods
35 */
36public class MessageDigest_Impl2Test extends TestCase {
37
38    /**
39     * Provider
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        Security.insertProviderAt(p, 1);
50    }
51
52    /*
53      * @see TestCase#tearDown()
54      */
55    protected void tearDown() throws Exception {
56        super.tearDown();
57        Security.removeProvider(p.getName());
58    }
59
60    /*
61      * Class under test for MessageDigest getInstance(String)
62      */
63    public void testGetInstanceString1() throws Exception {
64        MessageDigest md1 = MessageDigest.getInstance("ABC");
65        checkMD1(md1, p);
66    }
67
68    /*
69      * Class under test for MessageDigest getInstance(String)
70      */
71    public void testGetInstanceString2() throws Exception {
72        MessageDigest md2 = MessageDigest.getInstance("CBA");
73        checkMD2(md2, p);
74    }
75
76    /*
77      * Class under test for MessageDigest getInstance(String, String)
78      */
79    public void testGetInstanceStringString1() throws Exception {
80        MessageDigest md1 = MessageDigest.getInstance("ABC", "MyProvider");
81        checkMD1(md1, p);
82    }
83
84    /*
85      * Class under test for MessageDigest getInstance(String, String)
86      */
87    public void testGetInstanceStringString2() throws Exception {
88        MessageDigest md2 = MessageDigest.getInstance("CBA", "MyProvider");
89        checkMD2(md2, p);
90    }
91
92    /*
93      * Class under test for MessageDigest getInstance(String, Provider)
94      */
95    public void testGetInstanceStringProvider1() throws Exception {
96        Provider p = new MyProvider();
97        MessageDigest md1 = MessageDigest.getInstance("ABC", p);
98        checkMD1(md1, p);
99    }
100
101    /*
102      * Class under test for MessageDigest getInstance(String, Provider)
103      */
104    public void testGetInstanceStringProvider2() throws Exception {
105        Provider p = new MyProvider();
106        MessageDigest md2 = MessageDigest.getInstance("CBA", p);
107        checkMD2(md2, p);
108    }
109
110    /*
111     * Class under test for String toString()
112     */
113    public void testToString() {
114        MyMessageDigest1 md = new MyMessageDigest1("ABC");
115        assertEquals("incorrect result", "MESSAGE DIGEST ABC", md.toString());
116    }
117
118    private void checkMD1(MessageDigest md1, Provider p) throws Exception {
119        byte[] b = { 1, 2, 3, 4, 5 };
120        assertTrue("getInstance() failed", md1 instanceof MyMessageDigest1);
121        assertEquals("getProvider() failed", p, md1.getProvider());
122        assertEquals("getAlgorithm() failed", "ABC", md1.getAlgorithm());
123
124        md1.update((byte) 1);
125        md1.update(b, 1, 4);
126        assertTrue("update failed", ((MyMessageDigest1) md1).runEngineUpdate1);
127        assertTrue("update failed", ((MyMessageDigest1) md1).runEngineUpdate2);
128
129        assertEquals("incorrect digest result", 0, md1.digest().length);
130        assertEquals("getProvider() failed", 0, md1.digest(b, 2, 3));
131        assertTrue("digest failed", ((MyMessageDigest1) md1).runEngineDigest);
132
133        md1.reset();
134        assertTrue("reset failed", ((MyMessageDigest1) md1).runEngineReset);
135
136        assertEquals("getDigestLength() failed", 0, md1.getDigestLength());
137        try {
138            md1.clone();
139            fail("No expected CloneNotSupportedException");
140        } catch (CloneNotSupportedException e) {
141        }
142    }
143
144    private void checkMD2(MessageDigest md2, Provider p) throws Exception {
145        byte[] b = { 1, 2, 3, 4, 5 };
146        assertEquals("getProvider() failed", p, md2.getProvider());
147        assertEquals("getAlgorithm() failed", "CBA", md2.getAlgorithm());
148
149        md2.update((byte) 1);
150        md2.update(b, 1, 3);
151        assertTrue("update failed", MyMessageDigest2.runEngineUpdate1);
152        assertTrue("update failed", MyMessageDigest2.runEngineUpdate2);
153
154        assertEquals("incorrect digest result", 0, md2.digest().length);
155        assertEquals("getProvider() failed", 0, md2.digest(b, 2, 3));
156        assertTrue("digest failed", MyMessageDigest2.runEngineDigest);
157
158        md2.reset();
159        assertTrue("reset failed", MyMessageDigest2.runEngineReset);
160
161        assertEquals("getDigestLength() failed", 0, md2.getDigestLength());
162        try {
163            md2.clone();
164            fail("No expected CloneNotSupportedException");
165        } catch (CloneNotSupportedException e) {
166        }
167    }
168
169    private class MyProvider extends Provider {
170        MyProvider() {
171            super("MyProvider", 1.0, "Provider for testing");
172            put("MessageDigest.ABC", "org.apache.harmony.security.tests.support.MyMessageDigest1");
173            put("MessageDigest.CBA", "org.apache.harmony.security.tests.support.MyMessageDigest2");
174        }
175
176        MyProvider(String name, double version, String info) {
177            super(name, version, info);
178        }
179    }
180}
181