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  
26  import org.apache.maven.artifact.Artifact;
27  import org.apache.maven.artifact.DefaultArtifact;
28  import org.apache.maven.artifact.handler.ArtifactHandler;
29  import org.apache.maven.artifact.handler.DefaultArtifactHandler;
30  import org.apache.maven.artifact.versioning.VersionRange;
31  import org.apache.maven.plugin.MojoExecutionException;
32  import org.apache.maven.plugins.dependency.testUtils.stubs.StubSourcesFileMarkerHandler;
33  import org.junit.jupiter.api.BeforeEach;
34  import org.junit.jupiter.api.Test;
35  import org.junit.jupiter.api.io.TempDir;
36  
37  import static org.junit.jupiter.api.Assertions.assertFalse;
38  import static org.junit.jupiter.api.Assertions.assertTrue;
39  import static org.junit.jupiter.api.Assertions.fail;
40  
41  /**
42   * @author brianf
43   */
44  class TestSourcesMarkerFileHandler {
45      List<Artifact> artifacts = new ArrayList<>();
46  
47      private File outputFolder;
48  
49      @BeforeEach
50      void setUp(@TempDir File tempDir) {
51  
52          ArtifactHandler ah = new DefaultArtifactHandler();
53          VersionRange vr = VersionRange.createFromVersion("1.1");
54          Artifact artifact = new DefaultArtifact("test", "1", vr, Artifact.SCOPE_COMPILE, "jar", "", ah, false);
55          artifacts.add(artifact);
56          artifact = new DefaultArtifact("test", "2", vr, Artifact.SCOPE_PROVIDED, "war", "", ah, false);
57          artifacts.add(artifact);
58          artifact = new DefaultArtifact("test", "3", vr, Artifact.SCOPE_TEST, "sources", "", ah, false);
59          artifacts.add(artifact);
60          artifact = new DefaultArtifact("test", "4", vr, Artifact.SCOPE_RUNTIME, "zip", "", ah, false);
61          artifacts.add(artifact);
62  
63          outputFolder = new File(tempDir, "markers");
64          assertFalse(outputFolder.exists());
65      }
66  
67      @Test
68      void setMarkerResolved() throws Exception {
69          DefaultFileMarkerHandler handler = new SourcesFileMarkerHandler(artifacts.get(0), this.outputFolder, true);
70          assertFalse(handler.isMarkerSet());
71          handler.setMarker();
72          assertTrue(handler.isMarkerSet());
73          handler.clearMarker();
74          assertFalse(handler.isMarkerSet());
75  
76          handler.setMarker();
77          handler.setMarker();
78          assertTrue(handler.isMarkerSet());
79  
80          handler.clearMarker();
81          handler.clearMarker();
82          outputFolder.delete();
83          assertFalse(outputFolder.exists());
84      }
85  
86      @Test
87      void setMarkerUnresolved() throws Exception {
88          DefaultFileMarkerHandler handler = new SourcesFileMarkerHandler(artifacts.get(0), this.outputFolder, false);
89          assertFalse(handler.isMarkerSet());
90          handler.setMarker();
91          assertTrue(handler.isMarkerSet());
92          handler.clearMarker();
93          assertFalse(handler.isMarkerSet());
94  
95          handler.setMarker();
96          handler.setMarker();
97          assertTrue(handler.isMarkerSet());
98  
99          handler.clearMarker();
100         handler.clearMarker();
101         outputFolder.delete();
102         assertFalse(outputFolder.exists());
103     }
104 
105     @Test
106     void bothMarkers() throws Exception {
107         DefaultFileMarkerHandler handler = new SourcesFileMarkerHandler(artifacts.get(1), this.outputFolder, true);
108         DefaultFileMarkerHandler handler2 = new SourcesFileMarkerHandler(artifacts.get(1), this.outputFolder, false);
109 
110         handler.setMarker();
111         assertTrue(handler.isMarkerSet());
112         assertTrue(handler2.isMarkerSet());
113 
114         handler2.clearMarker();
115         assertFalse(handler.isMarkerSet());
116         assertFalse(handler2.isMarkerSet());
117         outputFolder.delete();
118         assertFalse(outputFolder.exists());
119     }
120 
121     @Test
122     void markerFile() throws Exception {
123         DefaultFileMarkerHandler handler = new SourcesFileMarkerHandler(artifacts.get(0), this.outputFolder, true);
124         DefaultFileMarkerHandler handler2 = new SourcesFileMarkerHandler(artifacts.get(0), this.outputFolder, false);
125 
126         File handle = handler.getMarkerFile();
127         File handle2 = handler2.getMarkerFile();
128         assertFalse(handle.exists());
129         assertFalse(handler.isMarkerSet());
130         assertFalse(handle2.exists());
131         assertFalse(handler2.isMarkerSet());
132 
133         // if either file exists, the marker is set
134         handler.setMarker();
135         assertTrue(handler.isMarkerSet());
136         assertTrue(handle.exists());
137         assertTrue(handler2.isMarkerSet());
138         assertFalse(handle2.exists());
139 
140         // if either file exists, the marker is set
141         // setting 1 will clear the other marker
142         handler2.setMarker();
143         assertTrue(handler.isMarkerSet());
144         assertFalse(handle.exists());
145         assertTrue(handler2.isMarkerSet());
146         assertTrue(handle2.exists());
147 
148         // reset file for next test
149         handle.createNewFile();
150 
151         // only delete one, should be still true
152         handle2.delete();
153         assertTrue(handler.isMarkerSet());
154         assertTrue(handler2.isMarkerSet());
155 
156         // delete the 2nd, should be false.
157         handle.delete();
158         assertFalse(handler.isMarkerSet());
159         assertFalse(handler2.isMarkerSet());
160 
161         handle.createNewFile();
162         assertTrue(handler.isMarkerSet());
163         assertTrue(handler2.isMarkerSet());
164 
165         handler.clearMarker();
166         assertFalse(handle.exists());
167         handler2.clearMarker();
168         assertFalse(handle2.exists());
169 
170         handle.delete();
171         handle2.delete();
172 
173         outputFolder.delete();
174         assertFalse(outputFolder.exists());
175     }
176 
177     @Test
178     void markerTimeStampResolved() throws Exception {
179         doTestMarkerTimeStamp(true);
180     }
181 
182     @Test
183     void markerTimeStampUnResolved() throws Exception {
184         doTestMarkerTimeStamp(false);
185     }
186 
187     private void doTestMarkerTimeStamp(boolean resolved) throws MojoExecutionException, IOException {
188         File theFile = new File(outputFolder, "theFile.jar");
189         outputFolder.mkdirs();
190         theFile.createNewFile();
191         Artifact theArtifact = artifacts.get(0);
192         theArtifact.setFile(theFile);
193         SourcesFileMarkerHandler resolvedHandler =
194                 new SourcesFileMarkerHandler(artifacts.get(0), this.outputFolder, resolved);
195         SourcesFileMarkerHandler unResolvedHandler =
196                 new SourcesFileMarkerHandler(artifacts.get(0), this.outputFolder, !resolved);
197 
198         assertFalse(resolvedHandler.isMarkerSet());
199         assertFalse(unResolvedHandler.isMarkerSet());
200         // if the marker is not set, assume it is infinately older than the
201         // artifact.
202         assertTrue(resolvedHandler.isMarkerOlder(theArtifact));
203         assertTrue(unResolvedHandler.isMarkerOlder(theArtifact));
204         resolvedHandler.setMarker();
205         assertFalse(resolvedHandler.isMarkerOlder(theArtifact));
206         assertFalse(unResolvedHandler.isMarkerOlder(theArtifact));
207 
208         resolvedHandler.clearMarker();
209         unResolvedHandler.setMarker();
210         assertFalse(resolvedHandler.isMarkerOlder(theArtifact));
211         assertFalse(unResolvedHandler.isMarkerOlder(theArtifact));
212 
213         assertTrue(theFile.setLastModified(theFile.lastModified() + 60000));
214         assertTrue(resolvedHandler.isMarkerOlder(theArtifact));
215         assertTrue(unResolvedHandler.isMarkerOlder(theArtifact));
216 
217         theFile.delete();
218         resolvedHandler.clearMarker();
219         assertFalse(resolvedHandler.isMarkerSet());
220     }
221 
222     @Test
223     void markerFileException() {
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     @Test
235     void markerFileResolvedSetter() {
236         SourcesFileMarkerHandler handler = new SourcesFileMarkerHandler(null, null, true);
237         assertTrue(handler.isResolved());
238         handler.setResolved(false);
239         assertFalse(handler.isResolved());
240     }
241 
242     @Test
243     void nullParent() throws Exception {
244         // the parent isn't set so this will create the marker in the local
245         // folder. We must clear the
246         // marker to avoid leaving test droppings in root.
247         DefaultFileMarkerHandler handler = new SourcesFileMarkerHandler(null, null, false);
248         handler.setArtifact(artifacts.get(0));
249         handler.setMarker();
250         assertTrue(handler.isMarkerSet());
251         handler.clearMarker();
252         assertFalse(handler.isMarkerSet());
253     }
254 
255     @Test
256     void nullParentResolved() throws Exception {
257         // the parent isn't set so this will create the marker in the local
258         // folder. We must clear the
259         // marker to avoid leaving test droppings in root.
260         DefaultFileMarkerHandler handler = new SourcesFileMarkerHandler(null, null, true);
261         handler.setArtifact(artifacts.get(0));
262         handler.setMarker();
263         assertTrue(handler.isMarkerSet());
264         handler.clearMarker();
265         assertFalse(handler.isMarkerSet());
266     }
267 }