1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17 package android.app.admin; 18 19 import static org.junit.Assert.assertEquals; 20 import static org.junit.Assert.assertNotEquals; 21 22 import android.os.Parcel; 23 import android.support.test.filters.SmallTest; 24 import android.support.test.runner.AndroidJUnit4; 25 26 import org.junit.Test; 27 import org.junit.runner.RunWith; 28 29 /** Unit tests for {@link PasswordMetrics}. */ 30 @RunWith(AndroidJUnit4.class) 31 @SmallTest 32 public class PasswordMetricsTest { 33 34 @Test 35 public void testIsDefault() { 36 final PasswordMetrics metrics = new PasswordMetrics(); 37 assertEquals(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, metrics.quality); 38 assertEquals(0, metrics.length); 39 assertEquals(0, metrics.letters); 40 assertEquals(0, metrics.upperCase); 41 assertEquals(0, metrics.lowerCase); 42 assertEquals(0, metrics.numeric); 43 assertEquals(0, metrics.symbols); 44 assertEquals(0, metrics.nonLetter); 45 } 46 47 @Test 48 public void testParceling() { 49 final int quality = 0; 50 final int length = 1; 51 final int letters = 2; 52 final int upperCase = 3; 53 final int lowerCase = 4; 54 final int numeric = 5; 55 final int symbols = 6; 56 final int nonLetter = 7; 57 58 final Parcel parcel = Parcel.obtain(); 59 final PasswordMetrics metrics; 60 try { 61 new PasswordMetrics( 62 quality, length, letters, upperCase, lowerCase, numeric, symbols, nonLetter) 63 .writeToParcel(parcel, 0); 64 parcel.setDataPosition(0); 65 metrics = PasswordMetrics.CREATOR.createFromParcel(parcel); 66 } finally { 67 parcel.recycle(); 68 } 69 70 assertEquals(quality, metrics.quality); 71 assertEquals(length, metrics.length); 72 assertEquals(letters, metrics.letters); 73 assertEquals(upperCase, metrics.upperCase); 74 assertEquals(lowerCase, metrics.lowerCase); 75 assertEquals(numeric, metrics.numeric); 76 assertEquals(symbols, metrics.symbols); 77 assertEquals(nonLetter, metrics.nonLetter); 78 79 } 80 81 @Test 82 public void testComputeForPassword_metrics() { 83 final PasswordMetrics metrics = PasswordMetrics.computeForPassword("6B~0z1Z3*8A"); 84 assertEquals(11, metrics.length); 85 assertEquals(4, metrics.letters); 86 assertEquals(3, metrics.upperCase); 87 assertEquals(1, metrics.lowerCase); 88 assertEquals(5, metrics.numeric); 89 assertEquals(2, metrics.symbols); 90 assertEquals(7, metrics.nonLetter); 91 } 92 93 @Test 94 public void testComputeForPassword_quality() { 95 assertEquals(DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC, 96 PasswordMetrics.computeForPassword("a1").quality); 97 assertEquals(DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, 98 PasswordMetrics.computeForPassword("a").quality); 99 assertEquals(DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, 100 PasswordMetrics.computeForPassword("*~&%$").quality); 101 assertEquals(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX, 102 PasswordMetrics.computeForPassword("1").quality); 103 // contains a long sequence so isn't complex 104 assertEquals(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, 105 PasswordMetrics.computeForPassword("1234").quality); 106 assertEquals(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, 107 PasswordMetrics.computeForPassword("").quality); 108 } 109 110 @Test 111 public void testMaxLengthSequence() { 112 assertEquals(4, PasswordMetrics.maxLengthSequence("1234")); 113 assertEquals(5, PasswordMetrics.maxLengthSequence("13579")); 114 assertEquals(4, PasswordMetrics.maxLengthSequence("1234abd")); 115 assertEquals(3, PasswordMetrics.maxLengthSequence("aabc")); 116 assertEquals(1, PasswordMetrics.maxLengthSequence("qwertyuio")); 117 assertEquals(3, PasswordMetrics.maxLengthSequence("@ABC")); 118 // anything that repeats 119 assertEquals(4, PasswordMetrics.maxLengthSequence(";;;;")); 120 // ordered, but not composed of alphas or digits 121 assertEquals(1, PasswordMetrics.maxLengthSequence(":;<=>")); 122 } 123 124 @Test 125 public void testEquals() { 126 PasswordMetrics metrics0 = new PasswordMetrics(); 127 PasswordMetrics metrics1 = new PasswordMetrics(); 128 assertNotEquals(metrics0, null); 129 assertNotEquals(metrics0, new Object()); 130 assertEquals(metrics0, metrics0); 131 assertEquals(metrics0, metrics1); 132 133 assertEquals(new PasswordMetrics(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, 4), 134 new PasswordMetrics(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, 4)); 135 136 assertNotEquals(new PasswordMetrics(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, 4), 137 new PasswordMetrics(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, 5)); 138 139 assertNotEquals(new PasswordMetrics(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, 4), 140 new PasswordMetrics(DevicePolicyManager.PASSWORD_QUALITY_COMPLEX, 4)); 141 142 metrics0 = PasswordMetrics.computeForPassword("1234abcd,./"); 143 metrics1 = PasswordMetrics.computeForPassword("1234abcd,./"); 144 assertEquals(metrics0, metrics1); 145 metrics1.letters++; 146 assertNotEquals(metrics0, metrics1); 147 metrics1.letters--; 148 metrics1.upperCase++; 149 assertNotEquals(metrics0, metrics1); 150 metrics1.upperCase--; 151 metrics1.lowerCase++; 152 assertNotEquals(metrics0, metrics1); 153 metrics1.lowerCase--; 154 metrics1.numeric++; 155 assertNotEquals(metrics0, metrics1); 156 metrics1.numeric--; 157 metrics1.symbols++; 158 assertNotEquals(metrics0, metrics1); 159 metrics1.symbols--; 160 metrics1.nonLetter++; 161 assertNotEquals(metrics0, metrics1); 162 metrics1.nonLetter--; 163 assertEquals(metrics0, metrics1); 164 165 166 } 167 } 168