View Javadoc
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 }