blob: 2c6d5d4710c08b75f1dd3c88e48e2338255640dc [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.android.storagemanager.automatic;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import android.os.BatteryManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
import java.util.HashMap;
@RunWith(RobolectricTestRunner.class)
public class JobPreconditionsTest {
// TODO: Instead of mocking, use ShadowConnectivityManager. Right now, using it causes a crash.
// Use the shadow once we get it working.
@Mock private ConnectivityManager mConnectivityManager;
@Mock private BatteryManager mBatteryManager;
@Mock private Network mWifiNetwork;
@Mock private NetworkInfo mWifiNetworkInfo;
private Context mContext;
private ArrayList<Network> mNetworkList;
private HashMap<Network, NetworkInfo> mNetworkMap;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mNetworkList = new ArrayList<>();
mNetworkMap = new HashMap<>();
shadowOf(RuntimeEnvironment.application).setSystemService(Context.CONNECTIVITY_SERVICE,
mConnectivityManager);
shadowOf(RuntimeEnvironment.application).setSystemService(Context.BATTERY_SERVICE,
mBatteryManager);
mContext = RuntimeEnvironment.application;
}
@Test
public void testNoNetworks() {
hookUpMocks();
assertThat(JobPreconditions.isWifiConnected(mContext)).isFalse();
}
@Test
public void testValidWifiNetworkConnected() {
// Connect the fake Wi-Fi.
mNetworkList.add(mWifiNetwork);
mNetworkMap.put(mWifiNetwork, mWifiNetworkInfo);
when(mWifiNetworkInfo.getType()).thenReturn(ConnectivityManager.TYPE_WIFI);
when(mWifiNetworkInfo.isConnected()).thenReturn(true);
hookUpMocks();
assertThat(JobPreconditions.isWifiConnected(mContext)).isTrue();
assertThat(JobPreconditions.isNetworkMetered(mContext)).isFalse();
}
@Test
public void testBatteryConnected() {
when(mBatteryManager.isCharging()).thenReturn(true);
assertThat(JobPreconditions.isCharging(mContext)).isTrue();
}
@Test
public void testBatteryDisconnected() {
when(mBatteryManager.isCharging()).thenReturn(false);
assertThat(JobPreconditions.isCharging(mContext)).isFalse();
}
// TODO(b/31224380): Checking if a network is metered relies on a hidden API which we cannot
// mock or shadow in the current API. Find a way to test the metered check.
/**
* hookUpMocks takes the local list of networks and hooks it up to the mock ConnectivityManager.
* It mocks the getAllNetworks() method to return the list of Networks as an array and the
* getNetworkInfo(Network) method to return a lookup in our local network -> network info map.
*/
private void hookUpMocks() {
doReturn(mNetworkList.toArray(new Network[mNetworkList.size()]))
.when(mConnectivityManager).getAllNetworks();
when(mConnectivityManager.getNetworkInfo(any(Network.class))).thenAnswer(
new Answer<NetworkInfo>() {
@Override
public NetworkInfo answer(InvocationOnMock invocation) {
Network network = (Network) invocation.getArguments()[0];
return mNetworkMap.get(network);
}
}
);
}
}