package org.apache.archiva.checksum;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
/**
* ChecksummedFileTest
*
*
*/
public class ChecksummedFileTest
extends AbstractChecksumTestCase
{
/**
* SHA1 checksum from www.ibiblio.org/maven2, incuding file path
*/
private static final String SERVLETAPI_SHA1 = "bcc82975c0f9c681fcb01cc38504c992553e93ba";
private static final String REMOTE_METADATA_SHA1 = "da39a3ee5e6b4b0d3255bfef95601890afd80709";
private static final String REMOTE_METADATA_MD5 = "d41d8cd98f00b204e9800998ecf8427e";
@Before
public void cleanTestDir()
{
try
{
FileUtils.deleteDirectory( getTestOutputDir() );
}
catch ( IOException ex )
{
LoggerFactory.getLogger( ChecksummedFileTest.class ).warn( ex.getMessage(), ex );
}
}
private File createTestableJar( String filename )
throws IOException
{
File srcFile = getTestResource( filename );
File destFile = new File( getTestOutputDir(), srcFile.getName() );
FileUtils.copyFile( srcFile, destFile );
return destFile;
}
private File createTestableJar( String filename, boolean copySha1, boolean copyMd5 )
throws IOException
{
File srcFile = getTestResource( filename );
File jarFile = new File( getTestOutputDir(), srcFile.getName() );
FileUtils.copyFile( srcFile, jarFile );
if ( copySha1 )
{
File srcSha1 = new File( srcFile.getAbsolutePath() + ".sha1" );
File sha1File = new File( jarFile.getAbsolutePath() + ".sha1" );
FileUtils.copyFile( srcSha1, sha1File );
}
if ( copyMd5 )
{
File srcMd5 = new File( srcFile.getAbsolutePath() + ".md5" );
File md5File = new File( jarFile.getAbsolutePath() + ".md5" );
FileUtils.copyFile( srcMd5, md5File );
}
return jarFile;
}
@Test
public void testCalculateChecksumMd5()
throws IOException
{
File testfile = getTestResource( "examples/redback-authz-open.jar" );
ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
String expectedChecksum = "f42047fe2e177ac04d0df7aa44d408be";
String actualChecksum = checksummedFile.calculateChecksum( ChecksumAlgorithm.MD5 );
assertEquals( expectedChecksum, actualChecksum );
}
@Test
public void testCalculateChecksumSha1()
throws IOException
{
File testfile = getTestResource( "examples/redback-authz-open.jar" );
ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
String expectedChecksum = "2bb14b388973351b0a4dfe11d171965f59cc61a1";
String actualChecksum = checksummedFile.calculateChecksum( ChecksumAlgorithm.SHA1 );
assertEquals( expectedChecksum, actualChecksum );
}
@Test
public void testCreateChecksum()
throws IOException
{
File testableJar = createTestableJar( "examples/redback-authz-open.jar" );
ChecksummedFile checksummedFile = new ChecksummedFile( testableJar );
checksummedFile.createChecksum( ChecksumAlgorithm.SHA1 );
File hashFile = checksummedFile.getChecksumFile( ChecksumAlgorithm.SHA1 );
assertTrue( "ChecksumAlgorithm file should exist.", hashFile.exists() );
String hashContents = FileUtils.readFileToString( hashFile );
hashContents = StringUtils.trim( hashContents );
assertEquals( "2bb14b388973351b0a4dfe11d171965f59cc61a1 redback-authz-open.jar", hashContents );
}
@Test
public void testFixChecksum()
throws IOException
{
File jarFile = createTestableJar( "examples/redback-authz-open.jar" );
File sha1File = new File( jarFile.getAbsolutePath() + ".sha1" );
// A typical scenario seen in the wild.
FileUtils.writeStringToFile( sha1File, "sha1sum: redback-authz-open.jar: No such file or directory" );
ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
assertFalse( "ChecksummedFile.isValid(SHA1) == false",
checksummedFile.isValidChecksum( ChecksumAlgorithm.SHA1 ) );
boolean fixed = checksummedFile.fixChecksums( new ChecksumAlgorithm[]{ ChecksumAlgorithm.SHA1 } );
assertTrue( "ChecksummedFile.fixChecksums() == true", fixed );
assertTrue( "ChecksummedFile.isValid(SHA1) == true",
checksummedFile.isValidChecksum( ChecksumAlgorithm.SHA1 ) );
}
@Test
public void testGetChecksumFile()
{
ChecksummedFile checksummedFile = new ChecksummedFile( new File( "test.jar" ) );
assertEquals( "test.jar.sha1", checksummedFile.getChecksumFile( ChecksumAlgorithm.SHA1 ).getName() );
}
@Test
public void testIsValidChecksum()
throws IOException
{
File jarFile = createTestableJar( "examples/redback-authz-open.jar", true, false );
ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
assertTrue( "ChecksummedFile.isValid(SHA1)", checksummedFile.isValidChecksum( ChecksumAlgorithm.SHA1 ) );
}
@Test
public void testIsValidChecksumInvalidSha1Format()
throws IOException
{
File jarFile = createTestableJar( "examples/redback-authz-open.jar" );
File sha1File = new File( jarFile.getAbsolutePath() + ".sha1" );
// A typical scenario seen in the wild.
FileUtils.writeStringToFile( sha1File, "sha1sum: redback-authz-open.jar: No such file or directory" );
ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
assertFalse( "ChecksummedFile.isValid(SHA1)", checksummedFile.isValidChecksum( ChecksumAlgorithm.SHA1 ) );
}
@Test
public void testIsValidChecksumNoChecksumFiles()
throws IOException
{
File jarFile = createTestableJar( "examples/redback-authz-open.jar", false, false );
ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
assertFalse( "ChecksummedFile.isValid(SHA1,MD5)", checksummedFile.isValidChecksums(
new ChecksumAlgorithm[]{ ChecksumAlgorithm.SHA1, ChecksumAlgorithm.MD5 } ) );
}
@Test
public void testIsValidChecksumSha1AndMd5()
throws IOException
{
File jarFile = createTestableJar( "examples/redback-authz-open.jar", true, true );
ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
assertTrue( "ChecksummedFile.isValid(SHA1,MD5)", checksummedFile.isValidChecksums(
new ChecksumAlgorithm[]{ ChecksumAlgorithm.SHA1, ChecksumAlgorithm.MD5 } ) );
}
@Test
public void testIsValidChecksumSha1NoMd5()
throws IOException
{
File jarFile = createTestableJar( "examples/redback-authz-open.jar", true, false );
ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
assertTrue( "ChecksummedFile.isValid(SHA1)", checksummedFile.isValidChecksums(
new ChecksumAlgorithm[]{ ChecksumAlgorithm.SHA1, ChecksumAlgorithm.MD5 } ) );
}
@Test
public void testParseChecksum()
throws IOException
{
String expected = SERVLETAPI_SHA1
+ " /home/projects/maven/repository-staging/to-ibiblio/maven2/servletapi/servletapi/2.4/servletapi-2.4.pom";
File testfile = getTestResource( "examples/redback-authz-open.jar" );
ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
String s = checksummedFile.parseChecksum( expected, ChecksumAlgorithm.SHA1,
"servletapi/servletapi/2.4/servletapi-2.4.pom" );
assertEquals( "Checksum doesn't match", SERVLETAPI_SHA1, s );
}
@Test
public void testParseChecksumAltDash1()
throws IOException
{
String expected = SERVLETAPI_SHA1 + " -";
File testfile = getTestResource( "examples/redback-authz-open.jar" );
ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
String s = checksummedFile.parseChecksum( expected, ChecksumAlgorithm.SHA1,
"servletapi/servletapi/2.4/servletapi-2.4.pom" );
assertEquals( "Checksum doesn't match", SERVLETAPI_SHA1, s );
}
@Test
public void testParseChecksumAltDash2()
throws IOException
{
String expected = "SHA1(-)=" + SERVLETAPI_SHA1;
File testfile = getTestResource( "examples/redback-authz-open.jar" );
ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
String s = checksummedFile.parseChecksum( expected, ChecksumAlgorithm.SHA1,
"servletapi/servletapi/2.4/servletapi-2.4.pom" );
assertEquals( "Checksum doesn't match", SERVLETAPI_SHA1, s );
}
@Test
public void testRemoteMetadataChecksumFilePathSha1()
throws IOException
{
String expected = REMOTE_METADATA_SHA1 + " /home/test/repository/examples/metadata/maven-metadata.xml";
File testfile = getTestResource( "examples/metadata/maven-metadata-remote.xml" );
ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
try
{
String s = checksummedFile.parseChecksum( expected, ChecksumAlgorithm.SHA1, "maven-metadata-remote.xml" );
assertEquals( "Checksum doesn't match", REMOTE_METADATA_SHA1, s );
}
catch ( IOException e )
{
e.printStackTrace();
fail( "IOException should not occur." );
}
}
@Test
public void testRemoteMetadataChecksumFilePathMd5()
throws IOException
{
String expected = REMOTE_METADATA_MD5 + " ./examples/metadata/maven-metadata.xml";
File testfile = getTestResource( "examples/metadata/maven-metadata-remote.xml" );
ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
try
{
String s = checksummedFile.parseChecksum( expected, ChecksumAlgorithm.MD5, "maven-metadata-remote.xml" );
assertEquals( "Checksum doesn't match", REMOTE_METADATA_MD5, s );
}
catch ( IOException e )
{
e.printStackTrace();
fail( "IOException should not occur." );
}
}
}