aboutsummaryrefslogtreecommitdiffstats
path: root/test/java/org/jau/util/TestTempJarCache.java
diff options
context:
space:
mode:
Diffstat (limited to 'test/java/org/jau/util/TestTempJarCache.java')
-rw-r--r--test/java/org/jau/util/TestTempJarCache.java273
1 files changed, 273 insertions, 0 deletions
diff --git a/test/java/org/jau/util/TestTempJarCache.java b/test/java/org/jau/util/TestTempJarCache.java
new file mode 100644
index 0000000..5408f1c
--- /dev/null
+++ b/test/java/org/jau/util/TestTempJarCache.java
@@ -0,0 +1,273 @@
+/**
+ * Copyright 2011 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+
+package org.jau.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.jar.JarFile;
+
+import org.jau.io.IOUtil;
+import org.jau.junit.util.SingletonJunitCase;
+import org.jau.lang.ReflectionUtil;
+import org.jau.net.URIDumpUtil;
+import org.jau.net.Uri;
+import org.jau.pkg.JarUtil;
+import org.jau.pkg.cache.TempCacheReg;
+import org.jau.pkg.cache.TempFileCache;
+import org.jau.pkg.cache.TempJarCache;
+import org.jau.sys.AndroidVersion;
+import org.jau.sys.JNILibrary;
+import org.jau.sys.PlatformProps;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class TestTempJarCache extends SingletonJunitCase {
+ static TempFileCache fileCache;
+
+ static class TestClassLoader extends URLClassLoader {
+ public TestClassLoader(final URL[] urls) {
+ super(urls);
+ }
+ public TestClassLoader(final URL[] urls, final ClassLoader parent) {
+ super(urls, parent);
+ }
+ }
+
+ static void assertTempFileCachesIndividualInstances(final boolean shallBeSame, final TempFileCache fileCache2, final TempFileCache fileCache3) {
+ Assert.assertTrue(fileCache2.getTempDir().exists());
+ Assert.assertTrue(fileCache2.getTempDir().isDirectory());
+ Assert.assertTrue(fileCache3.getTempDir().exists());
+ Assert.assertTrue(fileCache3.getTempDir().isDirectory());
+
+ Assert.assertEquals(TempFileCache.getBaseDir(), TempFileCache.getBaseDir());
+ Assert.assertEquals(TempFileCache.getRootDir(), TempFileCache.getRootDir());
+
+ if(shallBeSame) {
+ Assert.assertTrue("file caches are not equal", fileCache2.getTempDir().equals(fileCache3.getTempDir()));
+ } else {
+ Assert.assertFalse("file caches are equal", fileCache2.getTempDir().equals(fileCache3.getTempDir()));
+ }
+ // also verify with diff classloader/reflection method,
+ // to proof that methodology is valid!
+ final ClassLoader cl = fileCache2.getClass().getClassLoader();
+ assertTempFileCachesIndividualInstances(shallBeSame, fileCache2, cl, fileCache3, cl);
+ }
+
+ static void assertTempFileCachesIndividualInstances(final boolean shallBeSame, final Object fileCache2, final ClassLoader cl2, final Object fileCache3, final ClassLoader cl3) {
+ final Class<?> fileCacheClazz2 = ReflectionUtil.getClass(TempFileCache.class.getName(), false, cl2);
+ final Class<?> fileCacheClazz3 = ReflectionUtil.getClass(TempFileCache.class.getName(), false, cl3);
+
+ final Method fc2GetBaseDir = ReflectionUtil.getMethod(fileCacheClazz2 , "getBaseDir");
+ final Method fc3GetBaseDir = ReflectionUtil.getMethod(fileCacheClazz3 , "getBaseDir");
+ final Object baseDir2 = ReflectionUtil.callMethod(fileCache2, fc2GetBaseDir);
+ final Object baseDir3 = ReflectionUtil.callMethod(fileCache3, fc3GetBaseDir);
+ Assert.assertEquals(baseDir2, baseDir3);
+
+ final Method fc2GetRootDir = ReflectionUtil.getMethod(fileCacheClazz2 , "getRootDir");
+ final Method fc3GetRootDir = ReflectionUtil.getMethod(fileCacheClazz3 , "getRootDir");
+ final Object rootDir2 = ReflectionUtil.callMethod(fileCache2, fc2GetRootDir);
+ final Object rootDir3 = ReflectionUtil.callMethod(fileCache3, fc3GetRootDir);
+ Assert.assertEquals(rootDir2, rootDir3);
+
+ final Method fc2GetTempDir = ReflectionUtil.getMethod(fileCacheClazz2 , "getTempDir");
+ final Method fc3GetTempDir = ReflectionUtil.getMethod(fileCacheClazz3 , "getTempDir");
+ final Object tempDir2 = ReflectionUtil.callMethod(fileCache2, fc2GetTempDir);
+ final Object tempDir3 = ReflectionUtil.callMethod(fileCache3, fc3GetTempDir);
+
+ if(shallBeSame) {
+ Assert.assertTrue("file caches are not equal", tempDir2.equals(tempDir3));
+ } else {
+ Assert.assertFalse("file caches are equal", tempDir2.equals(tempDir3));
+ }
+ }
+
+ @BeforeClass
+ public static void init() {
+ // may already been initialized by other test
+ // Assert.assertFalse(TempCacheReg.isTempFileCacheUsed());
+ Assert.assertTrue(TempFileCache.initSingleton());
+ Assert.assertTrue(TempCacheReg.isTempFileCacheUsed());
+
+ fileCache = new TempFileCache();
+ Assert.assertTrue(fileCache.isValid(false));
+ System.err.println("tmp dir: "+fileCache.getTempDir());
+ }
+
+ @Test
+ public void testTempFileCache01FileExist() throws IOException {
+ Assert.assertTrue(fileCache.getTempDir().exists());
+ Assert.assertTrue(fileCache.getTempDir().isDirectory());
+ }
+
+ @Test
+ public void testTempFileCache02Instances() throws IOException {
+ final TempFileCache fileCache2 = new TempFileCache();
+ final TempFileCache fileCache3 = new TempFileCache();
+
+ assertTempFileCachesIndividualInstances(false, fileCache2, fileCache3);
+ }
+
+ @Test
+ public void testJarUtil01a() throws IOException, IllegalArgumentException, URISyntaxException {
+ if(AndroidVersion.isAvailable) { System.err.println("n/a on Android"); return; }
+ final JarFile jarFile = JarUtil.getJarFile(PlatformProps.class.getName(), this.getClass().getClassLoader());
+ Assert.assertNotNull(jarFile);
+ JarUtil.extract(fileCache.getTempDir(), null, jarFile, null, false, true, true);
+ File f = new File(fileCache.getTempDir(), "META-INF/MANIFEST.MF");
+ Assert.assertTrue(f.exists());
+ f = new File(fileCache.getTempDir(), IOUtil.getClassFileName(PlatformProps.class.getName()));
+ Assert.assertTrue(f.exists());
+ }
+
+ @Test
+ public void testJarUtil01b() throws IOException {
+ if(AndroidVersion.isAvailable) { System.err.println("n/a on Android"); return; }
+ File f = new File(fileCache.getTempDir(), "META-INF/MANIFEST.MF");
+ Assert.assertTrue(f.exists());
+ f = new File(fileCache.getTempDir(), IOUtil.getClassFileName(PlatformProps.class.getName()));
+ Assert.assertTrue(f.exists());
+ }
+
+ @Test
+ public void testTempJarCache00Init() throws IOException {
+ // may already been initialized by other test
+ // Assert.assertFalse(TempCacheReg.isTempJarCacheUsed());
+ // Assert.assertFalse(TempJarCache.isInitialized());
+ Assert.assertTrue(TempJarCache.initSingleton());
+ Assert.assertTrue(TempCacheReg.isTempJarCacheUsed(false));
+ Assert.assertTrue(TempJarCache.isInitialized(false));
+ }
+
+ @Test
+ public void testTempJarCache01LoadAllTestManifestAndClass() throws IOException, SecurityException, IllegalArgumentException, URISyntaxException {
+ if(AndroidVersion.isAvailable) { System.err.println("n/a on Android"); return; }
+
+ final ClassLoader cl = getClass().getClassLoader();
+ TempJarCache.addAll(PlatformProps.class, JarUtil.getJarFileUri(PlatformProps.class.getName(), cl));
+
+ File f0 = new File(TempJarCache.getTempFileCache().getTempDir(), "META-INF/MANIFEST.MF");
+ Assert.assertTrue(f0.exists());
+
+ File f1 = new File(TempJarCache.findResource("META-INF/MANIFEST.MF"));
+ Assert.assertTrue(f1.exists());
+ Assert.assertEquals(f0, f1);
+
+ f0 = new File(TempJarCache.getTempFileCache().getTempDir(), IOUtil.getClassFileName(PlatformProps.class.getName()));
+ Assert.assertTrue(f0.exists());
+
+ f1 = new File(TempJarCache.findResource(IOUtil.getClassFileName(PlatformProps.class.getName())));
+ Assert.assertTrue(f1.exists());
+ Assert.assertEquals(f0, f1);
+ }
+
+ @Test
+ public void testTempJarCache02AddNativeLibs() throws IOException, IllegalArgumentException, URISyntaxException {
+ if(AndroidVersion.isAvailable) { System.err.println("n/a on Android"); return; }
+ final Uri.Encoded nativeJarName = Uri.Encoded.cast("gluegen-rt-natives-"+PlatformProps.os_and_arch+".jar");
+ final String libBaseName = "gluegen_rt";
+ final ClassLoader cl = getClass().getClassLoader();
+
+ final Uri jarUri = JarUtil.getJarUri(TempJarCache.class.getName(), cl);
+ Assert.assertNotNull(jarUri);
+ System.err.println("1 - jarUri:");
+ URIDumpUtil.showUri(jarUri);
+
+ final Uri jarFileUri = jarUri.getContainedUri();
+ Assert.assertNotNull(jarFileUri);
+ System.err.println("2 - jarFileUri:");
+ URIDumpUtil.showUri(jarFileUri);
+
+ final Uri jarFileDir = jarFileUri.getParent();
+ Assert.assertNotNull(jarFileDir);
+ System.err.println("3 - jarFileDir:");
+ URIDumpUtil.showUri(jarFileDir);
+
+ final Uri nativeJarURI = JarUtil.getJarFileUri(jarFileDir, nativeJarName);
+ System.err.println("4 - nativeJarURI:");
+ URIDumpUtil.showUri(nativeJarURI);
+
+ TempJarCache.addNativeLibs(TempJarCache.class, nativeJarURI, null /* nativeLibraryPath */);
+ final String libFullPath = TempJarCache.findLibrary(libBaseName);
+ Assert.assertNotNull(libFullPath);
+ Assert.assertEquals(libBaseName, JNILibrary.isValidNativeLibraryName(libFullPath, true));
+ final File f = new File(libFullPath);
+ Assert.assertTrue(f.exists());
+ }
+
+ @Test
+ public void testTempJarCache04aSameClassLoader() throws IOException {
+ assertTempFileCachesIndividualInstances(true, TempJarCache.getTempFileCache(), TempJarCache.getTempFileCache());
+
+ final ClassLoader cl = getClass().getClassLoader();
+ final TempFileCache fileCache2 = (TempFileCache) ReflectionUtil.callStaticMethod(TempJarCache.class.getName(), "getTempFileCache", null, null, cl);
+ final TempFileCache fileCache3 = (TempFileCache) ReflectionUtil.callStaticMethod(TempJarCache.class.getName(), "getTempFileCache", null, null, cl);
+ assertTempFileCachesIndividualInstances(true, fileCache2, fileCache3);
+ }
+
+ @Test
+ public void testTempJarCache04bDiffClassLoader() throws IOException, IllegalArgumentException, URISyntaxException {
+ if(AndroidVersion.isAvailable) { System.err.println("n/a on Android"); return; }
+ final URL[] urls = new URL[] { JarUtil.getJarFileUri(TempJarCache.class.getName(), getClass().getClassLoader()).toURL() };
+ System.err.println("url: "+urls[0]);
+ final ClassLoader cl2 = new TestClassLoader(urls, null);
+ final ClassLoader cl3 = new TestClassLoader(urls, null);
+
+ Assert.assertFalse(( (Boolean) ReflectionUtil.callStaticMethod(TempJarCache.class.getName(), "isInitialized", new Class<?>[] { Boolean.TYPE }, new Object[] { Boolean.FALSE }, cl2)
+ ).booleanValue());
+ Assert.assertFalse(( (Boolean) ReflectionUtil.callStaticMethod(TempJarCache.class.getName(), "isInitialized", new Class<?>[] { Boolean.TYPE }, new Object[] { Boolean.FALSE }, cl3)
+ ).booleanValue());
+ Assert.assertTrue(( (Boolean) ReflectionUtil.callStaticMethod(TempJarCache.class.getName(), "initSingleton", null, null, cl2)
+ ).booleanValue());
+ Assert.assertTrue(( (Boolean) ReflectionUtil.callStaticMethod(TempJarCache.class.getName(), "initSingleton", null, null, cl3)
+ ).booleanValue());
+ Assert.assertTrue(( (Boolean) ReflectionUtil.callStaticMethod(TempJarCache.class.getName(), "isInitialized", new Class<?>[] { Boolean.TYPE }, new Object[] { Boolean.FALSE }, cl2)
+ ).booleanValue());
+ Assert.assertTrue(( (Boolean) ReflectionUtil.callStaticMethod(TempJarCache.class.getName(), "isInitialized", new Class<?>[] { Boolean.TYPE }, new Object[] { Boolean.FALSE }, cl3)
+ ).booleanValue());
+
+ final Object fileCache2 = ReflectionUtil.callStaticMethod(TempJarCache.class.getName(), "getTempFileCache", null, null, cl2);
+ final Object fileCache3 = ReflectionUtil.callStaticMethod(TempJarCache.class.getName(), "getTempFileCache", null, null, cl3);
+
+ assertTempFileCachesIndividualInstances(false, fileCache2, cl2, fileCache3, cl3);
+ }
+
+ public static void main(final String args[]) throws IOException {
+ final String tstname = TestTempJarCache.class.getName();
+ org.junit.runner.JUnitCore.main(tstname);
+ }
+
+}