public String prefixPartialUrl(String url) { if(url.startsWith("/")) { return format("%s%s", baseRemoteURL(), url); } return url; } }
public void fetch(DownloadAction downloadAction, URLService urlService) throws Exception { downloadChecksumFile(downloadAction, urlService.baseRemoteURL()); downloadArtifact(downloadAction, urlService.baseRemoteURL()); }
@Test public void shouldMakeTheFetchHandlerUseTheArtifactMd5Checksum() throws Exception { ArtifactMd5Checksums artifactMd5Checksums = mock(ArtifactMd5Checksums.class); when(urlService.baseRemoteURL()).thenReturn("http://10.10.1.1/go/files"); when(checksumFileHandler.url("http://10.10.1.1/go/files", "cruise/10/dev/1/windows")).thenReturn("http://10.10.1.1/go/files/cruise/10/dev/1/windows/cruise-output/md5.checksum"); when(checksumFileHandler.getArtifactMd5Checksums()).thenReturn(artifactMd5Checksums); FetchHandler fetchHandler = mock(FetchHandler.class); FetchArtifactBuilder builder = getBuilder(new JobIdentifier("cruise", 10, "1", "dev", "1", "windows", 1L), "log", dest.getPath(), fetchHandler, checksumFileHandler); builder.fetch(downloadAction, urlService); verify(fetchHandler).useArtifactMd5Checksums(artifactMd5Checksums); }
@Test public void shouldValidateChecksumOnArtifact() throws Exception { when(urlService.baseRemoteURL()).thenReturn("http://10.10.1.1/go/files"); when(checksumFileHandler.url("http://10.10.1.1/go/files", "cruise/10/dev/1/windows")).thenReturn("http://10.10.1.1/go/files/cruise/10/dev/1/windows/cruise-output/md5.checksum"); FetchArtifactBuilder builder = getBuilder(new JobIdentifier("cruise", 10, "1", "dev", "1", "windows", 1L), "log", dest.getPath(), mock(FetchHandler.class), checksumFileHandler); builder.fetch(downloadAction, urlService); verify(downloadAction).perform("http://10.10.1.1/go/files/cruise/10/dev/1/windows/cruise-output/md5.checksum", checksumFileHandler); }
@Test public void shouldDownloadWithURLContainsSHA1WhenFileExists() throws Exception { File artifactOnAgent = new File(sandbox, "pipelines/cruise/foo/a.jar"); new File(sandbox, "pipelines/cruise/foo").mkdirs(); FileUtils.writeStringToFile(artifactOnAgent, "foobar", UTF_8); String sha1 = java.net.URLEncoder.encode(FileUtil.sha1Digest(artifactOnAgent), "UTF-8"); httpService.setupDownload(format("%s/remoting/files/cruise/1/dev/1/windows/a.jar", new URLService().baseRemoteURL()), "content for url without sha1"); httpService.setupDownload(format("%s/remoting/files/cruise/1/dev/1/windows/a.jar?sha1=%s", new URLService().baseRemoteURL(), sha1), "content for url with sha1"); FetchArtifactBuilder builder = getBuilder(new JobIdentifier("cruise", -1, "1", "dev", "1", "windows", 1L), "a.jar", "foo", new FileHandler(new File("pipelines/cruise/foo/a.jar"), "a.jar")); runBuilder(builder, JobResult.Passed); assertThat(artifactOnAgent.isFile(), is(true)); assertThat(FileUtils.readFileToString(artifactOnAgent, UTF_8), is("content for url with sha1")); }
@Test public void shouldBuildWhenChecksumValidForArtifact() throws Exception { httpService.setupDownload(format("%s/remoting/files/cruise/1/dev/1/windows/cruise-output/md5.checksum", new URLService().baseRemoteURL()), "a.jar=9893532233caff98cd083a116b013c0b"); httpService.setupDownload(format("%s/remoting/files/cruise/1/dev/1/windows/a.jar", new URLService().baseRemoteURL()), "some content"); FetchArtifactBuilder builder = getBuilder(new JobIdentifier("cruise", -1, "1", "dev", "1", "windows", 1L), "a.jar", "foo", new FileHandler(new File("pipelines/cruise/foo/a.jar"), "a.jar")); runBuilder(builder, JobResult.Passed); assertThat(console.output(), containsString(format("Saved artifact to [%s] after verifying the integrity of its contents", new File(sandbox, "pipelines/cruise/foo/a.jar").getPath()))); }
@Test public void shouldFailBuildWhenChecksumNotValidForArtifact() throws Exception { httpService.setupDownload(format("%s/remoting/files/cruise/1/dev/1/windows/cruise-output/md5.checksum", new URLService().baseRemoteURL()), "a.jar=invalid-checksum"); httpService.setupDownload(format("%s/remoting/files/cruise/1/dev/1/windows/a.jar", new URLService().baseRemoteURL()), "some content"); FetchArtifactBuilder builder = getBuilder(new JobIdentifier("cruise", -1, "1", "dev", "1", "windows", 1L), "a.jar", "foo", new FileHandler(new File("pipelines/cruise/foo/a.jar"), "a.jar")); runBuilder(builder, JobResult.Failed); assertThat(console.output(), containsString("[ERROR] Verification of the integrity of the artifact [a.jar] failed")); assertThat(new File(sandbox, "pipelines/cruise/foo/a.jar").isFile(), is(true)); }
@Test public void shouldReturnURLWithSHA1WhenFileExists() throws Exception { String src = "cruise-output/console.log"; File destOnAgent = new File("pipelines" + '/' + "cruise" + '/' + dest); File consolelog = new File(destOnAgent, "console.log"); consolelog.getParentFile().mkdirs(); consolelog.createNewFile(); toClean.add(destOnAgent); FetchArtifactBuilder builder = getBuilder(new JobIdentifier("foo", -1, "label-1", "dev", "1", "linux", 1L), src, "lib/a.jar", new FileHandler(consolelog, getSrc()), checksumFileHandler); when(urlService.baseRemoteURL()).thenReturn("http://foo.bar:8153/go"); when(checksumFileHandler.url("http://foo.bar:8153/go", "foo/label-1/dev/1/linux")).thenReturn("http://foo.bar:8153/go/files/foo/label-1/dev/1/linux/cruise-output/md5.checksum"); java.util.Properties properties = new java.util.Properties(); when(checksumFileHandler.getArtifactMd5Checksums()).thenReturn(new ArtifactMd5Checksums(properties)); builder.fetch(downloadAction, urlService); verify(downloadAction).perform(eq("http://foo.bar:8153/go/files/foo/label-1/dev/1/linux/cruise-output/md5.checksum"), any(FetchHandler.class)); verify(downloadAction).perform(eq("http://foo.bar:8153/go/remoting/files/foo/label-1/dev/1/linux/cruise-output/console.log?sha1=2jmj7l5rSw0yVb%2FvlWAYkK%2FYBwk%3D"), any(FileHandler.class)); verifyNoMoreInteractions(downloadAction); }
@Test public void shouldReturnURLEndsWithDotZipWhenRequestingFolder() throws Exception { String src = "cruise-output"; File destOnAgent = new File("pipelines/cruise/", dest.getPath()); FetchArtifactBuilder builder = getBuilder(new JobIdentifier("foo", -1, "label-1", "dev", "1", "linux", 1L), src, "lib/a.jar", new DirHandler(src, destOnAgent), checksumFileHandler); when(urlService.baseRemoteURL()).thenReturn("http://foo.bar:8153/go"); when(checksumFileHandler.url("http://foo.bar:8153/go", "foo/label-1/dev/1/linux")).thenReturn("http://foo.bar:8153/go/files/foo/label-1/dev/1/linux/cruise-output/md5.checksum"); java.util.Properties properties = new java.util.Properties(); when(checksumFileHandler.getArtifactMd5Checksums()).thenReturn(new ArtifactMd5Checksums(properties)); builder.fetch(downloadAction, urlService); verify(downloadAction).perform(eq("http://foo.bar:8153/go/files/foo/label-1/dev/1/linux/cruise-output/md5.checksum"), isA(FetchHandler.class)); verify(downloadAction).perform(eq("http://foo.bar:8153/go/remoting/files/foo/label-1/dev/1/linux/cruise-output.zip"), isA(DirHandler.class)); verifyNoMoreInteractions(downloadAction); }
@Test public void shouldGiveWarningWhenMd5FileNotExists() throws Exception { httpService.setupDownload(format("%s/remoting/files/cruise/1/dev/1/windows/a.jar", new URLService().baseRemoteURL()), "some content"); FetchArtifactBuilder builder = getBuilder(new JobIdentifier("cruise", -1, "1", "dev", "1", "windows", 1L), "a.jar", "foo", new FileHandler(new File("pipelines/cruise/foo/a.jar"), "a.jar")); runBuilder(builder, JobResult.Passed); assertThat(new File(sandbox, "pipelines/cruise/foo/a.jar").isFile(), is(true)); assertThat(console.output(), containsString("[WARN] The md5checksum property file was not found")); }
@Test public void shouldReturnURLWithoutSHA1WhenFileDoesNotExist() throws Exception { String src = "cruise-output/console.log"; File destOnAgent = new File("pipelines" + '/' + "cruise" + '/' + dest); File consolelog = new File(destOnAgent, "console.log"); consolelog.delete(); FetchArtifactBuilder builder = getBuilder(new JobIdentifier("foo", -1, "label-1", "dev", "1", "linux", 1L), src, "lib/a.jar", new FileHandler(consolelog, getSrc()), checksumFileHandler); when(urlService.baseRemoteURL()).thenReturn("http://foo.bar:8153/go"); when(checksumFileHandler.url("http://foo.bar:8153/go", "foo/label-1/dev/1/linux")).thenReturn("http://foo.bar:8153/go/files/foo/label-1/dev/1/linux/cruise-output/md5.checksum"); java.util.Properties properties = new java.util.Properties(); when(checksumFileHandler.getArtifactMd5Checksums()).thenReturn(new ArtifactMd5Checksums(properties)); builder.fetch(downloadAction, urlService); verify(downloadAction).perform(eq("http://foo.bar:8153/go/files/foo/label-1/dev/1/linux/cruise-output/md5.checksum"), isA(FetchHandler.class)); verify(downloadAction).perform(eq("http://foo.bar:8153/go/remoting/files/foo/label-1/dev/1/linux/cruise-output/console.log"), isA(FileHandler.class)); verifyNoMoreInteractions(downloadAction); }
@Test public void shouldUnzipWhenFetchingFolder() throws Exception { httpService.setupDownload(format("%s/remoting/files/cruise/1/dev/1/windows/log.zip", new URLService().baseRemoteURL()), zip); FetchArtifactBuilder builder = getBuilder(new JobIdentifier("cruise", -10, "1", "dev", "1", "windows", 1L), "log", "dest", new DirHandler("log", new File("pipelines/cruise/dest"))); runBuilder(builder, JobResult.Passed); assertDownloaded(new File(sandbox, "pipelines/cruise/dest")); }