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