TelephonyTestUtils.java revision aeb892fb006035636dd0959ad4e4f9cb106ac565
1aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan/*
2aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * Copyright (C) 2015 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;
20aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan
21aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajanimport com.android.internal.telephony.cdma.SmsMessage;
22aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan
23aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajanimport java.lang.reflect.Constructor;
24aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajanimport java.lang.reflect.InvocationTargetException;
25aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajanimport java.lang.reflect.Method;
26aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajanimport junit.framework.Assert;
27aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan
28aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan/**
29aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * This class provides reflection for classes/methods that are not accessible from tests.
30aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan * Convention for helper function naming is: classNameFunctionName()
31aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan */
32aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajanpublic class TelephonyTestUtils {
33aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan
34aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan    /**
35aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * This function calls constructor that takes in params.
36aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * This function does not work if any of the parameter passed in is null because
37aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * params[i].getClass() fails. In that case it needs to be handled by the caller (it knows the
38aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * param types so getClass() is not needed)
39aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     */
40aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan    public static Object createNewInstance(String className, Object... params) {
41aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        try {
42aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Class clazz = Class.forName(className);
43aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            int numParam = params.length;
44aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Class<?>[] paramType = new Class[numParam];
45aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            for (int i = 0; i < numParam; i++) {
46aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan                paramType[i] = params[i].getClass();
47aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            }
48aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Constructor constructor = clazz.getDeclaredConstructor(paramType);
49aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            constructor.setAccessible(true);
50aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan
51aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            return constructor.newInstance(params);
52aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        } catch (Exception e) {
53aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Assert.fail(e.toString());
54aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            return null;
55aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        }
56aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan    }
57aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan
58aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan    /**
59aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * This function does not work if any of the parameter passed in is null because
60aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * params[i].getClass() fails. In that case it needs to be handled by the caller (it knows the
61aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * param types so getClass() is not needed)
62aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     */
63aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan    public static Object invokeStaticMethod(Class<?> clazz, String method, Object... params) {
64aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        try {
65aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            int numParam = params.length;
66aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Class<?>[] paramType = new Class[numParam];
67aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            for (int i = 0; i < numParam; i++) {
68aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan                paramType[i] = params[i].getClass();
69aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            }
70aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Method methodReflection = clazz.getDeclaredMethod(method, paramType);
71aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            methodReflection.setAccessible(true);
72aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            return methodReflection.invoke(null, params);
73aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        } catch (Exception e) {
74aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Assert.fail(e.toString());
75aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            return null;
76aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        }
77aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan    }
78aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan
79aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan    /**
80aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * This is needed when the test expects the method in source being called to throw an exception.
81aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * Throwable will be an instanceof the expected exception.
82aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * This function does not work if any of the parameter passed in is null because
83aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * params[i].getClass() fails. In that case it needs to be handled by the caller (it knows the
84aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * param types so getClass() is not needed)
85aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     */
86aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan    public static Object invokeStaticMethodThrowsException(Class<?> clazz, String method,
87aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan                                                           Object... params) throws Throwable {
88aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        try {
89aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            int numParam = params.length;
90aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Class<?>[] paramType = new Class[numParam];
91aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            for (int i = 0; i < numParam; i++) {
92aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan                paramType[i] = params[i].getClass();
93aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            }
94aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Method methodReflection = clazz.getDeclaredMethod(method, paramType);
95aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            methodReflection.setAccessible(true);
96aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            return methodReflection.invoke(null, params);
97aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        } catch (InvocationTargetException e) {
98aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            throw e.getTargetException();
99aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        } catch (Exception e) {
100aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Assert.fail(e.toString());
101aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            return null;
102aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        }
103aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan    }
104aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan
105aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan    /**
106aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * This function does not work if any of the parameter passed in is null because
107aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * params[i].getClass() fails. In that case it needs to be handled by the caller (it knows the
108aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * param types so getClass() is not needed)
109aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     */
110aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan    public static Object invokeNonStaticMethod(Class<?> clazz, Object caller, String method,
111aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan                                               Object... params) {
112aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        try {
113aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            int numParam = params.length;
114aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Class<?>[] paramType = new Class[numParam];
115aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            for (int i = 0; i < numParam; i++) {
116aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan                paramType[i] = params[i].getClass();
117aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            }
118aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Method methodReflection = clazz.getDeclaredMethod(method, paramType);
119aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            methodReflection.setAccessible(true);
120aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            return methodReflection.invoke(caller, params);
121aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        } catch (Exception e) {
122aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Assert.fail(e.toString());
123aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            return null;
124aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        }
125aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan    }
126aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan
127aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan    /**
128aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * This is needed when the test expects the method in source being called to throw an exception.
129aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * Throwable will be an instanceof the expected exception.
130aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * This function does not work if any of the parameter passed in is null because
131aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * params[i].getClass() fails. In that case it needs to be handled by the caller (it knows the
132aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     * param types so getClass() is not needed)
133aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan     */
134aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan    public static Object invokeNonStaticMethodThrowsException(Class<?> clazz, Object caller,
135aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan                                                              String method, Object... params)
136aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            throws Throwable {
137aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        try {
138aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            int numParam = params.length;
139aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Class<?>[] paramType = new Class[numParam];
140aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            for (int i = 0; i < numParam; i++) {
141aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan                paramType[i] = params[i].getClass();
142aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            }
143aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Method methodReflection = clazz.getDeclaredMethod(method, paramType);
144aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            methodReflection.setAccessible(true);
145aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            return methodReflection.invoke(caller, params);
146aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        } catch (InvocationTargetException e) {
147aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            throw e.getTargetException();
148aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        } catch (Exception e) {
149aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            Assert.fail(e.toString());
150aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan            return null;
151aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan        }
152aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan    }
153aeb892fb006035636dd0959ad4e4f9cb106ac565Amit Mahajan}
154