001package org.eclipse.aether.connector.basic;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *  http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import static org.junit.Assert.*;
023
024import java.io.File;
025import java.io.IOException;
026import java.net.URI;
027import java.nio.ByteBuffer;
028import java.nio.charset.StandardCharsets;
029import java.security.NoSuchAlgorithmException;
030import java.util.ArrayList;
031import java.util.List;
032import java.util.Map;
033
034import org.eclipse.aether.internal.test.util.TestFileUtils;
035import org.eclipse.aether.spi.connector.layout.RepositoryLayout;
036import org.junit.Before;
037import org.junit.Test;
038
039public class ChecksumCalculatorTest
040{
041
042    private static final String SHA512 = "SHA-512";
043
044    private static final String SHA256 = "SHA-256";
045
046    private static final String SHA1 = "SHA-1";
047
048    private static final String MD5 = "MD5";
049
050    private File file;
051
052    private ChecksumCalculator newCalculator( String... algos )
053    {
054        List<RepositoryLayout.Checksum> checksums = new ArrayList<>();
055        for ( String algo : algos )
056        {
057            checksums.add( new RepositoryLayout.Checksum( algo, URI.create( "irrelevant" ) ) );
058        }
059        return ChecksumCalculator.newInstance( file, checksums );
060    }
061
062    private ByteBuffer toBuffer( String data )
063    {
064        return ByteBuffer.wrap( data.getBytes( StandardCharsets.UTF_8 ) );
065    }
066
067    @Before
068    public void init()
069        throws Exception
070    {
071        file = TestFileUtils.createTempFile( "Hello World!" );
072    }
073
074    @Test
075    public void testNoOffset()
076    {
077        ChecksumCalculator calculator = newCalculator( SHA512, SHA256, SHA1, MD5 );
078        calculator.init( 0 );
079        calculator.update( toBuffer( "Hello World!" ) );
080        Map<String, Object> digests = calculator.get();
081        assertNotNull( digests );
082        assertEquals( "861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8", digests.get( SHA512 ) );
083        assertEquals( "7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069", digests.get( SHA256 ) );
084        assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) );
085        assertEquals( "ed076287532e86365e841e92bfc50d8c", digests.get( MD5 ) );
086        assertEquals( 4, digests.size() );
087    }
088
089    @Test
090    public void testWithOffset()
091    {
092        ChecksumCalculator calculator = newCalculator( SHA512, SHA256, SHA1, MD5 );
093        calculator.init( 6 );
094        calculator.update( toBuffer( "World!" ) );
095        Map<String, Object> digests = calculator.get();
096        assertNotNull( digests );
097        assertEquals( "861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8", digests.get( SHA512 ) );
098        assertEquals( "7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069", digests.get( SHA256 ) );
099        assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) );
100        assertEquals( "ed076287532e86365e841e92bfc50d8c", digests.get( MD5 ) );
101        assertEquals( 4, digests.size() );
102    }
103
104    @Test
105    public void testWithExcessiveOffset()
106    {
107        ChecksumCalculator calculator = newCalculator( SHA512, SHA256, SHA1, MD5 );
108        calculator.init( 100 );
109        calculator.update( toBuffer( "World!" ) );
110        Map<String, Object> digests = calculator.get();
111        assertNotNull( digests );
112        assertTrue( digests.get( SHA512 ) instanceof IOException );
113        assertTrue( digests.get( SHA256 ) instanceof IOException );
114        assertTrue( digests.get( SHA1 ) instanceof IOException );
115        assertTrue( digests.get( MD5 ) instanceof IOException );
116        assertEquals( 4, digests.size() );
117    }
118
119    @Test
120    public void testUnknownAlgorithm()
121    {
122        ChecksumCalculator calculator = newCalculator( "unknown", SHA1 );
123        calculator.init( 0 );
124        calculator.update( toBuffer( "Hello World!" ) );
125        Map<String, Object> digests = calculator.get();
126        assertNotNull( digests );
127        assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) );
128        assertTrue( digests.get( "unknown" ) instanceof NoSuchAlgorithmException );
129        assertEquals( 2, digests.size() );
130    }
131
132    @Test
133    public void testNoInitCall()
134    {
135        ChecksumCalculator calculator = newCalculator( SHA512, SHA256, SHA1, MD5 );
136        calculator.update( toBuffer( "Hello World!" ) );
137        Map<String, Object> digests = calculator.get();
138        assertNotNull( digests );
139        assertEquals( "861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8", digests.get( SHA512 ) );
140        assertEquals( "7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069", digests.get( SHA256 ) );
141        assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) );
142        assertEquals( "ed076287532e86365e841e92bfc50d8c", digests.get( MD5 ) );
143        assertEquals( 4, digests.size() );
144    }
145
146    @Test
147    public void testRestart()
148    {
149        ChecksumCalculator calculator = newCalculator( SHA512, SHA256, SHA1, MD5 );
150        calculator.init( 0 );
151        calculator.update( toBuffer( "Ignored" ) );
152        calculator.init( 0 );
153        calculator.update( toBuffer( "Hello World!" ) );
154        Map<String, Object> digests = calculator.get();
155        assertNotNull( digests );
156        assertEquals( "861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8", digests.get( SHA512 ) );
157        assertEquals( "7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069", digests.get( SHA256 ) );
158        assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) );
159        assertEquals( "ed076287532e86365e841e92bfc50d8c", digests.get( MD5 ) );
160        assertEquals( 4, digests.size() );
161    }
162
163    @Test
164    public void testRestartAfterError()
165    {
166        ChecksumCalculator calculator = newCalculator( SHA512, SHA256, SHA1, MD5 );
167        calculator.init( 100 );
168        calculator.init( 0 );
169        calculator.update( toBuffer( "Hello World!" ) );
170        Map<String, Object> digests = calculator.get();
171        assertNotNull( digests );
172        assertEquals( "861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8", digests.get( SHA512 ) );
173        assertEquals( "7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069", digests.get( SHA256 ) );
174        assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) );
175        assertEquals( "ed076287532e86365e841e92bfc50d8c", digests.get( MD5 ) );
176        assertEquals( 4, digests.size() );
177    }
178
179}