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

Commit fe3b1182 authored by Neil Fuller's avatar Neil Fuller
Browse files

Track TimeZoneDistroInstaller method changes

The TimeZoneDistroInstaller now takes a TimeZoneDistro object
not bytes, which will help to hide whether the distro is in memory
or in storage. See the associated libcore change for details.

To run tests:
make -j30 FrameworksServicesTests
adb install -r -g
  "out/target/product/angler/data/app/FrameworksServicesTests/FrameworksServicesTests.apk"
adb shell am instrument -e package com.android.server.timezone -w
  com.android.frameworks.servicestests \
  "com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner"

Test: See above.
Bug: 31008728

Change-Id: Ieead1bb87b9ae196abab93342ba5c5747ca45116
parent 1dae9a47
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.server.SystemService;
import com.android.timezone.distro.DistroException;
import com.android.timezone.distro.DistroVersion;
import com.android.timezone.distro.TimeZoneDistro;
import com.android.timezone.distro.StagedDistroOperation;

import android.app.timezone.Callback;
@@ -224,7 +225,8 @@ public final class RulesManagerService extends IRulesManager.Stub {
            try {
                byte[] distroBytes =
                        RulesManagerService.this.mFileDescriptorHelper.readFully(mTimeZoneDistro);
                int installerResult = mInstaller.stageInstallWithErrorCode(distroBytes);
                TimeZoneDistro distro = new TimeZoneDistro(distroBytes);
                int installerResult = mInstaller.stageInstallWithErrorCode(distro);
                int resultCode = mapInstallerResultToApiCode(installerResult);
                sendFinishedStatus(mCallback, resultCode);

+4 −1
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.updates;

import com.android.timezone.distro.TimeZoneDistro;

import android.util.Slog;

import java.io.File;
@@ -46,7 +48,8 @@ public class TzDataInstallReceiver extends ConfigUpdateInstallReceiver {

    @Override
    protected void install(byte[] content, int version) throws IOException {
        boolean valid = installer.install(content);
        TimeZoneDistro distro = new TimeZoneDistro(content);
        boolean valid = installer.install(distro);
        Slog.i(TAG, "Timezone data install valid for this device: " + valid);
        // Even if !valid, we call super.install(). Only in the event of an exception should we
        // not. If we didn't do this we could attempt to install repeatedly.
+17 −10
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.timezone;

import com.android.timezone.distro.DistroVersion;
import com.android.timezone.distro.TimeZoneDistro;
import com.android.timezone.distro.StagedDistroOperation;

import org.junit.Before;
@@ -403,14 +404,16 @@ public class RulesManagerServiceTest {
        verifyNoInstallerCallsMade();
        verifyNoPackageTrackerCallsMade();

        TimeZoneDistro expectedDistro = new TimeZoneDistro(expectedContent);

        // Set up the installer.
        configureStageInstallExpectation(expectedContent, TimeZoneDistroInstaller.INSTALL_SUCCESS);
        configureStageInstallExpectation(expectedDistro, TimeZoneDistroInstaller.INSTALL_SUCCESS);

        // Simulate the async execution.
        mFakeExecutor.simulateAsyncExecutionOfLastCommand();

        // Verify the expected calls were made to other components.
        verifyStageInstallCalled(expectedContent);
        verifyStageInstallCalled(expectedDistro);
        verifyPackageTrackerCalled(token, true /* success */);

        // Check the callback was called.
@@ -436,14 +439,16 @@ public class RulesManagerServiceTest {
        verifyNoInstallerCallsMade();
        callback.assertNoResultReceived();

        TimeZoneDistro expectedDistro = new TimeZoneDistro(expectedContent);

        // Set up the installer.
        configureStageInstallExpectation(expectedContent, TimeZoneDistroInstaller.INSTALL_SUCCESS);
        configureStageInstallExpectation(expectedDistro, TimeZoneDistroInstaller.INSTALL_SUCCESS);

        // Simulate the async execution.
        mFakeExecutor.simulateAsyncExecutionOfLastCommand();

        // Verify the expected calls were made to other components.
        verifyStageInstallCalled(expectedContent);
        verifyStageInstallCalled(expectedDistro);
        verifyPackageTrackerCalled(null /* expectedToken */, true /* success */);

        // Check the callback was received.
@@ -471,15 +476,17 @@ public class RulesManagerServiceTest {
        verifyNoInstallerCallsMade();
        callback.assertNoResultReceived();

        TimeZoneDistro expectedDistro = new TimeZoneDistro(expectedContent);

        // Set up the installer.
        configureStageInstallExpectation(
                expectedContent, TimeZoneDistroInstaller.INSTALL_FAIL_VALIDATION_ERROR);
                expectedDistro, TimeZoneDistroInstaller.INSTALL_FAIL_VALIDATION_ERROR);

        // Simulate the async execution.
        mFakeExecutor.simulateAsyncExecutionOfLastCommand();

        // Verify the expected calls were made to other components.
        verifyStageInstallCalled(expectedContent);
        verifyStageInstallCalled(expectedDistro);

        // Validation failure is treated like a successful check: repeating it won't improve things.
        boolean expectedSuccess = true;
@@ -780,9 +787,9 @@ public class RulesManagerServiceTest {
                .thenThrow(new IOException("Simulated failure"));
    }

    private void configureStageInstallExpectation(byte[] expectedContent, int resultCode)
    private void configureStageInstallExpectation(TimeZoneDistro expected, int resultCode)
            throws Exception {
        when(mMockTimeZoneDistroInstaller.stageInstallWithErrorCode(eq(expectedContent)))
        when(mMockTimeZoneDistroInstaller.stageInstallWithErrorCode(eq(expected)))
                .thenReturn(resultCode);
    }

@@ -790,8 +797,8 @@ public class RulesManagerServiceTest {
        doReturn(success).when(mMockTimeZoneDistroInstaller).stageUninstall();
    }

    private void verifyStageInstallCalled(byte[] expectedContent) throws Exception {
        verify(mMockTimeZoneDistroInstaller).stageInstallWithErrorCode(eq(expectedContent));
    private void verifyStageInstallCalled(TimeZoneDistro expected) throws Exception {
        verify(mMockTimeZoneDistroInstaller).stageInstallWithErrorCode(eq(expected));
        verifyNoMoreInteractions(mMockTimeZoneDistroInstaller);
        reset(mMockTimeZoneDistroInstaller);
    }