TestReflectionUtils.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:4k
源码类别:

网格计算

开发平台:

Java

  1. /**  * 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.util;
  2. import java.net.URL;
  3. import java.net.URLClassLoader;
  4. import java.util.HashMap;
  5. import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapred.JobConfigurable;
  6. import junit.framework.TestCase;
  7. public class TestReflectionUtils extends TestCase {
  8.   private static Class toConstruct[] = { String.class, TestReflectionUtils.class, HashMap.class };
  9.   private Throwable failure = null;
  10.   public void setUp() {
  11.     ReflectionUtils.clearCache();
  12.   }
  13.     
  14.   public void testCache() throws Exception {
  15.     assertEquals(0, cacheSize());
  16.     doTestCache();
  17.     assertEquals(toConstruct.length, cacheSize());
  18.     ReflectionUtils.clearCache();
  19.     assertEquals(0, cacheSize());
  20.   }
  21.     
  22.     
  23.   @SuppressWarnings("unchecked")   private void doTestCache() {
  24.     for (int i=0; i<toConstruct.length; i++) {
  25.       Class cl = toConstruct[i];
  26.       Object x = ReflectionUtils.newInstance(cl, null);
  27.       Object y = ReflectionUtils.newInstance(cl, null);
  28.       assertEquals(cl, x.getClass());
  29.       assertEquals(cl, y.getClass());
  30.     }
  31.   }
  32.     
  33.   public void testThreadSafe() throws Exception {
  34.     Thread[] th = new Thread[32];
  35.     for (int i=0; i<th.length; i++) {
  36.       th[i] = new Thread() {
  37.           public void run() {
  38.             try {
  39.               doTestCache();
  40.             } catch (Throwable t) {
  41.               failure = t;
  42.             }
  43.           }
  44.         };
  45.       th[i].start();
  46.     }
  47.     for (int i=0; i<th.length; i++) {
  48.       th[i].join();
  49.     }
  50.     if (failure != null) {
  51.       failure.printStackTrace();
  52.       fail(failure.getMessage());
  53.     }
  54.   }
  55.     
  56.   private int cacheSize() throws Exception {
  57.     return ReflectionUtils.getCacheSize();
  58.   }
  59.     
  60.   public void testCantCreate() {
  61.     try {
  62.       ReflectionUtils.newInstance(NoDefaultCtor.class, null);
  63.       fail("invalid call should fail");
  64.     } catch (RuntimeException rte) {
  65.       assertEquals(NoSuchMethodException.class, rte.getCause().getClass());
  66.     }
  67.   }
  68.     
  69.   @SuppressWarnings("unchecked")   public void testCacheDoesntLeak() throws Exception {
  70.     int iterations=9999; // very fast, but a bit less reliable - bigger numbers force GC
  71.     for (int i=0; i<iterations; i++) {
  72.       URLClassLoader loader = new URLClassLoader(new URL[0], getClass().getClassLoader());
  73.       Class cl = Class.forName("org.apache.hadoop.util.TestReflectionUtils$LoadedInChild", false, loader);
  74.       Object o = ReflectionUtils.newInstance(cl, null);
  75.       assertEquals(cl, o.getClass());
  76.     }
  77.     System.gc();
  78.     assertTrue(cacheSize()+" too big", cacheSize()<iterations);
  79.   }
  80.     
  81.   private static class LoadedInChild {
  82.   }
  83.     
  84.   public static class NoDefaultCtor {
  85.     public NoDefaultCtor(int x) {}
  86.   }      /**    * This is to test backward compatibility of ReflectionUtils for     * JobConfigurable objects.     * This should be made deprecated along with the mapred package HADOOP-1230.     * Should be removed when mapred package is removed.    */   public void testSetConf() {     JobConfigurableOb ob = new JobConfigurableOb();     ReflectionUtils.setConf(ob, new Configuration());     assertFalse(ob.configured);     ReflectionUtils.setConf(ob, new JobConf());     assertTrue(ob.configured);   }      private static class JobConfigurableOb implements JobConfigurable {     boolean configured;     public void configure(JobConf job) {       configured = true;     }   }
  87. }