1ef39d40dSAndrew Rist /************************************************************** 21738ad43Smseidel * 3ef39d40dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4ef39d40dSAndrew Rist * or more contributor license agreements. See the NOTICE file 5ef39d40dSAndrew Rist * distributed with this work for additional information 6ef39d40dSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7ef39d40dSAndrew Rist * to you under the Apache License, Version 2.0 (the 8ef39d40dSAndrew Rist * "License"); you may not use this file except in compliance 9ef39d40dSAndrew Rist * with the License. You may obtain a copy of the License at 101738ad43Smseidel * 11ef39d40dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 121738ad43Smseidel * 13ef39d40dSAndrew Rist * Unless required by applicable law or agreed to in writing, 14ef39d40dSAndrew Rist * software distributed under the License is distributed on an 15ef39d40dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16ef39d40dSAndrew Rist * KIND, either express or implied. See the License for the 17ef39d40dSAndrew Rist * specific language governing permissions and limitations 18ef39d40dSAndrew Rist * under the License. 191738ad43Smseidel * 20ef39d40dSAndrew Rist *************************************************************/ 21ef39d40dSAndrew Rist 22ef39d40dSAndrew Rist 231738ad43Smseidel 24cdf0e10cSrcweir package lib; 25cdf0e10cSrcweir 26cdf0e10cSrcweir import java.io.PrintWriter; 27cdf0e10cSrcweir import java.lang.reflect.Field; 28cdf0e10cSrcweir import java.lang.reflect.InvocationTargetException; 29cdf0e10cSrcweir import java.lang.reflect.Method; 30cdf0e10cSrcweir import java.util.Vector; 31cdf0e10cSrcweir 32cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime; 33cdf0e10cSrcweir import com.sun.star.uno.XInterface; 34cdf0e10cSrcweir 35cdf0e10cSrcweir import share.DescEntry; 36cdf0e10cSrcweir import lib.TestParameters; 37cdf0e10cSrcweir import stats.Summarizer; 38cdf0e10cSrcweir 39cdf0e10cSrcweir /** 40cdf0e10cSrcweir * The class supports method based interface tests development. 41cdf0e10cSrcweir * 42cdf0e10cSrcweir * <p>There are some points that should be fulfilled in a subclass to work 43cdf0e10cSrcweir * correctly in the multi-method framework: 44cdf0e10cSrcweir * 4530acf5e8Spfg * 1. each subclass should define a public field named oObj of type tested 46cdf0e10cSrcweir * by the subclass, e.g. 'public XText oObj;'. That field will be initialized 47cdf0e10cSrcweir * by the MultiMethodTest code with the instance of the interface to test. 48cdf0e10cSrcweir * In a case of service testing the field type should be XPropertySet. 49cdf0e10cSrcweir * 50cdf0e10cSrcweir * 2. for the test of each method of the tested interface(or a property in the 51cdf0e10cSrcweir * case of service testing) should be method with the following signature 52cdf0e10cSrcweir * provided: 'public void _<method name>()', e.g. 'public void _getText()'. 53cdf0e10cSrcweir * The methods will be called by MultiMethodText code using reflection API 54cdf0e10cSrcweir * for each method in the interface description. 55cdf0e10cSrcweir * 56cdf0e10cSrcweir * 3. to set status for a call 'tRes.tested(String method, 57cdf0e10cSrcweir * boolean result)' should be used. For example 'tRes.tested("getText()", 58cdf0e10cSrcweir * true)'. Also 'tRes.assert(String assertion, boolean result)' call can 59bb6af6bcSPedro Giffuni * be used. Note, that one can call the methods not necessarily from the 60cdf0e10cSrcweir * test for the tested method, but from other method tests too (in the 61cdf0e10cSrcweir * MultiMethodTest subclass). See also TestResult and MultiMethodTest.tRes 62cdf0e10cSrcweir * documentation. 63cdf0e10cSrcweir * 641738ad43Smseidel * 4. the before() and after() methods can be overridden to perform some 65cdf0e10cSrcweir * actions, accordingly, before and after calling the test methods. 66cdf0e10cSrcweir * 67cdf0e10cSrcweir * 5. besides tRes, there are some fields initialized in the MultiMethodTest, 68cdf0e10cSrcweir * that can be used for implementing tests: 69cdf0e10cSrcweir * 70cdf0e10cSrcweir * - tEnv contains the environment tested 71cdf0e10cSrcweir * - tParam contains parameters of the test 72cdf0e10cSrcweir * - log a writer to log information about the test 73cdf0e10cSrcweir * 74cdf0e10cSrcweir * @see TestResult 75cdf0e10cSrcweir */ 76cdf0e10cSrcweir public class MultiMethodTest 77cdf0e10cSrcweir { 78cdf0e10cSrcweir 79cdf0e10cSrcweir /** 80cdf0e10cSrcweir * Contains the TestEnvironment being tested, to allow for tests to access 81cdf0e10cSrcweir * it. 82cdf0e10cSrcweir */ 83cdf0e10cSrcweir protected TestEnvironment tEnv; 84cdf0e10cSrcweir /** 85cdf0e10cSrcweir * Contains the TestParameters for the tests, to allow for tests to access 86cdf0e10cSrcweir * it. 87cdf0e10cSrcweir */ 88cdf0e10cSrcweir protected TestParameters tParam; 89cdf0e10cSrcweir /** 90cdf0e10cSrcweir * Contains the Description for the test 91cdf0e10cSrcweir * it. 92cdf0e10cSrcweir */ 93cdf0e10cSrcweir protected DescEntry entry; 94cdf0e10cSrcweir /** 95cdf0e10cSrcweir * Contains a writer to log an information about the interface testing, to 96cdf0e10cSrcweir * allows for tests to access it. 97cdf0e10cSrcweir */ 98cdf0e10cSrcweir protected PrintWriter log; 99cdf0e10cSrcweir /** 100cdf0e10cSrcweir * Contains the TestResult instance for the interface test to collect 101cdf0e10cSrcweir * information about methods test. 102cdf0e10cSrcweir */ 103cdf0e10cSrcweir protected TestResult tRes; 104cdf0e10cSrcweir /** 105cdf0e10cSrcweir * Contains names of the methods have been alreadycalled 106cdf0e10cSrcweir */ 107cdf0e10cSrcweir private Vector methCalled = new Vector(10); 108cdf0e10cSrcweir 109cdf0e10cSrcweir /** 110cdf0e10cSrcweir * Disposes the test environment, which was corrupted by the test. 111cdf0e10cSrcweir * 112cdf0e10cSrcweir * @param tEnv the environment to dispose 113cdf0e10cSrcweir */ disposeEnvironment(TestEnvironment tEnv)114cdf0e10cSrcweir public void disposeEnvironment(TestEnvironment tEnv) 115cdf0e10cSrcweir { 116cdf0e10cSrcweir disposeEnvironment(); 117cdf0e10cSrcweir } 118cdf0e10cSrcweir 119cdf0e10cSrcweir /** 120cdf0e10cSrcweir * Disposes the current test environment, which was corrupted by the test. 121cdf0e10cSrcweir * 122cdf0e10cSrcweir * @see #disposeEnvironment(TestEnvironment) 123cdf0e10cSrcweir */ disposeEnvironment()124cdf0e10cSrcweir public void disposeEnvironment() 125cdf0e10cSrcweir { 126cdf0e10cSrcweir tEnv.dispose(); 127cdf0e10cSrcweir TestCase tCase = tEnv.getTestCase(); 128cdf0e10cSrcweir tCase.disposeTestEnvironment(tEnv, tParam); 129cdf0e10cSrcweir } 130cdf0e10cSrcweir 131cdf0e10cSrcweir /** 132cdf0e10cSrcweir * Runs the interface test: its method tests. First, it initializes some 133cdf0e10cSrcweir * of MultiMethodTest fields, like tRes, log, tEnv, etc. Then, it queries 134cdf0e10cSrcweir * the tested interface and initializes 'oObj' field (defined in a 135*4e167d9cSJohn Bampton * subclass). Before calling method tests, before() method calls to allow 136cdf0e10cSrcweir * initialization of s stuff before testing. Then, the method tests are 137cdf0e10cSrcweir * called. After them, after() method is called, to allow cleaning up the 138cdf0e10cSrcweir * stuff initialized in before() and test methods. 139cdf0e10cSrcweir * 140cdf0e10cSrcweir * @param entry the interface test state 141cdf0e10cSrcweir * @param tEnv the environment to test 142cdf0e10cSrcweir * @param tParam the parameters of the test 143cdf0e10cSrcweir * 144cdf0e10cSrcweir * @see #before 145cdf0e10cSrcweir * @see #after 146cdf0e10cSrcweir */ run(DescEntry entry, TestEnvironment tEnv, TestParameters tParam)147cdf0e10cSrcweir public TestResult run(DescEntry entry, TestEnvironment tEnv, TestParameters tParam) 148cdf0e10cSrcweir { 149cdf0e10cSrcweir 150cdf0e10cSrcweir log = (PrintWriter) entry.Logger; 151cdf0e10cSrcweir 152cdf0e10cSrcweir this.tEnv = tEnv; 153cdf0e10cSrcweir this.tParam = tParam; 154cdf0e10cSrcweir // this.log = log; 155cdf0e10cSrcweir this.entry = entry; 156cdf0e10cSrcweir this.tRes = new TestResult(); 157cdf0e10cSrcweir Class testedClass; 158cdf0e10cSrcweir 159cdf0e10cSrcweir // Some fake code for a self test. 160cdf0e10cSrcweir // For normal test we must not be a "ifc.qadevooo._SelfTest" 161cdf0e10cSrcweir if (! entry.entryName.equals("ifc.qadevooo._SelfTest")) 162cdf0e10cSrcweir { 163cdf0e10cSrcweir String ifcName = getInterfaceName(); 164cdf0e10cSrcweir // System.out.println("checking : " + ifcName); 165cdf0e10cSrcweir System.out.print("checking: [" + entry.longName + "]"); 166cdf0e10cSrcweir 167cdf0e10cSrcweir // defining a name of the class corresponding to the tested interface 168cdf0e10cSrcweir // or service 169cdf0e10cSrcweir String testedClassName; 170cdf0e10cSrcweir 171cdf0e10cSrcweir testedClassName = getTestedClassName(); 172cdf0e10cSrcweir 173cdf0e10cSrcweir if (entry.EntryType.equals("service")) 174cdf0e10cSrcweir { 175cdf0e10cSrcweir testedClassName = "com.sun.star.beans.XPropertySet"; 176cdf0e10cSrcweir } 177cdf0e10cSrcweir 178cdf0e10cSrcweir try 179cdf0e10cSrcweir { 180cdf0e10cSrcweir testedClass = Class.forName(testedClassName); 181cdf0e10cSrcweir } 182cdf0e10cSrcweir catch (ClassNotFoundException cnfE) 183cdf0e10cSrcweir { 184cdf0e10cSrcweir System.out.println(); 185cdf0e10cSrcweir cnfE.printStackTrace(log); 186cdf0e10cSrcweir log.println("could not find a class : " + getTestedClassName()); 187cdf0e10cSrcweir return null; 188cdf0e10cSrcweir } 189cdf0e10cSrcweir System.out.println(" is iface: [" + testedClassName + "] testcode: [" + entry.entryName + "]"); 190cdf0e10cSrcweir 1911738ad43Smseidel // querying the tested interface from the tested object 192cdf0e10cSrcweir XInterface tCase = tEnv.getTestObject(); 193cdf0e10cSrcweir Object oObj = UnoRuntime.queryInterface(testedClass, tEnv.getTestObject()); 194cdf0e10cSrcweir 195cdf0e10cSrcweir if (oObj == null) 196cdf0e10cSrcweir { 197cdf0e10cSrcweir if (entry.isOptional) 198cdf0e10cSrcweir { 199cdf0e10cSrcweir Summarizer.summarizeDown(entry, "Not supported but optional.OK"); 200cdf0e10cSrcweir } 201cdf0e10cSrcweir else 202cdf0e10cSrcweir { 203cdf0e10cSrcweir Summarizer.summarizeDown(entry, "queryInterface returned null.FAILED"); 204cdf0e10cSrcweir entry.ErrorMsg = "queryInterface returned null"; 205cdf0e10cSrcweir entry.hasErrorMsg = true; 206cdf0e10cSrcweir } 207cdf0e10cSrcweir 208cdf0e10cSrcweir return null; 209cdf0e10cSrcweir } 210cdf0e10cSrcweir 211cdf0e10cSrcweir //setting the field oObj 212cdf0e10cSrcweir setField("oObj", oObj); 213cdf0e10cSrcweir } 214cdf0e10cSrcweir 215cdf0e10cSrcweir // to perform some stuff before all method tests 216cdf0e10cSrcweir try 217cdf0e10cSrcweir { 218cdf0e10cSrcweir before(); 219cdf0e10cSrcweir } 220cdf0e10cSrcweir catch (Exception e) 221cdf0e10cSrcweir { 222cdf0e10cSrcweir setSubStates(e.toString()); 223cdf0e10cSrcweir return tRes; 224cdf0e10cSrcweir } 225cdf0e10cSrcweir 226cdf0e10cSrcweir // executing methods tests 227cdf0e10cSrcweir for (int i = 0; i < entry.SubEntryCount; i++) 228cdf0e10cSrcweir { 229cdf0e10cSrcweir DescEntry aSubEntry = entry.SubEntries[i]; 230cdf0e10cSrcweir try 231cdf0e10cSrcweir { 232cdf0e10cSrcweir final String sEntryName = aSubEntry.entryName; 233cdf0e10cSrcweir executeMethod(sEntryName); 234cdf0e10cSrcweir } 235cdf0e10cSrcweir catch (Exception e) 236cdf0e10cSrcweir { 237cdf0e10cSrcweir log.println("Exception while checking: " + aSubEntry.entryName + " : " + e.getMessage()); 238cdf0e10cSrcweir } 239cdf0e10cSrcweir } 240cdf0e10cSrcweir 241cdf0e10cSrcweir // to perform some stuff after all method tests 242cdf0e10cSrcweir try 243cdf0e10cSrcweir { 244cdf0e10cSrcweir after(); 245cdf0e10cSrcweir } 246cdf0e10cSrcweir catch (Exception e) 247cdf0e10cSrcweir { 248cdf0e10cSrcweir } 249cdf0e10cSrcweir 250cdf0e10cSrcweir return tRes; 251cdf0e10cSrcweir } 252cdf0e10cSrcweir 253cdf0e10cSrcweir /** 254cdf0e10cSrcweir * Is called before calling method tests, but after initialization. 255cdf0e10cSrcweir * Subclasses may override to perform actions before method tests. 256cdf0e10cSrcweir */ before()257cdf0e10cSrcweir protected void before() 258cdf0e10cSrcweir { 259cdf0e10cSrcweir } 260cdf0e10cSrcweir 261cdf0e10cSrcweir /** 262cdf0e10cSrcweir * Is called after calling method tests. Subclasses may override 263cdf0e10cSrcweir * to perform actions after method tests. 264cdf0e10cSrcweir */ after()265cdf0e10cSrcweir protected void after() 266cdf0e10cSrcweir { 267cdf0e10cSrcweir } 268cdf0e10cSrcweir 269cdf0e10cSrcweir /** 270cdf0e10cSrcweir * @return the name of the interface or the service tested. 271cdf0e10cSrcweir */ getTestedClassName()272cdf0e10cSrcweir protected String getTestedClassName() 273cdf0e10cSrcweir { 274cdf0e10cSrcweir String clsName = this.getClass().getName(); 275cdf0e10cSrcweir 276cdf0e10cSrcweir int firstDot = clsName.indexOf("."); 277cdf0e10cSrcweir int lastDot = clsName.lastIndexOf("."); 278cdf0e10cSrcweir 279cdf0e10cSrcweir String append = "com.sun.star."; 280cdf0e10cSrcweir 281cdf0e10cSrcweir if (entry.longName.indexOf("::drafts::com::") > -1) 282cdf0e10cSrcweir { 283cdf0e10cSrcweir append = "drafts.com.sun.star."; 284cdf0e10cSrcweir } 285cdf0e10cSrcweir 286cdf0e10cSrcweir return append + clsName.substring(firstDot + 1, lastDot + 1) + clsName.substring(lastDot + 2); 287cdf0e10cSrcweir } 288cdf0e10cSrcweir 289cdf0e10cSrcweir /** 290cdf0e10cSrcweir * Sets a method status. 291cdf0e10cSrcweir * 292cdf0e10cSrcweir * @param methName the method name to set status 293cdf0e10cSrcweir * @param methStatus the status to set to the method 294cdf0e10cSrcweir */ setStatus(String methName, Status methStatus)295cdf0e10cSrcweir protected void setStatus(String methName, Status methStatus) 296cdf0e10cSrcweir { 297cdf0e10cSrcweir tRes.tested(methName, methStatus); 298cdf0e10cSrcweir } 299cdf0e10cSrcweir 300cdf0e10cSrcweir /** 301cdf0e10cSrcweir * sets the substates 302cdf0e10cSrcweir */ setSubStates(String msg)303cdf0e10cSrcweir protected void setSubStates(String msg) 304cdf0e10cSrcweir { 305cdf0e10cSrcweir for (int k = 0; k < entry.SubEntryCount; k++) 306cdf0e10cSrcweir { 307cdf0e10cSrcweir entry.SubEntries[k].hasErrorMsg = true; 308cdf0e10cSrcweir entry.SubEntries[k].ErrorMsg = msg; 309cdf0e10cSrcweir if (entry.SubEntries[k].State.equals("UNKNOWN")) 310cdf0e10cSrcweir { 311cdf0e10cSrcweir entry.SubEntries[k].State = msg; 312cdf0e10cSrcweir } 313cdf0e10cSrcweir } 314cdf0e10cSrcweir 315cdf0e10cSrcweir } 316cdf0e10cSrcweir 317cdf0e10cSrcweir /** 318cdf0e10cSrcweir * Checks if the <code>method</code> is optional in the service. 319cdf0e10cSrcweir */ isOptional(String _method)320cdf0e10cSrcweir protected boolean isOptional(String _method) 321cdf0e10cSrcweir { 322cdf0e10cSrcweir for (int k = 0; k < entry.SubEntryCount; k++) 323cdf0e10cSrcweir { 324cdf0e10cSrcweir final String sName = entry.SubEntries[k].entryName; 325cdf0e10cSrcweir if (sName.equals(_method)) 326cdf0e10cSrcweir { 327cdf0e10cSrcweir final boolean bIsOptional = entry.SubEntries[k].isOptional; 328cdf0e10cSrcweir return bIsOptional; 329cdf0e10cSrcweir } 330cdf0e10cSrcweir } 331cdf0e10cSrcweir return false; 332cdf0e10cSrcweir } 333cdf0e10cSrcweir 334cdf0e10cSrcweir /** 335cdf0e10cSrcweir * Checks if the <code>method</code> test has been already called. 336cdf0e10cSrcweir */ isCalled(String method)337cdf0e10cSrcweir protected boolean isCalled(String method) 338cdf0e10cSrcweir { 339cdf0e10cSrcweir return methCalled.contains(method); 340cdf0e10cSrcweir } 341cdf0e10cSrcweir 342cdf0e10cSrcweir /** 343cdf0e10cSrcweir * Calling of the method indicates that the <code>method</code> test should 344cdf0e10cSrcweir * be called. The method checks this and if it is not called, calls it. 345cdf0e10cSrcweir * If the method is failed or skipped, it throws StatusException. 346cdf0e10cSrcweir */ requiredMethod(String method)347cdf0e10cSrcweir protected void requiredMethod(String method) 348cdf0e10cSrcweir { 349cdf0e10cSrcweir log.println("starting required method: " + method); 350cdf0e10cSrcweir executeMethod(method); 351cdf0e10cSrcweir Status mtStatus = tRes.getStatusFor(method); 352cdf0e10cSrcweir 353cdf0e10cSrcweir if (mtStatus != null && (!mtStatus.isPassed() || mtStatus.isFailed())) 354cdf0e10cSrcweir { 355cdf0e10cSrcweir log.println("! Required method " + method + " failed"); 356cdf0e10cSrcweir throw new StatusException(mtStatus); 357cdf0e10cSrcweir } 358cdf0e10cSrcweir } 359cdf0e10cSrcweir 360cdf0e10cSrcweir /** 361cdf0e10cSrcweir * Checks if the <code>method</code> was called, and if not, call it. 362cdf0e10cSrcweir * On contrary to requiredMethod(), he method doesn't check its status. 363cdf0e10cSrcweir */ executeMethod(String method)364cdf0e10cSrcweir protected void executeMethod(String method) 365cdf0e10cSrcweir { 366cdf0e10cSrcweir if (!isCalled(method)) 367cdf0e10cSrcweir { 368cdf0e10cSrcweir log.println("Execute: " + method); 369cdf0e10cSrcweir callMethod(method); 370cdf0e10cSrcweir log.println(method + ": " + tRes.getStatusFor(method)); 371cdf0e10cSrcweir log.println(); 372cdf0e10cSrcweir } 373cdf0e10cSrcweir } 374cdf0e10cSrcweir 375cdf0e10cSrcweir /** 376cdf0e10cSrcweir * Just calls the <code>method</code> test. 377cdf0e10cSrcweir */ callMethod(String method)378cdf0e10cSrcweir protected void callMethod(String method) 379cdf0e10cSrcweir { 380cdf0e10cSrcweir methCalled.add(method); 381cdf0e10cSrcweir invokeTestMethod(getMethodFor(method), method); 382cdf0e10cSrcweir } 383cdf0e10cSrcweir 384cdf0e10cSrcweir /** 385cdf0e10cSrcweir * Invokes a test method of the subclass using reflection API. Handles 386cdf0e10cSrcweir * the method results and sets its status. 387cdf0e10cSrcweir * 388cdf0e10cSrcweir * @param meth the subclass' method to invoke 389cdf0e10cSrcweir * @param methName the name of the method 390cdf0e10cSrcweir */ invokeTestMethod(Method meth, String methName)391cdf0e10cSrcweir protected void invokeTestMethod(Method meth, String methName) 392cdf0e10cSrcweir { 393cdf0e10cSrcweir if (meth == null) 394cdf0e10cSrcweir { 395cdf0e10cSrcweir setStatus(methName, Status.skipped(false)); 396cdf0e10cSrcweir } 397cdf0e10cSrcweir else 398cdf0e10cSrcweir { 399cdf0e10cSrcweir Status stat; 400cdf0e10cSrcweir 401cdf0e10cSrcweir try 402cdf0e10cSrcweir { 403cdf0e10cSrcweir meth.invoke(this, new Object[0]); 404cdf0e10cSrcweir return; 405cdf0e10cSrcweir } 406cdf0e10cSrcweir catch (InvocationTargetException itE) 407cdf0e10cSrcweir { 408cdf0e10cSrcweir Throwable t = itE.getTargetException(); 409cdf0e10cSrcweir 410cdf0e10cSrcweir if (t instanceof StatusException) 411cdf0e10cSrcweir { 412cdf0e10cSrcweir stat = ((StatusException) t).getStatus(); 413cdf0e10cSrcweir } 414cdf0e10cSrcweir else 415cdf0e10cSrcweir { 416cdf0e10cSrcweir t.printStackTrace(log); 417cdf0e10cSrcweir stat = Status.exception(t); 418cdf0e10cSrcweir } 419cdf0e10cSrcweir } 420cdf0e10cSrcweir catch (IllegalAccessException iaE) 421cdf0e10cSrcweir { 422cdf0e10cSrcweir iaE.printStackTrace(log); 423cdf0e10cSrcweir stat = Status.exception(iaE); 424cdf0e10cSrcweir } 425cdf0e10cSrcweir catch (IllegalArgumentException iaE) 426cdf0e10cSrcweir { 427cdf0e10cSrcweir iaE.printStackTrace(log); 428cdf0e10cSrcweir stat = Status.exception(iaE); 429cdf0e10cSrcweir } 430cdf0e10cSrcweir catch (ClassCastException ccE) 431cdf0e10cSrcweir { 432cdf0e10cSrcweir ccE.printStackTrace(log); 433cdf0e10cSrcweir stat = Status.exception(ccE); 434cdf0e10cSrcweir } 435cdf0e10cSrcweir 436cdf0e10cSrcweir setStatus(methName, stat); 437cdf0e10cSrcweir } 438cdf0e10cSrcweir } 439cdf0e10cSrcweir 440cdf0e10cSrcweir /** 441cdf0e10cSrcweir * Finds a testing method for the <code>method</code> of the interface. 442cdf0e10cSrcweir * 443cdf0e10cSrcweir * @return the testing method, if found, <tt>null</tt> otherwise 444cdf0e10cSrcweir */ getMethodFor(String method)445cdf0e10cSrcweir protected Method getMethodFor(String method) 446cdf0e10cSrcweir { 447cdf0e10cSrcweir String mName = "_" + method; 448cdf0e10cSrcweir 449cdf0e10cSrcweir if (mName.endsWith("()")) 450cdf0e10cSrcweir { 451cdf0e10cSrcweir mName = mName.substring(0, mName.length() - 2); 452cdf0e10cSrcweir } 453cdf0e10cSrcweir 454cdf0e10cSrcweir final Class[] paramTypes = new Class[0]; 455cdf0e10cSrcweir 456cdf0e10cSrcweir try 457cdf0e10cSrcweir { 458cdf0e10cSrcweir return this.getClass().getDeclaredMethod(mName, paramTypes); 459cdf0e10cSrcweir } 460cdf0e10cSrcweir catch (NoSuchMethodException nsmE) 461cdf0e10cSrcweir { 462cdf0e10cSrcweir return null; 463cdf0e10cSrcweir } 464cdf0e10cSrcweir } 465cdf0e10cSrcweir 466cdf0e10cSrcweir /** 467cdf0e10cSrcweir * @return the name of the interface tested 468cdf0e10cSrcweir */ getInterfaceName()469cdf0e10cSrcweir public String getInterfaceName() 470cdf0e10cSrcweir { 471cdf0e10cSrcweir String clName = this.getClass().getName(); 472cdf0e10cSrcweir return clName.substring(clName.lastIndexOf('.') + 1); 473cdf0e10cSrcweir } 474cdf0e10cSrcweir 475cdf0e10cSrcweir /** 476cdf0e10cSrcweir * Initializes <code>fieldName</code> of the subclass with 477cdf0e10cSrcweir * <code>value</code>. 478cdf0e10cSrcweir * 479cdf0e10cSrcweir * @return Status describing the result of the operation. 480cdf0e10cSrcweir */ setField(String fieldName, Object value)481cdf0e10cSrcweir protected Status setField(String fieldName, Object value) 482cdf0e10cSrcweir { 483cdf0e10cSrcweir Field objField; 484cdf0e10cSrcweir 485cdf0e10cSrcweir try 486cdf0e10cSrcweir { 487cdf0e10cSrcweir objField = this.getClass().getField(fieldName); 488cdf0e10cSrcweir } 489cdf0e10cSrcweir catch (NoSuchFieldException nsfE) 490cdf0e10cSrcweir { 491cdf0e10cSrcweir return Status.exception(nsfE); 492cdf0e10cSrcweir } 493cdf0e10cSrcweir 494cdf0e10cSrcweir try 495cdf0e10cSrcweir { 496cdf0e10cSrcweir objField.set(this, value); 497cdf0e10cSrcweir return Status.passed(true); 498cdf0e10cSrcweir } 499cdf0e10cSrcweir catch (IllegalArgumentException iaE) 500cdf0e10cSrcweir { 501cdf0e10cSrcweir return Status.exception(iaE); 502cdf0e10cSrcweir } 503cdf0e10cSrcweir catch (IllegalAccessException iaE) 504cdf0e10cSrcweir { 505cdf0e10cSrcweir return Status.exception(iaE); 506cdf0e10cSrcweir } 507cdf0e10cSrcweir } 508cdf0e10cSrcweir } 509