1aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan/* 29c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu * Copyright (C) 2016 The Android Open Source Project 3aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * 4aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * Licensed under the Apache License, Version 2.0 (the "License"); 5aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * you may not use this file except in compliance with the License. 6aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * You may obtain a copy of the License at 7aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * 8aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * http://www.apache.org/licenses/LICENSE-2.0 9aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * 10aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * Unless required by applicable law or agreed to in writing, software 11aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * distributed under the License is distributed on an "AS IS" BASIS, 12aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * See the License for the specific language governing permissions and 14aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * limitations under the License. 15aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan */ 16aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan 17aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajanpackage com.android.internal.telephony; 18aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan 19aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajanimport android.telephony.SmsCbMessage; 2091680ad599f9e15a32c3a9798021778e8d4eab6eAmit Mahajanimport android.util.Log; 21aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan 22aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajanimport com.android.internal.telephony.cdma.SmsMessage; 23aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan 24aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajanimport java.lang.reflect.Constructor; 25aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajanimport java.lang.reflect.InvocationTargetException; 26aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajanimport java.lang.reflect.Method; 27aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajanimport junit.framework.Assert; 28aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan 29aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan/** 30aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * This class provides reflection for classes/methods that are not accessible from tests. 31aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * Convention for helper function naming is: classNameFunctionName() 32aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan */ 33aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajanpublic class TelephonyTestUtils { 3491680ad599f9e15a32c3a9798021778e8d4eab6eAmit Mahajan private static final String TAG = "TelephonyTestUtils"; 35aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan 36aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan /** 37aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * This function calls constructor that takes in params. 38aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * This function does not work if any of the parameter passed in is null because 39aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * params[i].getClass() fails. In that case it needs to be handled by the caller (it knows the 40aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * param types so getClass() is not needed) 41aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan */ 42aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan public static Object createNewInstance(String className, Object... params) { 43aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan try { 44aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Class clazz = Class.forName(className); 45aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan int numParam = params.length; 46aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Class<?>[] paramType = new Class[numParam]; 47aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan for (int i = 0; i < numParam; i++) { 48aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan paramType[i] = params[i].getClass(); 49aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } 50aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Constructor constructor = clazz.getDeclaredConstructor(paramType); 51aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan constructor.setAccessible(true); 52aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan 53aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan return constructor.newInstance(params); 54aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } catch (Exception e) { 55aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Assert.fail(e.toString()); 56aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan return null; 57aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } 58aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } 59aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan 60aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan /** 61aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * This function does not work if any of the parameter passed in is null because 62aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * params[i].getClass() fails. In that case it needs to be handled by the caller (it knows the 63aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * param types so getClass() is not needed) 64aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan */ 65aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan public static Object invokeStaticMethod(Class<?> clazz, String method, Object... params) { 66aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan try { 67aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan int numParam = params.length; 68aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Class<?>[] paramType = new Class[numParam]; 69aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan for (int i = 0; i < numParam; i++) { 70aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan paramType[i] = params[i].getClass(); 71aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } 72aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Method methodReflection = clazz.getDeclaredMethod(method, paramType); 73aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan methodReflection.setAccessible(true); 74aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan return methodReflection.invoke(null, params); 75aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } catch (Exception e) { 76aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Assert.fail(e.toString()); 77aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan return null; 78aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } 79aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } 80aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan 81aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan /** 82aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * This is needed when the test expects the method in source being called to throw an exception. 83aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * Throwable will be an instanceof the expected exception. 84aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * This function does not work if any of the parameter passed in is null because 85aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * params[i].getClass() fails. In that case it needs to be handled by the caller (it knows the 86aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * param types so getClass() is not needed) 87aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan */ 88aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan public static Object invokeStaticMethodThrowsException(Class<?> clazz, String method, 89aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Object... params) throws Throwable { 90aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan try { 91aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan int numParam = params.length; 92aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Class<?>[] paramType = new Class[numParam]; 93aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan for (int i = 0; i < numParam; i++) { 94aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan paramType[i] = params[i].getClass(); 95aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } 96aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Method methodReflection = clazz.getDeclaredMethod(method, paramType); 97aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan methodReflection.setAccessible(true); 98aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan return methodReflection.invoke(null, params); 99aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } catch (InvocationTargetException e) { 100aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan throw e.getTargetException(); 101aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } catch (Exception e) { 102aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Assert.fail(e.toString()); 103aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan return null; 104aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } 105aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } 106aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan 107aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan /** 108aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * This function does not work if any of the parameter passed in is null because 109aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * params[i].getClass() fails. In that case it needs to be handled by the caller (it knows the 110aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * param types so getClass() is not needed) 111aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan */ 112aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan public static Object invokeNonStaticMethod(Class<?> clazz, Object caller, String method, 113aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Object... params) { 114aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan try { 115aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan int numParam = params.length; 116aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Class<?>[] paramType = new Class[numParam]; 117aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan for (int i = 0; i < numParam; i++) { 118aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan paramType[i] = params[i].getClass(); 119aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } 120aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Method methodReflection = clazz.getDeclaredMethod(method, paramType); 121aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan methodReflection.setAccessible(true); 122aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan return methodReflection.invoke(caller, params); 123aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } catch (Exception e) { 124aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Assert.fail(e.toString()); 125aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan return null; 126aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } 127aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } 128aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan 129aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan /** 130aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * This is needed when the test expects the method in source being called to throw an exception. 131aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * Throwable will be an instanceof the expected exception. 132aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * This function does not work if any of the parameter passed in is null because 133aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * params[i].getClass() fails. In that case it needs to be handled by the caller (it knows the 134aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * param types so getClass() is not needed) 135aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan */ 136aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan public static Object invokeNonStaticMethodThrowsException(Class<?> clazz, Object caller, 137aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan String method, Object... params) 138aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan throws Throwable { 139aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan try { 140aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan int numParam = params.length; 141aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Class<?>[] paramType = new Class[numParam]; 142aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan for (int i = 0; i < numParam; i++) { 143aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan paramType[i] = params[i].getClass(); 144aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } 145aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Method methodReflection = clazz.getDeclaredMethod(method, paramType); 146aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan methodReflection.setAccessible(true); 147aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan return methodReflection.invoke(caller, params); 148aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } catch (InvocationTargetException e) { 149aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan throw e.getTargetException(); 150aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } catch (Exception e) { 151aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan Assert.fail(e.toString()); 152aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan return null; 153aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } 154aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan } 15591680ad599f9e15a32c3a9798021778e8d4eab6eAmit Mahajan 15691680ad599f9e15a32c3a9798021778e8d4eab6eAmit Mahajan public static void waitForMs(long ms) { 15791680ad599f9e15a32c3a9798021778e8d4eab6eAmit Mahajan try { 15891680ad599f9e15a32c3a9798021778e8d4eab6eAmit Mahajan Thread.sleep(ms); 15991680ad599f9e15a32c3a9798021778e8d4eab6eAmit Mahajan } catch (InterruptedException e) { 16091680ad599f9e15a32c3a9798021778e8d4eab6eAmit Mahajan logd("InterruptedException while waiting: " + e); 16191680ad599f9e15a32c3a9798021778e8d4eab6eAmit Mahajan } 16291680ad599f9e15a32c3a9798021778e8d4eab6eAmit Mahajan } 16391680ad599f9e15a32c3a9798021778e8d4eab6eAmit Mahajan 16491680ad599f9e15a32c3a9798021778e8d4eab6eAmit Mahajan private static void logd(String s) { 16591680ad599f9e15a32c3a9798021778e8d4eab6eAmit Mahajan Log.d(TAG, s); 16691680ad599f9e15a32c3a9798021778e8d4eab6eAmit Mahajan } 167aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan} 168