1/*
2 * Copyright (C) 2017 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.tv.settings.connectivity.setup;
18
19import static org.junit.Assert.assertNotNull;
20import static org.junit.Assert.assertNull;
21import static org.junit.Assert.assertTrue;
22import static org.mockito.Mockito.verify;
23import static org.robolectric.shadow.api.Shadow.extract;
24
25import android.arch.lifecycle.ViewModelProviders;
26import android.content.Intent;
27import android.net.wifi.ScanResult;
28import android.net.wifi.WifiConfiguration;
29import android.os.Bundle;
30
31import com.android.tv.settings.R;
32import com.android.tv.settings.TvSettingsRobolectricTestRunner;
33import com.android.tv.settings.connectivity.WifiConfigHelper;
34import com.android.tv.settings.connectivity.util.State;
35import com.android.tv.settings.connectivity.util.StateMachine;
36import com.android.tv.settings.testutils.ShadowStateMachine;
37
38import org.junit.Before;
39import org.junit.Test;
40import org.junit.runner.RunWith;
41import org.mockito.Mock;
42import org.mockito.Mockito;
43import org.mockito.MockitoAnnotations;
44import org.robolectric.Robolectric;
45import org.robolectric.RuntimeEnvironment;
46import org.robolectric.annotation.Config;
47
48@RunWith(TvSettingsRobolectricTestRunner.class)
49@Config(shadows = ShadowStateMachine.class)
50public class AddPageBasedOnNetworkStateTest {
51    private WifiSetupActivity mActivity;
52    private AddPageBasedOnNetworkState mAddPageBasedOnNetworkState;
53    private UserChoiceInfo mUserChoiceInfo;
54    @Mock
55    private State.StateCompleteListener mStateCompleteListener;
56
57    @Before
58    public void setUp() {
59        MockitoAnnotations.initMocks(this);
60        mActivity = Mockito.spy(Robolectric.buildActivity(
61                        WifiSetupActivity.class, new Intent().putExtras(new Bundle())).get());
62        StateMachine stateMachine = ViewModelProviders.of(mActivity).get(StateMachine.class);
63        mUserChoiceInfo = ViewModelProviders.of(mActivity).get(UserChoiceInfo.class);
64        ShadowStateMachine shadowStateMachine = extract(stateMachine);
65        shadowStateMachine.setListener(mStateCompleteListener);
66        mAddPageBasedOnNetworkState = new AddPageBasedOnNetworkState(mActivity);
67    }
68
69    @Test
70    public void testForward_otherNetwork() {
71        mUserChoiceInfo.init();
72        mUserChoiceInfo.put(UserChoiceInfo.SELECT_WIFI, getString(R.string.other_network));
73        mAddPageBasedOnNetworkState.processForward();
74        assertTrue(mUserChoiceInfo.getWifiConfiguration().hiddenSSID);
75        verify(mStateCompleteListener).onComplete(StateMachine.OTHER_NETWORK);
76    }
77
78    @Test
79    public void testForward_clearPassword_ssidNotMatch() {
80        mUserChoiceInfo.init();
81        ScanResult scanResult = new ScanResult();
82        scanResult.SSID = "atv01";
83        scanResult.capabilities = "";
84        mUserChoiceInfo.setChosenNetwork(scanResult);
85        mUserChoiceInfo.put(UserChoiceInfo.PASSWORD, "123");
86        WifiConfiguration wifiConfiguration = new WifiConfiguration();
87        wifiConfiguration.SSID = "atv02";
88        mUserChoiceInfo.setWifiConfiguration(wifiConfiguration);
89        WifiConfigHelper.saveConfiguration(mActivity, wifiConfiguration);
90        assertNotNull(mUserChoiceInfo.getChosenNetwork());
91        mAddPageBasedOnNetworkState.processForward();
92        assertNull(mUserChoiceInfo.getPageSummary(UserChoiceInfo.PASSWORD));
93    }
94
95    @Test
96    public void testForward_clearPassword_ssidIsNull() {
97        mUserChoiceInfo.init();
98        ScanResult scanResult = new ScanResult();
99        scanResult.SSID = "atv";
100        scanResult.capabilities = "";
101        mUserChoiceInfo.setChosenNetwork(scanResult);
102        mUserChoiceInfo.put(UserChoiceInfo.PASSWORD, "123");
103        mUserChoiceInfo.setWifiConfiguration(null);
104        mAddPageBasedOnNetworkState.processForward();
105        assertNull(mUserChoiceInfo.getPageSummary(UserChoiceInfo.PASSWORD));
106    }
107
108    @Test
109    public void testForward_networkSaved() {
110        mUserChoiceInfo.init();
111        ScanResult scanResult = new ScanResult();
112        scanResult.SSID = "atv";
113        scanResult.capabilities = "";
114        mUserChoiceInfo.setChosenNetwork(scanResult);
115        WifiConfiguration config = new WifiConfiguration();
116        config.SSID = "\"atv\"";
117        WifiConfigHelper.saveConfiguration(mActivity, config);
118        mAddPageBasedOnNetworkState.processForward();
119        verify(mStateCompleteListener).onComplete(StateMachine.KNOWN_NETWORK);
120    }
121
122    @Test
123    public void testForward_networkNotSaved() {
124        mUserChoiceInfo.init();
125        ScanResult scanResult = new ScanResult();
126        scanResult.SSID = "atv";
127        scanResult.capabilities = "";
128        mUserChoiceInfo.setChosenNetwork(scanResult);
129        mUserChoiceInfo.put(UserChoiceInfo.PASSWORD, "123");
130        WifiConfiguration config = new WifiConfiguration();
131        config.networkId = -1;
132        WifiConfigHelper.saveConfiguration(mActivity, config);
133        mAddPageBasedOnNetworkState.processForward();
134        verify(mStateCompleteListener).onComplete(StateMachine.ADD_START);
135    }
136
137    private String getString(int id) {
138        return RuntimeEnvironment.application.getString(id);
139    }
140}
141