Merge "Add support for LoggingOnly changes" into rvc-dev

This commit is contained in:
Anna Trostanetski
2020-03-06 14:38:28 +00:00
committed by Android (Google) Code Review
10 changed files with 106 additions and 25 deletions

View File

@@ -30,6 +30,7 @@ public class CompatibilityChangeInfo implements Parcelable {
private final @Nullable String mName; private final @Nullable String mName;
private final int mEnableAfterTargetSdk; private final int mEnableAfterTargetSdk;
private final boolean mDisabled; private final boolean mDisabled;
private final boolean mLoggingOnly;
private final @Nullable String mDescription; private final @Nullable String mDescription;
public long getId() { public long getId() {
@@ -49,17 +50,22 @@ public class CompatibilityChangeInfo implements Parcelable {
return mDisabled; return mDisabled;
} }
public boolean getLoggingOnly() {
return mLoggingOnly;
}
public String getDescription() { public String getDescription() {
return mDescription; return mDescription;
} }
public CompatibilityChangeInfo( public CompatibilityChangeInfo(
Long changeId, String name, int enableAfterTargetSdk, boolean disabled, Long changeId, String name, int enableAfterTargetSdk, boolean disabled,
String description) { boolean loggingOnly, String description) {
this.mChangeId = changeId; this.mChangeId = changeId;
this.mName = name; this.mName = name;
this.mEnableAfterTargetSdk = enableAfterTargetSdk; this.mEnableAfterTargetSdk = enableAfterTargetSdk;
this.mDisabled = disabled; this.mDisabled = disabled;
this.mLoggingOnly = loggingOnly;
this.mDescription = description; this.mDescription = description;
} }
@@ -68,6 +74,7 @@ public class CompatibilityChangeInfo implements Parcelable {
mName = in.readString(); mName = in.readString();
mEnableAfterTargetSdk = in.readInt(); mEnableAfterTargetSdk = in.readInt();
mDisabled = in.readBoolean(); mDisabled = in.readBoolean();
mLoggingOnly = in.readBoolean();
mDescription = in.readString(); mDescription = in.readString();
} }
@@ -82,6 +89,7 @@ public class CompatibilityChangeInfo implements Parcelable {
dest.writeString(mName); dest.writeString(mName);
dest.writeInt(mEnableAfterTargetSdk); dest.writeInt(mEnableAfterTargetSdk);
dest.writeBoolean(mDisabled); dest.writeBoolean(mDisabled);
dest.writeBoolean(mLoggingOnly);
dest.writeString(mDescription); dest.writeString(mDescription);
} }

View File

@@ -33,7 +33,8 @@ public final class OverrideAllowedState implements Parcelable {
DISABLED_NOT_DEBUGGABLE, DISABLED_NOT_DEBUGGABLE,
DISABLED_NON_TARGET_SDK, DISABLED_NON_TARGET_SDK,
DISABLED_TARGET_SDK_TOO_HIGH, DISABLED_TARGET_SDK_TOO_HIGH,
PACKAGE_DOES_NOT_EXIST PACKAGE_DOES_NOT_EXIST,
LOGGING_ONLY_CHANGE
}) })
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface State { public @interface State {
@@ -60,6 +61,10 @@ public final class OverrideAllowedState implements Parcelable {
* Package does not exist. * Package does not exist.
*/ */
public static final int PACKAGE_DOES_NOT_EXIST = 4; public static final int PACKAGE_DOES_NOT_EXIST = 4;
/**
* Change is marked as logging only, and cannot be toggled.
*/
public static final int LOGGING_ONLY_CHANGE = 5;
@State @State
public final int state; public final int state;
@@ -118,6 +123,10 @@ public final class OverrideAllowedState implements Parcelable {
"Cannot override %1$d for %2$s because the package does not exist, and " "Cannot override %1$d for %2$s because the package does not exist, and "
+ "the change is targetSdk gated.", + "the change is targetSdk gated.",
changeId, packageName)); changeId, packageName));
case LOGGING_ONLY_CHANGE:
throw new SecurityException(String.format(
"Cannot override %1$d because it is marked as a logging-only change.",
changeId));
} }
} }

