diff options
Diffstat (limited to 'test/java/org/jau/util/TestTempJarCache.java')
-rw-r--r-- | test/java/org/jau/util/TestTempJarCache.java | 273 |
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); + } + +} |