|
@@ -0,0 +1,136 @@
|
|
|
+/**
|
|
|
+ * Licensed to the Apache Software Foundation (ASF) under one
|
|
|
+ * or more contributor license agreements. See the NOTICE file
|
|
|
+ * distributed with this work for additional information
|
|
|
+ * regarding copyright ownership. The ASF licenses this file
|
|
|
+ * to you under the Apache License, Version 2.0 (the
|
|
|
+ * "License"); you may not use this file except in compliance
|
|
|
+ * with the License. You may obtain a copy of the License at
|
|
|
+ *
|
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
|
+ *
|
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
+ * See the License for the specific language governing permissions and
|
|
|
+ * limitations under the License.
|
|
|
+ */
|
|
|
+
|
|
|
+package org.apache.hadoop.yarn.util;
|
|
|
+
|
|
|
+import static junit.framework.Assert.assertEquals;
|
|
|
+import static junit.framework.Assert.assertFalse;
|
|
|
+import static junit.framework.Assert.assertNotNull;
|
|
|
+import static junit.framework.Assert.assertNull;
|
|
|
+import static junit.framework.Assert.assertTrue;
|
|
|
+import static org.apache.hadoop.yarn.util.ApplicationClassLoader.constructUrlsFromClasspath;
|
|
|
+import static org.apache.hadoop.yarn.util.ApplicationClassLoader.isSystemClass;
|
|
|
+
|
|
|
+import com.google.common.base.Splitter;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.io.FileOutputStream;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.net.URL;
|
|
|
+import java.util.List;
|
|
|
+import java.util.jar.JarOutputStream;
|
|
|
+import java.util.zip.ZipEntry;
|
|
|
+
|
|
|
+import org.apache.commons.io.IOUtils;
|
|
|
+import org.apache.hadoop.fs.FileUtil;
|
|
|
+import org.junit.Before;
|
|
|
+import org.junit.Test;
|
|
|
+
|
|
|
+public class TestApplicationClassLoader {
|
|
|
+
|
|
|
+ private static File testDir = new File(System.getProperty("test.build.data",
|
|
|
+ System.getProperty("java.io.tmpdir")), "appclassloader");
|
|
|
+
|
|
|
+ @Before
|
|
|
+ public void setUp() {
|
|
|
+ FileUtil.fullyDelete(testDir);
|
|
|
+ testDir.mkdirs();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testConstructUrlsFromClasspath() throws Exception {
|
|
|
+ File file = new File(testDir, "file");
|
|
|
+ assertTrue("Create file", file.createNewFile());
|
|
|
+
|
|
|
+ File dir = new File(testDir, "dir");
|
|
|
+ assertTrue("Make dir", dir.mkdir());
|
|
|
+
|
|
|
+ File jarsDir = new File(testDir, "jarsdir");
|
|
|
+ assertTrue("Make jarsDir", jarsDir.mkdir());
|
|
|
+ File nonJarFile = new File(jarsDir, "nonjar");
|
|
|
+ assertTrue("Create non-jar file", nonJarFile.createNewFile());
|
|
|
+ File jarFile = new File(jarsDir, "a.jar");
|
|
|
+ assertTrue("Create jar file", jarFile.createNewFile());
|
|
|
+
|
|
|
+ File nofile = new File(testDir, "nofile");
|
|
|
+ // don't create nofile
|
|
|
+
|
|
|
+ StringBuilder cp = new StringBuilder();
|
|
|
+ cp.append(file.getAbsolutePath()).append(File.pathSeparator)
|
|
|
+ .append(dir.getAbsolutePath()).append(File.pathSeparator)
|
|
|
+ .append(jarsDir.getAbsolutePath() + "/*").append(File.pathSeparator)
|
|
|
+ .append(nofile.getAbsolutePath()).append(File.pathSeparator)
|
|
|
+ .append(nofile.getAbsolutePath() + "/*").append(File.pathSeparator);
|
|
|
+
|
|
|
+ URL[] urls = constructUrlsFromClasspath(cp.toString());
|
|
|
+
|
|
|
+ assertEquals(3, urls.length);
|
|
|
+ assertEquals(file.toURI().toURL(), urls[0]);
|
|
|
+ assertEquals(dir.toURI().toURL(), urls[1]);
|
|
|
+ assertEquals(jarFile.toURI().toURL(), urls[2]);
|
|
|
+ // nofile should be ignored
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testIsSystemClass() {
|
|
|
+ assertFalse(isSystemClass("org.example.Foo", null));
|
|
|
+ assertTrue(isSystemClass("org.example.Foo", classes("org.example.Foo")));
|
|
|
+ assertTrue(isSystemClass("/org.example.Foo", classes("org.example.Foo")));
|
|
|
+ assertTrue(isSystemClass("org.example.Foo", classes("org.example.")));
|
|
|
+ assertTrue(isSystemClass("net.example.Foo",
|
|
|
+ classes("org.example.,net.example.")));
|
|
|
+ assertFalse(isSystemClass("org.example.Foo",
|
|
|
+ classes("-org.example.Foo,org.example.")));
|
|
|
+ assertTrue(isSystemClass("org.example.Bar",
|
|
|
+ classes("-org.example.Foo.,org.example.")));
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<String> classes(String classes) {
|
|
|
+ return Lists.newArrayList(Splitter.on(',').split(classes));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testGetResource() throws IOException {
|
|
|
+ URL testJar = makeTestJar().toURI().toURL();
|
|
|
+
|
|
|
+ ClassLoader currentClassLoader = getClass().getClassLoader();
|
|
|
+ ClassLoader appClassloader = new ApplicationClassLoader(
|
|
|
+ new URL[] { testJar }, currentClassLoader, null);
|
|
|
+
|
|
|
+ assertNull("Resource should be null for current classloader",
|
|
|
+ currentClassLoader.getResourceAsStream("resource.txt"));
|
|
|
+
|
|
|
+ InputStream in = appClassloader.getResourceAsStream("resource.txt");
|
|
|
+ assertNotNull("Resource should not be null for app classloader", in);
|
|
|
+ assertEquals("hello", IOUtils.toString(in));
|
|
|
+ }
|
|
|
+
|
|
|
+ private File makeTestJar() throws IOException {
|
|
|
+ File jarFile = new File(testDir, "test.jar");
|
|
|
+ JarOutputStream out = new JarOutputStream(new FileOutputStream(jarFile));
|
|
|
+ ZipEntry entry = new ZipEntry("resource.txt");
|
|
|
+ out.putNextEntry(entry);
|
|
|
+ out.write("hello".getBytes());
|
|
|
+ out.closeEntry();
|
|
|
+ out.close();
|
|
|
+ return jarFile;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|