]> source.dussan.org Git - archiva.git/blob
ec1cd216504c5691a59bbe0d33d939265dd3aad9
[archiva.git] /
1 package org.apache.archiva.policies;
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.junit.Rule;
24 import org.junit.Test;
25 import org.junit.rules.TestName;
26 import org.junit.runner.RunWith;
27 import org.springframework.test.context.ContextConfiguration;
28
29 import java.io.BufferedReader;
30 import java.io.File;
31 import java.io.FileReader;
32 import java.util.Properties;
33 import javax.inject.Inject;
34 import javax.inject.Named;
35 import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
36
37 import static org.junit.Assert.*;
38
39 /**
40  * ChecksumPolicyTest
41  *
42  *
43  */
44 @RunWith( ArchivaSpringJUnit4ClassRunner.class )
45 @ContextConfiguration( locations = {"classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml"} )
46 public class ChecksumPolicyTest
47 {
48     private static final String GOOD = "good";
49
50     private static final String BAD = "bad";
51
52     @Inject
53     @Named( value = "postDownloadPolicy#checksum" )
54     PostDownloadPolicy downloadPolicy;
55
56     @Rule
57     public TestName name = new TestName();
58
59     private PostDownloadPolicy lookupPolicy()
60         throws Exception
61     {
62         return downloadPolicy;
63     }
64
65     @Test
66     public void testFailOnFileOnly()
67         throws Exception
68     {
69         assertFailSetting( false, null, null );
70     }
71
72     @Test
73     public void testFailOnFileWithBadMd5AndBadSha1()
74         throws Exception
75     {
76         assertFailSetting( false, BAD, BAD );
77     }
78
79     @Test
80     public void testFailOnFileWithBadMd5AndGoodSha1()
81         throws Exception
82     {
83         assertFailSetting( false, BAD, GOOD );
84     }
85
86     @Test
87     public void testFailOnFileWithBadMd5Only()
88         throws Exception
89     {
90         assertFailSetting( false, BAD, null );
91     }
92
93     @Test
94     public void testFailOnFileWithBadSha1Only()
95         throws Exception
96     {
97         assertFailSetting( false, null, BAD );
98     }
99
100     @Test
101     public void testFailOnFileWithGoodMd5AndBadSha1()
102         throws Exception
103     {
104         assertFailSetting( false, GOOD, BAD );
105     }
106
107     @Test
108     public void testFailOnFileWithGoodMd5AndGoodSha1()
109         throws Exception
110     {
111         assertFailSetting( true, GOOD, GOOD );
112     }
113
114     @Test
115     public void testFailOnFileWithGoodMd5Only()
116         throws Exception
117     {
118         assertFailSetting( true, GOOD, null );
119     }
120
121     @Test
122     public void testFailOnFileWithGoodSha1Only()
123         throws Exception
124     {
125         assertFailSetting( true, null, GOOD );
126     }
127
128     @Test
129     public void testFixOnFileOnly()
130         throws Exception
131     {
132         assertFixSetting( true, null, null );
133     }
134
135     @Test
136     public void testFixOnFileWithBadMd5AndBadSha1()
137         throws Exception
138     {
139         assertFixSetting( true, BAD, BAD );
140     }
141
142     @Test
143     public void testFixOnFileWithBadMd5AndGoodSha1()
144         throws Exception
145     {
146         assertFixSetting( true, BAD, GOOD );
147     }
148
149     @Test
150     public void testFixOnFileWithBadMd5Only()
151         throws Exception
152     {
153         assertFixSetting( true, BAD, null );
154     }
155
156     @Test
157     public void testFixOnFileWithBadSha1Only()
158         throws Exception
159     {
160         assertFixSetting( true, null, BAD );
161     }
162
163     @Test
164     public void testFixOnFileWithGoodMd5AndBadSha1()
165         throws Exception
166     {
167         assertFixSetting( true, GOOD, BAD );
168     }
169
170     @Test
171     public void testFixOnFileWithGoodMd5AndGoodSha1()
172         throws Exception
173     {
174         assertFixSetting( true, GOOD, GOOD );
175     }
176
177     @Test
178     public void testFixOnFileWithGoodMd5Only()
179         throws Exception
180     {
181         assertFixSetting( true, GOOD, null );
182     }
183
184     @Test
185     public void testFixOnFileWithGoodSha1Only()
186         throws Exception
187     {
188         assertFixSetting( true, null, GOOD );
189     }
190
191     @Test
192     public void testIgnore()
193         throws Exception
194     {
195         PostDownloadPolicy policy = lookupPolicy();
196         File localFile = createTestableFiles( null, null );
197         Properties request = createRequest();
198
199         policy.applyPolicy( ChecksumPolicy.IGNORE, request, localFile );
200     }
201
202     private void assertFailSetting( boolean expectedResult, String md5State, String sha1State )
203         throws Exception
204     {
205         PostDownloadPolicy policy = lookupPolicy();
206         File localFile = createTestableFiles( md5State, sha1State );
207         Properties request = createRequest();
208
209         boolean actualResult;
210
211         try
212         {
213             policy.applyPolicy( ChecksumPolicy.FAIL, request, localFile );
214             actualResult = true;
215         }
216         catch ( PolicyViolationException e )
217         {
218             actualResult = false;
219             String msg = createMessage( ChecksumPolicy.FAIL, md5State, sha1State );
220
221             assertFalse( msg + " local file should not exist:", localFile.exists() );
222             File md5File = new File( localFile.getAbsolutePath() + ".sha1" );
223             File sha1File = new File( localFile.getAbsolutePath() + ".md5" );
224             assertFalse( msg + " local md5 file should not exist:", md5File.exists() );
225             assertFalse( msg + " local sha1 file should not exist:", sha1File.exists() );
226         }
227
228         assertEquals( createMessage( ChecksumPolicy.FAIL, md5State, sha1State ), expectedResult, actualResult );
229     }
230
231     private void assertFixSetting( boolean expectedResult, String md5State, String sha1State )
232         throws Exception
233     {
234         PostDownloadPolicy policy = lookupPolicy();
235         File localFile = createTestableFiles( md5State, sha1State );
236         Properties request = createRequest();
237
238         boolean actualResult;
239
240         try
241         {
242             policy.applyPolicy( ChecksumPolicy.FIX, request, localFile );
243             actualResult = true;
244         }
245         catch ( PolicyViolationException e )
246         {
247             actualResult = false;
248         }
249
250         assertEquals( createMessage( ChecksumPolicy.FIX, md5State, sha1State ), expectedResult, actualResult );
251
252         // End result should be legitimate SHA1 and MD5 files.
253         File md5File = new File( localFile.getAbsolutePath() + ".md5" );
254         File sha1File = new File( localFile.getAbsolutePath() + ".sha1" );
255
256         assertTrue( "ChecksumPolicy.apply(FIX) md5 should exist.", md5File.exists() && md5File.isFile() );
257         assertTrue( "ChecksumPolicy.apply(FIX) sha1 should exist.", sha1File.exists() && sha1File.isFile() );
258
259         String actualMd5Contents = readChecksumFile( md5File );
260         String actualSha1Contents = readChecksumFile( sha1File );
261
262         String expectedMd5Contents = "360ccd01d8a0a2d94b86f9802c2fc548  artifact.jar";
263         String expectedSha1Contents = "7dd8929150664f182db60ad15f20359d875f059f  artifact.jar";
264
265         assertEquals( "ChecksumPolicy.apply(FIX) md5 contents:", expectedMd5Contents, actualMd5Contents );
266         assertEquals( "ChecksumPolicy.apply(FIX) sha1 contents:", expectedSha1Contents, actualSha1Contents );
267     }
268
269     /**
270      * Read the first line from the checksum file, and return it (trimmed).
271      */
272     private String readChecksumFile( File checksumFile )
273         throws Exception
274     {
275         FileReader freader = null;
276         BufferedReader buf = null;
277
278         try
279         {
280             freader = new FileReader( checksumFile );
281             buf = new BufferedReader( freader );
282             return buf.readLine();
283         }
284         finally
285         {
286             if ( buf != null )
287             {
288                 buf.close();
289             }
290
291             if ( freader != null )
292             {
293                 freader.close();
294             }
295         }
296     }
297
298     private String createMessage( String settingType, String md5State, String sha1State )
299     {
300         StringBuilder msg = new StringBuilder();
301         msg.append( "Expected result of ChecksumPolicy.apply(" );
302         msg.append( settingType.toUpperCase() );
303         msg.append( ") when working with " );
304         if ( md5State == null )
305         {
306             msg.append( "NO" );
307         }
308         else
309         {
310             msg.append( "a " ).append( md5State.toUpperCase() );
311         }
312
313         msg.append( " MD5 and " );
314
315         if ( sha1State == null )
316         {
317             msg.append( "NO" );
318         }
319         else
320         {
321             msg.append( "a " ).append( sha1State.toUpperCase() );
322         }
323         msg.append( " SHA1:" );
324
325         return msg.toString();
326     }
327
328     private Properties createRequest()
329     {
330         Properties request = new Properties();
331
332         request.setProperty( "url", "http://a.bad.hostname.maven.org/path/to/resource.txt" );
333
334         return request;
335     }
336
337     private File createTestableFiles( String md5State, String sha1State )
338         throws Exception
339     {
340         File sourceDir = getTestFile( "src/test/resources/checksums/" );
341         File destDir = getTestFile( "target/checksum-tests/" + name.getMethodName() + "/" );
342
343         FileUtils.copyFileToDirectory( new File( sourceDir, "artifact.jar" ), destDir );
344
345         if ( md5State != null )
346         {
347             File md5File = new File( sourceDir, "artifact.jar.md5-" + md5State );
348             assertTrue( "Testable file exists: " + md5File.getName() + ":", md5File.exists() && md5File.isFile() );
349             File destFile = new File( destDir, "artifact.jar.md5" );
350             FileUtils.copyFile( md5File, destFile );
351         }
352
353         if ( sha1State != null )
354         {
355             File sha1File = new File( sourceDir, "artifact.jar.sha1-" + sha1State );
356             assertTrue( "Testable file exists: " + sha1File.getName() + ":", sha1File.exists() && sha1File.isFile() );
357             File destFile = new File( destDir, "artifact.jar.sha1" );
358             FileUtils.copyFile( sha1File, destFile );
359         }
360
361         File localFile = new File( destDir, "artifact.jar" );
362         return localFile;
363     }
364
365     public static File getTestFile( String path )
366     {
367         return new File( org.apache.archiva.common.utils.FileUtils.getBasedir(), path );
368     }
369
370 }