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