View File

@@ -63,7 +63,7 @@ public final class CompatChange extends CompatibilityChangeInfo {
private Map<String, Boolean> mPackageOverrides; private Map<String, Boolean> mPackageOverrides;
public CompatChange(long changeId) { public CompatChange(long changeId) {
this(changeId, null, -1, false, null); this(changeId, null, -1, false, false, null);
} }
/** /**
@@ -74,8 +74,8 @@ public final class CompatChange extends CompatibilityChangeInfo {
* @param disabled If {@code true}, overrides any {@code enableAfterTargetSdk} set. * @param disabled If {@code true}, overrides any {@code enableAfterTargetSdk} set.
*/ */
public CompatChange(long changeId, @Nullable String name, int enableAfterTargetSdk, public CompatChange(long changeId, @Nullable String name, int enableAfterTargetSdk,
boolean disabled, String description) { boolean disabled, boolean loggingOnly, String description) {
super(changeId, name, enableAfterTargetSdk, disabled, description); super(changeId, name, enableAfterTargetSdk, disabled, loggingOnly, description);
} }
/** /**
@@ -83,7 +83,7 @@ public final class CompatChange extends CompatibilityChangeInfo {
*/ */
public CompatChange(Change change) { public CompatChange(Change change) {
super(change.getId(), change.getName(), change.getEnableAfterTargetSdk(), super(change.getId(), change.getName(), change.getEnableAfterTargetSdk(),
change.getDisabled(), change.getDescription()); change.getDisabled(), change.getLoggingOnly(), change.getDescription());
} }
void registerListener(ChangeListener listener) { void registerListener(ChangeListener listener) {
@@ -105,6 +105,10 @@ public final class CompatChange extends CompatibilityChangeInfo {
* @param enabled Whether or not to enable the change. * @param enabled Whether or not to enable the change.
*/ */
void addPackageOverride(String pname, boolean enabled) { void addPackageOverride(String pname, boolean enabled) {
if (getLoggingOnly()) {
throw new IllegalArgumentException(
"Can't add overrides for a logging only change " + toString());
}
if (mPackageOverrides == null) { if (mPackageOverrides == null) {
mPackageOverrides = new HashMap<>(); mPackageOverrides = new HashMap<>();
} }
@@ -160,6 +164,9 @@ public final class CompatChange extends CompatibilityChangeInfo {
if (getDisabled()) { if (getDisabled()) {
sb.append("; disabled"); sb.append("; disabled");
} }
if (getLoggingOnly()) {
sb.append("; loggingOnly");
}
if (mPackageOverrides != null && mPackageOverrides.size() > 0) { if (mPackageOverrides != null && mPackageOverrides.size() > 0) {
sb.append("; packageOverrides=").append(mPackageOverrides); sb.append("; packageOverrides=").append(mPackageOverrides);
} }

View File

@@ -205,6 +205,19 @@ final class CompatConfig {
} }
} }
/**
* Returns whether the change is marked as logging only.
*/
boolean isLoggingOnly(long changeId) {
synchronized (mChanges) {
CompatChange c = mChanges.get(changeId);
if (c == null) {
return false;
}
return c.getLoggingOnly();
}
}
/** /**
* Removes an override previously added via {@link #addOverride(long, String, boolean)}. This * Removes an override previously added via {@link #addOverride(long, String, boolean)}. This
* restores the default behaviour for the given change and app, once any app processes have been * restores the default behaviour for the given change and app, once any app processes have been
@@ -365,6 +378,7 @@ final class CompatConfig {
change.getName(), change.getName(),
change.getEnableAfterTargetSdk(), change.getEnableAfterTargetSdk(),
change.getDisabled(), change.getDisabled(),
change.getLoggingOnly(),
change.getDescription()); change.getDescription());
} }
return changeInfos; return changeInfos;

View File

@@ -20,6 +20,7 @@ import static com.android.internal.compat.OverrideAllowedState.ALLOWED;
import static com.android.internal.compat.OverrideAllowedState.DISABLED_NON_TARGET_SDK; import static com.android.internal.compat.OverrideAllowedState.DISABLED_NON_TARGET_SDK;
import static com.android.internal.compat.OverrideAllowedState.DISABLED_NOT_DEBUGGABLE; import static com.android.internal.compat.OverrideAllowedState.DISABLED_NOT_DEBUGGABLE;
import static com.android.internal.compat.OverrideAllowedState.DISABLED_TARGET_SDK_TOO_HIGH; import static com.android.internal.compat.OverrideAllowedState.DISABLED_TARGET_SDK_TOO_HIGH;
import static com.android.internal.compat.OverrideAllowedState.LOGGING_ONLY_CHANGE;
import static com.android.internal.compat.OverrideAllowedState.PACKAGE_DOES_NOT_EXIST; import static com.android.internal.compat.OverrideAllowedState.PACKAGE_DOES_NOT_EXIST;
import android.content.Context; import android.content.Context;
@@ -51,12 +52,13 @@ public class OverrideValidatorImpl extends IOverrideValidator.Stub {
@Override @Override
public OverrideAllowedState getOverrideAllowedState(long changeId, String packageName) { public OverrideAllowedState getOverrideAllowedState(long changeId, String packageName) {
boolean debuggableBuild = false; if (mCompatConfig.isLoggingOnly(changeId)) {
boolean finalBuild = false; return new OverrideAllowedState(LOGGING_ONLY_CHANGE, -1, -1);
int minTargetSdk = mCompatConfig.minTargetSdkForChangeId(changeId); }
debuggableBuild = mAndroidBuildClassifier.isDebuggableBuild(); boolean debuggableBuild = mAndroidBuildClassifier.isDebuggableBuild();
finalBuild = mAndroidBuildClassifier.isFinalBuild(); boolean finalBuild = mAndroidBuildClassifier.isFinalBuild();
int minTargetSdk = mCompatConfig.minTargetSdkForChangeId(changeId);
// Allow any override for userdebug or eng builds. // Allow any override for userdebug or eng builds.
if (debuggableBuild) { if (debuggableBuild) {

View File

@@ -27,6 +27,7 @@
<xs:attribute type="xs:long" name="id" use="required"/> <xs:attribute type="xs:long" name="id" use="required"/>
<xs:attribute type="xs:string" name="name" use="required"/> <xs:attribute type="xs:string" name="name" use="required"/>
<xs:attribute type="xs:boolean" name="disabled"/> <xs:attribute type="xs:boolean" name="disabled"/>
<xs:attribute type="xs:boolean" name="loggingOnly"/>
<xs:attribute type="xs:int" name="enableAfterTargetSdk"/> <xs:attribute type="xs:int" name="enableAfterTargetSdk"/>
<xs:attribute type="xs:string" name="description"/> <xs:attribute type="xs:string" name="description"/>
</xs:extension> </xs:extension>

View File

@@ -7,12 +7,14 @@ package com.android.server.compat.config {
method public boolean getDisabled(); method public boolean getDisabled();
method public int getEnableAfterTargetSdk(); method public int getEnableAfterTargetSdk();
method public long getId(); method public long getId();
method public boolean getLoggingOnly();
method public String getName(); method public String getName();
method public String getValue(); method public String getValue();
method public void setDescription(String); method public void setDescription(String);
method public void setDisabled(boolean); method public void setDisabled(boolean);
method public void setEnableAfterTargetSdk(int); method public void setEnableAfterTargetSdk(int);
method public void setId(long); method public void setId(long);
method public void setLoggingOnly(boolean);
method public void setName(String); method public void setName(String);
method public void setValue(String); method public void setValue(String);
} }

View File

@@ -40,52 +40,57 @@ class CompatConfigBuilder {
} }
CompatConfigBuilder addTargetSdkChangeWithId(int sdk, long id) { CompatConfigBuilder addTargetSdkChangeWithId(int sdk, long id) {
mChanges.add(new CompatChange(id, "", sdk, false, "")); mChanges.add(new CompatChange(id, "", sdk, false, false, ""));
return this; return this;
} }
CompatConfigBuilder addTargetSdkDisabledChangeWithId(int sdk, long id) { CompatConfigBuilder addTargetSdkDisabledChangeWithId(int sdk, long id) {
mChanges.add(new CompatChange(id, "", sdk, true, "")); mChanges.add(new CompatChange(id, "", sdk, true, false, ""));
return this; return this;
} }
CompatConfigBuilder addTargetSdkChangeWithIdAndName(int sdk, long id, String name) { CompatConfigBuilder addTargetSdkChangeWithIdAndName(int sdk, long id, String name) {
mChanges.add(new CompatChange(id, name, sdk, false, "")); mChanges.add(new CompatChange(id, name, sdk, false, false, ""));
return this; return this;
} }
CompatConfigBuilder addTargetSdkChangeWithIdAndDescription(int sdk, long id, CompatConfigBuilder addTargetSdkChangeWithIdAndDescription(int sdk, long id,
String description) { String description) {
mChanges.add(new CompatChange(id, "", sdk, false, description)); mChanges.add(new CompatChange(id, "", sdk, false, false, description));
return this; return this;
} }
CompatConfigBuilder addEnabledChangeWithId(long id) { CompatConfigBuilder addEnabledChangeWithId(long id) {
mChanges.add(new CompatChange(id, "", -1, false, "")); mChanges.add(new CompatChange(id, "", -1, false, false, ""));
return this; return this;
} }
CompatConfigBuilder addEnabledChangeWithIdAndName(long id, String name) { CompatConfigBuilder addEnabledChangeWithIdAndName(long id, String name) {
mChanges.add(new CompatChange(id, name, -1, false, "")); mChanges.add(new CompatChange(id, name, -1, false, false, ""));
return this; return this;
} }
CompatConfigBuilder addEnabledChangeWithIdAndDescription(long id, String description) { CompatConfigBuilder addEnabledChangeWithIdAndDescription(long id, String description) {
mChanges.add(new CompatChange(id, "", -1, false, description)); mChanges.add(new CompatChange(id, "", -1, false, false, description));
return this; return this;
} }
CompatConfigBuilder addDisabledChangeWithId(long id) { CompatConfigBuilder addDisabledChangeWithId(long id) {
mChanges.add(new CompatChange(id, "", -1, true, "")); mChanges.add(new CompatChange(id, "", -1, true, false, ""));
return this; return this;
} }
CompatConfigBuilder addDisabledChangeWithIdAndName(long id, String name) { CompatConfigBuilder addDisabledChangeWithIdAndName(long id, String name) {
mChanges.add(new CompatChange(id, name, -1, true, "")); mChanges.add(new CompatChange(id, name, -1, true, false, ""));
return this; return this;
} }
CompatConfigBuilder addDisabledChangeWithIdAndDescription(long id, String description) { CompatConfigBuilder addDisabledChangeWithIdAndDescription(long id, String description) {
mChanges.add(new CompatChange(id, "", -1, true, description)); mChanges.add(new CompatChange(id, "", -1, true, false, description));
return this;
}
CompatConfigBuilder addLoggingOnlyChangeWithId(long id) {
mChanges.add(new CompatChange(id, "", -1, false, true, ""));
return this; return this;
} }

View File

@@ -213,6 +213,17 @@ public class CompatConfigTest {
assertThat(compatConfig.isChangeEnabled(1234L, applicationInfo)).isFalse(); assertThat(compatConfig.isChangeEnabled(1234L, applicationInfo)).isFalse();
} }
@Test
public void testLoggingOnlyChangePreventAddOverride() throws Exception {
CompatConfig compatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext)
.addLoggingOnlyChangeWithId(1234L)
.build();
assertThrows(SecurityException.class,
() -> compatConfig.addOverride(1234L, "com.some.package", true)
);
}
@Test @Test
public void testPreventRemoveOverride() throws Exception { public void testPreventRemoveOverride() throws Exception {
CompatConfig compatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext) CompatConfig compatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext)

View File

@@ -20,6 +20,7 @@ import static com.android.internal.compat.OverrideAllowedState.ALLOWED;
import static com.android.internal.compat.OverrideAllowedState.DISABLED_NON_TARGET_SDK; import static com.android.internal.compat.OverrideAllowedState.DISABLED_NON_TARGET_SDK;
import static com.android.internal.compat.OverrideAllowedState.DISABLED_NOT_DEBUGGABLE; import static com.android.internal.compat.OverrideAllowedState.DISABLED_NOT_DEBUGGABLE;
import static com.android.internal.compat.OverrideAllowedState.DISABLED_TARGET_SDK_TOO_HIGH; import static com.android.internal.compat.OverrideAllowedState.DISABLED_TARGET_SDK_TOO_HIGH;
import static com.android.internal.compat.OverrideAllowedState.LOGGING_ONLY_CHANGE;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
@@ -78,6 +79,7 @@ public class OverrideValidatorImplTest {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
android.app.compat.ChangeIdStateCache.disable();
when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getPackageManager()).thenReturn(mPackageManager);
} }
@@ -89,7 +91,8 @@ public class OverrideValidatorImplTest {
.addTargetSdkChangeWithId(TARGET_SDK, 2) .addTargetSdkChangeWithId(TARGET_SDK, 2)
.addTargetSdkChangeWithId(TARGET_SDK_AFTER, 3) .addTargetSdkChangeWithId(TARGET_SDK_AFTER, 3)
.addEnabledChangeWithId(4) .addEnabledChangeWithId(4)
.addDisabledChangeWithId(5).build(); .addDisabledChangeWithId(5)
.addLoggingOnlyChangeWithId(6).build();
IOverrideValidator overrideValidator = config.getOverrideValidator(); IOverrideValidator overrideValidator = config.getOverrideValidator();
when(mPackageManager.getApplicationInfo(eq(PACKAGE_NAME), anyInt())) when(mPackageManager.getApplicationInfo(eq(PACKAGE_NAME), anyInt()))
.thenReturn(ApplicationInfoBuilder.create() .thenReturn(ApplicationInfoBuilder.create()
@@ -107,6 +110,8 @@ public class OverrideValidatorImplTest {
overrideValidator.getOverrideAllowedState(4, PACKAGE_NAME); overrideValidator.getOverrideAllowedState(4, PACKAGE_NAME);
OverrideAllowedState stateDisabledChange = OverrideAllowedState stateDisabledChange =
overrideValidator.getOverrideAllowedState(5, PACKAGE_NAME); overrideValidator.getOverrideAllowedState(5, PACKAGE_NAME);
OverrideAllowedState stateDLoggingOnlyChange =
overrideValidator.getOverrideAllowedState(6, PACKAGE_NAME);
assertThat(stateTargetSdkLessChange) assertThat(stateTargetSdkLessChange)
.isEqualTo(new OverrideAllowedState(ALLOWED, -1, -1)); .isEqualTo(new OverrideAllowedState(ALLOWED, -1, -1));
@@ -118,6 +123,8 @@ public class OverrideValidatorImplTest {
.isEqualTo(new OverrideAllowedState(ALLOWED, -1, -1)); .isEqualTo(new OverrideAllowedState(ALLOWED, -1, -1));
assertThat(stateDisabledChange) assertThat(stateDisabledChange)
.isEqualTo(new OverrideAllowedState(ALLOWED, -1, -1)); .isEqualTo(new OverrideAllowedState(ALLOWED, -1, -1));
assertThat(stateDLoggingOnlyChange)
.isEqualTo(new OverrideAllowedState(LOGGING_ONLY_CHANGE, -1, -1));
} }
@Test @Test
@@ -128,7 +135,8 @@ public class OverrideValidatorImplTest {
.addTargetSdkChangeWithId(TARGET_SDK, 2) .addTargetSdkChangeWithId(TARGET_SDK, 2)
.addTargetSdkChangeWithId(TARGET_SDK_AFTER, 3) .addTargetSdkChangeWithId(TARGET_SDK_AFTER, 3)
.addEnabledChangeWithId(4) .addEnabledChangeWithId(4)
.addDisabledChangeWithId(5).build(); .addDisabledChangeWithId(5)
.addLoggingOnlyChangeWithId(6).build();
IOverrideValidator overrideValidator = config.getOverrideValidator(); IOverrideValidator overrideValidator = config.getOverrideValidator();
when(mPackageManager.getApplicationInfo(eq(PACKAGE_NAME), anyInt())) when(mPackageManager.getApplicationInfo(eq(PACKAGE_NAME), anyInt()))
.thenReturn(ApplicationInfoBuilder.create() .thenReturn(ApplicationInfoBuilder.create()
@@ -145,6 +153,8 @@ public class OverrideValidatorImplTest {
overrideValidator.getOverrideAllowedState(4, PACKAGE_NAME); overrideValidator.getOverrideAllowedState(4, PACKAGE_NAME);
OverrideAllowedState stateDisabledChange = OverrideAllowedState stateDisabledChange =
overrideValidator.getOverrideAllowedState(5, PACKAGE_NAME); overrideValidator.getOverrideAllowedState(5, PACKAGE_NAME);
OverrideAllowedState stateDLoggingOnlyChange =
overrideValidator.getOverrideAllowedState(6, PACKAGE_NAME);
assertThat(stateTargetSdkLessChange) assertThat(stateTargetSdkLessChange)
.isEqualTo(new OverrideAllowedState(ALLOWED, -1, -1)); .isEqualTo(new OverrideAllowedState(ALLOWED, -1, -1));
@@ -156,6 +166,8 @@ public class OverrideValidatorImplTest {
.isEqualTo(new OverrideAllowedState(ALLOWED, -1, -1)); .isEqualTo(new OverrideAllowedState(ALLOWED, -1, -1));
assertThat(stateDisabledChange) assertThat(stateDisabledChange)
.isEqualTo(new OverrideAllowedState(ALLOWED, -1, -1)); .isEqualTo(new OverrideAllowedState(ALLOWED, -1, -1));
assertThat(stateDLoggingOnlyChange)
.isEqualTo(new OverrideAllowedState(LOGGING_ONLY_CHANGE, -1, -1));
} }
@Test @Test
@@ -232,7 +244,8 @@ public class OverrideValidatorImplTest {
.addTargetSdkChangeWithId(TARGET_SDK, 2) .addTargetSdkChangeWithId(TARGET_SDK, 2)
.addTargetSdkChangeWithId(TARGET_SDK_AFTER, 3) .addTargetSdkChangeWithId(TARGET_SDK_AFTER, 3)
.addEnabledChangeWithId(4) .addEnabledChangeWithId(4)
.addDisabledChangeWithId(5).build(); .addDisabledChangeWithId(5)
.addLoggingOnlyChangeWithId(6).build();
IOverrideValidator overrideValidator = config.getOverrideValidator(); IOverrideValidator overrideValidator = config.getOverrideValidator();
when(mPackageManager.getApplicationInfo(eq(PACKAGE_NAME), anyInt())) when(mPackageManager.getApplicationInfo(eq(PACKAGE_NAME), anyInt()))
.thenReturn(ApplicationInfoBuilder.create() .thenReturn(ApplicationInfoBuilder.create()
@@ -249,6 +262,8 @@ public class OverrideValidatorImplTest {
overrideValidator.getOverrideAllowedState(4, PACKAGE_NAME); overrideValidator.getOverrideAllowedState(4, PACKAGE_NAME);
OverrideAllowedState stateDisabledChange = OverrideAllowedState stateDisabledChange =
overrideValidator.getOverrideAllowedState(5, PACKAGE_NAME); overrideValidator.getOverrideAllowedState(5, PACKAGE_NAME);
OverrideAllowedState stateDLoggingOnlyChange =
overrideValidator.getOverrideAllowedState(6, PACKAGE_NAME);
assertThat(stateTargetSdkLessChange) assertThat(stateTargetSdkLessChange)
.isEqualTo(new OverrideAllowedState(DISABLED_NOT_DEBUGGABLE, -1, -1)); .isEqualTo(new OverrideAllowedState(DISABLED_NOT_DEBUGGABLE, -1, -1));
@@ -260,6 +275,8 @@ public class OverrideValidatorImplTest {
.isEqualTo(new OverrideAllowedState(DISABLED_NOT_DEBUGGABLE, -1, -1)); .isEqualTo(new OverrideAllowedState(DISABLED_NOT_DEBUGGABLE, -1, -1));
assertThat(stateDisabledChange) assertThat(stateDisabledChange)
.isEqualTo(new OverrideAllowedState(DISABLED_NOT_DEBUGGABLE, -1, -1)); .isEqualTo(new OverrideAllowedState(DISABLED_NOT_DEBUGGABLE, -1, -1));
assertThat(stateDLoggingOnlyChange)
.isEqualTo(new OverrideAllowedState(LOGGING_ONLY_CHANGE, -1, -1));
} }
@Test @Test
@@ -351,7 +368,8 @@ public class OverrideValidatorImplTest {
.addTargetSdkChangeWithId(TARGET_SDK, 2) .addTargetSdkChangeWithId(TARGET_SDK, 2)
.addTargetSdkChangeWithId(TARGET_SDK_AFTER, 3) .addTargetSdkChangeWithId(TARGET_SDK_AFTER, 3)
.addEnabledChangeWithId(4) .addEnabledChangeWithId(4)
.addDisabledChangeWithId(5).build(); .addDisabledChangeWithId(5)
.addLoggingOnlyChangeWithId(6).build();
IOverrideValidator overrideValidator = config.getOverrideValidator(); IOverrideValidator overrideValidator = config.getOverrideValidator();
when(mPackageManager.getApplicationInfo(eq(PACKAGE_NAME), anyInt())) when(mPackageManager.getApplicationInfo(eq(PACKAGE_NAME), anyInt()))
.thenReturn(ApplicationInfoBuilder.create() .thenReturn(ApplicationInfoBuilder.create()
@@ -368,6 +386,8 @@ public class OverrideValidatorImplTest {
overrideValidator.getOverrideAllowedState(4, PACKAGE_NAME); overrideValidator.getOverrideAllowedState(4, PACKAGE_NAME);
OverrideAllowedState stateDisabledChange = OverrideAllowedState stateDisabledChange =
overrideValidator.getOverrideAllowedState(5, PACKAGE_NAME); overrideValidator.getOverrideAllowedState(5, PACKAGE_NAME);
OverrideAllowedState stateDLoggingOnlyChange =
overrideValidator.getOverrideAllowedState(6, PACKAGE_NAME);
assertThat(stateTargetSdkLessChange) assertThat(stateTargetSdkLessChange)
.isEqualTo(new OverrideAllowedState(DISABLED_NOT_DEBUGGABLE, -1, -1)); .isEqualTo(new OverrideAllowedState(DISABLED_NOT_DEBUGGABLE, -1, -1));
@@ -379,5 +399,7 @@ public class OverrideValidatorImplTest {
.isEqualTo(new OverrideAllowedState(DISABLED_NOT_DEBUGGABLE, -1, -1)); .isEqualTo(new OverrideAllowedState(DISABLED_NOT_DEBUGGABLE, -1, -1));
assertThat(stateDisabledChange) assertThat(stateDisabledChange)
.isEqualTo(new OverrideAllowedState(DISABLED_NOT_DEBUGGABLE, -1, -1)); .isEqualTo(new OverrideAllowedState(DISABLED_NOT_DEBUGGABLE, -1, -1));
assertThat(stateDLoggingOnlyChange)
.isEqualTo(new OverrideAllowedState(LOGGING_ONLY_CHANGE, -1, -1));
} }
} }