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.eclipse.aether.connector.basic.TestChecksumAlgorithmSelector.MD5;
023import static org.eclipse.aether.connector.basic.TestChecksumAlgorithmSelector.SHA1;
024import static org.eclipse.aether.connector.basic.TestChecksumAlgorithmSelector.SHA256;
025import static org.eclipse.aether.connector.basic.TestChecksumAlgorithmSelector.SHA512;
026import static org.junit.Assert.*;
027
028import java.io.File;
029import java.io.IOException;
030import java.nio.ByteBuffer;
031import java.nio.charset.StandardCharsets;
032import java.util.ArrayList;
033import java.util.List;
034import java.util.Map;
035
036import org.eclipse.aether.internal.test.util.TestFileUtils;
037import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory;
038import org.junit.Before;
039import org.junit.Test;
040
041public class ChecksumCalculatorTest
042{
043
044    private File file;
045
046    private final TestChecksumAlgorithmSelector selector = new TestChecksumAlgorithmSelector();
047
048    private ChecksumCalculator newCalculator( String... algos )
049    {
050        List<ChecksumAlgorithmFactory> checksumAlgorithmFactories = new ArrayList<>();
051        for ( String algo : algos )
052        {
053            checksumAlgorithmFactories.add( selector.select( algo ) );
054        }
055        return ChecksumCalculator.newInstance( file, checksumAlgorithmFactories );
056    }
057
058    private ByteBuffer toBuffer( String data )
059    {
060        return ByteBuffer.wrap( data.getBytes( StandardCharsets.UTF_8 ) );
061    }
062
063    @Before
064    public void init()
065        throws Exception
066    {
067        file = TestFileUtils.createTempFile( "Hello World!" );
068    }
069
070    @Test
071    public void testNoOffset()
072    {
073        ChecksumCalculator calculator = newCalculator( SHA512, SHA256, SHA1, MD5 );
074        calculator.init( 0 );
075        calculator.update( toBuffer( "Hello World!" ) );
076        Map<String, Object> digests = calculator.get();
077        assertNotNull( digests );
078        assertEquals( "861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8", digests.get( SHA512 ) );
079        assertEquals( "7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069", digests.get( SHA256 ) );
080        assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) );
081        assertEquals( "ed076287532e86365e841e92bfc50d8c", digests.get( MD5 ) );
082        assertEquals( 4, digests.size() );
083    }
084
085    @Test
086    public void testWithOffset()
087    {
088        ChecksumCalculator calculator = newCalculator( SHA512, SHA256, SHA1, MD5 );
089        calculator.init( 6 );
090        calculator.update( toBuffer( "World!" ) );
091        Map<String, Object> digests = calculator.get();
092        assertNotNull( digests );
093        assertEquals( "861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8", digests.get( SHA512 ) );
094        assertEquals( "7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069", digests.get( SHA256 ) );
095        assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) );
096        assertEquals( "ed076287532e86365e841e92bfc50d8c", digests.get( MD5 ) );
097        assertEquals( 4, digests.size() );
098    }
099
100    @Test
101    public void testWithExcessiveOffset()
102    {
103        ChecksumCalculator calculator = newCalculator( SHA512, SHA256, SHA1, MD5 );
104        calculator.init( 100 );
105        calculator.update( toBuffer( "World!" ) );
106        Map<String, Object> digests = calculator.get();
107        assertNotNull( digests );
108        assertTrue( digests.get( SHA512 ) instanceof IOException );
109        assertTrue( digests.get( SHA256 ) instanceof IOException );
110        assertTrue( digests.get( SHA1 ) instanceof IOException );
111        assertTrue( digests.get( MD5 ) instanceof IOException );
112        assertEquals( 4, digests.size() );
113    }
114
115    @Test( expected = IllegalArgumentException.class )
116    public void testUnknownAlgorithm()
117    {
118        // resolver now does not tolerate unknown checksums: as they may be set by user only, it is user misconfiguration
119        newCalculator( "unknown", SHA1 );
120    }
121
122    @Test
123    public void testNoInitCall()
124    {
125        ChecksumCalculator calculator = newCalculator( SHA512, SHA256, SHA1, MD5 );
126        calculator.update( toBuffer( "Hello World!" ) );
127        Map<String, Object> digests = calculator.get();
128        assertNotNull( digests );
129        assertEquals( "861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8", digests.get( SHA512 ) );
130        assertEquals( "7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069", digests.get( SHA256 ) );
131        assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) );
132        assertEquals( "ed076287532e86365e841e92bfc50d8c", digests.get( MD5 ) );
133        assertEquals( 4, digests.size() );
134    }
135
136    @Test
137    public void testRestart()
138    {
139        ChecksumCalculator calculator = newCalculator( SHA512, SHA256, SHA1, MD5 );
140        calculator.init( 0 );
141        calculator.update( toBuffer( "Ignored" ) );
142        calculator.init( 0 );
143        calculator.update( toBuffer( "Hello World!" ) );
144        Map<String, Object> digests = calculator.get();
145        assertNotNull( digests );
146        assertEquals( "861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8", digests.get( SHA512 ) );
147        assertEquals( "7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069", digests.get( SHA256 ) );
148        assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) );
149        assertEquals( "ed076287532e86365e841e92bfc50d8c", digests.get( MD5 ) );
150        assertEquals( 4, digests.size() );
151    }
152
153    @Test
154    public void testRestartAfterError()
155    {
156        ChecksumCalculator calculator = newCalculator( SHA512, SHA256, SHA1, MD5 );
157        calculator.init( 100 );
158        calculator.init( 0 );
159        calculator.update( toBuffer( "Hello World!" ) );
160        Map<String, Object> digests = calculator.get();
161        assertNotNull( digests );
162        assertEquals( "861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8", digests.get( SHA512 ) );
163        assertEquals( "7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069", digests.get( SHA256 ) );
164        assertEquals( "2ef7bde608ce5404e97d5f042f95f89f1c232871", digests.get( SHA1 ) );
165        assertEquals( "ed076287532e86365e841e92bfc50d8c", digests.get( MD5 ) );
166        assertEquals( 4, digests.size() );
167    }
168
169}