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

Commit f7dd4320 authored by Remi NGUYEN VAN's avatar Remi NGUYEN VAN Committed by android-build-merger
Browse files

Merge "Add tests for NetworkStack failure notifications" into qt-dev am: d63457c6

am: 95727b51

Change-Id: Icaf817803421d8b177abe91c2ad8efbaa2ae7e09
parents 9e37c4af 95727b51
Loading
Loading
Loading
Loading
+53 −5
Original line number Original line Diff line number Diff line
@@ -23,11 +23,20 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;


import android.Manifest;
import android.Manifest;
import android.content.Context;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.VersionedPackage;
import android.content.pm.VersionedPackage;
import android.net.NetworkStackClient;
import android.net.NetworkStackClient;
import android.net.NetworkStackClient.NetworkStackHealthListener;
import android.os.Handler;
import android.os.Handler;
import android.os.test.TestLooper;
import android.os.test.TestLooper;
import android.provider.DeviceConfig;
import android.provider.DeviceConfig;
@@ -42,6 +51,8 @@ import com.android.server.PackageWatchdog.PackageHealthObserverImpact;
import org.junit.After;
import org.junit.After;
import org.junit.Before;
import org.junit.Before;
import org.junit.Test;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.MockitoAnnotations;


@@ -73,8 +84,13 @@ public class PackageWatchdogTest {
    private static final long SHORT_DURATION = TimeUnit.SECONDS.toMillis(1);
    private static final long SHORT_DURATION = TimeUnit.SECONDS.toMillis(1);
    private static final long LONG_DURATION = TimeUnit.SECONDS.toMillis(5);
    private static final long LONG_DURATION = TimeUnit.SECONDS.toMillis(5);
    private TestLooper mTestLooper;
    private TestLooper mTestLooper;
    private Context mSpyContext;
    @Mock
    @Mock
    private NetworkStackClient mNetworkStackClient;
    private NetworkStackClient mMockNetworkStackClient;
    @Mock
    private PackageManager mMockPackageManager;
    @Captor
    private ArgumentCaptor<NetworkStackHealthListener> mNetworkStackCallbackCaptor;


    @Before
    @Before
    public void setUp() throws Exception {
    public void setUp() throws Exception {
@@ -83,6 +99,14 @@ public class PackageWatchdogTest {
                "package-watchdog.xml").delete();
                "package-watchdog.xml").delete();
        adoptShellPermissions(Manifest.permission.READ_DEVICE_CONFIG);
        adoptShellPermissions(Manifest.permission.READ_DEVICE_CONFIG);
        mTestLooper = new TestLooper();
        mTestLooper = new TestLooper();
        mSpyContext = spy(InstrumentationRegistry.getContext());
        when(mSpyContext.getPackageManager()).thenReturn(mMockPackageManager);
        when(mMockPackageManager.getPackageInfo(anyString(), anyInt())).then(inv -> {
            final PackageInfo res = new PackageInfo();
            res.packageName = inv.getArgument(0);
            res.setLongVersionCode(VERSION_CODE);
            return res;
        });
    }
    }


    @After
    @After
@@ -702,6 +726,26 @@ public class PackageWatchdogTest {
        assertEquals(MonitoredPackage.STATE_PASSED, m4.handleElapsedTimeLocked(LONG_DURATION));
        assertEquals(MonitoredPackage.STATE_PASSED, m4.handleElapsedTimeLocked(LONG_DURATION));
    }
    }


    @Test
    public void testNetworkStackFailure() {
        final PackageWatchdog wd = createWatchdog();

        // Start observing with failure handling
        TestObserver observer = new TestObserver(OBSERVER_NAME_1,
                PackageHealthObserverImpact.USER_IMPACT_HIGH);
        wd.startObservingHealth(observer, Collections.singletonList(APP_A), SHORT_DURATION);

        // Notify of NetworkStack failure
        mNetworkStackCallbackCaptor.getValue().onNetworkStackFailure(APP_A);

        // Run handler so package failures are dispatched to observers
        mTestLooper.dispatchAll();

        // Verify the NetworkStack observer is notified
        assertEquals(1, observer.mFailedPackages.size());
        assertEquals(APP_A, observer.mFailedPackages.get(0));
    }

    private void adoptShellPermissions(String... permissions) {
    private void adoptShellPermissions(String... permissions) {
        InstrumentationRegistry
        InstrumentationRegistry
                .getInstrumentation()
                .getInstrumentation()
@@ -733,19 +777,23 @@ public class PackageWatchdogTest {
    }
    }


    private PackageWatchdog createWatchdog(TestController controller, boolean withPackagesReady) {
    private PackageWatchdog createWatchdog(TestController controller, boolean withPackagesReady) {
        Context context = InstrumentationRegistry.getContext();
        AtomicFile policyFile =
        AtomicFile policyFile =
                new AtomicFile(new File(context.getFilesDir(), "package-watchdog.xml"));
                new AtomicFile(new File(mSpyContext.getFilesDir(), "package-watchdog.xml"));
        Handler handler = new Handler(mTestLooper.getLooper());
        Handler handler = new Handler(mTestLooper.getLooper());
        PackageWatchdog watchdog =
        PackageWatchdog watchdog =
                new PackageWatchdog(context, policyFile, handler, handler, controller,
                new PackageWatchdog(mSpyContext, policyFile, handler, handler, controller,
                        mNetworkStackClient);
                        mMockNetworkStackClient);
        // Verify controller is not automatically started
        // Verify controller is not automatically started
        assertFalse(controller.mIsEnabled);
        assertFalse(controller.mIsEnabled);
        if (withPackagesReady) {
        if (withPackagesReady) {
            // Only capture the NetworkStack callback for the latest registered watchdog
            reset(mMockNetworkStackClient);
            watchdog.onPackagesReady();
            watchdog.onPackagesReady();
            // Verify controller by default is started when packages are ready
            // Verify controller by default is started when packages are ready
            assertTrue(controller.mIsEnabled);
            assertTrue(controller.mIsEnabled);

            verify(mMockNetworkStackClient).registerHealthListener(
                    mNetworkStackCallbackCaptor.capture());
        }
        }
        return watchdog;
        return watchdog;
    }
    }