001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 019 package org.apache.commons.beanutils; 020 021 022 import java.util.HashMap; 023 import java.util.Iterator; 024 import java.util.Map; 025 import junit.framework.TestCase; 026 import junit.framework.Test; 027 import junit.framework.TestSuite; 028 029 030 /** 031 * JUnit Test Case containing microbenchmarks for PropertyUtils. 032 */ 033 034 public class PropertyUtilsBenchCase extends TestCase { 035 036 037 // ------------------------------------------------------------ Constructors 038 039 040 /** 041 * Construct a new instance of this test case. 042 * 043 * @param name Name of the test case 044 */ 045 public PropertyUtilsBenchCase(String name) { 046 047 super(name); 048 049 } 050 051 052 // ------------------------------------------------------ Instance Variables 053 054 055 // Basic loop counter 056 private long counter = 100000; 057 058 // DynaClass for inDyna and outDyna 059 private DynaClass dynaClass = null; 060 061 // Input objects that have identical sets of properties and values. 062 private BenchBean inBean = null; 063 private DynaBean inDyna = null; 064 private Map inMap = null; 065 066 // Output objects that have identical sets of properties. 067 private BenchBean outBean = null; 068 private DynaBean outDyna = null; 069 070 // PropertyUtilsBean instance to be used 071 private PropertyUtilsBean pu = null; 072 073 074 // ---------------------------------------------------- Overall Test Methods 075 076 077 /** 078 * Set up instance variables required by this test case. 079 */ 080 public void setUp() throws Exception { 081 082 // Set up loop counter (if property specified) 083 String prop = System.getProperty("counter"); 084 if (prop != null) { 085 counter = Long.parseLong(prop); 086 } 087 088 // Set up DynaClass for our DynaBean instances 089 dynaClass = new BasicDynaClass 090 ("BenchDynaClass", null, 091 new DynaProperty[]{ 092 new DynaProperty("booleanProperty", Boolean.TYPE), 093 new DynaProperty("byteProperty", Byte.TYPE), 094 new DynaProperty("doubleProperty", Double.TYPE), 095 new DynaProperty("floatProperty", Float.TYPE), 096 new DynaProperty("intProperty", Integer.TYPE), 097 new DynaProperty("longProperty", Long.TYPE), 098 new DynaProperty("shortProperty", Short.TYPE), 099 new DynaProperty("stringProperty", String.class), 100 }); 101 102 // Create input instances 103 inBean = new BenchBean(); 104 inMap = new HashMap(); 105 inMap.put("booleanProperty", new Boolean(inBean.getBooleanProperty())); 106 inMap.put("byteProperty", new Byte(inBean.getByteProperty())); 107 inMap.put("doubleProperty", new Double(inBean.getDoubleProperty())); 108 inMap.put("floatProperty", new Float(inBean.getFloatProperty())); 109 inMap.put("intProperty", new Integer(inBean.getIntProperty())); 110 inMap.put("longProperty", new Long(inBean.getLongProperty())); 111 inMap.put("shortProperty", new Short(inBean.getShortProperty())); 112 inMap.put("stringProperty", inBean.getStringProperty()); 113 inDyna = dynaClass.newInstance(); 114 Iterator inKeys = inMap.keySet().iterator(); 115 while (inKeys.hasNext()) { 116 String inKey = (String) inKeys.next(); 117 inDyna.set(inKey, inMap.get(inKey)); 118 } 119 120 // Create output instances 121 outBean = new BenchBean(); 122 outDyna = dynaClass.newInstance(); 123 Iterator outKeys = inMap.keySet().iterator(); 124 while (outKeys.hasNext()) { 125 String outKey = (String) outKeys.next(); 126 outDyna.set(outKey, inMap.get(outKey)); 127 } 128 129 // Set up PropertyUtilsBean instance we will use 130 pu = PropertyUtilsBean.getInstance(); 131 132 } 133 134 135 /** 136 * Return the tests included in this test suite. 137 */ 138 public static Test suite() { 139 140 return (new TestSuite(PropertyUtilsBenchCase.class)); 141 142 } 143 144 145 /** 146 * Tear down instance variables required by this test case. 147 */ 148 public void tearDown() { 149 150 dynaClass = null; 151 inBean = null; 152 inDyna = null; 153 inMap = null; 154 outBean = null; 155 outDyna = null; 156 pu = null; 157 158 } 159 160 161 162 // ------------------------------------------------- Individual Test Methods 163 164 165 // Time copyProperties() from a bean 166 public void testCopyPropertiesBean() throws Exception { 167 168 long start; 169 long stop; 170 171 // Bean->Bean 172 for (long i = 0; i < counter; i++) { 173 pu.copyProperties(outBean, inBean); 174 } 175 start = System.currentTimeMillis(); 176 for (long i = 0; i < counter; i++) { 177 pu.copyProperties(outBean, inBean); 178 } 179 stop = System.currentTimeMillis(); 180 System.err.println("PU.copyProperties(bean,bean), count=" + counter + 181 ", time=" + (stop - start)); 182 183 // Bean->Dyna 184 for (long i = 0; i < counter; i++) { 185 pu.copyProperties(outDyna, inBean); 186 } 187 start = System.currentTimeMillis(); 188 for (long i = 0; i < counter; i++) { 189 pu.copyProperties(outDyna, inBean); 190 } 191 stop = System.currentTimeMillis(); 192 System.err.println("PU.copyProperties(dyna,bean), count=" + counter + 193 ", time=" + (stop - start)); 194 195 } 196 197 198 // Time copyProperties() from a DynaBean 199 public void testCopyPropertiesDyna() throws Exception { 200 201 long start; 202 long stop; 203 204 // Dyna->Bean 205 for (long i = 0; i < counter; i++) { 206 pu.copyProperties(outBean, inDyna); 207 } 208 start = System.currentTimeMillis(); 209 for (long i = 0; i < counter; i++) { 210 pu.copyProperties(outBean, inDyna); 211 } 212 stop = System.currentTimeMillis(); 213 System.err.println("PU.copyProperties(bean,dyna), count=" + counter + 214 ", time=" + (stop - start)); 215 216 // Dyna->Dyna 217 for (long i = 0; i < counter; i++) { 218 pu.copyProperties(outDyna, inDyna); 219 } 220 start = System.currentTimeMillis(); 221 for (long i = 0; i < counter; i++) { 222 pu.copyProperties(outDyna, inDyna); 223 } 224 stop = System.currentTimeMillis(); 225 System.err.println("PU.copyProperties(dyna,dyna), count=" + counter + 226 ", time=" + (stop - start)); 227 228 } 229 230 231 // Time copyProperties() from a Map 232 public void testCopyPropertiesMap() throws Exception { 233 234 long start; 235 long stop; 236 237 // Dyna->Bean 238 for (long i = 0; i < counter; i++) { 239 pu.copyProperties(outBean, inMap); 240 } 241 start = System.currentTimeMillis(); 242 for (long i = 0; i < counter; i++) { 243 pu.copyProperties(outBean, inMap); 244 } 245 stop = System.currentTimeMillis(); 246 System.err.println("PU.copyProperties(bean, map), count=" + counter + 247 ", time=" + (stop - start)); 248 249 // Dyna->Dyna 250 for (long i = 0; i < counter; i++) { 251 pu.copyProperties(outDyna, inMap); 252 } 253 start = System.currentTimeMillis(); 254 for (long i = 0; i < counter; i++) { 255 pu.copyProperties(outDyna, inMap); 256 } 257 stop = System.currentTimeMillis(); 258 System.err.println("PU.copyProperties(dyna, map), count=" + counter + 259 ", time=" + (stop - start)); 260 261 } 262 263 264 // --------------------------------------------------------- Support Methods 265 266 267 }