]> source.dussan.org Git - archiva.git/blob
d458d82a739de463a3276782458dbf9684584f95
[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.archiva.common.utils.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 import java.nio.charset.Charset;
31 import java.nio.file.Files;
32 import java.nio.file.Path;
33 import java.nio.file.Paths;
34 import java.nio.file.StandardCopyOption;
35
36 /**
37  * ChecksummedFileTest
38  *
39  *
40  */
41
42 public class ChecksummedFileTest
43     extends AbstractChecksumTestCase
44 {
45     /**
46      * SHA1 checksum from www.ibiblio.org/maven2, incuding file path
47      */
48     private static final String SERVLETAPI_SHA1 = "bcc82975c0f9c681fcb01cc38504c992553e93ba";
49
50     private static final String REMOTE_METADATA_SHA1 = "da39a3ee5e6b4b0d3255bfef95601890afd80709";
51
52     private static final String REMOTE_METADATA_MD5 = "d41d8cd98f00b204e9800998ecf8427e";
53
54     private static final Charset FILE_ENCODING = Charset.forName( "UTF-8" );
55
56
57     @Before
58     public void cleanTestDir()
59     {
60         try
61         {
62             FileUtils.deleteDirectory( getTestOutputDir() );
63         }
64         catch ( IOException ex )
65         {
66             LoggerFactory.getLogger( ChecksummedFileTest.class ).warn( ex.getMessage(), ex );
67         }
68     }
69
70     private Path createTestableJar( String filename )
71         throws IOException
72     {
73         Path srcFile = getTestResource( filename );
74         Path destFile = getTestOutputDir( ).resolve( srcFile.getFileName());
75         Files.copy( srcFile, destFile, StandardCopyOption.REPLACE_EXISTING );
76         return destFile;
77     }
78
79     private Path createTestableJar( String filename, boolean copySha1, boolean copyMd5 )
80         throws IOException
81     {
82         Path srcFile = getTestResource( filename );
83         Path jarFile = getTestOutputDir().resolve(srcFile.getFileName() );
84         Files.copy( srcFile, jarFile, StandardCopyOption.REPLACE_EXISTING );
85
86         if ( copySha1 )
87         {
88             Path srcSha1 = srcFile.resolveSibling( srcFile.getFileName() + ".sha1" );
89             Path sha1File = jarFile.resolveSibling( jarFile.getFileName() + ".sha1" );
90
91             Files.copy( srcSha1, sha1File, StandardCopyOption.REPLACE_EXISTING );
92         }
93
94         if ( copyMd5 )
95         {
96             Path srcMd5 = srcFile.resolveSibling( srcFile.getFileName() + ".md5" );
97             Path md5File = jarFile.resolveSibling( jarFile.getFileName() + ".md5" );
98
99             Files.copy( srcMd5, md5File, StandardCopyOption.REPLACE_EXISTING );
100         }
101
102         return jarFile;
103     }
104
105     @Test
106     public void testCalculateChecksumMd5()
107         throws IOException
108     {
109         Path testfile = getTestResource( "examples/redback-authz-open.jar" );
110         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
111         String expectedChecksum = "f42047fe2e177ac04d0df7aa44d408be";
112         String actualChecksum = checksummedFile.calculateChecksum( ChecksumAlgorithm.MD5 );
113         assertEquals( expectedChecksum, actualChecksum );
114     }
115
116     @Test
117     public void testCalculateChecksumSha1()
118         throws IOException
119     {
120         Path testfile = getTestResource( "examples/redback-authz-open.jar" );
121         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
122         String expectedChecksum = "2bb14b388973351b0a4dfe11d171965f59cc61a1";
123         String actualChecksum = checksummedFile.calculateChecksum( ChecksumAlgorithm.SHA1 );
124         assertEquals( expectedChecksum, actualChecksum );
125     }
126
127     @Test
128     public void testCreateChecksum()
129         throws IOException
130     {
131         Path testableJar = createTestableJar( "examples/redback-authz-open.jar" );
132         ChecksummedFile checksummedFile = new ChecksummedFile( testableJar );
133         checksummedFile.createChecksum( ChecksumAlgorithm.SHA1 );
134         Path hashFile = checksummedFile.getChecksumFile( ChecksumAlgorithm.SHA1 );
135         assertTrue( "ChecksumAlgorithm file should exist.", Files.exists(hashFile) );
136         String hashContents = org.apache.commons.io.FileUtils.readFileToString( hashFile.toFile() );
137         hashContents = StringUtils.trim( hashContents );
138         assertEquals( "2bb14b388973351b0a4dfe11d171965f59cc61a1  redback-authz-open.jar", hashContents );
139     }
140
141     @Test
142     public void testFixChecksum()
143         throws IOException, ChecksumValidationException
144     {
145         Path jarFile = createTestableJar( "examples/redback-authz-open.jar" );
146         Path sha1File = jarFile.resolveSibling( jarFile.getFileName()+ ".sha1" );
147
148         // A typical scenario seen in the wild.
149         org.apache.commons.io.FileUtils.writeStringToFile( sha1File.toFile(), "sha1sum: redback-authz-open.jar: No such file or directory" );
150
151         ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
152         assertFalse( "ChecksummedFile.isValid(SHA1) == false",
153                      checksummedFile.isValidChecksum( ChecksumAlgorithm.SHA1 ) );
154
155         boolean fixed = checksummedFile.fixChecksums( new ChecksumAlgorithm[]{ ChecksumAlgorithm.SHA1 } );
156         assertTrue( "ChecksummedFile.fixChecksums() == true", fixed );
157
158         assertTrue( "ChecksummedFile.isValid(SHA1) == true",
159                     checksummedFile.isValidChecksum( ChecksumAlgorithm.SHA1 ) );
160     }
161
162     @Test
163     public void testGetChecksumFile()
164     {
165         ChecksummedFile checksummedFile = new ChecksummedFile( Paths.get( "test.jar" ) );
166         assertEquals( "test.jar.sha1", checksummedFile.getChecksumFile( ChecksumAlgorithm.SHA1 ).getFileName().toString() );
167     }
168
169     @Test
170     public void testIsValidChecksum()
171         throws IOException, ChecksumValidationException
172     {
173         Path jarFile = createTestableJar( "examples/redback-authz-open.jar", true, false );
174
175         ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
176         assertTrue( "ChecksummedFile.isValid(SHA1)", checksummedFile.isValidChecksum( ChecksumAlgorithm.SHA1 ) );
177     }
178
179     @Test
180     public void testIsValidChecksumInvalidSha1Format()
181         throws IOException, ChecksumValidationException
182     {
183         Path jarFile = createTestableJar( "examples/redback-authz-open.jar" );
184         Path sha1File = jarFile.resolveSibling( jarFile.getFileName() + ".sha1" );
185
186         // A typical scenario seen in the wild.
187         FileUtils.writeStringToFile( sha1File, FILE_ENCODING, "sha1sum: redback-authz-open.jar: No such file or directory" );
188
189         ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
190         assertFalse( "ChecksummedFile.isValid(SHA1)", checksummedFile.isValidChecksum( ChecksumAlgorithm.SHA1 ) );
191
192     }
193
194     @Test
195     public void testIsValidChecksumNoChecksumFiles()
196         throws IOException, ChecksumValidationException
197     {
198         Path jarFile = createTestableJar( "examples/redback-authz-open.jar", false, false );
199
200         ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
201         assertFalse( "ChecksummedFile.isValid(SHA1,MD5)", checksummedFile.isValidChecksums(
202             new ChecksumAlgorithm[]{ ChecksumAlgorithm.SHA1, ChecksumAlgorithm.MD5 } ) );
203
204     }
205
206     @Test
207     public void testIsValidChecksumSha1AndMd5()
208         throws IOException, ChecksumValidationException
209     {
210         Path jarFile = createTestableJar( "examples/redback-authz-open.jar", true, true );
211
212         ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
213         assertTrue( "ChecksummedFile.isValid(SHA1,MD5)", checksummedFile.isValidChecksums(
214             new ChecksumAlgorithm[]{ ChecksumAlgorithm.SHA1, ChecksumAlgorithm.MD5 } ) );
215     }
216
217     @Test
218     public void testIsValidChecksumSha1NoMd5()
219         throws IOException, ChecksumValidationException
220     {
221         Path jarFile = createTestableJar( "examples/redback-authz-open.jar", true, false );
222
223         ChecksummedFile checksummedFile = new ChecksummedFile( jarFile );
224         assertTrue( "ChecksummedFile.isValid(SHA1)", checksummedFile.isValidChecksums(
225             new ChecksumAlgorithm[]{ ChecksumAlgorithm.SHA1, ChecksumAlgorithm.MD5 } ) );
226
227     }
228
229     @Test
230     public void testParseChecksum()
231         throws IOException, ChecksumValidationException
232     {
233         Path expectedFile = getTestOutputDir().resolve("servletapi-2.4.pom.sha1");
234         FileUtils.writeStringToFile( expectedFile, FILE_ENCODING, SERVLETAPI_SHA1
235             + "  /home/projects/maven/repository-staging/to-ibiblio/maven2/servletapi/servletapi/2.4/servletapi-2.4.pom");
236
237         Path testfile = getTestResource( "examples/redback-authz-open.jar" );
238         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
239         String s = checksummedFile.parseChecksum( expectedFile, ChecksumAlgorithm.SHA1,
240                                                   "servletapi/servletapi/2.4/servletapi-2.4.pom", FILE_ENCODING);
241         assertEquals( "Checksum doesn't match", SERVLETAPI_SHA1, s );
242
243     }
244
245     @Test
246     public void testParseChecksumAltDash1()
247         throws IOException, ChecksumValidationException
248     {
249         Path expectedFile = getTestOutputDir().resolve("redback-authz-open.jar.sha1");
250         FileUtils.writeStringToFile( expectedFile, FILE_ENCODING, SERVLETAPI_SHA1 + "  -");
251         Path testfile = getTestResource( "examples/redback-authz-open.jar" );
252         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
253         String s = checksummedFile.parseChecksum( expectedFile, ChecksumAlgorithm.SHA1,
254                                                   "servletapi/servletapi/2.4/servletapi-2.4.pom", FILE_ENCODING );
255         assertEquals( "Checksum doesn't match", SERVLETAPI_SHA1, s );
256     }
257
258     @Test
259     public void testParseChecksumAltDash2()
260         throws IOException, ChecksumValidationException
261     {
262         Path expectedFile = getTestOutputDir().resolve("redback-authz-open.jar.sha1");
263         FileUtils.writeStringToFile( expectedFile, FILE_ENCODING, "SHA1(-)=" + SERVLETAPI_SHA1);
264         Path testfile = getTestResource( "examples/redback-authz-open.jar" );
265         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
266         String s = checksummedFile.parseChecksum( expectedFile, ChecksumAlgorithm.SHA1,
267                                                   "servletapi/servletapi/2.4/servletapi-2.4.pom" , FILE_ENCODING);
268         assertEquals( "Checksum doesn't match", SERVLETAPI_SHA1, s );
269     }
270
271     @Test
272     public void testRemoteMetadataChecksumFilePathSha1()
273         throws IOException
274     {
275         Path expectedFile = getTestOutputDir().resolve("maven-metadata-remote.xml.sha1");
276         FileUtils.writeStringToFile( expectedFile, FILE_ENCODING, REMOTE_METADATA_SHA1 + "  /home/test/repository/examples/metadata/maven-metadata.xml");
277         Path testfile = getTestResource( "examples/metadata/maven-metadata-remote.xml" );
278         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
279
280         try
281         {
282             String s = checksummedFile.parseChecksum( expectedFile, ChecksumAlgorithm.SHA1, "maven-metadata-remote.xml", FILE_ENCODING );
283             assertEquals( "Checksum doesn't match", REMOTE_METADATA_SHA1, s );
284         }
285         catch ( ChecksumValidationException e )
286         {
287             e.printStackTrace();
288             fail( "IOException should not occur." );
289         }
290     }
291
292     @Test
293     public void testRemoteMetadataChecksumFilePathMd5()
294         throws IOException
295     {
296         Path expectedFile = getTestOutputDir().resolve( "maven-metadata.xml.md5" );
297         FileUtils.writeStringToFile( expectedFile, FILE_ENCODING, REMOTE_METADATA_MD5 + "  ./examples/metadata/maven-metadata.xml");
298         Path testfile = getTestResource( "examples/metadata/maven-metadata-remote.xml" );
299         ChecksummedFile checksummedFile = new ChecksummedFile( testfile );
300
301         try
302         {
303             String s = checksummedFile.parseChecksum( expectedFile, ChecksumAlgorithm.MD5, "maven-metadata-remote.xml", FILE_ENCODING );
304             assertEquals( "Checksum doesn't match", REMOTE_METADATA_MD5, s );
305         }
306         catch ( ChecksumValidationException e )
307         {
308             e.printStackTrace();
309             fail( "IOException should not occur." );
310         }
311     }
312 }