1/*
2 * Copyright (C) 2011 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;
18
19import android.test.AndroidTestCase;
20
21import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
22
23import java.util.ArrayList;
24
25/**
26 * Test cases for the IntRangeManager class.
27 */
28public class IntRangeManagerTest extends AndroidTestCase {
29
30    private static final int SMS_CB_CODE_SCHEME_MIN = 0;
31    private static final int SMS_CB_CODE_SCHEME_MAX = 255;
32
33    private static final int FLAG_START_UPDATE_CALLED   = 0x01;
34    private static final int FLAG_ADD_RANGE_CALLED      = 0x02;
35    private static final int FLAG_FINISH_UPDATE_CALLED  = 0x04;
36
37    private static final int ALL_FLAGS_SET = FLAG_START_UPDATE_CALLED | FLAG_ADD_RANGE_CALLED |
38            FLAG_FINISH_UPDATE_CALLED;
39
40    /** Dummy IntRangeManager for testing. */
41    class TestIntRangeManager extends IntRangeManager {
42        ArrayList<SmsBroadcastConfigInfo> mConfigList =
43                new ArrayList<SmsBroadcastConfigInfo>();
44
45        int flags;
46        boolean finishUpdateReturnValue = true;
47
48        /**
49         * Called when the list of enabled ranges has changed. This will be
50         * followed by zero or more calls to {@link #addRange} followed by
51         * a call to {@link #finishUpdate}.
52         */
53        protected void startUpdate() {
54            mConfigList.clear();
55            flags |= FLAG_START_UPDATE_CALLED;
56        }
57
58        /**
59         * Called after {@link #startUpdate} to indicate a range of enabled
60         * values.
61         * @param startId the first id included in the range
62         * @param endId the last id included in the range
63         */
64        protected void addRange(int startId, int endId, boolean selected) {
65            mConfigList.add(new SmsBroadcastConfigInfo(startId, endId,
66                        SMS_CB_CODE_SCHEME_MIN, SMS_CB_CODE_SCHEME_MAX, selected));
67            flags |= FLAG_ADD_RANGE_CALLED;
68        }
69
70        /**
71         * Called to indicate the end of a range update started by the
72         * previous call to {@link #startUpdate}.
73         */
74        protected boolean finishUpdate() {
75            flags |= FLAG_FINISH_UPDATE_CALLED;
76            return finishUpdateReturnValue;
77        }
78
79        /** Reset the object for the next test case. */
80        void reset() {
81            flags = 0;
82            mConfigList.clear();
83        }
84    }
85
86    public void testEmptyRangeManager() {
87        TestIntRangeManager testManager = new TestIntRangeManager();
88        assertEquals("expecting empty configlist", 0, testManager.mConfigList.size());
89    }
90
91    private void checkConfigInfo(SmsBroadcastConfigInfo info, int fromServiceId,
92            int toServiceId, int fromCodeScheme, int toCodeScheme, boolean selected) {
93        assertEquals("fromServiceId", fromServiceId, info.getFromServiceId());
94        assertEquals("toServiceId", toServiceId, info.getToServiceId());
95        assertEquals("fromCodeScheme", fromCodeScheme, info.getFromCodeScheme());
96        assertEquals("toCodeScheme", toCodeScheme, info.getToCodeScheme());
97        assertEquals("selected", selected, info.isSelected());
98    }
99
100    public void testAddSingleChannel() {
101        TestIntRangeManager testManager = new TestIntRangeManager();
102        assertEquals("flags before test", 0, testManager.flags);
103        assertTrue("enabling range", testManager.enableRange(123, 123, "client1"));
104        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
105        assertEquals("configlist size", 1, testManager.mConfigList.size());
106        checkConfigInfo(testManager.mConfigList.get(0), 123, 123, SMS_CB_CODE_SCHEME_MIN,
107                SMS_CB_CODE_SCHEME_MAX, true);
108        testManager.reset();
109        assertTrue("updating ranges", testManager.updateRanges());
110        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
111        assertEquals("configlist size", 1, testManager.mConfigList.size());
112        checkConfigInfo(testManager.mConfigList.get(0), 123, 123, SMS_CB_CODE_SCHEME_MIN,
113                SMS_CB_CODE_SCHEME_MAX, true);
114    }
115
116    public void testRemoveSingleChannel() {
117        TestIntRangeManager testManager = new TestIntRangeManager();
118        assertTrue("enabling range", testManager.enableRange(123, 123, "client1"));
119        assertEquals("flags after enable", ALL_FLAGS_SET, testManager.flags);
120        assertEquals("configlist size", 1, testManager.mConfigList.size());
121        testManager.reset();
122        assertTrue("disabling range", testManager.disableRange(123, 123, "client1"));
123        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
124        assertEquals("configlist size", 1, testManager.mConfigList.size());
125        checkConfigInfo(testManager.mConfigList.get(0), 123, 123, SMS_CB_CODE_SCHEME_MIN,
126                SMS_CB_CODE_SCHEME_MAX, false);
127        testManager.reset();
128        assertTrue("updating ranges", testManager.updateRanges());
129        assertEquals("flags after test", FLAG_START_UPDATE_CALLED | FLAG_FINISH_UPDATE_CALLED,
130                testManager.flags);
131        assertEquals("configlist size", 0, testManager.mConfigList.size());
132    }
133
134    public void testRemoveBadChannel() {
135        TestIntRangeManager testManager = new TestIntRangeManager();
136        assertFalse("disabling missing range", testManager.disableRange(123, 123, "client1"));
137        assertEquals("flags after test", 0, testManager.flags);
138        assertEquals("configlist size", 0, testManager.mConfigList.size());
139    }
140
141    public void testAddTwoChannels() {
142        TestIntRangeManager testManager = new TestIntRangeManager();
143        assertEquals("flags before test", 0, testManager.flags);
144        assertTrue("enabling range 1", testManager.enableRange(100, 120, "client1"));
145        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
146        assertEquals("configlist size", 1, testManager.mConfigList.size());
147        checkConfigInfo(testManager.mConfigList.get(0), 100, 120, SMS_CB_CODE_SCHEME_MIN,
148                SMS_CB_CODE_SCHEME_MAX, true);
149        testManager.reset();
150        assertTrue("enabling range 2", testManager.enableRange(200, 250, "client2"));
151        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
152        assertEquals("configlist size", 1, testManager.mConfigList.size());
153        checkConfigInfo(testManager.mConfigList.get(0), 200, 250, SMS_CB_CODE_SCHEME_MIN,
154                SMS_CB_CODE_SCHEME_MAX, true);
155        testManager.reset();
156        assertTrue("updating ranges", testManager.updateRanges());
157        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
158        assertEquals("configlist size", 2, testManager.mConfigList.size());
159        checkConfigInfo(testManager.mConfigList.get(0), 100, 120, SMS_CB_CODE_SCHEME_MIN,
160                SMS_CB_CODE_SCHEME_MAX, true);
161        checkConfigInfo(testManager.mConfigList.get(1), 200, 250, SMS_CB_CODE_SCHEME_MIN,
162                SMS_CB_CODE_SCHEME_MAX, true);
163    }
164
165    public void testOverlappingChannels() {
166        TestIntRangeManager testManager = new TestIntRangeManager();
167        assertEquals("flags before test", 0, testManager.flags);
168        assertTrue("enabling range 1", testManager.enableRange(100, 200, "client1"));
169        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
170        assertEquals("configlist size", 1, testManager.mConfigList.size());
171        checkConfigInfo(testManager.mConfigList.get(0), 100, 200, SMS_CB_CODE_SCHEME_MIN,
172                SMS_CB_CODE_SCHEME_MAX, true);
173        testManager.reset();
174        assertTrue("enabling range 2", testManager.enableRange(150, 250, "client2"));
175        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
176        assertEquals("configlist size", 1, testManager.mConfigList.size());
177        checkConfigInfo(testManager.mConfigList.get(0), 201, 250, SMS_CB_CODE_SCHEME_MIN,
178                SMS_CB_CODE_SCHEME_MAX, true);
179        testManager.reset();
180        assertTrue("updating ranges", testManager.updateRanges());
181        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
182        assertEquals("configlist size", 1, testManager.mConfigList.size());
183        checkConfigInfo(testManager.mConfigList.get(0), 100, 250, SMS_CB_CODE_SCHEME_MIN,
184                SMS_CB_CODE_SCHEME_MAX, true);
185        testManager.reset();
186        assertTrue("disabling range 1", testManager.disableRange(100, 200, "client1"));
187        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
188        assertEquals("configlist size", 1, testManager.mConfigList.size());
189        checkConfigInfo(testManager.mConfigList.get(0), 100, 149, SMS_CB_CODE_SCHEME_MIN,
190                SMS_CB_CODE_SCHEME_MAX, false);
191        testManager.reset();
192        assertTrue("disabling range 2", testManager.disableRange(150, 250, "client2"));
193        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
194        assertEquals("configlist size", 1, testManager.mConfigList.size());
195        checkConfigInfo(testManager.mConfigList.get(0), 150, 250, SMS_CB_CODE_SCHEME_MIN,
196                SMS_CB_CODE_SCHEME_MAX, false);
197        testManager.reset();
198        assertTrue("updating ranges", testManager.updateRanges());
199        assertEquals("flags after test", FLAG_START_UPDATE_CALLED | FLAG_FINISH_UPDATE_CALLED,
200                testManager.flags);
201        assertEquals("configlist size", 0, testManager.mConfigList.size());
202    }
203
204    public void testOverlappingChannels2() {
205        TestIntRangeManager testManager = new TestIntRangeManager();
206        assertEquals("flags before test", 0, testManager.flags);
207        assertTrue("enabling range 1", testManager.enableRange(100, 200, "client1"));
208        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
209        assertEquals("configlist size", 1, testManager.mConfigList.size());
210        checkConfigInfo(testManager.mConfigList.get(0), 100, 200, SMS_CB_CODE_SCHEME_MIN,
211                SMS_CB_CODE_SCHEME_MAX, true);
212        testManager.reset();
213        assertTrue("enabling range 2", testManager.enableRange(150, 250, "client2"));
214        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
215        assertEquals("configlist size", 1, testManager.mConfigList.size());
216        checkConfigInfo(testManager.mConfigList.get(0), 201, 250, SMS_CB_CODE_SCHEME_MIN,
217                SMS_CB_CODE_SCHEME_MAX, true);
218        testManager.reset();
219        assertTrue("disabling range 2", testManager.disableRange(150, 250, "client2"));
220        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
221        assertEquals("configlist size", 1, testManager.mConfigList.size());
222        checkConfigInfo(testManager.mConfigList.get(0), 201, 250, SMS_CB_CODE_SCHEME_MIN,
223                SMS_CB_CODE_SCHEME_MAX, false);
224        testManager.reset();
225        assertTrue("updating ranges", testManager.updateRanges());
226        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
227        assertEquals("configlist size", 1, testManager.mConfigList.size());
228        checkConfigInfo(testManager.mConfigList.get(0), 100, 200, SMS_CB_CODE_SCHEME_MIN,
229                SMS_CB_CODE_SCHEME_MAX, true);
230        testManager.reset();
231        assertTrue("disabling range 1", testManager.disableRange(100, 200, "client1"));
232        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
233        assertEquals("configlist size", 1, testManager.mConfigList.size());
234        checkConfigInfo(testManager.mConfigList.get(0), 100, 200, SMS_CB_CODE_SCHEME_MIN,
235                SMS_CB_CODE_SCHEME_MAX, false);
236    }
237
238    public void testMultipleOverlappingChannels() {
239        TestIntRangeManager testManager = new TestIntRangeManager();
240        assertEquals("flags before test", 0, testManager.flags);
241        assertTrue("enabling range 1", testManager.enableRange(67, 9999, "client1"));
242        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
243        assertEquals("configlist size", 1, testManager.mConfigList.size());
244        checkConfigInfo(testManager.mConfigList.get(0), 67, 9999, SMS_CB_CODE_SCHEME_MIN,
245                SMS_CB_CODE_SCHEME_MAX, true);
246        testManager.reset();
247        assertTrue("enabling range 2", testManager.enableRange(150, 250, "client2"));
248        assertEquals("flags after test", 0, testManager.flags);
249        assertEquals("configlist size", 0, testManager.mConfigList.size());
250        testManager.reset();
251        assertTrue("enabling range 3", testManager.enableRange(25, 75, "client3"));
252        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
253        assertEquals("configlist size", 1, testManager.mConfigList.size());
254        checkConfigInfo(testManager.mConfigList.get(0), 25, 66, SMS_CB_CODE_SCHEME_MIN,
255                SMS_CB_CODE_SCHEME_MAX, true);
256        testManager.reset();
257        assertTrue("enabling range 4", testManager.enableRange(12, 500, "client4"));
258        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
259        assertEquals("configlist size", 1, testManager.mConfigList.size());
260        checkConfigInfo(testManager.mConfigList.get(0), 12, 24, SMS_CB_CODE_SCHEME_MIN,
261                SMS_CB_CODE_SCHEME_MAX, true);
262        testManager.reset();
263        assertTrue("enabling range 5", testManager.enableRange(8000, 9998, "client5"));
264        assertEquals("flags after test", 0, testManager.flags);
265        assertEquals("configlist size", 0, testManager.mConfigList.size());
266        testManager.reset();
267        assertTrue("enabling range 6", testManager.enableRange(50000, 65535, "client6"));
268        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
269        assertEquals("configlist size", 1, testManager.mConfigList.size());
270        checkConfigInfo(testManager.mConfigList.get(0), 50000, 65535, SMS_CB_CODE_SCHEME_MIN,
271                SMS_CB_CODE_SCHEME_MAX, true);
272        testManager.reset();
273        assertTrue("updating ranges", testManager.updateRanges());
274        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
275        assertEquals("configlist size", 2, testManager.mConfigList.size());
276        checkConfigInfo(testManager.mConfigList.get(0), 12, 9999, SMS_CB_CODE_SCHEME_MIN,
277                SMS_CB_CODE_SCHEME_MAX, true);
278        checkConfigInfo(testManager.mConfigList.get(1), 50000, 65535, SMS_CB_CODE_SCHEME_MIN,
279                SMS_CB_CODE_SCHEME_MAX, true);
280        testManager.reset();
281        assertTrue("disabling range 1", testManager.disableRange(67, 9999, "client1"));
282        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
283        assertEquals("configlist size", 2, testManager.mConfigList.size());
284        checkConfigInfo(testManager.mConfigList.get(0), 501, 7999, SMS_CB_CODE_SCHEME_MIN,
285                SMS_CB_CODE_SCHEME_MAX, false);
286        checkConfigInfo(testManager.mConfigList.get(1), 9999, 9999, SMS_CB_CODE_SCHEME_MIN,
287                SMS_CB_CODE_SCHEME_MAX, false);
288        testManager.reset();
289        assertTrue("updating ranges", testManager.updateRanges());
290        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
291        assertEquals("configlist size", 3, testManager.mConfigList.size());
292        checkConfigInfo(testManager.mConfigList.get(0), 12, 500, SMS_CB_CODE_SCHEME_MIN,
293                SMS_CB_CODE_SCHEME_MAX, true);
294        checkConfigInfo(testManager.mConfigList.get(1), 8000, 9998, SMS_CB_CODE_SCHEME_MIN,
295                SMS_CB_CODE_SCHEME_MAX, true);
296        checkConfigInfo(testManager.mConfigList.get(2), 50000, 65535, SMS_CB_CODE_SCHEME_MIN,
297                SMS_CB_CODE_SCHEME_MAX, true);
298        testManager.reset();
299        assertTrue("disabling range 4", testManager.disableRange(12, 500, "client4"));
300        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
301        assertEquals("configlist size", 3, testManager.mConfigList.size());
302        checkConfigInfo(testManager.mConfigList.get(0), 12, 24, SMS_CB_CODE_SCHEME_MIN,
303                SMS_CB_CODE_SCHEME_MAX, false);
304        checkConfigInfo(testManager.mConfigList.get(1), 76, 149, SMS_CB_CODE_SCHEME_MIN,
305                SMS_CB_CODE_SCHEME_MAX, false);
306        checkConfigInfo(testManager.mConfigList.get(2), 251, 500, SMS_CB_CODE_SCHEME_MIN,
307                SMS_CB_CODE_SCHEME_MAX, false);
308        testManager.reset();
309        assertTrue("updating ranges", testManager.updateRanges());
310        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
311        assertEquals("configlist size", 4, testManager.mConfigList.size());
312        checkConfigInfo(testManager.mConfigList.get(0), 25, 75, SMS_CB_CODE_SCHEME_MIN,
313                SMS_CB_CODE_SCHEME_MAX, true);
314        checkConfigInfo(testManager.mConfigList.get(1), 150, 250, SMS_CB_CODE_SCHEME_MIN,
315                SMS_CB_CODE_SCHEME_MAX, true);
316        checkConfigInfo(testManager.mConfigList.get(2), 8000, 9998, SMS_CB_CODE_SCHEME_MIN,
317                SMS_CB_CODE_SCHEME_MAX, true);
318        checkConfigInfo(testManager.mConfigList.get(3), 50000, 65535, SMS_CB_CODE_SCHEME_MIN,
319                SMS_CB_CODE_SCHEME_MAX, true);
320        testManager.reset();
321        assertTrue("disabling range 5", testManager.disableRange(8000, 9998, "client5"));
322        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
323        assertEquals("configlist size", 1, testManager.mConfigList.size());
324        checkConfigInfo(testManager.mConfigList.get(0), 8000, 9998, SMS_CB_CODE_SCHEME_MIN,
325                SMS_CB_CODE_SCHEME_MAX, false);
326        testManager.reset();
327        assertTrue("updating ranges", testManager.updateRanges());
328        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
329        assertEquals("configlist size", 3, testManager.mConfigList.size());
330        checkConfigInfo(testManager.mConfigList.get(0), 25, 75, SMS_CB_CODE_SCHEME_MIN,
331                SMS_CB_CODE_SCHEME_MAX, true);
332        checkConfigInfo(testManager.mConfigList.get(1), 150, 250, SMS_CB_CODE_SCHEME_MIN,
333                SMS_CB_CODE_SCHEME_MAX, true);
334        checkConfigInfo(testManager.mConfigList.get(2), 50000, 65535, SMS_CB_CODE_SCHEME_MIN,
335                SMS_CB_CODE_SCHEME_MAX, true);
336        testManager.reset();
337        assertTrue("disabling range 6", testManager.disableRange(50000, 65535, "client6"));
338        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
339        assertEquals("configlist size", 1, testManager.mConfigList.size());
340        checkConfigInfo(testManager.mConfigList.get(0), 50000, 65535, SMS_CB_CODE_SCHEME_MIN,
341                SMS_CB_CODE_SCHEME_MAX, false);
342        testManager.reset();
343        assertTrue("updating ranges", testManager.updateRanges());
344        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
345        assertEquals("configlist size", 2, testManager.mConfigList.size());
346        checkConfigInfo(testManager.mConfigList.get(0), 25, 75, SMS_CB_CODE_SCHEME_MIN,
347                SMS_CB_CODE_SCHEME_MAX, true);
348        checkConfigInfo(testManager.mConfigList.get(1), 150, 250, SMS_CB_CODE_SCHEME_MIN,
349                SMS_CB_CODE_SCHEME_MAX, true);
350        testManager.reset();
351        assertTrue("disabling range 2", testManager.disableRange(150, 250, "client2"));
352        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
353        assertEquals("configlist size", 1, testManager.mConfigList.size());
354        checkConfigInfo(testManager.mConfigList.get(0), 150, 250, SMS_CB_CODE_SCHEME_MIN,
355                SMS_CB_CODE_SCHEME_MAX, false);
356        testManager.reset();
357        assertTrue("updating ranges", testManager.updateRanges());
358        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
359        assertEquals("configlist size", 1, testManager.mConfigList.size());
360        checkConfigInfo(testManager.mConfigList.get(0), 25, 75, SMS_CB_CODE_SCHEME_MIN,
361                SMS_CB_CODE_SCHEME_MAX, true);
362        testManager.reset();
363        assertTrue("disabling range 3", testManager.disableRange(25, 75, "client3"));
364        assertEquals("flags after test", ALL_FLAGS_SET, testManager.flags);
365        assertEquals("configlist size", 1, testManager.mConfigList.size());
366        checkConfigInfo(testManager.mConfigList.get(0), 25, 75, SMS_CB_CODE_SCHEME_MIN,
367                SMS_CB_CODE_SCHEME_MAX, false);
368        testManager.reset();
369        assertTrue("updating ranges", testManager.updateRanges());
370        assertEquals("flags after test", FLAG_START_UPDATE_CALLED | FLAG_FINISH_UPDATE_CALLED,
371                testManager.flags);
372        assertEquals("configlist size", 0, testManager.mConfigList.size());
373    }
374}
375