]> source.dussan.org Git - archiva.git/blob
69d34f28daaa4705b18aba53237e9c7eca62c618
[archiva.git] /
1 package org.apache.archiva.checksum;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *   http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import org.apache.commons.io.FileUtils;
23 import org.apache.commons.lang.StringUtils;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.slf4j.LoggerFactory;
27
28 import java.io.File;
29 import java.io.IOException;
30
31 /**
32  * ChecksummedFileTest
33  *
34  *
35  */
36
37 public class ChecksummedFileTest
38     extends AbstractChecksumTestCase
39 {
40     /**
41      * SHA1 checksum from www.ibiblio.org/maven2, incuding file path
42      */
43     private static final String SERVLETAPI_SHA1 = "bcc82975c0f9c681fcb01cc38504c992553e93ba";
44
45     private static final String REMOTE_METADATA_SHA1 = "da39a3ee5e6b4b0d3255bfef95601890afd80709";
46
47     private static final String REMOTE_METADATA_MD5 = "d41d8cd98f00b204e9800998ecf8427e";
48
49
50     @Before
51     public void cleanTestDir()
52     {
53         try
54         {
55             FileUtils.deleteDirectory( getTestOutputDir() );
56         }
57         catch ( IOException ex )
58         {
59             LoggerFactory.getLogger( ChecksummedFileTest.class ).warn( ex.getMessage(), ex );
60         }
61     }
62
63     private File createTestableJar( String filename )
64         throws IOException
65     {
66         File srcFile = getTestResource( filename );
67         File destFile = new File( getTestOutputDir(), srcFile.getName() );
68         FileUtils.copyFile( srcFile, destFile );
69         return destFile;
70     }
71
72     private File createTestableJar( String filename, boolean copySha1, boolean copyMd5 )
73         throws IOException
74     {
75         File srcFile = getTestResource( filename );
76         File jarFile = new File( getTestOutputDir(), srcFile.getName() );
77         FileUtils.copyFile( srcFile, jarFile );
78
79         if ( copySha1 )
80         {
81             File srcSha1 = new File( srcFile.getAbsolutePath() + ".sha1" );
82             File sha1File = new File( jarFile.getAbsolutePath() + ".sha1" );
83
84             FileUtils.copyFile( srcSha1, sha1File );
85         }
86
87         if ( copyMd5 )
88         {
89             File srcMd5 = new File( srcFile.getAbsolutePath() + ".md5" );
90             File md5File = new File( jarFile.getAbsolutePath() + ".md5" );
91
92             FileUtils.copyFile( srcMd5, md5File );
93         }
94
95         return jarFile;
96     }
97
98     @Test
99     public void testCalculateChecksumMd5()
100         throws IOException
101     {
102         File testfile = getTestResource( "examples/redback-authz-open.jar" );
103         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
104         String expectedChecksum = "f42047fe2e177ac04d0df7aa44d408be";
105         String actualChecksum = checksummedFile.calculateChecksum( ChecksumAlgorithm.MD5 );
106         assertEquals( expectedChecksum, actualChecksum );
107     }
108
109     @Test
110     public void testCalculateChecksumSha1()
111         throws IOException
112     {
113         File testfile = getTestResource( "examples/redback-authz-open.jar" );
114         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
115         String expectedChecksum = "2bb14b388973351b0a4dfe11d171965f59cc61a1";
116         String actualChecksum = checksummedFile.calculateChecksum( ChecksumAlgorithm.SHA1 );
117         assertEquals( expectedChecksum, actualChecksum );
118     }
119
120     @Test
121     public void testCreateChecksum()
122         throws IOException
123     {
124         File testableJar = createTestableJar( "examples/redback-authz-open.jar" );
125         ChecksummedFile checksummedFile = new ChecksummedFile( testableJar );
126         checksummedFile.createChecksum( ChecksumAlgorithm.SHA1 );
127         File hashFile = checksummedFile.getChecksumFile( ChecksumAlgorithm.SHA1 );
128         assertTrue( "ChecksumAlgorithm file should exist.", hashFile.exists() );
129         String hashContents = FileUtils.readFileToString( hashFile );
130         hashContents = StringUtils.trim( hashContents );
131         assertEquals( "2bb14b388973351b0a4dfe11d171965f59cc61a1  redback-authz-open.jar", hashContents );
132     }
133
134     @Test
135     public void testFixChecksum()
136         throws IOException
137     {
138         File jarFile = createTestableJar( "examples/redback-authz-open.jar" );
139         File sha1File = new File( jarFile.getAbsolutePath() + ".sha1" );
140
141         // A typical scenario seen in the wild.
142         FileUtils.writeStringToFile( sha1File, "sha1sum: redback-authz-open.jar: No such file or directory" );
143
144         ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
145         assertFalse( "ChecksummedFile.isValid(SHA1) == false",
146                      checksummedFile.isValidChecksum( ChecksumAlgorithm.SHA1 ) );
147
148         boolean fixed = checksummedFile.fixChecksums( new ChecksumAlgorithm[]{ ChecksumAlgorithm.SHA1 } );
149         assertTrue( "ChecksummedFile.fixChecksums() == true", fixed );
150
151         assertTrue( "ChecksummedFile.isValid(SHA1) == true",
152                     checksummedFile.isValidChecksum( ChecksumAlgorithm.SHA1 ) );
153     }
154
155     @Test
156     public void testGetChecksumFile()
157     {
158         ChecksummedFile checksummedFile = new ChecksummedFile( new File( "test.jar" ) );
159         assertEquals( "test.jar.sha1", checksummedFile.getChecksumFile( ChecksumAlgorithm.SHA1 ).getName() );
160     }
161
162     @Test
163     public void testIsValidChecksum()
164         throws IOException
165     {
166         File jarFile = createTestableJar( "examples/redback-authz-open.jar", true, false );
167
168         ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
169         assertTrue( "ChecksummedFile.isValid(SHA1)", checksummedFile.isValidChecksum( ChecksumAlgorithm.SHA1 ) );
170     }
171
172     @Test
173     public void testIsValidChecksumInvalidSha1Format()
174         throws IOException
175     {
176         File jarFile = createTestableJar( "examples/redback-authz-open.jar" );
177         File sha1File = new File( jarFile.getAbsolutePath() + ".sha1" );
178
179         // A typical scenario seen in the wild.
180         FileUtils.writeStringToFile( sha1File, "sha1sum: redback-authz-open.jar: No such file or directory" );
181
182         ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
183         assertFalse( "ChecksummedFile.isValid(SHA1)", checksummedFile.isValidChecksum( ChecksumAlgorithm.SHA1 ) );
184
185     }
186
187     @Test
188     public void testIsValidChecksumNoChecksumFiles()
189         throws IOException
190     {
191         File jarFile = createTestableJar( "examples/redback-authz-open.jar", false, false );
192
193         ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
194         assertFalse( "ChecksummedFile.isValid(SHA1,MD5)", checksummedFile.isValidChecksums(
195             new ChecksumAlgorithm[]{ ChecksumAlgorithm.SHA1, ChecksumAlgorithm.MD5 } ) );
196
197     }
198
199     @Test
200     public void testIsValidChecksumSha1AndMd5()
201         throws IOException
202     {
203         File jarFile = createTestableJar( "examples/redback-authz-open.jar", true, true );
204
205         ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
206         assertTrue( "ChecksummedFile.isValid(SHA1,MD5)", checksummedFile.isValidChecksums(
207             new ChecksumAlgorithm[]{ ChecksumAlgorithm.SHA1, ChecksumAlgorithm.MD5 } ) );
208     }
209
210     @Test
211     public void testIsValidChecksumSha1NoMd5()
212         throws IOException
213     {
214         File jarFile = createTestableJar( "examples/redback-authz-open.jar", true, false );
215
216         ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
217         assertTrue( "ChecksummedFile.isValid(SHA1)", checksummedFile.isValidChecksums(
218             new ChecksumAlgorithm[]{ ChecksumAlgorithm.SHA1, ChecksumAlgorithm.MD5 } ) );
219
220     }
221
222     @Test
223     public void testParseChecksum()
224         throws IOException
225     {
226         String expected = SERVLETAPI_SHA1
227             + "  /home/projects/maven/repository-staging/to-ibiblio/maven2/servletapi/servletapi/2.4/servletapi-2.4.pom";
228
229         File testfile = getTestResource( "examples/redback-authz-open.jar" );
230         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
231         String s = checksummedFile.parseChecksum( expected, ChecksumAlgorithm.SHA1,
232                                                   "servletapi/servletapi/2.4/servletapi-2.4.pom" );
233         assertEquals( "Checksum doesn't match", SERVLETAPI_SHA1, s );
234
235     }
236
237     @Test
238     public void testParseChecksumAltDash1()
239         throws IOException
240     {
241         String expected = SERVLETAPI_SHA1 + "  -";
242         File testfile = getTestResource( "examples/redback-authz-open.jar" );
243         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
244         String s = checksummedFile.parseChecksum( expected, ChecksumAlgorithm.SHA1,
245                                                   "servletapi/servletapi/2.4/servletapi-2.4.pom" );
246         assertEquals( "Checksum doesn't match", SERVLETAPI_SHA1, s );
247     }
248
249     @Test
250     public void testParseChecksumAltDash2()
251         throws IOException
252     {
253         String expected = "SHA1(-)=" + SERVLETAPI_SHA1;
254         File testfile = getTestResource( "examples/redback-authz-open.jar" );
255         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
256         String s = checksummedFile.parseChecksum( expected, ChecksumAlgorithm.SHA1,
257                                                   "servletapi/servletapi/2.4/servletapi-2.4.pom" );
258         assertEquals( "Checksum doesn't match", SERVLETAPI_SHA1, s );
259     }
260
261     @Test
262     public void testRemoteMetadataChecksumFilePathSha1()
263         throws IOException
264     {
265         String expected = REMOTE_METADATA_SHA1 + "  /home/test/repository/examples/metadata/maven-metadata.xml";
266         File testfile = getTestResource( "examples/metadata/maven-metadata-remote.xml" );
267         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
268
269         try
270         {
271             String s = checksummedFile.parseChecksum( expected, ChecksumAlgorithm.SHA1, "maven-metadata-remote.xml" );
272             assertEquals( "Checksum doesn't match", REMOTE_METADATA_SHA1, s );
273         }
274         catch ( IOException e )
275         {
276             e.printStackTrace();
277             fail( "IOException should not occur." );
278         }
279     }
280
281     @Test
282     public void testRemoteMetadataChecksumFilePathMd5()
283         throws IOException
284     {
285         String expected = REMOTE_METADATA_MD5 + "  ./examples/metadata/maven-metadata.xml";
286         File testfile = getTestResource( "examples/metadata/maven-metadata-remote.xml" );
287         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
288
289         try
290         {
291             String s = checksummedFile.parseChecksum( expected, ChecksumAlgorithm.MD5, "maven-metadata-remote.xml" );
292             assertEquals( "Checksum doesn't match", REMOTE_METADATA_MD5, s );
293         }
294         catch ( IOException e )
295         {
296             e.printStackTrace();
297             fail( "IOException should not occur." );
298         }
299     }
300 }