]> source.dussan.org Git - archiva.git/blob
1668b5b723aad4ea6466f9921626f984586ce76d
[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 testIgnored()
152         throws Exception
153     {
154         PostDownloadPolicy policy = lookupPolicy();
155         File localFile = createTestableFiles( null, null );
156         Properties request = createRequest();
157
158         assertTrue( policy.applyPolicy( ChecksumPolicy.IGNORED, 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 = policy.applyPolicy( ChecksumPolicy.FAIL, request, localFile );
169         String msg = createMessage( ChecksumPolicy.FAIL, md5State, sha1State );
170
171         if ( actualResult == false )
172         {
173             assertFalse( msg + " local file should not exist:", localFile.exists() );
174             File md5File = new File( localFile.getAbsolutePath() + ".sha1" );
175             File sha1File = new File( localFile.getAbsolutePath() + ".md5" );
176             assertFalse( msg + " local md5 file should not exist:", md5File.exists() );
177             assertFalse( msg + " local sha1 file should not exist:", sha1File.exists() );
178         }
179
180         assertEquals( createMessage( ChecksumPolicy.FAIL, md5State, sha1State ), expectedResult, actualResult );
181     }
182
183     private void assertFixSetting( boolean expectedResult, String md5State, String sha1State )
184         throws Exception
185     {
186         PostDownloadPolicy policy = lookupPolicy();
187         File localFile = createTestableFiles( md5State, sha1State );
188         Properties request = createRequest();
189
190         boolean actualResult = policy.applyPolicy( ChecksumPolicy.FIX, request, localFile );
191         assertEquals( createMessage( ChecksumPolicy.FIX, md5State, sha1State ), expectedResult, actualResult );
192
193         // End result should be legitimate SHA1 and MD5 files.
194         File md5File = new File( localFile.getAbsolutePath() + ".md5" );
195         File sha1File = new File( localFile.getAbsolutePath() + ".sha1" );
196
197         assertTrue( "ChecksumPolicy.apply(FIX) md5 should exist.", md5File.exists() && md5File.isFile() );
198         assertTrue( "ChecksumPolicy.apply(FIX) sha1 should exist.", sha1File.exists() && sha1File.isFile() );
199
200         String actualMd5Contents = readChecksumFile( md5File );
201         String actualSha1Contents = readChecksumFile( sha1File );
202
203         String expectedMd5Contents = "360ccd01d8a0a2d94b86f9802c2fc548  artifact.jar";
204         String expectedSha1Contents = "7dd8929150664f182db60ad15f20359d875f059f  artifact.jar";
205
206         assertEquals( "ChecksumPolicy.apply(FIX) md5 contents:", expectedMd5Contents, actualMd5Contents );
207         assertEquals( "ChecksumPolicy.apply(FIX) sha1 contents:", expectedSha1Contents, actualSha1Contents );
208     }
209
210     /**
211      * Read the first line from the checksum file, and return it (trimmed).
212      */
213     private String readChecksumFile( File checksumFile )
214         throws Exception
215     {
216         FileReader freader = null;
217         BufferedReader buf = null;
218
219         try
220         {
221             freader = new FileReader( checksumFile );
222             buf = new BufferedReader( freader );
223             return buf.readLine();
224         }
225         finally
226         {
227             if ( buf != null )
228             {
229                 buf.close();
230             }
231
232             if ( freader != null )
233             {
234                 freader.close();
235             }
236         }
237     }
238
239     private String createMessage( String settingType, String md5State, String sha1State )
240     {
241         StringBuffer msg = new StringBuffer();
242         msg.append( "Expected result of ChecksumPolicy.apply(" );
243         msg.append( settingType.toUpperCase() );
244         msg.append( ") when working with " );
245         if ( md5State == null )
246         {
247             msg.append( "NO" );
248         }
249         else
250         {
251             msg.append( "a " ).append( md5State.toUpperCase() );
252         }
253
254         msg.append( " MD5 and " );
255
256         if ( sha1State == null )
257         {
258             msg.append( "NO" );
259         }
260         else
261         {
262             msg.append( "a " ).append( sha1State.toUpperCase() );
263         }
264         msg.append( " SHA1:" );
265
266         return msg.toString();
267     }
268
269     private Properties createRequest()
270     {
271         Properties request = new Properties();
272
273         request.setProperty( "url", "http://a.bad.hostname.maven.org/path/to/resource.txt" );
274
275         return request;
276     }
277
278     private File createTestableFiles( String md5State, String sha1State )
279         throws Exception
280     {
281         File sourceDir = new File( "src/test/resources/checksums/" );
282         File destDir = new File( "target/checksum-tests/" + getName() + "/" );
283
284         FileUtils.copyFileToDirectory( new File( sourceDir, "artifact.jar" ), destDir );
285
286         if ( md5State != null )
287         {
288             File md5File = new File( sourceDir, "artifact.jar.md5-" + md5State );
289             assertTrue( "Testable file exists: " + md5File.getName() + ":", md5File.exists() && md5File.isFile() );
290             File destFile = new File( destDir, "artifact.jar.md5" );
291             FileUtils.copyFile( md5File, destFile );
292         }
293
294         if ( sha1State != null )
295         {
296             File sha1File = new File( sourceDir, "artifact.jar.sha1-" + sha1State );
297             assertTrue( "Testable file exists: " + sha1File.getName() + ":", sha1File.exists() && sha1File.isFile() );
298             File destFile = new File( destDir, "artifact.jar.sha1" );
299             FileUtils.copyFile( sha1File, destFile );
300         }
301
302         File localFile = new File( destDir, "artifact.jar" );
303         return localFile;
304     }
305
306     private PostDownloadPolicy lookupPolicy()
307         throws Exception
308     {
309         PostDownloadPolicy policy = (PostDownloadPolicy) lookup( PostDownloadPolicy.class.getName(), "checksum" );
310         assertNotNull( policy );
311         return policy;
312     }
313
314 }