1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.internal.telephony.dataconnection;
18
19import android.os.PersistableBundle;
20import android.telephony.CarrierConfigManager;
21import android.test.suitebuilder.annotation.SmallTest;
22
23import com.android.internal.telephony.TelephonyTest;
24
25import org.junit.After;
26import org.junit.Before;
27import org.junit.Test;
28
29import java.util.ArrayList;
30
31import static junit.framework.Assert.assertEquals;
32import static junit.framework.Assert.assertFalse;
33import static junit.framework.Assert.assertTrue;
34import static org.mockito.Mockito.doReturn;
35
36public class DcFailCauseTest extends TelephonyTest {
37
38    private class DcFailCauseData {
39        public final int mCause;
40        public final boolean mPermanentFailure;
41        public final boolean mEventLoggable;
42        DcFailCauseData(int cause, boolean permanentFailure, boolean eventLoggable) {
43            mCause = cause;
44            mPermanentFailure = permanentFailure;
45            mEventLoggable = eventLoggable;
46        }
47    }
48
49    private ArrayList<DcFailCauseData> mFailCauseDataList;
50
51    @Before
52    public void setUp() throws Exception {
53        super.setUp(getClass().getSimpleName());
54
55        mFailCauseDataList = new ArrayList<>();
56
57        mFailCauseDataList.add(new DcFailCauseData(0, false, false));
58        mFailCauseDataList.add(new DcFailCauseData(0x08, true, true));
59        mFailCauseDataList.add(new DcFailCauseData(0x0E, false, false));
60        mFailCauseDataList.add(new DcFailCauseData(0x19, false, false));
61        mFailCauseDataList.add(new DcFailCauseData(0x1A, false, true));
62        mFailCauseDataList.add(new DcFailCauseData(0x1B, true, false));
63        mFailCauseDataList.add(new DcFailCauseData(0x1C, true, true));
64        mFailCauseDataList.add(new DcFailCauseData(0x1D, true, true));
65        mFailCauseDataList.add(new DcFailCauseData(0x1E, true, true));
66        mFailCauseDataList.add(new DcFailCauseData(0x1F, false, true));
67        mFailCauseDataList.add(new DcFailCauseData(0x20, true, true));
68        mFailCauseDataList.add(new DcFailCauseData(0x21, true, true));
69        mFailCauseDataList.add(new DcFailCauseData(0x22, false, true));
70        mFailCauseDataList.add(new DcFailCauseData(0x23, true, true));
71        mFailCauseDataList.add(new DcFailCauseData(0x24, false, false));
72        mFailCauseDataList.add(new DcFailCauseData(0x25, false, false));
73        mFailCauseDataList.add(new DcFailCauseData(0x26, false, false));
74        mFailCauseDataList.add(new DcFailCauseData(0x27, false, false));
75        mFailCauseDataList.add(new DcFailCauseData(0x28, false, false));
76        mFailCauseDataList.add(new DcFailCauseData(0x29, false, false));
77        mFailCauseDataList.add(new DcFailCauseData(0x2A, false, false));
78        mFailCauseDataList.add(new DcFailCauseData(0x2B, false, false));
79        mFailCauseDataList.add(new DcFailCauseData(0x2C, false, false));
80        mFailCauseDataList.add(new DcFailCauseData(0x2D, false, false));
81        mFailCauseDataList.add(new DcFailCauseData(0x2E, false, false));
82        mFailCauseDataList.add(new DcFailCauseData(0x32, true, true));
83        mFailCauseDataList.add(new DcFailCauseData(0x33, true, true));
84        mFailCauseDataList.add(new DcFailCauseData(0x34, false, false));
85        mFailCauseDataList.add(new DcFailCauseData(0x35, false, false));
86        mFailCauseDataList.add(new DcFailCauseData(0x36, false, false));
87        mFailCauseDataList.add(new DcFailCauseData(0x37, false, false));
88        mFailCauseDataList.add(new DcFailCauseData(0x41, false, false));
89        mFailCauseDataList.add(new DcFailCauseData(0x42, false, false));
90        mFailCauseDataList.add(new DcFailCauseData(0x51, false, false));
91        mFailCauseDataList.add(new DcFailCauseData(0x5F, false, false));
92        mFailCauseDataList.add(new DcFailCauseData(0x60, false, false));
93        mFailCauseDataList.add(new DcFailCauseData(0x61, false, false));
94        mFailCauseDataList.add(new DcFailCauseData(0x62, false, false));
95        mFailCauseDataList.add(new DcFailCauseData(0x63, false, false));
96        mFailCauseDataList.add(new DcFailCauseData(0x64, false, false));
97        mFailCauseDataList.add(new DcFailCauseData(0x65, false, false));
98        mFailCauseDataList.add(new DcFailCauseData(0x6F, true, true));
99        mFailCauseDataList.add(new DcFailCauseData(0x70, false, false));
100        mFailCauseDataList.add(new DcFailCauseData(0x71, false, false));
101        mFailCauseDataList.add(new DcFailCauseData(0x72, false, false));
102        mFailCauseDataList.add(new DcFailCauseData(0x73, false, false));
103        mFailCauseDataList.add(new DcFailCauseData(0x74, false, false));
104        mFailCauseDataList.add(new DcFailCauseData(0x75, false, false));
105        mFailCauseDataList.add(new DcFailCauseData(0x76, false, false));
106        mFailCauseDataList.add(new DcFailCauseData(0x77, false, false));
107        mFailCauseDataList.add(new DcFailCauseData(0x78, false, false));
108        mFailCauseDataList.add(new DcFailCauseData(0x79, false, false));
109        mFailCauseDataList.add(new DcFailCauseData(0x7A, false, false));
110        mFailCauseDataList.add(new DcFailCauseData(0x1001, false, false));
111        mFailCauseDataList.add(new DcFailCauseData(0x1002, false, false));
112        mFailCauseDataList.add(new DcFailCauseData(0x1003, false, false));
113        mFailCauseDataList.add(new DcFailCauseData(0x1004, false, false));
114        mFailCauseDataList.add(new DcFailCauseData(0x1005, false, false));
115        mFailCauseDataList.add(new DcFailCauseData(0x1006, false, false));
116        mFailCauseDataList.add(new DcFailCauseData(0x1007, false, false));
117        mFailCauseDataList.add(new DcFailCauseData(0x1008, false, false));
118        mFailCauseDataList.add(new DcFailCauseData(0x1009, false, false));
119        mFailCauseDataList.add(new DcFailCauseData(0x100A, false, false));
120        mFailCauseDataList.add(new DcFailCauseData(0x100B, false, false));
121        mFailCauseDataList.add(new DcFailCauseData(0x100C, false, false));
122        mFailCauseDataList.add(new DcFailCauseData(0x100D, false, false));
123        mFailCauseDataList.add(new DcFailCauseData(0x100E, false, false));
124        mFailCauseDataList.add(new DcFailCauseData(0x100F, false, false));
125        mFailCauseDataList.add(new DcFailCauseData(-1, false, false));
126        mFailCauseDataList.add(new DcFailCauseData(-2, false, false));
127        mFailCauseDataList.add(new DcFailCauseData(-3, true, true));
128        mFailCauseDataList.add(new DcFailCauseData(-4, false, false));
129        mFailCauseDataList.add(new DcFailCauseData(-5, true, true));
130        mFailCauseDataList.add(new DcFailCauseData(-6, true, true));
131        mFailCauseDataList.add(new DcFailCauseData(0xFFFF, false, false));
132        mFailCauseDataList.add(new DcFailCauseData(0x10000, false, false));
133        mFailCauseDataList.add(new DcFailCauseData(0x10001, true, false));
134        mFailCauseDataList.add(new DcFailCauseData(0x10002, true, true));
135        mFailCauseDataList.add(new DcFailCauseData(0x10003, false, false));
136        mFailCauseDataList.add(new DcFailCauseData(0x10004, false, false));
137        mFailCauseDataList.add(new DcFailCauseData(0x10005, false, false));
138    }
139
140    @After
141    public void tearDown() throws Exception {
142        super.tearDown();
143    }
144
145    @Test
146    @SmallTest
147    public void testPermanentFailDefault() throws Exception {
148        for (DcFailCauseData data : mFailCauseDataList) {
149            assertEquals("cause = " + data.mCause, data.mPermanentFailure, DcFailCause.fromInt(
150                    data.mCause).isPermanentFailure(mContext, mPhone.getSubId()));
151        }
152        assertFalse(DcFailCause.fromInt(123456).isPermanentFailure(mContext, mPhone.getSubId()));
153    }
154
155    @Test
156    @SmallTest
157    public void testPermanentFailConfigured() throws Exception {
158
159        doReturn(2).when(mPhone).getSubId();
160        PersistableBundle mBundle = mContextFixture.getCarrierConfigBundle();
161        mBundle.putStringArray(
162                CarrierConfigManager.KEY_CARRIER_DATA_CALL_PERMANENT_FAILURE_STRINGS,
163                new String[]{"SERVICE_OPTION_NOT_SUBSCRIBED", "TETHERED_CALL_ACTIVE"});
164
165        // Run it twice to make sure the cached carrier config is working as expected.
166        for (int i = 0; i < 2; i++) {
167            for (DcFailCauseData data : mFailCauseDataList) {
168                if (DcFailCause.fromInt(data.mCause).equals(
169                        DcFailCause.SERVICE_OPTION_NOT_SUBSCRIBED) ||
170                        DcFailCause.fromInt(data.mCause).equals(DcFailCause.TETHERED_CALL_ACTIVE)) {
171                    assertTrue("cause = " + data.mCause, DcFailCause.fromInt(data.mCause).
172                            isPermanentFailure(mContext, mPhone.getSubId()));
173                } else {
174                    assertFalse("cause = " + data.mCause, DcFailCause.fromInt(data.mCause).
175                            isPermanentFailure(mContext, mPhone.getSubId()));
176                }
177            }
178        }
179    }
180
181    @Test
182    @SmallTest
183    public void testEventLoggable() throws Exception {
184        for (DcFailCauseData data : mFailCauseDataList) {
185            assertEquals("cause = " + data.mCause, data.mEventLoggable,
186                    DcFailCause.fromInt(data.mCause).isEventLoggable());
187        }
188        assertFalse(DcFailCause.fromInt(123456).isEventLoggable());
189    }
190
191    @Test
192    @SmallTest
193    public void testGetErrorCode() throws Exception {
194        for (DcFailCauseData data : mFailCauseDataList) {
195            assertEquals(data.mCause, DcFailCause.fromInt(data.mCause).getErrorCode());
196        }
197        assertEquals(DcFailCause.UNKNOWN.getErrorCode(),
198                DcFailCause.fromInt(123456).getErrorCode());
199    }
200}
201