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