package de.saumya.mojo.mavengem; import org.junit.Before; import org.junit.Test; import java.io.File; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.Map; import java.util.HashMap; import java.net.URL; import java.net.URLConnection; import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.endsWith; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.startsWith; public class MavenGemURLConnectionTest { private File cacheDir; private RubygemsFactory factory; @Before public void setup() throws Exception { cacheDir = new File(System.getProperty("basedir"), "target/cache4test"); factory = new RubygemsFactory(cacheDir); } @Test public void virtusPomWithAuthentication() throws Exception { // this test goes online to rubygems.org File cached = new File(cacheDir, "http___rubygems_org/quick/Marshal.4.8/v/virtus-1.0.5.gemspec.rz"); // with the /maven/releases prefix URLConnection url = new MavenGemURLConnection(factory, new URL("http://me:andthecorner@rubygems.org"), "/maven/releases/rubygems/virtus/1.0.5/virtus-1.0.5.pom"); // the cached dir does not expose the credentials assertCached(url, cached); // without the /maven/releases prefix url = new MavenGemURLConnection(factory, new URL("http://me:andthecorner@rubygems.org"), "/rubygems/virtus/1.0.5/virtus-1.0.5.pom"); // the cached dir does not expose the credentials assertCached(url, cached); } @Test public void virtusPomWithMirror() throws Exception { // this test goes online to rubygems.org File cached = new File(cacheDir, "http___rubygems_org/quick/Marshal.4.8/v/virtus-1.0.5.gemspec.rz"); RubygemsFactory factory = new RubygemsFactory(cacheDir, new URL("http://me:andthecorner@rubygems.org")); // with the /maven/releases prefix URLConnection url = new MavenGemURLConnection(factory, new URL("http://example.com"), "/maven/releases/rubygems/virtus/1.0.5/virtus-1.0.5.pom"); // the cached dir does not expose the credentials assertCached(url, cached); // without the /maven/releases prefix url = new MavenGemURLConnection(factory, new URL("http://example.com"), "/rubygems/virtus/1.0.5/virtus-1.0.5.pom"); // the cached dir does not expose the credentials assertCached(url, cached); } @Test public void virtusPomWithMirrors() throws Exception { // this test goes online to rubygems.org File cached = new File(cacheDir, "http___rubygems_org/quick/Marshal.4.8/v/virtus-1.0.5.gemspec.rz"); Map<URL,URL> mirrors = new HashMap<URL,URL>(); mirrors.put(new URL("http://example.com"), new URL("http://me:andthecorner@rubygems.org")); mirrors.put(new URL("http://hans:glueck@example.org"), new URL("http://rubygems.org")); RubygemsFactory factory = new RubygemsFactory(cacheDir, mirrors); // with the /maven/releases prefix URLConnection url = new MavenGemURLConnection(factory, new URL("http://example.com"), "/maven/releases/rubygems/virtus/1.0.5/virtus-1.0.5.pom"); // the cached dir does not expose the credentials assertCached(url, cached); // without the /maven/releases prefix url = new MavenGemURLConnection(factory, new URL("http://example.org"), "/rubygems/virtus/1.0.5/virtus-1.0.5.pom"); assertCached(url, cached); // go direct here cached = new File(cacheDir, "https___rubygems_org/quick/Marshal.4.8/v/virtus-1.0.5.gemspec.rz"); url = new MavenGemURLConnection(factory, new URL("https://rubygems.org"), "/rubygems/virtus/1.0.5/virtus-1.0.5.pom"); assertCached(url, cached); } private void assertCached(URLConnection url, File cached) throws Exception { cached.delete(); try (InputStream in = url.getInputStream()) { // just read the file byte[] data = new byte[in.available()]; in.read(data, 0, in.available()); } // the cached dir does not expose the credentials assertThat(cached.getPath(), cached.exists(), is(true)); } @Test public void ping() throws Exception { URLConnection url = new MavenGemURLConnection(new URL("https://rubygems.org/something"), "/maven/releases/ping"); byte[] data = new byte[4]; url.getInputStream().read(data, 0, 4); String result = new String(data); assertThat(result, is("pong")); } @Test public void railsMavenMetadata() throws Exception { // this test goes online to rubygems.org File cached = new File(cacheDir, "https___rubygems_org/api/v1/dependencies/rails.ruby"); cached.delete(); URLConnection url = new MavenGemURLConnection(factory, new URL("https://rubygems.org"), "/maven/releases/rubygems/rails/maven-metadata.xml"); String result = download(url); assertThat(result, startsWith("<metadata>")); assertThat(result, containsString("<version>4.2.5</version>")); assertThat(result, endsWith("</metadata>\n")); assertThat(cached.getPath(), cached.isFile(), is(true)); } String download(URLConnection url) throws Exception { try (InputStream in = url.getInputStream()) { byte[] data = new byte[in.available()]; in.read(data, 0, in.available()); return new String(data); } } @Test public void railsPom() throws Exception { // this test goes online to rubygems.org File cached = new File(cacheDir, "https___rubygems_org/quick/Marshal.4.8/r/rails-4.2.5.gemspec.rz"); cached.delete(); URLConnection url = new MavenGemURLConnection(factory, new URL("https://rubygems.org"), "/rubygems/rails/4.2.5/rails-4.2.5.pom"); String result = download(url); assertThat(result, startsWith("<project>")); assertThat(result, containsString("<version>4.2.5</version>")); assertThat(result, containsString("<name>Full-stack web application framework.</name>")); assertThat(result, containsString("<packaging>gem</packaging>")); assertThat(result, endsWith("</project>\n")); assertThat(cached.getPath(), cached.isFile(), is(true)); } @Test(expected = FileNotFoundException.class) public void fileNotFoundOnWrongBaseURL() throws Exception { // this test goes online to rubygems.org URLConnection url = new MavenGemURLConnection(factory, new URL("https://rubygems.org/something/not/right/here"), "/maven/releases/rubygems/rails/maven-metadata.xml"); url.getInputStream(); } @Test(expected = FileNotFoundException.class) public void fileNotFoundOnDirectory() throws Exception { // this test goes online to rubygems.org URLConnection url = new MavenGemURLConnection(factory, new URL("https://rubygems.org"), "/maven/releases/rubygems/rails"); url.getInputStream(); } }