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.repository;
20  
21  import javax.inject.Inject;
22  
23  import java.util.Arrays;
24  import java.util.List;
25  
26  import org.apache.maven.artifact.repository.ArtifactRepository;
27  import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
28  import org.apache.maven.repository.legacy.repository.ArtifactRepositoryFactory;
29  import org.apache.maven.settings.Mirror;
30  import org.codehaus.plexus.testing.PlexusTest;
31  import org.junit.jupiter.api.Test;
32  
33  import static org.junit.jupiter.api.Assertions.assertFalse;
34  import static org.junit.jupiter.api.Assertions.assertNull;
35  import static org.junit.jupiter.api.Assertions.assertSame;
36  import static org.junit.jupiter.api.Assertions.assertTrue;
37  
38  @PlexusTest
39  @Deprecated
40  class MirrorProcessorTest {
41      @Inject
42      private DefaultMirrorSelector mirrorSelector;
43  
44      @Inject
45      private ArtifactRepositoryFactory repositorySystem;
46  
47      @Test
48      void testExternalURL() {
49          assertTrue(DefaultMirrorSelector.isExternalRepo(getRepo("foo", "http://somehost")));
50          assertTrue(DefaultMirrorSelector.isExternalRepo(getRepo("foo", "http://somehost:9090/somepath")));
51          assertTrue(DefaultMirrorSelector.isExternalRepo(getRepo("foo", "ftp://somehost")));
52          assertTrue(DefaultMirrorSelector.isExternalRepo(getRepo("foo", "http://192.168.101.1")));
53          assertTrue(DefaultMirrorSelector.isExternalRepo(getRepo("foo", "http://")));
54          // these are local
55          assertFalse(DefaultMirrorSelector.isExternalRepo(getRepo("foo", "http://localhost:8080")));
56          assertFalse(DefaultMirrorSelector.isExternalRepo(getRepo("foo", "http://127.0.0.1:9090")));
57          assertFalse(DefaultMirrorSelector.isExternalRepo(getRepo("foo", "file://localhost/somepath")));
58          assertFalse(DefaultMirrorSelector.isExternalRepo(getRepo("foo", "file://localhost/D:/somepath")));
59          assertFalse(DefaultMirrorSelector.isExternalRepo(getRepo("foo", "http://localhost")));
60          assertFalse(DefaultMirrorSelector.isExternalRepo(getRepo("foo", "http://127.0.0.1")));
61          assertFalse(DefaultMirrorSelector.isExternalRepo(getRepo("foo", "file:///somepath")));
62          assertFalse(DefaultMirrorSelector.isExternalRepo(getRepo("foo", "file://D:/somepath")));
63  
64          // not a proper url so returns false;
65          assertFalse(DefaultMirrorSelector.isExternalRepo(getRepo("foo", "192.168.101.1")));
66          assertFalse(DefaultMirrorSelector.isExternalRepo(getRepo("foo", "")));
67      }
68  
69      @Test
70      void testMirrorLookup() {
71          Mirror mirrorA = newMirror("a", "a", "http://a");
72          Mirror mirrorB = newMirror("b", "b", "http://b");
73  
74          List<Mirror> mirrors = Arrays.asList(mirrorA, mirrorB);
75  
76          assertSame(mirrorA, mirrorSelector.getMirror(getRepo("a", "http://a.a"), mirrors));
77  
78          assertSame(mirrorB, mirrorSelector.getMirror(getRepo("b", "http://a.a"), mirrors));
79  
80          assertNull(mirrorSelector.getMirror(getRepo("c", "http://c.c"), mirrors));
81      }
82  
83      @Test
84      void testMirrorWildcardLookup() {
85          Mirror mirrorA = newMirror("a", "a", "http://a");
86          Mirror mirrorB = newMirror("b", "b", "http://b");
87          Mirror mirrorC = newMirror("c", "*", "http://wildcard");
88  
89          List<Mirror> mirrors = Arrays.asList(mirrorA, mirrorB, mirrorC);
90  
91          assertSame(mirrorA, mirrorSelector.getMirror(getRepo("a", "http://a.a"), mirrors));
92  
93          assertSame(mirrorB, mirrorSelector.getMirror(getRepo("b", "http://a.a"), mirrors));
94  
95          assertSame(mirrorC, mirrorSelector.getMirror(getRepo("c", "http://c.c"), mirrors));
96      }
97  
98      @Test
99      void testMirrorStopOnFirstMatch() {
100         // exact matches win first
101         Mirror mirrorA2 = newMirror("a2", "a,b", "http://a2");
102         Mirror mirrorA = newMirror("a", "a", "http://a");
103         // make sure repeated entries are skipped
104         Mirror mirrorA3 = newMirror("a", "a", "http://a3");
105 
106         Mirror mirrorB = newMirror("b", "b", "http://b");
107         Mirror mirrorC = newMirror("c", "d,e", "http://de");
108         Mirror mirrorC2 = newMirror("c", "*", "http://wildcard");
109         Mirror mirrorC3 = newMirror("c", "e,f", "http://ef");
110 
111         List<Mirror> mirrors = Arrays.asList(mirrorA2, mirrorA, mirrorA3, mirrorB, mirrorC, mirrorC2, mirrorC3);
112 
113         assertSame(mirrorA, mirrorSelector.getMirror(getRepo("a", "http://a.a"), mirrors));
114 
115         assertSame(mirrorB, mirrorSelector.getMirror(getRepo("b", "http://a.a"), mirrors));
116 
117         assertSame(mirrorC2, mirrorSelector.getMirror(getRepo("c", "http://c.c"), mirrors));
118 
119         assertSame(mirrorC, mirrorSelector.getMirror(getRepo("d", "http://d"), mirrors));
120 
121         assertSame(mirrorC, mirrorSelector.getMirror(getRepo("e", "http://e"), mirrors));
122 
123         assertSame(mirrorC2, mirrorSelector.getMirror(getRepo("f", "http://f"), mirrors));
124     }
125 
126     @Test
127     void testPatterns() {
128         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("a"), "*"));
129         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("a"), "*,"));
130         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("a"), ",*,"));
131         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("a"), "*,"));
132 
133         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("a"), "a"));
134         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("a"), "a,"));
135         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("a"), ",a,"));
136         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("a"), "a,"));
137 
138         assertFalse(DefaultMirrorSelector.matchPattern(getRepo("b"), "a"));
139         assertFalse(DefaultMirrorSelector.matchPattern(getRepo("b"), "a,"));
140         assertFalse(DefaultMirrorSelector.matchPattern(getRepo("b"), ",a"));
141         assertFalse(DefaultMirrorSelector.matchPattern(getRepo("b"), ",a,"));
142 
143         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("a"), "a,b"));
144         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("b"), "a,b"));
145 
146         assertFalse(DefaultMirrorSelector.matchPattern(getRepo("c"), "a,b"));
147 
148         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("a"), "*"));
149         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("a"), "*,b"));
150         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("a"), "*,!b"));
151 
152         assertFalse(DefaultMirrorSelector.matchPattern(getRepo("a"), "*,!a"));
153         assertFalse(DefaultMirrorSelector.matchPattern(getRepo("a"), "!a,*"));
154 
155         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("c"), "*,!a"));
156         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("c"), "!a,*"));
157 
158         assertFalse(DefaultMirrorSelector.matchPattern(getRepo("c"), "!a,!c"));
159         assertFalse(DefaultMirrorSelector.matchPattern(getRepo("d"), "!a,!c*"));
160     }
161 
162     @Test
163     void testPatternsWithExternal() {
164         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("a", "http://localhost"), "*"));
165         assertFalse(DefaultMirrorSelector.matchPattern(getRepo("a", "http://localhost"), "external:*"));
166 
167         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("a", "http://localhost"), "external:*,a"));
168         assertFalse(DefaultMirrorSelector.matchPattern(getRepo("a", "http://localhost"), "external:*,!a"));
169         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("a", "http://localhost"), "a,external:*"));
170         assertFalse(DefaultMirrorSelector.matchPattern(getRepo("a", "http://localhost"), "!a,external:*"));
171 
172         assertFalse(DefaultMirrorSelector.matchPattern(getRepo("c", "http://localhost"), "!a,external:*"));
173         assertTrue(DefaultMirrorSelector.matchPattern(getRepo("c", "http://somehost"), "!a,external:*"));
174     }
175 
176     @Test
177     void testLayoutPattern() {
178         assertTrue(DefaultMirrorSelector.matchesLayout("default", null));
179         assertTrue(DefaultMirrorSelector.matchesLayout("default", ""));
180         assertTrue(DefaultMirrorSelector.matchesLayout("default", "*"));
181 
182         assertTrue(DefaultMirrorSelector.matchesLayout("default", "default"));
183         assertFalse(DefaultMirrorSelector.matchesLayout("default", "legacy"));
184 
185         assertTrue(DefaultMirrorSelector.matchesLayout("default", "legacy,default"));
186         assertTrue(DefaultMirrorSelector.matchesLayout("default", "default,legacy"));
187 
188         assertFalse(DefaultMirrorSelector.matchesLayout("default", "legacy,!default"));
189         assertFalse(DefaultMirrorSelector.matchesLayout("default", "!default,legacy"));
190 
191         assertFalse(DefaultMirrorSelector.matchesLayout("default", "*,!default"));
192         assertFalse(DefaultMirrorSelector.matchesLayout("default", "!default,*"));
193     }
194 
195     @Test
196     void testMirrorLayoutConsideredForMatching() {
197         ArtifactRepository repo = getRepo("a");
198 
199         Mirror mirrorA = newMirror("a", "a", null, "http://a");
200         Mirror mirrorB = newMirror("b", "a", "p2", "http://b");
201 
202         Mirror mirrorC = newMirror("c", "*", null, "http://c");
203         Mirror mirrorD = newMirror("d", "*", "p2", "http://d");
204 
205         assertSame(mirrorA, mirrorSelector.getMirror(repo, Arrays.asList(mirrorA)));
206         assertNull(mirrorSelector.getMirror(repo, Arrays.asList(mirrorB)));
207 
208         assertSame(mirrorC, mirrorSelector.getMirror(repo, Arrays.asList(mirrorC)));
209         assertNull(mirrorSelector.getMirror(repo, Arrays.asList(mirrorD)));
210     }
211 
212     /**
213      * Build an ArtifactRepository object.
214      *
215      * @param id
216      * @param url
217      * @return
218      */
219     private ArtifactRepository getRepo(String id, String url) {
220         return repositorySystem.createArtifactRepository(id, url, new DefaultRepositoryLayout(), null, null);
221     }
222 
223     /**
224      * Build an ArtifactRepository object.
225      *
226      * @param id
227      * @return
228      */
229     private ArtifactRepository getRepo(String id) {
230         return getRepo(id, "http://something");
231     }
232 
233     private Mirror newMirror(String id, String mirrorOf, String url) {
234         return newMirror(id, mirrorOf, null, url);
235     }
236 
237     private Mirror newMirror(String id, String mirrorOf, String layouts, String url) {
238         Mirror mirror = new Mirror();
239 
240         mirror.setId(id);
241         mirror.setMirrorOf(mirrorOf);
242         mirror.setMirrorOfLayouts(layouts);
243         mirror.setUrl(url);
244 
245         return mirror;
246     }
247 }