Merge "Document Signature equals/hash should not include flags" into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
969c49681c
@@ -256,6 +256,8 @@ public class Signature implements Parcelable {
|
|||||||
try {
|
try {
|
||||||
if (obj != null) {
|
if (obj != null) {
|
||||||
Signature other = (Signature)obj;
|
Signature other = (Signature)obj;
|
||||||
|
// Note, some classes, such as PackageParser.SigningDetails, rely on equals
|
||||||
|
// only comparing the mSignature arrays without the flags.
|
||||||
return this == other || Arrays.equals(mSignature, other.mSignature);
|
return this == other || Arrays.equals(mSignature, other.mSignature);
|
||||||
}
|
}
|
||||||
} catch (ClassCastException e) {
|
} catch (ClassCastException e) {
|
||||||
@@ -268,6 +270,8 @@ public class Signature implements Parcelable {
|
|||||||
if (mHaveHashCode) {
|
if (mHaveHashCode) {
|
||||||
return mHashCode;
|
return mHashCode;
|
||||||
}
|
}
|
||||||
|
// Note, similar to equals some classes rely on the hash code not including
|
||||||
|
// the flags for Set membership checks.
|
||||||
mHashCode = Arrays.hashCode(mSignature);
|
mHashCode = Arrays.hashCode(mSignature);
|
||||||
mHaveHashCode = true;
|
mHaveHashCode = true;
|
||||||
return mHashCode;
|
return mHashCode;
|
||||||
|
|||||||
@@ -54,6 +54,32 @@ public class SignatureTest extends TestCase {
|
|||||||
assertFalse(Signature.areEffectiveMatch(asArray(A, M), asArray(A, B)));
|
assertFalse(Signature.areEffectiveMatch(asArray(A, M), asArray(A, B)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testHashCode_doesNotIncludeFlags() throws Exception {
|
||||||
|
// Some classes rely on the hash code not including the flags / capabilities for the signer
|
||||||
|
// to verify Set membership. This test verifies two signers with the same signature but
|
||||||
|
// different flags have the same hash code.
|
||||||
|
Signature signatureAWithAllCaps = new Signature(A.toCharsString());
|
||||||
|
// There are currently 5 capabilities that can be assigned to a previous signer, although
|
||||||
|
// for the purposes of this test all that matters is that the two flag values are distinct.
|
||||||
|
signatureAWithAllCaps.setFlags(31);
|
||||||
|
Signature signatureAWithNoCaps = new Signature(A.toCharsString());
|
||||||
|
signatureAWithNoCaps.setFlags(0);
|
||||||
|
|
||||||
|
assertEquals(signatureAWithAllCaps.hashCode(), signatureAWithNoCaps.hashCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testEquals_doesNotIncludeFlags() throws Exception {
|
||||||
|
// Similar to above some classes rely on equals only comparing the signature arrays
|
||||||
|
// for equality without including the flags. This test verifies two signers with the
|
||||||
|
// same signature but different flags are still considered equal.
|
||||||
|
Signature signatureAWithAllCaps = new Signature(A.toCharsString());
|
||||||
|
signatureAWithAllCaps.setFlags(31);
|
||||||
|
Signature signatureAWithNoCaps = new Signature(A.toCharsString());
|
||||||
|
signatureAWithNoCaps.setFlags(0);
|
||||||
|
|
||||||
|
assertEquals(signatureAWithAllCaps, signatureAWithNoCaps);
|
||||||
|
}
|
||||||
|
|
||||||
private static Signature[] asArray(Signature... s) {
|
private static Signature[] asArray(Signature... s) {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user