1/*
2 * Copyright (C) 2015 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 */
16package com.android.systemui.statusbar.policy;
17
18import android.os.HandlerThread;
19import android.support.test.runner.AndroidJUnit4;
20import android.telephony.SubscriptionInfo;
21import android.test.suitebuilder.annotation.SmallTest;
22import com.android.systemui.R;
23import com.android.systemui.SysuiTestCase;
24import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
25import com.android.systemui.statusbar.policy.NetworkController.IconState;
26import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
27import java.util.ArrayList;
28import java.util.List;
29import org.junit.Before;
30import org.junit.runner.RunWith;
31import org.junit.Test;
32import org.mockito.ArgumentCaptor;
33import org.mockito.Mock;
34import org.mockito.Mockito;
35import org.mockito.MockitoAnnotations;
36
37import static junit.framework.Assert.assertTrue;
38import static junit.framework.Assert.assertEquals;
39
40import static org.mockito.Matchers.eq;
41
42@SmallTest
43@RunWith(AndroidJUnit4.class)
44public class CallbackHandlerTest extends SysuiTestCase {
45
46    private CallbackHandler mHandler;
47    private HandlerThread mHandlerThread;
48
49    @Mock
50    private EmergencyListener mEmengencyListener;
51    @Mock
52    private SignalCallback mSignalCallback;
53
54    @Before
55    public void setUp() throws Exception {
56        mHandlerThread = new HandlerThread("TestThread");
57        mHandlerThread.start();
58        mHandler = new CallbackHandler(mHandlerThread.getLooper());
59
60        MockitoAnnotations.initMocks(this);
61        mHandler.setListening(mEmengencyListener, true);
62        mHandler.setListening(mSignalCallback, true);
63    }
64
65    @Test
66    public void testEmergencyListener() {
67        mHandler.setEmergencyCallsOnly(true);
68        waitForCallbacks();
69
70        ArgumentCaptor<Boolean> captor = ArgumentCaptor.forClass(Boolean.class);
71        Mockito.verify(mEmengencyListener).setEmergencyCallsOnly(captor.capture());
72        assertTrue(captor.getValue());
73    }
74
75    @Test
76    public void testSignalCallback_setWifiIndicators() {
77        boolean enabled = true;
78        IconState status = new IconState(true, 0, "");
79        IconState qs = new IconState(true, 1, "");
80        boolean in = true;
81        boolean out = true;
82        String description = "Test";
83        String secondaryLabel = "Secondary label";
84        mHandler.setWifiIndicators(enabled, status, qs, in, out, description, true, secondaryLabel);
85        waitForCallbacks();
86
87        ArgumentCaptor<Boolean> enableArg = ArgumentCaptor.forClass(Boolean.class);
88        ArgumentCaptor<IconState> statusArg = ArgumentCaptor.forClass(IconState.class);
89        ArgumentCaptor<IconState> qsArg = ArgumentCaptor.forClass(IconState.class);
90        ArgumentCaptor<Boolean> inArg = ArgumentCaptor.forClass(Boolean.class);
91        ArgumentCaptor<Boolean> outArg = ArgumentCaptor.forClass(Boolean.class);
92        ArgumentCaptor<String> descArg = ArgumentCaptor.forClass(String.class);
93        ArgumentCaptor<Boolean> isTransient = ArgumentCaptor.forClass(Boolean.class);
94        ArgumentCaptor<String> secondary = ArgumentCaptor.forClass(String.class);
95        Mockito.verify(mSignalCallback).setWifiIndicators(enableArg.capture(),
96                statusArg.capture(), qsArg.capture(), inArg.capture(), outArg.capture(),
97                descArg.capture(), isTransient.capture(), secondary.capture());
98        assertEquals(enabled, (boolean) enableArg.getValue());
99        assertEquals(status, statusArg.getValue());
100        assertEquals(qs, qsArg.getValue());
101        assertEquals(in, (boolean) inArg.getValue());
102        assertEquals(out, (boolean) outArg.getValue());
103        assertEquals(description, descArg.getValue());
104        assertTrue(isTransient.getValue());
105        assertEquals(secondaryLabel, secondary.getValue());
106    }
107
108    @Test
109    public void testSignalCallback_setMobileDataIndicators() {
110        IconState status = new IconState(true, 0, "");
111        IconState qs = new IconState(true, 1, "");
112        boolean in = true;
113        boolean out = true;
114        String typeDescription = "Test 1";
115        String description = "Test 2";
116        int type = TelephonyIcons.ICON_1X;
117        int qsType = TelephonyIcons.ICON_1X;
118        boolean wide = true;
119        int subId = 5;
120        boolean roaming = true;
121        mHandler.setMobileDataIndicators(status, qs, type, qsType, in, out, typeDescription,
122                description, wide, subId, roaming);
123        waitForCallbacks();
124
125        ArgumentCaptor<IconState> statusArg = ArgumentCaptor.forClass(IconState.class);
126        ArgumentCaptor<IconState> qsArg = ArgumentCaptor.forClass(IconState.class);
127        ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class);
128        ArgumentCaptor<Integer> qsTypeIconArg = ArgumentCaptor.forClass(Integer.class);
129        ArgumentCaptor<Boolean> inArg = ArgumentCaptor.forClass(Boolean.class);
130        ArgumentCaptor<Boolean> outArg = ArgumentCaptor.forClass(Boolean.class);
131        ArgumentCaptor<String> typeContentArg = ArgumentCaptor.forClass(String.class);
132        ArgumentCaptor<String> descArg = ArgumentCaptor.forClass(String.class);
133        ArgumentCaptor<Boolean> wideArg = ArgumentCaptor.forClass(Boolean.class);
134        ArgumentCaptor<Integer> subIdArg = ArgumentCaptor.forClass(Integer.class);
135        Mockito.verify(mSignalCallback).setMobileDataIndicators(statusArg.capture(),
136                qsArg.capture(), typeIconArg.capture(), qsTypeIconArg.capture(), inArg.capture(),
137                outArg.capture(), typeContentArg.capture(), descArg.capture(), wideArg.capture(),
138                subIdArg.capture(), eq(roaming));
139        assertEquals(status, statusArg.getValue());
140        assertEquals(qs, qsArg.getValue());
141        assertEquals(type, (int) typeIconArg.getValue());
142        assertEquals(qsType, (int) qsTypeIconArg.getValue());
143        assertEquals(in, (boolean) inArg.getValue());
144        assertEquals(out, (boolean) outArg.getValue());
145        assertEquals(typeDescription, typeContentArg.getValue());
146        assertEquals(description, descArg.getValue());
147        assertEquals(wide, (boolean) wideArg.getValue());
148        assertEquals(subId, (int) subIdArg.getValue());
149    }
150
151    @SuppressWarnings("unchecked")
152    @Test
153    public void testSignalCallback_setSubs() {
154        List<SubscriptionInfo> subs = new ArrayList<>();
155        mHandler.setSubs(subs);
156        waitForCallbacks();
157
158        ArgumentCaptor<ArrayList> subsArg = ArgumentCaptor.forClass(ArrayList.class);
159        Mockito.verify(mSignalCallback).setSubs(subsArg.capture());
160        assertTrue(subs == subsArg.getValue());
161    }
162
163    @Test
164    public void testSignalCallback_setNoSims() {
165        boolean noSims = true;
166        boolean simDetected = false;
167        mHandler.setNoSims(noSims, simDetected);
168        waitForCallbacks();
169
170        Mockito.verify(mSignalCallback).setNoSims(eq(noSims), eq(simDetected));
171    }
172
173    @Test
174    public void testSignalCallback_setEthernetIndicators() {
175        IconState state = new IconState(true, R.drawable.stat_sys_ethernet, "Test Description");
176        mHandler.setEthernetIndicators(state);
177        waitForCallbacks();
178
179        ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
180        Mockito.verify(mSignalCallback).setEthernetIndicators(iconArg.capture());
181        assertEquals(state, iconArg.getValue());
182    }
183
184    @Test
185    public void testSignalCallback_setIsAirplaneMode() {
186        IconState state = new IconState(true, R.drawable.stat_sys_airplane_mode, "Test Description");
187        mHandler.setIsAirplaneMode(state);
188        waitForCallbacks();
189
190        ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
191        Mockito.verify(mSignalCallback).setIsAirplaneMode(iconArg.capture());
192        assertEquals(state, iconArg.getValue());
193    }
194
195    private void waitForCallbacks() {
196        mHandlerThread.quitSafely();
197        try {
198            mHandlerThread.join();
199        } catch (InterruptedException e) {
200        }
201    }
202
203}
204