1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * contributor license agreements.  See the NOTICE file distributed with
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * this work for additional information regarding copyright ownership.
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * (the "License"); you may not use this file except in compliance with
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * the License.  You may obtain a copy of the License at
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Unless required by applicable law or agreed to in writing, software
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * See the License for the specific language governing permissions and
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * limitations under the License.
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.security.tests.java.security;
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.ByteArrayInputStream;
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.IOException;
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.UnsupportedEncodingException;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.DigestInputStream;
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.MessageDigest;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.NoSuchAlgorithmException;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class DigestInputStream2Test extends junit.framework.TestCase {
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
298d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    ByteArrayInputStream inStream;
308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    ByteArrayInputStream inStream1;
328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    MessageDigest digest;
348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @tests java.security.DigestInputStream#DigestInputStream(java.io.InputStream,
378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     *java.security.MessageDigest)
388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public void test_ConstructorLjava_io_InputStreamLjava_security_MessageDigest() {
408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // Test for method java.security.DigestInputStream(java.io.InputStream,
418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // java.security.MessageDigest)
428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        DigestInputStream dis = new DigestInputStream(inStream, digest);
438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertNotNull("Constructor returned null instance", dis);
448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @tests java.security.DigestInputStream#getMessageDigest()
488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public void test_getMessageDigest() {
508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // Test for method java.security.MessageDigest
518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // java.security.DigestInputStream.getMessageDigest()
528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        DigestInputStream dis = new DigestInputStream(inStream, digest);
538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertEquals("getMessageDigest returned a bogus result", digest, dis
548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                .getMessageDigest());
558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @tests java.security.DigestInputStream#on(boolean)
598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_onZ() throws Exception {
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Test for method void java.security.DigestInputStream.on(boolean)
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MessageDigest originalDigest = (MessageDigest) (digest.clone());
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MessageDigest noChangeDigest = (MessageDigest) (digest.clone());
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        DigestInputStream dis = new DigestInputStream(inStream, noChangeDigest);
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // turn off processing
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        dis.on(false);
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // read some data
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int c = dis.read();
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals('T', c);
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // make sure the digest for the part where it was off has not
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // changed
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("MessageDigest changed even though processing was off",
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                MessageDigest.isEqual(noChangeDigest.digest(), originalDigest
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        .digest()));
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MessageDigest changeDigest = (MessageDigest) (digest.clone());
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        dis = new DigestInputStream(inStream, digest);
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // turn on processing
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        dis.on(true);
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        c = dis.read();
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals('h', c);
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // make sure the digest has changed
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("MessageDigest did not change with processing on",
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                !MessageDigest.isEqual(digest.digest(), changeDigest.digest()));
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @tests java.security.DigestInputStream#read()
918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_read() throws IOException {
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Test for method int java.security.DigestInputStream.read()
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        DigestInputStream dis = new DigestInputStream(inStream, digest);
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // read and compare the data that the inStream has
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int c;
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        while ((c = dis.read()) > -1) {
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int d = inStream1.read();
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertEquals(d, c);
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }// end while
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1048d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
1058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @tests java.security.DigestInputStream#read(byte[], int, int)
1068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
1078d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public void test_read$BII() throws IOException {
1088d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // Test for method int java.security.DigestInputStream.read(byte [],
1098d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // int, int)
1108d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        DigestInputStream dis = new DigestInputStream(inStream, digest);
1118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        int bytesToRead = inStream.available();
1128d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        byte buf1[] = new byte[bytesToRead + 5];
1138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        byte buf2[] = new byte[bytesToRead + 5];
1148d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // make sure we're actually reading some data
1158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertTrue("No data to read for this test", bytesToRead > 0);
1168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // read and compare the data that the inStream has
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int bytesRead1 = dis.read(buf1, 5, bytesToRead);
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int bytesRead2 = inStream1.read(buf2, 5, bytesToRead);
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Didn't read the same from each stream", bytesRead1,
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                bytesRead2);
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Didn't read the entire", bytesRead1, bytesToRead);
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // compare the arrays
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        boolean same = true;
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < bytesToRead + 5; i++) {
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (buf1[i] != buf2[i]) {
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                same = false;
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }// end for
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Didn't get the same data", same);
1318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
1328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1338d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
1348d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @tests java.security.DigestInputStream#setMessageDigest(java.security.MessageDigest)
1358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
1368d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    public void test_setMessageDigestLjava_security_MessageDigest() {
1378d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // Test for method void
1388d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // java.security.DigestInputStream.setMessageDigest(java.security.MessageDigest)
1398d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        DigestInputStream dis = new DigestInputStream(inStream, null);
1408d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1418d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // make sure the digest is null when it's not been set
1428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertNull(
1438d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                "Uninitialised MessageDigest should have been returned as null",
1448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                dis.getMessageDigest());
1458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        dis.setMessageDigest(digest);
1468d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        assertEquals("Wrong MessageDigest was returned.", digest, dis
1478d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                .getMessageDigest());
1488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
1498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
1508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    /**
1518d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * Sets up the fixture, for example, open a network connection. This method
1528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * is called before a test is executed.
1538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     *
1548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * @throws UnsupportedEncodingException
1558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     */
1568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    protected void setUp() throws UnsupportedEncodingException {
1578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        // create a ByteArrayInputStream to perform digesting on
1588d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        inStream = new ByteArrayInputStream(
1598d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                "This is a test string for digesting".getBytes("UTF-8"));
1608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        inStream1 = new ByteArrayInputStream(
1618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                "This is a test string for digesting".getBytes("UTF-8"));
1628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        try {
1638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            digest = MessageDigest.getInstance("SHA-1");
1648d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (NoSuchAlgorithmException e) {
1658d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            fail("Unable to find SHA-1 algorithm");
1668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        }
1678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath    }
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}