View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.plugins.dependency.utils.markers;
20  
21  import java.io.File;
22  import java.io.IOException;
23  import java.util.ArrayList;
24  import java.util.List;
25  import java.util.Random;
26  
27  import junit.framework.TestCase;
28  import org.apache.maven.artifact.Artifact;
29  import org.apache.maven.artifact.DefaultArtifact;
30  import org.apache.maven.artifact.handler.ArtifactHandler;
31  import org.apache.maven.artifact.handler.DefaultArtifactHandler;
32  import org.apache.maven.artifact.versioning.VersionRange;
33  import org.apache.maven.plugin.MojoExecutionException;
34  import org.apache.maven.plugin.logging.Log;
35  import org.apache.maven.plugin.testing.SilentLog;
36  import org.apache.maven.plugins.dependency.testUtils.stubs.StubSourcesFileMarkerHandler;
37  
38  /**
39   * @author brianf
40   */
41  public class TestSourcesMarkerFileHandler extends TestCase {
42      List<Artifact> artifacts = new ArrayList<>();
43  
44      Log log = new SilentLog();
45  
46      File outputFolder;
47  
48      protected void setUp() throws Exception {
49          super.setUp();
50  
51          ArtifactHandler ah = new DefaultArtifactHandler();
52          VersionRange vr = VersionRange.createFromVersion("1.1");
53          Artifact artifact = new DefaultArtifact("test", "1", vr, Artifact.SCOPE_COMPILE, "jar", "", ah, false);
54          artifacts.add(artifact);
55          artifact = new DefaultArtifact("test", "2", vr, Artifact.SCOPE_PROVIDED, "war", "", ah, false);
56          artifacts.add(artifact);
57          artifact = new DefaultArtifact("test", "3", vr, Artifact.SCOPE_TEST, "sources", "", ah, false);
58          artifacts.add(artifact);
59          artifact = new DefaultArtifact("test", "4", vr, Artifact.SCOPE_RUNTIME, "zip", "", ah, false);
60          artifacts.add(artifact);
61  
62          // pick random output location
63          Random a = new Random();
64          outputFolder = new File("target/markers" + a.nextLong() + "/");
65          outputFolder.delete();
66          assertFalse(outputFolder.exists());
67      }
68  
69      protected void tearDown() {
70          outputFolder.delete();
71      }
72  
73      public void testSetMarkerResolved() throws MojoExecutionException {
74          DefaultFileMarkerHandler handler = new SourcesFileMarkerHandler(artifacts.get(0), this.outputFolder, true);
75          assertFalse(handler.isMarkerSet());
76          handler.setMarker();
77          assertTrue(handler.isMarkerSet());
78          handler.clearMarker();
79          assertFalse(handler.isMarkerSet());
80  
81          handler.setMarker();
82          handler.setMarker();
83          assertTrue(handler.isMarkerSet());
84  
85          handler.clearMarker();
86          handler.clearMarker();
87          outputFolder.delete();
88          assertFalse(outputFolder.exists());
89      }
90  
91      public void testSetMarkerUnresolved() throws MojoExecutionException {
92          DefaultFileMarkerHandler handler = new SourcesFileMarkerHandler(artifacts.get(0), this.outputFolder, false);
93          assertFalse(handler.isMarkerSet());
94          handler.setMarker();
95          assertTrue(handler.isMarkerSet());
96          handler.clearMarker();
97          assertFalse(handler.isMarkerSet());
98  
99          handler.setMarker();
100         handler.setMarker();
101         assertTrue(handler.isMarkerSet());
102 
103         handler.clearMarker();
104         handler.clearMarker();
105         outputFolder.delete();
106         assertFalse(outputFolder.exists());
107     }
108 
109     public void testBothMarkers() throws MojoExecutionException {
110         DefaultFileMarkerHandler handler = new SourcesFileMarkerHandler(artifacts.get(1), this.outputFolder, true);
111         DefaultFileMarkerHandler handler2 = new SourcesFileMarkerHandler(artifacts.get(1), this.outputFolder, false);
112 
113         handler.setMarker();
114         assertTrue(handler.isMarkerSet());
115         assertTrue(handler2.isMarkerSet());
116 
117         handler2.clearMarker();
118         assertFalse(handler.isMarkerSet());
119         assertFalse(handler2.isMarkerSet());
120         outputFolder.delete();
121         assertFalse(outputFolder.exists());
122     }
123 
124     public void testMarkerFile() throws MojoExecutionException, IOException {
125         DefaultFileMarkerHandler handler = new SourcesFileMarkerHandler(artifacts.get(0), this.outputFolder, true);
126         DefaultFileMarkerHandler handler2 = new SourcesFileMarkerHandler(artifacts.get(0), this.outputFolder, false);
127 
128         File handle = handler.getMarkerFile();
129         File handle2 = handler2.getMarkerFile();
130         assertFalse(handle.exists());
131         assertFalse(handler.isMarkerSet());
132         assertFalse(handle2.exists());
133         assertFalse(handler2.isMarkerSet());
134 
135         // if either file exists, the marker is set
136         handler.setMarker();
137         assertTrue(handler.isMarkerSet());
138         assertTrue(handle.exists());
139         assertTrue(handler2.isMarkerSet());
140         assertFalse(handle2.exists());
141 
142         // if either file exists, the marker is set
143         // setting 1 will clear the other marker
144         handler2.setMarker();
145         assertTrue(handler.isMarkerSet());
146         assertFalse(handle.exists());
147         assertTrue(handler2.isMarkerSet());
148         assertTrue(handle2.exists());
149 
150         // reset file for next test
151         handle.createNewFile();
152 
153         // only delete one, should be still true
154         handle2.delete();
155         assertTrue(handler.isMarkerSet());
156         assertTrue(handler2.isMarkerSet());
157 
158         // delete the 2nd, should be false.
159         handle.delete();
160         assertFalse(handler.isMarkerSet());
161         assertFalse(handler2.isMarkerSet());
162 
163         handle.createNewFile();
164         assertTrue(handler.isMarkerSet());
165         assertTrue(handler2.isMarkerSet());
166 
167         handler.clearMarker();
168         assertFalse(handle.exists());
169         handler2.clearMarker();
170         assertFalse(handle2.exists());
171 
172         handle.delete();
173         handle2.delete();
174 
175         outputFolder.delete();
176         assertFalse(outputFolder.exists());
177     }
178 
179     public void testMarkerTimeStampResolved() throws MojoExecutionException, IOException, InterruptedException {
180         doTestMarkerTimeStamp(true);
181     }
182 
183     public void testMarkerTimeStampUnResolved() throws MojoExecutionException, IOException, InterruptedException {
184         doTestMarkerTimeStamp(false);
185     }
186 
187     public void doTestMarkerTimeStamp(boolean resolved)
188             throws MojoExecutionException, IOException, InterruptedException {
189         File theFile = new File(outputFolder, "theFile.jar");
190         outputFolder.mkdirs();
191         theFile.createNewFile();
192         Artifact theArtifact = artifacts.get(0);
193         theArtifact.setFile(theFile);
194         SourcesFileMarkerHandler resolvedHandler =
195                 new SourcesFileMarkerHandler(artifacts.get(0), this.outputFolder, resolved);
196         SourcesFileMarkerHandler unResolvedHandler =
197                 new SourcesFileMarkerHandler(artifacts.get(0), this.outputFolder, !resolved);
198 
199         assertFalse(resolvedHandler.isMarkerSet());
200         assertFalse(unResolvedHandler.isMarkerSet());
201         // if the marker is not set, assume it is infinately older than the
202         // artifact.
203         assertTrue(resolvedHandler.isMarkerOlder(theArtifact));
204         assertTrue(unResolvedHandler.isMarkerOlder(theArtifact));
205         resolvedHandler.setMarker();
206         assertFalse(resolvedHandler.isMarkerOlder(theArtifact));
207         assertFalse(unResolvedHandler.isMarkerOlder(theArtifact));
208 
209         resolvedHandler.clearMarker();
210         unResolvedHandler.setMarker();
211         assertFalse(resolvedHandler.isMarkerOlder(theArtifact));
212         assertFalse(unResolvedHandler.isMarkerOlder(theArtifact));
213 
214         assertTrue(theFile.setLastModified(theFile.lastModified() + 60000));
215         assertTrue(resolvedHandler.isMarkerOlder(theArtifact));
216         assertTrue(unResolvedHandler.isMarkerOlder(theArtifact));
217 
218         theFile.delete();
219         resolvedHandler.clearMarker();
220         assertFalse(resolvedHandler.isMarkerSet());
221     }
222 
223     public void testMarkerFileException() {
224         // this stub wraps the file with an object to throw exceptions
225         StubSourcesFileMarkerHandler handler =
226                 new StubSourcesFileMarkerHandler(artifacts.get(0), this.outputFolder, true);
227         try {
228             handler.setMarker();
229             fail("Expected an Exception here");
230         } catch (MojoExecutionException e) {
231         }
232     }
233 
234     public void testMarkerFileResolvedSetter() {
235         SourcesFileMarkerHandler handler = new SourcesFileMarkerHandler(null, null, true);
236         assertTrue(handler.isResolved());
237         handler.setResolved(false);
238         assertFalse(handler.isResolved());
239     }
240 
241     public void testNullParent() throws MojoExecutionException {
242         // the parent isn't set so this will create the marker in the local
243         // folder. We must clear the
244         // marker to avoid leaving test droppings in root.
245         DefaultFileMarkerHandler handler = new SourcesFileMarkerHandler(null, null, false);
246         handler.setArtifact(artifacts.get(0));
247         handler.setMarker();
248         assertTrue(handler.isMarkerSet());
249         handler.clearMarker();
250         assertFalse(handler.isMarkerSet());
251     }
252 
253     public void testNullParentResolved() throws MojoExecutionException {
254         // the parent isn't set so this will create the marker in the local
255         // folder. We must clear the
256         // marker to avoid leaving test droppings in root.
257         DefaultFileMarkerHandler handler = new SourcesFileMarkerHandler(null, null, true);
258         handler.setArtifact(artifacts.get(0));
259         handler.setMarker();
260         assertTrue(handler.isMarkerSet());
261         handler.clearMarker();
262         assertFalse(handler.isMarkerSet());
263     }
264 }