package aQute.maven.provider; import java.io.File; import java.util.Arrays; import aQute.bnd.http.HttpClient; import aQute.bnd.service.url.State; import aQute.http.testservers.HttpTestServer.Config; import aQute.lib.hex.Hex; import aQute.lib.io.IO; import aQute.libg.cryptography.MD5; import aQute.libg.cryptography.SHA1; import aQute.libg.reporter.ReporterAdapter; import junit.framework.TestCase; public class RemoteRepoTest extends TestCase { String tmpName; File local; File remote; FakeNexus fnx; MavenRemoteRepository repo; ReporterAdapter reporter = new ReporterAdapter(System.err); @Override protected void setUp() throws Exception { super.setUp(); tmpName = "generated/tmp/test/" + getName(); local = IO.getFile(tmpName + "/local"); remote = IO.getFile(tmpName + "/remote"); Config config = new Config(); fnx = new FakeNexus(config, remote); fnx.start(); IO.delete(remote); IO.delete(local); remote.mkdirs(); local.mkdirs(); reporter.setTrace(true); repo = new MavenRemoteRepository(local, new HttpClient(), fnx.getBaseURI() + "/repo/", reporter); } @Override protected void tearDown() throws Exception { fnx.close(); super.tearDown(); } public void testBasic() throws Exception { File localFoobar = IO.getFile(this.local, "some.jar"); File localFoobarSha1 = IO.getFile(this.local, "some.jar.sha1"); File localFoobarMD5 = IO.getFile(this.local, "some.jar.md5"); File remoteFoobar = IO.getFile(this.remote, "foo/bar"); File remoteFoobarSha1 = IO.getFile(this.remote, "foo/bar.sha1"); File remoteFoobarMD5 = IO.getFile(this.remote, "foo/bar.md5"); remoteFoobar.getParentFile().mkdirs(); // Test does not exist assertFalse(remoteFoobar.exists()); assertEquals(State.NOT_FOUND, repo.fetch("foo/bar", localFoobar).getState()); assertFalse(localFoobar.exists()); // // Create remote // IO.store("bla", remoteFoobar); assertTrue(remoteFoobar.isFile()); assertEquals(3L, remoteFoobar.length()); // // Fetch it, must exist now // assertEquals(State.UPDATED, repo.fetch("foo/bar", localFoobar).getState()); assertTrue(localFoobar.isFile()); assertEquals(3L, localFoobar.length()); // // Overwrite it // assertFalse(remoteFoobarSha1.isFile()); assertFalse(remoteFoobarMD5.isFile()); IO.store("overwrite", localFoobar); repo.store(localFoobar, "foo/bar"); assertEquals(9L, remoteFoobar.length()); assertTrue(remoteFoobarSha1.isFile()); assertTrue(remoteFoobarMD5.isFile()); byte[] sha1Expected = SHA1.digest("overwrite".getBytes()).digest(); byte[] sha1Actual = Hex.toByteArray(IO.collect(remoteFoobarSha1)); assertTrue(Arrays.equals(sha1Expected, sha1Actual)); byte[] md5Expected = MD5.digest("overwrite".getBytes()).digest(); byte[] md5Actual = Hex.toByteArray(IO.collect(remoteFoobarMD5)); assertTrue(Arrays.equals(md5Expected, md5Actual)); // // Fetch the new one with checksums // IO.delete(localFoobar.getParentFile()); assertEquals(State.UPDATED, repo.fetch("foo/bar", localFoobar).getState()); String sha1 = SHA1.digest(localFoobar).asHex(); assertEquals(sha1, IO.collect(remoteFoobarSha1)); // // Delete the remote entry // IO.delete(localFoobar); assertTrue(repo.delete("foo/bar")); assertFalse(remoteFoobar.exists()); assertEquals(State.NOT_FOUND, repo.fetch("foo/bar", localFoobar).getState()); assertFalse(localFoobar.exists()); Thread.sleep(1000); assertFalse(remoteFoobarSha1.exists()); assertFalse(remoteFoobarMD5.exists()); } public void testChecksumError() throws Exception { File localFoobar = IO.getFile(this.local, "some.jar"); File remoteFoobar = IO.getFile(this.remote, "foo/bar"); File remoteFoobarSha1 = IO.getFile(this.remote, "foo/bar.sha1"); File remoteFoobarMD5 = IO.getFile(this.remote, "foo/bar.md5"); remoteFoobar.getParentFile().mkdirs(); IO.store("bla", remoteFoobar); IO.store("123456", remoteFoobarSha1); try { repo.fetch("foo/bar", localFoobar); fail("Expected an exception because checksum is wrong"); } catch (Exception e) { // ok } } public void testLowercaseChecksum() throws Exception { File localFoobar = IO.getFile(this.local, "some.jar"); File remoteFoobar = IO.getFile(this.remote, "foo/bar"); File remoteFoobarSha1 = IO.getFile(this.remote, "foo/bar.sha1"); File remoteFoobarMD5 = IO.getFile(this.remote, "foo/bar.md5"); remoteFoobar.getParentFile().mkdirs(); IO.store("bla", remoteFoobar); IO.store(" FFA6706FF2127A749973072756F83C532E43ED02\r\n".toLowerCase(), remoteFoobarSha1); assertEquals(State.UPDATED, repo.fetch("foo/bar", localFoobar).getState()); } public void testNoChecksum() throws Exception { File localFoobar = IO.getFile(this.local, "some.jar"); File remoteFoobar = IO.getFile(this.remote, "foo/bar"); File remoteFoobarSha1 = IO.getFile(this.remote, "foo/bar.sha1"); File remoteFoobarMD5 = IO.getFile(this.remote, "foo/bar.md5"); remoteFoobar.getParentFile().mkdirs(); assertFalse(remoteFoobarSha1.exists()); assertFalse(remoteFoobarMD5.exists()); IO.store("bla", remoteFoobar); assertEquals(State.UPDATED, repo.fetch("foo/bar", localFoobar).getState()); } public void testOnlyWrongMD5Checksum() throws Exception { File localFoobar = IO.getFile(this.local, "some.jar"); File remoteFoobar = IO.getFile(this.remote, "foo/bar"); File remoteFoobarMD5 = IO.getFile(this.remote, "foo/bar.md5"); remoteFoobar.getParentFile().mkdirs(); IO.store("1234", remoteFoobarMD5); assertTrue(remoteFoobarMD5.exists()); IO.store("bla", remoteFoobar); try { assertEquals(State.UPDATED, repo.fetch("foo/bar", localFoobar).getState()); fail("Expected exception with a false MD5 checksum"); } catch (Exception e) { System.out.println(e); // } } public void testOnlyMD5Checksum() throws Exception { File localFoobar = IO.getFile(this.local, "some.jar"); File remoteFoobar = IO.getFile(this.remote, "foo/bar"); File remoteFoobarSha1 = IO.getFile(this.remote, "foo/bar.sha1"); File remoteFoobarMD5 = IO.getFile(this.remote, "foo/bar.md5"); remoteFoobar.getParentFile().mkdirs(); assertFalse(remoteFoobarSha1.exists()); IO.store("128ECF542A35AC5270A87DC740918404", remoteFoobarMD5); assertTrue(remoteFoobarMD5.exists()); IO.store("bla", remoteFoobar); assertEquals(State.UPDATED, repo.fetch("foo/bar", localFoobar).getState()); } }