Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b1a01395 authored by Jeremy Joslin's avatar Jeremy Joslin Committed by Joe LaPenna
Browse files

Remove the recommendation request impl and test code.

Removing most of the platform side request recommendation code and
its tests.

Test: adb shell am instrument -e class android.net.NetworkRecommendationProviderTest -w com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
Test: runtest frameworks-services -c com.android.server.NetworkScoreServiceTest
Bug: 37357264
Change-Id: I36e592c5c82c38aa2174a51cf02c6e9825ef4f11
parent 951e95a7
Loading
Loading
Loading
Loading
+0 −25
Original line number Diff line number Diff line
@@ -19,10 +19,7 @@ package android.net;
import android.net.INetworkScoreCache;
import android.net.NetworkKey;
import android.net.NetworkScorerAppData;
import android.net.RecommendationRequest;
import android.net.RecommendationResult;
import android.net.ScoredNetwork;
import android.os.RemoteCallback;

/**
 * A service for updating network scores from a network scorer application.
@@ -80,16 +77,6 @@ interface INetworkScoreService
     */
    void unregisterNetworkScoreCache(int networkType, INetworkScoreCache scoreCache);

    /**
     * Request a recommendation for the best network to connect to
     * taking into account the inputs from the {@link RecommendationRequest}.
     *
     * @param request a {@link RecommendationRequest} instance containing the details of the request
     * @return a {@link RecommendationResult} containing the recommended network to connect to
     * @throws SecurityException if the caller is not the system
     */
    RecommendationResult requestRecommendation(in RecommendationRequest request);

    /**
     * Request scoring for networks.
     *
@@ -120,18 +107,6 @@ interface INetworkScoreService
     */
    String getActiveScorerPackage();

    /**
     * Request a recommendation for the best network to connect to
     * taking into account the inputs from the {@link RecommendationRequest}.
     *
     * @param request a {@link RecommendationRequest} instance containing the details of the request
     * @param remoteCallback a {@link RemoteCallback} instance to invoke when the recommendation
     *                       is available.
     * @throws SecurityException if the caller is not the system
     */
    oneway void requestRecommendationAsync(in RecommendationRequest request,
                                           in RemoteCallback remoteCallback);

    /**
     * Returns metadata about the active scorer or <code>null</code> if there is no active scorer.
     */
