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