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.scm.provider.git.repository;
20  
21  import org.apache.maven.scm.ScmTestCase;
22  import org.apache.maven.scm.manager.NoSuchScmProviderException;
23  import org.apache.maven.scm.manager.ScmManager;
24  import org.apache.maven.scm.repository.ScmRepository;
25  import org.apache.maven.scm.repository.ScmRepositoryException;
26  import org.junit.Before;
27  import org.junit.Ignore;
28  import org.junit.Test;
29  
30  import static org.junit.Assert.assertEquals;
31  import static org.junit.Assert.assertNotNull;
32  import static org.junit.Assert.assertTrue;
33  import static org.junit.Assert.fail;
34  
35  /**
36   * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
37   *
38   */
39  public class GitScmProviderRepositoryTest extends ScmTestCase {
40      private ScmManager scmManager;
41  
42      @Before
43      @Override
44      public void setUp() throws Exception {
45          super.setUp();
46  
47          scmManager = getScmManager();
48      }
49  
50      // ----------------------------------------------------------------------
51      // Testing legal URLs
52      // ----------------------------------------------------------------------
53  
54      @Test
55      public void testLegalFileURL() throws Exception {
56          testUrl("scm:git:file:///tmp/repo", null, "file:///tmp/repo", null, null, null, null, 0, null);
57      }
58  
59      @Test
60      public void testLegalFileHomeURL() throws Exception {
61          testUrl("scm:git:file://~/repo", null, "file://~/repo", null, null, null, null, 0, null);
62      }
63  
64      @Test
65      public void testLegalSshHomeURL() throws Exception {
66          testUrl("scm:git:ssh://~/repo", null, "ssh://~/repo", null, null, null, null, 0, null);
67      }
68  
69      @Test
70      public void testLegalLocalhostFileURL() throws Exception {
71          testUrl(
72                  "scm:git:file://somedirectory/tmp/repo",
73                  null,
74                  "file://somedirectory/tmp/repo",
75                  null,
76                  null,
77                  null,
78                  null,
79                  0,
80                  "somedirectory/tmp/repo");
81      }
82  
83      @Test
84      public void testLegalHistnameFileURL() throws Exception {
85          testUrl(
86                  "scm:git:file://my_server/tmp/repo",
87                  null,
88                  "file://my_server/tmp/repo",
89                  null,
90                  null,
91                  null,
92                  null,
93                  0,
94                  "my_server/tmp/repo");
95      }
96  
97      @Test
98      public void testLegalHttpURL() throws Exception {
99          testUrl(
100                 "scm:git:http://gitrepos.apache.org",
101                 null,
102                 "http://gitrepos.apache.org",
103                 null,
104                 null,
105                 null,
106                 "gitrepos.apache.org",
107                 0,
108                 null);
109     }
110 
111     @Test
112     public void testLegalHttpURLWithUser() throws Exception {
113         testUrl(
114                 "scm:git:http://user@gitrepos.apache.org",
115                 null,
116                 "http://user@gitrepos.apache.org",
117                 null,
118                 "user",
119                 null,
120                 "gitrepos.apache.org",
121                 0,
122                 null);
123     }
124 
125     @Test
126     public void testLegalHttpURLWithUserPassword() throws Exception {
127         testUrl(
128                 "scm:git:http://user:password@gitrepos.apache.org",
129                 null,
130                 "http://user:password@gitrepos.apache.org",
131                 null,
132                 "user",
133                 "password",
134                 "gitrepos.apache.org",
135                 0,
136                 null);
137     }
138 
139     @Test
140     public void testLegalHttpsURL() throws Exception {
141         testUrl(
142                 "scm:git:https://gitrepos.apache.org/repos/projectA",
143                 null,
144                 "https://gitrepos.apache.org/repos/projectA",
145                 null,
146                 null,
147                 null,
148                 "gitrepos.apache.org",
149                 0,
150                 "repos/projectA");
151     }
152 
153     @Test
154     public void testLegalFileWindowsURL() throws Exception {
155         // FIXME This URL is invalid, hell knows why Git accepts it. It should be by us right away
156         testUrl("scm:git:file://c:\\tmp\\repo", null, "file://c:\\tmp\\repo", null, null, null, null, 0, null);
157     }
158 
159     @Test
160     public void testLegalHttpsURLWithUser() throws Exception {
161         testUrl(
162                 "scm:git:https://user@gitrepos.apache.org",
163                 null,
164                 "https://user@gitrepos.apache.org",
165                 null,
166                 "user",
167                 null,
168                 "gitrepos.apache.org",
169                 0,
170                 null);
171     }
172 
173     @Test
174     public void testLegalHttpsURLWithUserPassword() throws Exception {
175         testUrl(
176                 "scm:git:https://user:password@gitrepos.apache.org",
177                 null,
178                 "https://user:password@gitrepos.apache.org",
179                 null,
180                 "user",
181                 "password",
182                 "gitrepos.apache.org",
183                 0,
184                 null);
185     }
186 
187     @Test
188     public void testLegalSshURLWithUser() throws Exception {
189         testUrl(
190                 "scm:git:ssh://user@gitrepos.apache.org",
191                 null,
192                 "ssh://user@gitrepos.apache.org",
193                 null,
194                 "user",
195                 null,
196                 "gitrepos.apache.org",
197                 0,
198                 null);
199     }
200 
201     @Test
202     public void testLegalSshURLWithUserPassword() throws Exception {
203         testUrl(
204                 "scm:git:ssh://user:password@gitrepos.apache.org",
205                 null,
206                 "ssh://user:password@gitrepos.apache.org",
207                 null,
208                 "user",
209                 "password",
210                 "gitrepos.apache.org",
211                 0,
212                 null);
213     }
214 
215     @Test
216     public void testLegalGitURL() throws Exception {
217         testUrl(
218                 "scm:git:git://gitrepos.apache.org",
219                 null,
220                 "git://gitrepos.apache.org",
221                 null,
222                 null,
223                 null,
224                 "gitrepos.apache.org",
225                 0,
226                 null);
227     }
228 
229     @Test
230     public void testGitDevURL() throws Exception, ScmRepositoryException {
231         testUrl(
232                 "scm:git:git@github.com:olamy/scm-git-test-one-module.git",
233                 null,
234                 "git@github.com:olamy/scm-git-test-one-module.git",
235                 null,
236                 "git",
237                 null,
238                 "github.com",
239                 0,
240                 null);
241     }
242 
243     @Test
244     public void testGitDevURLWIthPort() throws Exception, ScmRepositoryException {
245         testUrl(
246                 "scm:git:git@github.com:222:olamy/scm-git-test-one-module.git",
247                 null,
248                 "git@github.com:222:olamy/scm-git-test-one-module.git",
249                 null,
250                 "git",
251                 null,
252                 "github.com",
253                 222,
254                 null);
255     }
256 
257     // For SCM-639
258     @Test
259     public void testGitDevUrlWithNumberedRepoAndNoPort() throws Exception, ScmRepositoryException {
260         testUrl(
261                 "scm:git:git@github.com:4sh/blah.git",
262                 null,
263                 "git@github.com:4sh/blah.git",
264                 null,
265                 "git",
266                 null,
267                 "github.com",
268                 0,
269                 null);
270     }
271 
272     // For SCM-629
273     @Test
274     public void testGitDevUrlWithNumberedRepoAndMinus() throws Exception, ScmRepositoryException {
275         testUrl(
276                 "scm:git:ssh://git@github.com/360-Innovations/FJPAQuery.git",
277                 null,
278                 "ssh://git@github.com/360-Innovations/FJPAQuery.git",
279                 null,
280                 "git",
281                 null,
282                 "github.com",
283                 0,
284                 null);
285     }
286 
287     // For SCM-707
288     @Test
289     public void testSpecialCharacters() throws Exception {
290         testUrl(
291                 "scm:git:http://gitrepos.apache.org",
292                 "@_&_:_?_#_%20",
293                 "pass word",
294                 null,
295                 "http://gitrepos.apache.org",
296                 null,
297                 "http://%40_&_:_%3F_%23_%2520:pass%20word@gitrepos.apache.org",
298                 null,
299                 "gitrepos.apache.org",
300                 0,
301                 null);
302 
303         testUrl(
304                 "scm:git:http://gitrepos.apache.org",
305                 "user name",
306                 "@_&_:_?_#_%20",
307                 null,
308                 "http://gitrepos.apache.org",
309                 null,
310                 "http://user%20name:%40_&_:_%3F_%23_%2520@gitrepos.apache.org",
311                 null,
312                 "gitrepos.apache.org",
313                 0,
314                 null);
315     }
316 
317     @Test
318     public void testLegalGitPortUrl() throws Exception {
319         testUrl(
320                 "scm:git:http://username@gitrepos.apache.org:8800/pmgt/trunk",
321                 null,
322                 "http://username@gitrepos.apache.org:8800/pmgt/trunk",
323                 null,
324                 "username",
325                 null,
326                 "gitrepos.apache.org",
327                 8800,
328                 null);
329 
330         testUrl(
331                 "scm:git:https://username@gitrepos.apache.org:20443/pmgt/trunk",
332                 null,
333                 "https://username@gitrepos.apache.org:20443/pmgt/trunk",
334                 null,
335                 "username",
336                 null,
337                 "gitrepos.apache.org",
338                 20443,
339                 null);
340 
341         testUrl(
342                 "scm:git:git://username@gitrepos.apache.org:8800/pmgt/trunk",
343                 null,
344                 "git://username@gitrepos.apache.org:8800/pmgt/trunk",
345                 null,
346                 "username",
347                 null,
348                 "gitrepos.apache.org",
349                 8800,
350                 null);
351 
352         testUrl(
353                 "scm:git:ssh://username@gitrepos.apache.org:8080/pmgt/trunk",
354                 null,
355                 "ssh://username@gitrepos.apache.org:8080/pmgt/trunk",
356                 null,
357                 "username",
358                 null,
359                 "gitrepos.apache.org",
360                 8080,
361                 null);
362 
363         testUrl(
364                 "scm:git:ssh://username:password@gitrepos.apache.org/pmgt/trunk",
365                 null,
366                 "ssh://username:password@gitrepos.apache.org/pmgt/trunk",
367                 null,
368                 "username",
369                 "password",
370                 "gitrepos.apache.org",
371                 0,
372                 null);
373     }
374 
375     @Test
376     public void testUsernameWithAtAndPasswordInUrl() throws ScmRepositoryException, Exception {
377         testUrl(
378                 "scm:git:http://username@site.com:password@gitrepos.apache.org:8800/pmgt/trunk",
379                 null,
380                 "http://username%40site.com:password@gitrepos.apache.org:8800/pmgt/trunk",
381                 null,
382                 "username@site.com",
383                 "password",
384                 "gitrepos.apache.org",
385                 8800,
386                 null);
387     }
388 
389     // ----------------------------------------------------------------------
390     // the following tests are for combined fetch + push URLs
391     // ----------------------------------------------------------------------
392 
393     @Test
394     public void testHttpFetchSshPushUrl() throws Exception {
395         testUrl(
396                 "scm:git:[fetch=]http://git.apache.org/myprj.git[push=]ssh://myuser:mypassword@git.apache.org/~/myrepo/myprj.git",
397                 "[fetch=]http://myuser:mypassword@git.apache.org/myprj.git[push=]ssh://myuser:mypassword@git.apache.org/~/myrepo/myprj.git",
398                 "http://myuser:mypassword@git.apache.org/myprj.git",
399                 "ssh://myuser:mypassword@git.apache.org/~/myrepo/myprj.git",
400                 "myuser",
401                 "mypassword",
402                 "git.apache.org",
403                 0,
404                 null);
405 
406         testUrl(
407                 "scm:git:[push=]ssh://myuser:mypassword@git.apache.org/~/myrepo/myprj.git[fetch=]http://git.apache.org/myprj.git",
408                 "[fetch=]http://myuser:mypassword@git.apache.org/myprj.git[push=]ssh://myuser:mypassword@git.apache.org/~/myrepo/myprj.git",
409                 "http://myuser:mypassword@git.apache.org/myprj.git",
410                 "ssh://myuser:mypassword@git.apache.org/~/myrepo/myprj.git",
411                 "myuser",
412                 "mypassword",
413                 "git.apache.org",
414                 0,
415                 null);
416     }
417 
418     // ----------------------------------------------------------------------
419     // Testing illegal URLs
420     // ----------------------------------------------------------------------
421 
422     // X in fact this url is perfectly valid from a technical perspective
423     // X it will be interpreted by git as git://file/tmp/git
424     @Test
425     @Ignore
426     public void nottestIllegalFileUrl() throws Exception {
427         testIllegalUrl("file:/tmp/git");
428     }
429 
430     // ----------------------------------------------------------------------
431     //
432     // ----------------------------------------------------------------------
433 
434     private GitScmProviderRepository testUrl(
435             String scmUrl,
436             String expectedToString,
437             String expectedFetchUrl,
438             String expectedPushUrl,
439             String expectedUser,
440             String expectedPassword,
441             String expectedHost,
442             int expectedPort,
443             String expectedPath)
444             throws Exception, ScmRepositoryException {
445 
446         ScmRepository repository = testScmRepository(scmUrl, expectedToString, expectedFetchUrl);
447 
448         GitScmProviderRepository providerRepository = (GitScmProviderRepository) repository.getProviderRepository();
449 
450         return testScmProviderRepository(
451                 expectedToString,
452                 expectedFetchUrl,
453                 expectedPushUrl,
454                 expectedUser,
455                 expectedPassword,
456                 expectedHost,
457                 expectedPort,
458                 providerRepository);
459     }
460 
461     private GitScmProviderRepository testUrl(
462             String scmUrl,
463             String username,
464             String password,
465             String expectedScmRepositoryToString,
466             String expectedScmRepositoryFetchUrl,
467             String expectedScmProviderRepositoryToString,
468             String expectedScmProviderRepositoryFetchUrl,
469             String expectedPushUrl,
470             String expectedHost,
471             int expectedPort,
472             String expectedPath)
473             throws Exception, ScmRepositoryException {
474 
475         ScmRepository repository =
476                 testScmRepository(scmUrl, expectedScmRepositoryToString, expectedScmRepositoryFetchUrl);
477 
478         GitScmProviderRepository providerRepository = (GitScmProviderRepository) repository.getProviderRepository();
479 
480         providerRepository.setUser(username);
481 
482         providerRepository.setPassword(password);
483 
484         return testScmProviderRepository(
485                 expectedScmProviderRepositoryToString,
486                 expectedScmProviderRepositoryFetchUrl,
487                 expectedPushUrl,
488                 username,
489                 password,
490                 expectedHost,
491                 expectedPort,
492                 providerRepository);
493     }
494 
495     private GitScmProviderRepository testScmProviderRepository(
496             String expectedToString,
497             String expectedFetchUrl,
498             String expectedPushUrl,
499             String expectedUser,
500             String expectedPassword,
501             String expectedHost,
502             int expectedPort,
503             GitScmProviderRepository providerRepository) {
504         assertEquals("fetch url is incorrect", expectedFetchUrl, providerRepository.getFetchUrl());
505 
506         if (expectedPushUrl != null) {
507             assertEquals("push url is incorrect", expectedPushUrl, providerRepository.getPushUrl());
508         }
509 
510         assertEquals("User is incorrect", expectedUser, providerRepository.getUser());
511 
512         assertEquals("Password is incorrect", expectedPassword, providerRepository.getPassword());
513 
514         assertEquals("Host is incorrect", expectedHost == null ? "" : expectedHost, providerRepository.getHost());
515 
516         if (expectedPort > 0) {
517             assertEquals("Port is incorrect", expectedPort, providerRepository.getPort());
518         }
519 
520         return providerRepository;
521     }
522 
523     private ScmRepository testScmRepository(String scmUrl, String expectedToString, String expectedFetchUrl)
524             throws ScmRepositoryException, NoSuchScmProviderException {
525         ScmRepository repository = scmManager.makeScmRepository(scmUrl);
526 
527         assertNotNull("ScmManager.makeScmRepository() returned null", repository);
528 
529         assertNotNull("The provider repository was null.", repository.getProviderRepository());
530 
531         assertTrue(
532                 "The SCM Repository isn't a " + GitScmProviderRepository.class.getName() + ".",
533                 repository.getProviderRepository() instanceof GitScmProviderRepository);
534 
535         if (expectedToString != null) {
536             assertEquals("toString is incorrect", "git:" + expectedToString, repository.toString());
537         } else {
538             assertEquals("toString is incorrect", "git:" + expectedFetchUrl, repository.toString());
539         }
540 
541         return repository;
542     }
543 
544     private void testIllegalUrl(String url) throws Exception {
545         try {
546             scmManager.makeScmRepository("scm:git:" + url);
547 
548             fail("Expected a ScmRepositoryException while testing the url '" + url + "'.");
549         } catch (ScmRepositoryException e) {
550             // expected
551         }
552     }
553 
554     @Test
555     public void testGetParent() throws Exception {
556         new GitScmProviderRepository("http://gitrepos.apache.org");
557     }
558 }