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 {
|
||||
if (obj != null) {
|
||||
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);
|
||||
}
|
||||
} catch (ClassCastException e) {
|
||||
@@ -268,6 +270,8 @@ public class Signature implements Parcelable {
|
||||
if (mHaveHashCode) {
|
||||
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);
|
||||
mHaveHashCode = true;
|
||||
return mHashCode;
|
||||
|
||||
@@ -54,6 +54,32 @@ public class SignatureTest extends TestCase {
|
||||
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) {
|
||||
return s;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user