+2 −44
Original line number Diff line number Diff line
@@ -428,14 +428,11 @@ public class NetworkScoreManager {
     * @throws SecurityException if the caller does not hold the
     *         {@link android.Manifest.permission#REQUEST_NETWORK_SCORES} permission.
     * @hide
     * @deprecated to be removed.
     */
    public RecommendationResult requestRecommendation(RecommendationRequest request)
            throws SecurityException {
        try {
            return mService.requestRecommendation(request);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        return null;
    }

    /**
@@ -452,43 +449,4 @@ public class NetworkScoreManager {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Request a recommendation for which network to connect to.
     *
     * <p>The callback will be run on the thread associated with provided {@link Handler}.
     *
     * @param request a {@link RecommendationRequest} instance containing additional
     *                request details
     * @param handler a {@link Handler} instance representing the thread to complete the future on.
     *                If null the responding binder thread will be used.
     * @return a {@link CompletableFuture} instance that will eventually receive the
     *         {@link RecommendationResult}.
     * @throws SecurityException
     * @hide
     */
    public CompletableFuture<RecommendationResult> requestRecommendation(
            final @NonNull RecommendationRequest request,
            final @Nullable Handler handler) {
        Preconditions.checkNotNull(request, "RecommendationRequest cannot be null.");

        final CompletableFuture<RecommendationResult> futureResult =
                new CompletableFuture<>();

        RemoteCallback remoteCallback = new RemoteCallback(new RemoteCallback.OnResultListener() {
            @Override
            public void onResult(Bundle data) {
                RecommendationResult result = data.getParcelable(EXTRA_RECOMMENDATION_RESULT);
                futureResult.complete(result);
            }
        }, handler);

        try {
            mService.requestRecommendationAsync(request, remoteCallback);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }

        return futureResult;
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -8371,6 +8371,7 @@ public final class Settings {
         *
         * Type: long
         * @hide
         * @deprecated to be removed
         */
        public static final String NETWORK_RECOMMENDATION_REQUEST_TIMEOUT_MS =
                "network_recommendation_request_timeout_ms";
+2 −89
Original line number Diff line number Diff line
package android.net;

import static android.net.NetworkRecommendationProvider.EXTRA_RECOMMENDATION_RESULT;
import static android.net.NetworkRecommendationProvider.EXTRA_SEQUENCE;

import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertSame;
import static junit.framework.Assert.fail;
import static junit.framework.TestCase.assertEquals;

import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;

import android.Manifest.permission;
import android.content.Context;
import android.os.Bundle;
import android.os.IRemoteCallback;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
@@ -35,11 +28,9 @@ import java.util.concurrent.TimeUnit;
 */
@RunWith(AndroidJUnit4.class)
public class NetworkRecommendationProviderTest {
    @Mock private IRemoteCallback mMockRemoteCallback;
    @Mock private Context mContext;
    private NetworkRecProvider mRecProvider;
    private INetworkRecommendationProvider mStub;
    private CountDownLatch mRecRequestLatch;
    private CountDownLatch mScoreRequestLatch;
    private NetworkKey[] mTestNetworkKeys;

@@ -48,79 +39,14 @@ public class NetworkRecommendationProviderTest {
        MockitoAnnotations.initMocks(this);

        Executor executor = Executors.newSingleThreadExecutor();
        mRecRequestLatch = new CountDownLatch(1);
        mScoreRequestLatch = new CountDownLatch(1);
        mRecProvider = new NetworkRecProvider(mContext, executor, mRecRequestLatch,
                mScoreRequestLatch);
        mRecProvider = new NetworkRecProvider(mContext, executor, mScoreRequestLatch);
        mStub = INetworkRecommendationProvider.Stub.asInterface(mRecProvider.getBinder());
        mTestNetworkKeys = new NetworkKey[2];
        mTestNetworkKeys[0] = new NetworkKey(new WifiKey("\"ssid_01\"", "00:00:00:00:00:11"));
        mTestNetworkKeys[1] = new NetworkKey(new WifiKey("\"ssid_02\"", "00:00:00:00:00:22"));
    }

    @Test
    public void testRecommendationRequestReceived() throws Exception {
        final RecommendationRequest request = new RecommendationRequest.Builder().build();
        final int sequence = 100;
        mStub.requestRecommendation(request, mMockRemoteCallback, sequence);

        // wait for onRequestRecommendation() to be called in our impl below.
        mRecRequestLatch.await(200, TimeUnit.MILLISECONDS);
        NetworkRecommendationProvider.ResultCallback expectedResultCallback =
                new NetworkRecommendationProvider.ResultCallback(mMockRemoteCallback, sequence);
        assertEquals(request, mRecProvider.mCapturedRequest);
        assertEquals(expectedResultCallback, mRecProvider.mCapturedCallback);
    }

    @Test
    public void testRecommendationRequest_permissionsEnforced() throws Exception {
        final RecommendationRequest request = new RecommendationRequest.Builder().build();
        final int sequence = 100;
        Mockito.doThrow(new SecurityException())
                .when(mContext)
                .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES), anyString());

        try {
            mStub.requestRecommendation(request, mMockRemoteCallback, sequence);
            fail("SecurityException expected.");
        } catch (SecurityException e) {
            // expected
        }
    }

    @Test
    public void testResultCallbackOnResult() throws Exception {
        final int sequence = 100;
        final NetworkRecommendationProvider.ResultCallback callback =
                new NetworkRecommendationProvider.ResultCallback(mMockRemoteCallback, sequence);

        final RecommendationResult result = RecommendationResult.createDoNotConnectRecommendation();
        callback.onResult(result);

        final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
        Mockito.verify(mMockRemoteCallback).sendResult(bundleCaptor.capture());
        Bundle capturedBundle = bundleCaptor.getValue();
        assertEquals(sequence, capturedBundle.getInt(EXTRA_SEQUENCE));
        assertSame(result, capturedBundle.getParcelable(EXTRA_RECOMMENDATION_RESULT));
    }

    @Test
    public void testResultCallbackOnResult_runTwice_throwsException() throws Exception {
        final int sequence = 100;
        final NetworkRecommendationProvider.ResultCallback callback =
                new NetworkRecommendationProvider.ResultCallback(mMockRemoteCallback, sequence);

        final RecommendationResult result = RecommendationResult.createDoNotConnectRecommendation();
        callback.onResult(result);

        try {
            callback.onResult(result);
            fail("Callback ran more than once.");
        } catch (IllegalStateException e) {
            // expected
        }
    }

    @Test
    public void testScoreRequestReceived() throws Exception {
        mStub.requestScores(mTestNetworkKeys);
@@ -162,27 +88,14 @@ public class NetworkRecommendationProviderTest {
    }

    private static class NetworkRecProvider extends NetworkRecommendationProvider {
        private final CountDownLatch mRecRequestLatch;
        private final CountDownLatch mScoreRequestLatch;
        RecommendationRequest mCapturedRequest;
        ResultCallback mCapturedCallback;
        NetworkKey[] mCapturedNetworks;

        NetworkRecProvider(Context context, Executor executor, CountDownLatch recRequestLatch,
            CountDownLatch networkRequestLatch) {
        NetworkRecProvider(Context context, Executor executor, CountDownLatch networkRequestLatch) {
            super(context, executor);
            mRecRequestLatch = recRequestLatch;
            mScoreRequestLatch = networkRequestLatch;
        }

        @Override
        public void onRequestRecommendation(RecommendationRequest request,
                ResultCallback callback) {
            mCapturedRequest = request;
            mCapturedCallback = callback;
            mRecRequestLatch.countDown();
        }

        @Override
        public void onRequestScores(NetworkKey[] networks) {
            mCapturedNetworks = networks;
+0 −116
Original line number Diff line number Diff line
package android.net;

import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.os.Parcel;
import android.os.SystemClock;
import android.test.AndroidTestCase;

public class RecommendationRequestTest extends AndroidTestCase {
    private ScanResult[] mScanResults;
    private WifiConfiguration mDefaultConfig;
    private WifiConfiguration mConnectedConfig;
    private WifiConfiguration[] mConnectableConfigs;
    private int mLastSelectedNetworkId;
    private long mLastSelectedNetworkTimestamp;

    @Override
    public void setUp() throws Exception {
        mScanResults = new ScanResult[2];
        mScanResults[0] = new ScanResult();
        mScanResults[1] = new ScanResult(
                "ssid",
                "bssid",
                0L /*hessid*/,
                1 /*anqpDominId*/,
                "caps",
                2 /*level*/,
                3 /*frequency*/,
                4L /*tsf*/,
                5 /*distCm*/,
                6 /*distSdCm*/,
                7 /*channelWidth*/,
                8 /*centerFreq0*/,
                9 /*centerFreq1*/,
                false /*is80211McRTTResponder*/);
        mDefaultConfig = new WifiConfiguration();
        mDefaultConfig.SSID = "default_config";
        mConnectedConfig = new WifiConfiguration();
        mConnectedConfig.SSID = "connected_config";
        mConnectableConfigs = new WifiConfiguration[] {mDefaultConfig, mConnectedConfig};
        mLastSelectedNetworkId = 5;
        mLastSelectedNetworkTimestamp = SystemClock.elapsedRealtime();
    }

    public void testParceling() throws Exception {
        RecommendationRequest request = new RecommendationRequest.Builder()
                .setDefaultWifiConfig(mDefaultConfig)
                .setScanResults(mScanResults)
                .setConnectedWifiConfig(mConnectedConfig)
                .setConnectableConfigs(mConnectableConfigs)
                .setLastSelectedNetwork(mLastSelectedNetworkId, mLastSelectedNetworkTimestamp)
                .build();

        RecommendationRequest parceled = passThroughParcel(request);
        assertEquals(request.getDefaultWifiConfig().SSID,
                parceled.getDefaultWifiConfig().SSID);
        assertEquals(request.getConnectedConfig().SSID,
                parceled.getConnectedConfig().SSID);
        ScanResult[] parceledScanResults = parceled.getScanResults();
        assertNotNull(parceledScanResults);
        assertEquals(mScanResults.length, parceledScanResults.length);
        for (int i = 0; i < mScanResults.length; i++) {
            assertEquals(mScanResults[i].SSID, parceledScanResults[i].SSID);
        }
        WifiConfiguration[] parceledConfigs = parceled.getConnectableConfigs();
        for (int i = 0; i < parceledConfigs.length; i++) {
            assertEquals(mConnectableConfigs[i].SSID, parceledConfigs[i].SSID);
        }
        assertEquals(mLastSelectedNetworkId, parceled.getLastSelectedNetworkId());
        assertEquals(mLastSelectedNetworkTimestamp, parceled.getLastSelectedNetworkTimestamp());
    }

    public void testParceling_nullScanResults() throws Exception {
        RecommendationRequest request = new RecommendationRequest.Builder()
                .setDefaultWifiConfig(mDefaultConfig)
                .build();

        RecommendationRequest parceled = passThroughParcel(request);
        ScanResult[] parceledScanResults = parceled.getScanResults();
        assertNull(parceledScanResults);
    }

    public void testParceling_nullWifiConfigArray() throws Exception {
        RecommendationRequest request = new RecommendationRequest.Builder()
                .setDefaultWifiConfig(mDefaultConfig)
                .build();

        RecommendationRequest parceled = passThroughParcel(request);
        WifiConfiguration[] parceledConfigs = parceled.getConnectableConfigs();
        assertNull(parceledConfigs);
    }

    public void testParceling_unsetLastSelectedNetwork() throws Exception {
        RecommendationRequest request = new RecommendationRequest.Builder()
                .build();

        RecommendationRequest parceled = passThroughParcel(request);

        assertEquals(-1, parceled.getLastSelectedNetworkId());
        assertEquals(0, parceled.getLastSelectedNetworkTimestamp());
    }

    private RecommendationRequest passThroughParcel(RecommendationRequest request) {
        Parcel p = Parcel.obtain();
        RecommendationRequest output = null;
        try {
            request.writeToParcel(p, 0);
            p.setDataPosition(0);
            output = RecommendationRequest.CREATOR.createFromParcel(p);
        } finally {
            p.recycle();
        }
        assertNotNull(output);
        return output;
    }
}
Loading