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