package aQute.bnd.deployer.repository;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.List;
import aQute.bnd.deployer.http.DefaultURLConnector;
import aQute.lib.io.IO;
import junit.framework.TestCase;
import test.lib.NanoHTTPD;
public class CachingUriResourceHandlerTest extends TestCase {
private static final String EXPECTED_SHA = "d0002141a722ef03ecd8fd2e0d3e4d3bc680ba91483cb4962f68a41a12dd01ab"
.toUpperCase();
static File currentDir = new File(System.getProperty("user.dir"));
public static void testLoadFromCache() throws Exception {
CachingUriResourceHandle handle = new CachingUriResourceHandle(
new URI("http://localhost:18083/bundles/dummybundle.jar"), IO.getFile("testdata/httpcache/1"),
new DefaultURLConnector(), (String) null);
File result = handle.request();
assertEquals(IO.getFile("testdata/httpcache/1/http%3A%2F%2Flocalhost%3A18083%2Fbundles/dummybundle.jar")
.getAbsolutePath(), result.getAbsolutePath());
}
public static void testFailedLoadFromRemote() throws Exception {
String testDirName = "testdata/httpcache/2";
File cacheDir = new File(testDirName);
URI baseUri = new URI("http://localhost:18083/bundles");
URI uri = new URI(baseUri + "/dummybundle.jar");
CachingUriResourceHandle handle = new CachingUriResourceHandle(uri, cacheDir, new DefaultURLConnector(),
(String) null);
try {
handle.request();
fail("Should throw IOException");
} catch (IOException e) {
// expected
/* cleanup */
List<String> cacheFiles = Arrays.asList(cacheDir.list());
String uriCacheDir = URLEncoder.encode(baseUri.toURL().toExternalForm(), "UTF-8");
assert (cacheFiles.size() == 1 || cacheFiles.size() == 2);
assert (cacheFiles.contains(uriCacheDir));
if (cacheFiles.size() == 2) {
assert (cacheFiles.contains(".gitignore"));
}
IO.getFile(testDirName + "/" + uriCacheDir).delete();
}
}
public static void testLoadFromRemote() throws Exception {
String testDirName = "testdata/httpcache/3";
File cacheDir = new File(testDirName);
URI baseUri = new URI("http://localhost:18083/bundles");
URI uri = new URI(baseUri + "/dummybundle.jar");
CachingUriResourceHandle handle = new CachingUriResourceHandle(uri, cacheDir, new DefaultURLConnector(),
(String) null);
NanoHTTPD httpd = new NanoHTTPD(18083, IO.getFile("testdata/http"));
try {
File result = handle.request();
assertEquals(IO.getFile("testdata/httpcache/3/http%3A%2F%2Flocalhost%3A18083%2Fbundles/dummybundle.jar")
.getAbsolutePath(), result.getAbsolutePath());
File shaFile = new File(result.getAbsolutePath() + AbstractIndexedRepo.REPO_INDEX_SHA_EXTENSION);
assertEquals(EXPECTED_SHA, IO.collect(shaFile));
result.delete();
shaFile.delete();
/* cleanup */
List<String> cacheFiles = Arrays.asList(cacheDir.list());
String uriCacheDir = URLEncoder.encode(baseUri.toURL().toExternalForm(), "UTF-8");
assert (cacheFiles.size() == 1 || cacheFiles.size() == 2);
assert (cacheFiles.contains(uriCacheDir));
if (cacheFiles.size() == 2) {
assert (cacheFiles.contains(".gitignore"));
}
IO.getFile(testDirName + "/" + uriCacheDir).delete();
} finally {
httpd.stop();
}
}
public static void testUseCached() throws Exception {
File cached = IO.getFile("testdata/httpcache/4/http%3A%2F%2Flocalhost%3A18083%2Fbundles/dummybundle.jar");
long cacheTimestamp = cached.lastModified();
CachingUriResourceHandle handle = new CachingUriResourceHandle(
new URI("http://localhost:18083/bundles/dummybundle.jar"), IO.getFile("testdata/httpcache/4"),
new DefaultURLConnector(), EXPECTED_SHA);
NanoHTTPD httpd = new NanoHTTPD(18083, IO.getFile("testdata/http"));
try {
File result = handle.request();
assertEquals(cached, result);
assertEquals("File timestamp should NOT change", cacheTimestamp, result.lastModified());
} finally {
httpd.stop();
}
}
public static void testReplaceCache() throws Exception {
File cached = IO.getFile("testdata/httpcache/5/http%3A%2F%2Flocalhost%3A18083%2Fbundles/dummybundle.jar");
long cacheTimestamp = cached.lastModified();
// Clear the SHA so the file appears modified
File shaFile = new File(cached.getAbsolutePath() + AbstractIndexedRepo.REPO_INDEX_SHA_EXTENSION);
IO.store("00000000", shaFile);
CachingUriResourceHandle handle = new CachingUriResourceHandle(
new URI("http://localhost:18083/bundles/dummybundle.jar"), IO.getFile("testdata/httpcache/5"),
new DefaultURLConnector(), EXPECTED_SHA);
NanoHTTPD httpd = new NanoHTTPD(18083, IO.getFile("testdata/http"));
try {
File result = handle.request();
assertEquals(cached, result);
assertNotSame("File timestamp SHOULD change", cacheTimestamp, result.lastModified());
assertEquals(EXPECTED_SHA, IO.collect(shaFile));
} finally {
httpd.stop();
}
}
public static void testEmptyCache() throws Exception {
String testDirName = "testdata/httpcache/6";
File cacheDir = new File(testDirName);
URI baseUri = new URI("http://localhost:18083/bundles");
String jarName = "dummybundle.jar";
URI uri = new URI(baseUri + "/" + jarName);
String uriCacheDir = URLEncoder.encode(baseUri.toURL().toExternalForm(), "UTF-8");
File cached = IO.getFile(testDirName + "/" + uriCacheDir + "/" + jarName);
cached.delete();
File shaFile = new File(cached.getAbsolutePath() + AbstractIndexedRepo.REPO_INDEX_SHA_EXTENSION);
shaFile.delete();
CachingUriResourceHandle handle = new CachingUriResourceHandle(uri, cacheDir, new DefaultURLConnector(),
EXPECTED_SHA);
NanoHTTPD httpd = new NanoHTTPD(18083, IO.getFile("testdata/http"));
try {
File result = handle.request();
assertEquals(cached, result.getAbsoluteFile());
assertEquals(EXPECTED_SHA, IO.collect(shaFile));
/* cleanup */
List<String> cacheFiles = Arrays.asList(cacheDir.list());
assert (cacheFiles.size() == 1 || cacheFiles.size() == 2);
assert (cacheFiles.contains(uriCacheDir));
if (cacheFiles.size() == 2) {
assert (cacheFiles.contains(".gitignore"));
}
IO.delete(IO.getFile(testDirName + "/" + uriCacheDir));
} finally {
httpd.stop();
}
}
public static void testUseCacheWhenRemoteUnavailable() throws Exception {
File cached = IO.getFile("testdata/httpcache/7/http%3A%2F%2Flocalhost%3A18083%2Fbundles/dummybundle.jar");
CachingUriResourceHandle handle = new CachingUriResourceHandle(
new URI("http://localhost:18083/bundles/dummybundle.jar"), IO.getFile("testdata/httpcache/7"),
new DefaultURLConnector(), (String) null);
// whoops where's the server...
File result = handle.request();
assertEquals(cached, result);
}
}