/* * Copyright © 2015 Cask Data, Inc. * * Licensed 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 co.cask.cdap.data.runtime.main; import co.cask.cdap.common.lang.ClassLoaders; import org.apache.hadoop.mapred.JobConf; import org.junit.Assert; import org.junit.Test; import java.net.URI; import java.net.URL; /** * */ public class ResourcesClassLoaderTest { @SuppressWarnings("AccessStaticViaInstance") @Test public void testCustomResourceLoading() throws Exception { // Using default classloader JobConf jobConf = new JobConf(); // foo-loader is not defined in default classloader Assert.assertNull(jobConf.get("foo-loader")); // On first load, TestClass.init should be false Assert.assertFalse(TestClass.init); TestClass.init = true; // Using ResourcesClassLoader with URL /test-conf URL url = getClass().getResource("/test-conf/mapred-site.xml"); ClassLoader previousClassLoader = ClassLoaders.setContextClassLoader( new ResourcesClassLoader(new URL[]{getParentUrl(url)}, getClass().getClassLoader())); jobConf = new JobConf(); Assert.assertEquals("bar-loader", jobConf.get("foo-loader")); // TestClass is already initialzed earlier, hence TestClass.init should be true TestClass testClass = (TestClass) Thread.currentThread().getContextClassLoader().loadClass(TestClass.class.getName()).newInstance(); Assert.assertTrue(testClass.init); ClassLoaders.setContextClassLoader(previousClassLoader); // Using ResourcesClassLoader with URL /test-app-conf url = getClass().getResource("/test-app-conf/mapred-site.xml"); previousClassLoader = ClassLoaders.setContextClassLoader( new ResourcesClassLoader(new URL[]{getParentUrl(url)}, getClass().getClassLoader())); jobConf = new JobConf(); Assert.assertEquals("baz-app-loader", jobConf.get("foo-loader")); // TestClass is already initialzed earlier, hence TestClass.init should be true testClass = (TestClass) Thread.currentThread().getContextClassLoader().loadClass(TestClass.class.getName()).newInstance(); Assert.assertTrue(testClass.init); ClassLoaders.setContextClassLoader(previousClassLoader); } @SuppressWarnings("ConstantConditions") @Test public void testFirstNonNull() throws Exception { Integer null1 = null; Integer five = 5; Assert.assertNull(ResourcesClassLoader.firstNonNull(null1, null1)); Assert.assertEquals((Integer) 5, ResourcesClassLoader.firstNonNull(null1, five)); Assert.assertEquals((Integer) 5, ResourcesClassLoader.firstNonNull(five, null1)); Assert.assertEquals((Integer) 5, ResourcesClassLoader.firstNonNull(five, five)); } private URL getParentUrl(URL url) throws Exception { URI uri = url.toURI(); return uri.getPath().endsWith("/") ? uri.resolve("..").toURL() : uri.resolve(".").toURL(); } public static final class TestClass { public static boolean init = false; } }