SecurityPolicyTests.java revision 469f2987dc11d153434e50eb04dd6b83b924d09d
1345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler/* 2345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * Copyright (C) 2010 The Android Open Source Project 3345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * 4345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * Licensed under the Apache License, Version 2.0 (the "License"); 5345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * you may not use this file except in compliance with the License. 6345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * You may obtain a copy of the License at 7345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * 8345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * http://www.apache.org/licenses/LICENSE-2.0 9345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * 10345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * Unless required by applicable law or agreed to in writing, software 11345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * distributed under the License is distributed on an "AS IS" BASIS, 12345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * See the License for the specific language governing permissions and 14345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * limitations under the License. 15345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler */ 16345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 17345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerpackage com.android.email; 18345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 19345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport com.android.email.SecurityPolicy.PolicySet; 201ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadlerimport com.android.email.provider.ContentCache; 211ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadlerimport com.android.email.provider.EmailContent; 22345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport com.android.email.provider.EmailProvider; 23345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport com.android.email.provider.ProviderTestUtils; 24345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport com.android.email.provider.EmailContent.Account; 25345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport com.android.email.provider.EmailContent.AccountColumns; 261ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadlerimport com.android.email.provider.EmailContent.Mailbox; 271ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadlerimport com.android.email.provider.EmailContent.Message; 28345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 29345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport android.content.ContentUris; 30345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport android.content.ContentValues; 31345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport android.content.Context; 32d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadlerimport android.content.ContextWrapper; 33345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport android.net.Uri; 34345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport android.test.ProviderTestCase2; 35345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport android.test.suitebuilder.annotation.MediumTest; 36345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport android.test.suitebuilder.annotation.SmallTest; 37345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 38345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler/** 39345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * This is a series of unit tests for backup/restore of the SecurityPolicy class. 402b2b3448ec200f3d649e5f57309908d28ce3bfc7Marc Blank * 419b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank * You can run this entire test case with: 429b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank * runtest -c com.android.email.SecurityPolicyTests email 43345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler */ 449b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank 45345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler@MediumTest 46345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerpublic class SecurityPolicyTests extends ProviderTestCase2<EmailProvider> { 47345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 48345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler private Context mMockContext; 49345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 50d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler private static final PolicySet EMPTY_POLICY_SET = 51469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler new PolicySet(0, PolicySet.PASSWORD_MODE_NONE, 0, 0, false, 0, 0, 0, false); 52d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler 53345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler public SecurityPolicyTests() { 54345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler super(EmailProvider.class, EmailProvider.EMAIL_AUTHORITY); 55345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler } 56345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 57345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler @Override 58345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler protected void setUp() throws Exception { 59345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler super.setUp(); 60d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler mMockContext = new MockContext2(getMockContext(), this.mContext); 611ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // Invalidate all caches, since we reset the database for each test 621ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler ContentCache.invalidateAllCachesForTest(); 63345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler } 64345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 65345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler /** 66345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * Delete any dummy accounts we set up for this test 67345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler */ 68345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler @Override 69345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler protected void tearDown() throws Exception { 70345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler super.tearDown(); 71345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler } 72345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 73345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler /** 740fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki * Private context wrapper used to add back getPackageName() for these tests. 750fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki * 760fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki * This class also implements {@link Context} method(s) that is called during tests. 77d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler */ 78d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler private static class MockContext2 extends ContextWrapper { 79d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler 80d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler private final Context mRealContext; 81d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler 82d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler public MockContext2(Context mockContext, Context realContext) { 83d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler super(mockContext); 84d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler mRealContext = realContext; 85d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler } 86d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler 87d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler @Override 880fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki public Context getApplicationContext() { 890fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki return this; 900fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki } 910fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki 920fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki @Override 93d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler public String getPackageName() { 94d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler return mRealContext.getPackageName(); 95d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler } 96d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler } 97d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler 98d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler /** 99345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * Retrieve the security policy object, and inject the mock context so it works as expected 100345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler */ 101345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler private SecurityPolicy getSecurityPolicy() { 102345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler SecurityPolicy sp = SecurityPolicy.getInstance(mMockContext); 103345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler sp.setContext(mMockContext); 104345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler return sp; 105345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler } 106345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 1071d6dab29562eca7978f179be5f5c75f22f44d734Marc Blank public void testPolicySetConstructor() { 1081d6dab29562eca7978f179be5f5c75f22f44d734Marc Blank // We know that EMPTY_POLICY_SET doesn't generate an Exception or we wouldn't be here 1091d6dab29562eca7978f179be5f5c75f22f44d734Marc Blank // Try some illegal parameters 1101d6dab29562eca7978f179be5f5c75f22f44d734Marc Blank try { 111469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler new PolicySet(100, PolicySet.PASSWORD_MODE_SIMPLE, 0, 0, false, 0, 0, 0, false); 1121d6dab29562eca7978f179be5f5c75f22f44d734Marc Blank fail("Too-long password allowed"); 1131d6dab29562eca7978f179be5f5c75f22f44d734Marc Blank } catch (IllegalArgumentException e) { 1141d6dab29562eca7978f179be5f5c75f22f44d734Marc Blank } 1151d6dab29562eca7978f179be5f5c75f22f44d734Marc Blank try { 116469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler new PolicySet(0, PolicySet.PASSWORD_MODE_STRONG + 1, 0, 0, false, 0, 0, 0, false); 1171d6dab29562eca7978f179be5f5c75f22f44d734Marc Blank fail("Illegal password mode allowed"); 1181d6dab29562eca7978f179be5f5c75f22f44d734Marc Blank } catch (IllegalArgumentException e) { 1191d6dab29562eca7978f179be5f5c75f22f44d734Marc Blank } 12061911d4ff70132fa21c5ee7a987303479e8ef6aeMarc Blank 121c263810b08943541135a24e2b7520692152455ccMarc Blank PolicySet ps = new PolicySet(0, PolicySet.PASSWORD_MODE_SIMPLE, 0, 122469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet.SCREEN_LOCK_TIME_MAX + 1, false, 0, 0, 0, false); 1236278dcdeafadc55fe1a57eec42a0807874377f62Andy Stadler assertEquals(PolicySet.SCREEN_LOCK_TIME_MAX, ps.getMaxScreenLockTimeForTest()); 12461911d4ff70132fa21c5ee7a987303479e8ef6aeMarc Blank 125c263810b08943541135a24e2b7520692152455ccMarc Blank ps = new PolicySet(0, PolicySet.PASSWORD_MODE_SIMPLE, 126469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet.PASSWORD_MAX_FAILS_MAX + 1, 0, false, 0, 0, 0, false); 1276278dcdeafadc55fe1a57eec42a0807874377f62Andy Stadler assertEquals(PolicySet.PASSWORD_MAX_FAILS_MAX, ps.getMaxPasswordFailsForTest()); 128c263810b08943541135a24e2b7520692152455ccMarc Blank // All password related fields should be zero when password mode is NONE 129c263810b08943541135a24e2b7520692152455ccMarc Blank // Illegal values for these fields should be ignored 130c263810b08943541135a24e2b7520692152455ccMarc Blank ps = new PolicySet(999/*length*/, PolicySet.PASSWORD_MODE_NONE, 131c263810b08943541135a24e2b7520692152455ccMarc Blank 999/*fails*/, 9999/*screenlock*/, false, 999/*expir*/, 999/*history*/, 132469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler 999/*complex*/, false); 133c263810b08943541135a24e2b7520692152455ccMarc Blank assertEquals(0, ps.mMinPasswordLength); 134c263810b08943541135a24e2b7520692152455ccMarc Blank assertEquals(0, ps.mMaxScreenLockTime); 135c263810b08943541135a24e2b7520692152455ccMarc Blank assertEquals(0, ps.mMaxPasswordFails); 1361ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(0, ps.mPasswordExpirationDays); 137c263810b08943541135a24e2b7520692152455ccMarc Blank assertEquals(0, ps.mPasswordHistory); 138c263810b08943541135a24e2b7520692152455ccMarc Blank assertEquals(0, ps.mPasswordComplexChars); 13961911d4ff70132fa21c5ee7a987303479e8ef6aeMarc Blank 14061911d4ff70132fa21c5ee7a987303479e8ef6aeMarc Blank // With a simple password, we should set complex chars to zero 14161911d4ff70132fa21c5ee7a987303479e8ef6aeMarc Blank ps = new PolicySet(4/*length*/, PolicySet.PASSWORD_MODE_SIMPLE, 142469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler 0, 0, false, 0, 0, 3/*complex*/, false); 14361911d4ff70132fa21c5ee7a987303479e8ef6aeMarc Blank assertEquals(4, ps.mMinPasswordLength); 14461911d4ff70132fa21c5ee7a987303479e8ef6aeMarc Blank assertEquals(0, ps.mPasswordComplexChars); 1451d6dab29562eca7978f179be5f5c75f22f44d734Marc Blank } 1461d6dab29562eca7978f179be5f5c75f22f44d734Marc Blank 147345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler /** 148345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * Test business logic of aggregating accounts with policies 149345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler */ 150345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler public void testAggregator() { 151345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler SecurityPolicy sp = getSecurityPolicy(); 152345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 153d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler // with no accounts, should return empty set 1549b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(EMPTY_POLICY_SET, sp.computeAggregatePolicy()); 155345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 156d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler // with accounts having no security, empty set 157345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler Account a1 = ProviderTestUtils.setupAccount("no-sec-1", false, mMockContext); 158345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler a1.mSecurityFlags = 0; 159345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler a1.save(mMockContext); 160345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler Account a2 = ProviderTestUtils.setupAccount("no-sec-2", false, mMockContext); 161345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler a2.mSecurityFlags = 0; 162345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler a2.save(mMockContext); 1639b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(EMPTY_POLICY_SET, sp.computeAggregatePolicy()); 164345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 165345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler // with a single account in security mode, should return same security as in account 1663d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler // first test with partially-populated policies 167345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler Account a3 = ProviderTestUtils.setupAccount("sec-3", false, mMockContext); 168469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet p3ain = new PolicySet(10, PolicySet.PASSWORD_MODE_SIMPLE, 0, 0, false, 0, 0, 0, 169469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler false); 1703d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler p3ain.writeAccount(a3, null, true, mMockContext); 1713d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler PolicySet p3aout = sp.computeAggregatePolicy(); 1723d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler assertNotNull(p3aout); 1733d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler assertEquals(p3ain, p3aout); 1743d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler 1753d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler // Repeat that test with fully-populated policies 176469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet p3bin = new PolicySet(10, PolicySet.PASSWORD_MODE_SIMPLE, 15, 16, false, 6, 2, 3, 177469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler false); 1783d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler p3bin.writeAccount(a3, null, true, mMockContext); 1793d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler PolicySet p3bout = sp.computeAggregatePolicy(); 1803d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler assertNotNull(p3bout); 1813d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler assertEquals(p3bin, p3bout); 182345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 183345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler // add another account which mixes it up (some fields will change, others will not) 184345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler // pw length and pw mode - max logic - will change because larger #s here 185345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler // fail count and lock timer - min logic - will *not* change because larger #s here 186345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler // wipe required - OR logic - will *not* change here because false 1871ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // expiration - will not change because 0 (unspecified) 1881ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // max complex chars - max logic - will change 189469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler // encryption required - OR logic - will *not* change here because false 190469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet p4in = new PolicySet(20, PolicySet.PASSWORD_MODE_STRONG, 25, 26, false, 0, 5, 7, 191469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler false); 192345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler Account a4 = ProviderTestUtils.setupAccount("sec-4", false, mMockContext); 1933d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler p4in.writeAccount(a4, null, true, mMockContext); 194345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler PolicySet p4out = sp.computeAggregatePolicy(); 195345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertNotNull(p4out); 196345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(20, p4out.mMinPasswordLength); 197345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(PolicySet.PASSWORD_MODE_STRONG, p4out.mPasswordMode); 198345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(15, p4out.mMaxPasswordFails); 199345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(16, p4out.mMaxScreenLockTime); 2001ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(6, p4out.mPasswordExpirationDays); 2019b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(5, p4out.mPasswordHistory); 2029b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(7, p4out.mPasswordComplexChars); 203345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertFalse(p4out.mRequireRemoteWipe); 204469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertFalse(p4out.mRequireEncryption); 205345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 206345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler // add another account which mixes it up (the remaining fields will change) 207345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler // pw length and pw mode - max logic - will *not* change because smaller #s here 208345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler // fail count and lock timer - min logic - will change because smaller #s here 209345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler // wipe required - OR logic - will change here because true 2101ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // expiration time - min logic - will change because lower here 2111ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // history & complex chars - will not change because 0 (unspecified) 212469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler // encryption required - OR logic - will change here because true 213469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet p5in = new PolicySet(4, PolicySet.PASSWORD_MODE_SIMPLE, 5, 6, true, 1, 0, 0, 214469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler true); 215345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler Account a5 = ProviderTestUtils.setupAccount("sec-5", false, mMockContext); 2163d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler p5in.writeAccount(a5, null, true, mMockContext); 217345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler PolicySet p5out = sp.computeAggregatePolicy(); 218345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertNotNull(p5out); 219345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(20, p5out.mMinPasswordLength); 220345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(PolicySet.PASSWORD_MODE_STRONG, p5out.mPasswordMode); 221345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(5, p5out.mMaxPasswordFails); 222345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(6, p5out.mMaxScreenLockTime); 2231ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(1, p5out.mPasswordExpirationDays); 224469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertEquals(5, p5out.mPasswordHistory); 225469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertEquals(7, p5out.mPasswordComplexChars); 226345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertTrue(p5out.mRequireRemoteWipe); 227469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertTrue(p5out.mRequireEncryption); 228345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler } 229345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 230345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler /** 231345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * Make sure aggregator (and any other direct DB accessors) handle the case of upgraded 232345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * accounts properly (where the security flags will be NULL instead of zero). 233345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler */ 234345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler public void testNullFlags() { 235345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler SecurityPolicy sp = getSecurityPolicy(); 236345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 237345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler Account a1 = ProviderTestUtils.setupAccount("null-sec-1", true, mMockContext); 238345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler ContentValues cv = new ContentValues(); 239345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler cv.putNull(AccountColumns.SECURITY_FLAGS); 240345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, a1.mId); 241345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler mMockContext.getContentResolver().update(uri, cv, null, null); 242345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 243345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler Account a2 = ProviderTestUtils.setupAccount("no-sec-2", false, mMockContext); 244345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler a2.mSecurityFlags = 0; 245345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler a2.save(mMockContext); 2469b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(EMPTY_POLICY_SET, sp.computeAggregatePolicy()); 247345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler } 248345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 249345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler /** 250345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * Make sure the fields are encoded properly for their max ranges. This is looking 251345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * for any encoding mask/shift errors, which would cause bits to overflow into other fields. 252345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler */ 253345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler @SmallTest 254a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler public void testFieldIsolation() { 255469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler // Check PASSWORD_LENGTH 256c263810b08943541135a24e2b7520692152455ccMarc Blank PolicySet p = new PolicySet(PolicySet.PASSWORD_LENGTH_MAX, PolicySet.PASSWORD_MODE_SIMPLE, 257469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler 0, 0, false, 0, 0 ,0, false); 258c263810b08943541135a24e2b7520692152455ccMarc Blank assertEquals(PolicySet.PASSWORD_MODE_SIMPLE, p.mPasswordMode); 259345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(PolicySet.PASSWORD_LENGTH_MAX, p.mMinPasswordLength); 260345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(0, p.mMaxPasswordFails); 261345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(0, p.mMaxScreenLockTime); 2621ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(0, p.mPasswordExpirationDays); 2639b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mPasswordHistory); 2649b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mPasswordComplexChars); 265345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertFalse(p.mRequireRemoteWipe); 266469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertFalse(p.mRequireEncryption); 267345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 268469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler // Check PASSWORD_MODE 269469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler p = new PolicySet(0, PolicySet.PASSWORD_MODE_STRONG, 0, 0, false, 0, 0, 0, false); 270345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(PolicySet.PASSWORD_MODE_STRONG, p.mPasswordMode); 271c263810b08943541135a24e2b7520692152455ccMarc Blank assertEquals(0, p.mMinPasswordLength); 272345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(0, p.mMaxPasswordFails); 273345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(0, p.mMaxScreenLockTime); 2741ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(0, p.mPasswordExpirationDays); 2759b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mPasswordHistory); 2769b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mPasswordComplexChars); 277345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertFalse(p.mRequireRemoteWipe); 278469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertFalse(p.mRequireEncryption); 279345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 280469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler // Check PASSWORD_FAILS (note, mode must be set for this to be non-zero) 281c263810b08943541135a24e2b7520692152455ccMarc Blank p = new PolicySet(0, PolicySet.PASSWORD_MODE_SIMPLE, PolicySet.PASSWORD_MAX_FAILS_MAX, 0, 282469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler false, 0, 0, 0, false); 283c263810b08943541135a24e2b7520692152455ccMarc Blank assertEquals(PolicySet.PASSWORD_MODE_SIMPLE, p.mPasswordMode); 284345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(0, p.mMinPasswordLength); 285345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(PolicySet.PASSWORD_MAX_FAILS_MAX, p.mMaxPasswordFails); 286345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(0, p.mMaxScreenLockTime); 2871ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(0, p.mPasswordExpirationDays); 2889b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mPasswordHistory); 2899b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mPasswordComplexChars); 290345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertFalse(p.mRequireRemoteWipe); 291469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertFalse(p.mRequireEncryption); 292345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 293469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler // Check SCREEN_LOCK_TIME (note, mode must be set for this to be non-zero) 294c263810b08943541135a24e2b7520692152455ccMarc Blank p = new PolicySet(0, PolicySet.PASSWORD_MODE_SIMPLE, 0, PolicySet.SCREEN_LOCK_TIME_MAX, 295469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler false, 0, 0, 0, false); 296c263810b08943541135a24e2b7520692152455ccMarc Blank assertEquals(PolicySet.PASSWORD_MODE_SIMPLE, p.mPasswordMode); 297345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(0, p.mMinPasswordLength); 298345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(0, p.mMaxPasswordFails); 299345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(PolicySet.SCREEN_LOCK_TIME_MAX, p.mMaxScreenLockTime); 3001ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(0, p.mPasswordExpirationDays); 3019b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mPasswordHistory); 3029b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mPasswordComplexChars); 303345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertFalse(p.mRequireRemoteWipe); 304469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertFalse(p.mRequireEncryption); 305345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 306469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler // Check REQUIRE_REMOTE_WIPE 307469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler p = new PolicySet(0, PolicySet.PASSWORD_MODE_NONE, 0, 0, true, 0, 0, 0, false); 308c263810b08943541135a24e2b7520692152455ccMarc Blank assertEquals(PolicySet.PASSWORD_MODE_NONE, p.mPasswordMode); 309345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(0, p.mMinPasswordLength); 310345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(0, p.mMaxPasswordFails); 311345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(0, p.mMaxScreenLockTime); 3121ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(0, p.mPasswordExpirationDays); 3139b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mPasswordHistory); 3149b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mPasswordComplexChars); 315345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertTrue(p.mRequireRemoteWipe); 316469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertFalse(p.mRequireEncryption); 3179b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank 318469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler // Check PASSWORD_EXPIRATION (note, mode must be set for this to be non-zero) 319c263810b08943541135a24e2b7520692152455ccMarc Blank p = new PolicySet(0, PolicySet.PASSWORD_MODE_SIMPLE, 0, 0, false, 320469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet.PASSWORD_EXPIRATION_MAX, 0, 0, false); 321c263810b08943541135a24e2b7520692152455ccMarc Blank assertEquals(PolicySet.PASSWORD_MODE_SIMPLE, p.mPasswordMode); 3229b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mMinPasswordLength); 3239b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mMaxPasswordFails); 3249b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mMaxScreenLockTime); 3251ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(PolicySet.PASSWORD_EXPIRATION_MAX, p.mPasswordExpirationDays); 3269b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mPasswordHistory); 3279b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mPasswordComplexChars); 3289b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertFalse(p.mRequireRemoteWipe); 329469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertFalse(p.mRequireEncryption); 3309b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank 331469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler // Check PASSWORD_HISTORY (note, mode must be set for this to be non-zero) 332c263810b08943541135a24e2b7520692152455ccMarc Blank p = new PolicySet(0, PolicySet.PASSWORD_MODE_SIMPLE, 0, 0, false, 0, 333469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet.PASSWORD_HISTORY_MAX, 0, false); 334c263810b08943541135a24e2b7520692152455ccMarc Blank assertEquals(PolicySet.PASSWORD_MODE_SIMPLE, p.mPasswordMode); 3359b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mMinPasswordLength); 3369b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mMaxPasswordFails); 3379b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mMaxScreenLockTime); 3381ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(0, p.mPasswordExpirationDays); 3399b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(PolicySet.PASSWORD_HISTORY_MAX, p.mPasswordHistory); 3409b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mPasswordComplexChars); 3419b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertFalse(p.mRequireRemoteWipe); 342469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertFalse(p.mRequireEncryption); 3439b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank 344469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler // Check PASSWORD_COMPLEX_CHARS (note, mode must be set for this to be non-zero) 34561911d4ff70132fa21c5ee7a987303479e8ef6aeMarc Blank p = new PolicySet(0, PolicySet.PASSWORD_MODE_STRONG, 0, 0, false, 0, 0, 346469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet.PASSWORD_COMPLEX_CHARS_MAX, false); 34761911d4ff70132fa21c5ee7a987303479e8ef6aeMarc Blank assertEquals(PolicySet.PASSWORD_MODE_STRONG, p.mPasswordMode); 3489b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mMinPasswordLength); 3499b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mMaxPasswordFails); 3509b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mMaxScreenLockTime); 3511ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(0, p.mPasswordExpirationDays); 3529b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(0, p.mPasswordHistory); 3539b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertEquals(PolicySet.PASSWORD_COMPLEX_CHARS_MAX, p.mPasswordComplexChars); 3549b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank assertFalse(p.mRequireRemoteWipe); 355469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertFalse(p.mRequireEncryption); 356469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler 357469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler // Check REQUIRE_ENCRYPTION 358469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler p = new PolicySet(0, PolicySet.PASSWORD_MODE_NONE, 0, 0, false, 0, 0, 0, true); 359469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertEquals(PolicySet.PASSWORD_MODE_NONE, p.mPasswordMode); 360469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertEquals(0, p.mMinPasswordLength); 361469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertEquals(0, p.mMaxPasswordFails); 362469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertEquals(0, p.mMaxScreenLockTime); 363469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertEquals(0, p.mPasswordExpirationDays); 364469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertEquals(0, p.mPasswordHistory); 365469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertEquals(0, p.mPasswordComplexChars); 366469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertFalse(p.mRequireRemoteWipe); 367469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler assertTrue(p.mRequireEncryption); 368345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler } 369345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 370345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler /** 371345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * Test encoding into an Account and out again 372345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler */ 373345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler @SmallTest 374345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler public void testAccountEncoding() { 375469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet p1 = new PolicySet(1, PolicySet.PASSWORD_MODE_STRONG, 3, 4, true, 7, 8, 9, false); 376345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler Account a = new Account(); 377345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler final String SYNC_KEY = "test_sync_key"; 3783d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler p1.writeAccount(a, SYNC_KEY, false, null); 379345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler PolicySet p2 = new PolicySet(a); 380345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertEquals(p1, p2); 381345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler } 382345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 383345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler /** 3849b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank * Test equality. Note, the tests for inequality are poor, as each field should 385345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * be tested individually. 386345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler */ 387345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler @SmallTest 3889b4988de43dbee6c06066caab63806e8c8303d7dMarc Blank public void testEquals() { 389469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet p1 = new PolicySet(1, PolicySet.PASSWORD_MODE_STRONG, 3, 4, true, 7, 8, 9, false); 390469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet p2 = new PolicySet(1, PolicySet.PASSWORD_MODE_STRONG, 3, 4, true, 7, 8, 9, false); 391469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet p3 = new PolicySet(2, PolicySet.PASSWORD_MODE_SIMPLE, 5, 6, true, 7, 8, 9, false); 392345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertTrue(p1.equals(p2)); 393345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler assertFalse(p2.equals(p3)); 394345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler } 395345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler 3962a5eeea9213005060256054ec773e72406415ce4Andrew Stadler /** 3972a5eeea9213005060256054ec773e72406415ce4Andrew Stadler * Test the API to set/clear policy hold flags in an account 3982a5eeea9213005060256054ec773e72406415ce4Andrew Stadler */ 3992a5eeea9213005060256054ec773e72406415ce4Andrew Stadler public void testSetClearHoldFlag() { 4002a5eeea9213005060256054ec773e72406415ce4Andrew Stadler SecurityPolicy sp = getSecurityPolicy(); 4012a5eeea9213005060256054ec773e72406415ce4Andrew Stadler 4022a5eeea9213005060256054ec773e72406415ce4Andrew Stadler Account a1 = ProviderTestUtils.setupAccount("holdflag-1", false, mMockContext); 4032a5eeea9213005060256054ec773e72406415ce4Andrew Stadler a1.mFlags = Account.FLAGS_NOTIFY_NEW_MAIL; 4042a5eeea9213005060256054ec773e72406415ce4Andrew Stadler a1.save(mMockContext); 4052a5eeea9213005060256054ec773e72406415ce4Andrew Stadler Account a2 = ProviderTestUtils.setupAccount("holdflag-2", false, mMockContext); 4069e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma a2.mFlags = Account.FLAGS_VIBRATE_ALWAYS | Account.FLAGS_SECURITY_HOLD; 4072a5eeea9213005060256054ec773e72406415ce4Andrew Stadler a2.save(mMockContext); 4082a5eeea9213005060256054ec773e72406415ce4Andrew Stadler 4092a5eeea9213005060256054ec773e72406415ce4Andrew Stadler // confirm clear until set 4102a5eeea9213005060256054ec773e72406415ce4Andrew Stadler Account a1a = Account.restoreAccountWithId(mMockContext, a1.mId); 4112a5eeea9213005060256054ec773e72406415ce4Andrew Stadler assertEquals(Account.FLAGS_NOTIFY_NEW_MAIL, a1a.mFlags); 4121ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler sp.setAccountHoldFlag(mMockContext, a1, true); 4132a5eeea9213005060256054ec773e72406415ce4Andrew Stadler assertEquals(Account.FLAGS_NOTIFY_NEW_MAIL | Account.FLAGS_SECURITY_HOLD, a1.mFlags); 4142a5eeea9213005060256054ec773e72406415ce4Andrew Stadler Account a1b = Account.restoreAccountWithId(mMockContext, a1.mId); 4152a5eeea9213005060256054ec773e72406415ce4Andrew Stadler assertEquals(Account.FLAGS_NOTIFY_NEW_MAIL | Account.FLAGS_SECURITY_HOLD, a1b.mFlags); 4162a5eeea9213005060256054ec773e72406415ce4Andrew Stadler 4172a5eeea9213005060256054ec773e72406415ce4Andrew Stadler // confirm set until cleared 4182a5eeea9213005060256054ec773e72406415ce4Andrew Stadler Account a2a = Account.restoreAccountWithId(mMockContext, a2.mId); 4199e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma assertEquals(Account.FLAGS_VIBRATE_ALWAYS | Account.FLAGS_SECURITY_HOLD, a2a.mFlags); 4201ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler sp.setAccountHoldFlag(mMockContext, a2, false); 4219e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma assertEquals(Account.FLAGS_VIBRATE_ALWAYS, a2.mFlags); 4222a5eeea9213005060256054ec773e72406415ce4Andrew Stadler Account a2b = Account.restoreAccountWithId(mMockContext, a2.mId); 4239e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma assertEquals(Account.FLAGS_VIBRATE_ALWAYS, a2b.mFlags); 4242a5eeea9213005060256054ec773e72406415ce4Andrew Stadler } 4252a5eeea9213005060256054ec773e72406415ce4Andrew Stadler 4261ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// private static class MockController extends Controller { 4271ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// protected MockController(Context context) { 4281ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// super(context); 4291ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// } 4301ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// } 43102d59d21949a77c60859b615312f02e6d8003490Marc Blank 4322a5eeea9213005060256054ec773e72406415ce4Andrew Stadler /** 433af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler * Test the response to disabling DeviceAdmin status 4341ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler * 4351ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler * TODO: Reenable the 2nd portion of this test - it fails because it gets into the Controller 4361ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler * and spins up an account backup on another thread. 437af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler */ 438af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler public void testDisableAdmin() { 439af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler Account a1 = ProviderTestUtils.setupAccount("disable-1", false, mMockContext); 440469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet p1 = new PolicySet(10, PolicySet.PASSWORD_MODE_SIMPLE, 0, 0, false, 0, 0, 0, 441469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler false); 442af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler p1.writeAccount(a1, "sync-key-1", true, mMockContext); 443af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler 444af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler Account a2 = ProviderTestUtils.setupAccount("disable-2", false, mMockContext); 445469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet p2 = new PolicySet(20, PolicySet.PASSWORD_MODE_STRONG, 25, 26, false, 0, 0, 0, 446469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler false); 447af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler p2.writeAccount(a2, "sync-key-2", true, mMockContext); 448af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler 449af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler Account a3 = ProviderTestUtils.setupAccount("disable-3", false, mMockContext); 450af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler a3.mSecurityFlags = 0; 451af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler a3.mSecuritySyncKey = null; 452af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler a3.save(mMockContext); 453af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler 454af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler SecurityPolicy sp = getSecurityPolicy(); 455af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler 456af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler // Confirm that "enabling" device admin does not change security status (flags & sync key) 457af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler PolicySet before = sp.getAggregatePolicy(); 458af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler sp.onAdminEnabled(true); // "enabled" should not change anything 459af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler PolicySet after1 = sp.getAggregatePolicy(); 460af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler assertEquals(before, after1); 461af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler Account a1a = Account.restoreAccountWithId(mMockContext, a1.mId); 462af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler assertNotNull(a1a.mSecuritySyncKey); 463af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler Account a2a = Account.restoreAccountWithId(mMockContext, a2.mId); 464af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler assertNotNull(a2a.mSecuritySyncKey); 465af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler Account a3a = Account.restoreAccountWithId(mMockContext, a3.mId); 466af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler assertNull(a3a.mSecuritySyncKey); 467af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler 46802d59d21949a77c60859b615312f02e6d8003490Marc Blank // Simulate revoke of device admin; directly call deleteSecuredAccounts, which is normally 46902d59d21949a77c60859b615312f02e6d8003490Marc Blank // called from a background thread 4701ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// MockController mockController = new MockController(mMockContext); 4711ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// Controller.injectMockControllerForTest(mockController); 4721ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// try { 4731ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// sp.deleteSecuredAccounts(mMockContext); 4741ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// PolicySet after2 = sp.getAggregatePolicy(); 4751ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// assertEquals(SecurityPolicy.NO_POLICY_SET, after2); 4761ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// Account a1b = Account.restoreAccountWithId(mMockContext, a1.mId); 4771ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// assertNull(a1b); 4781ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// Account a2b = Account.restoreAccountWithId(mMockContext, a2.mId); 4791ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// assertNull(a2b); 4801ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// Account a3b = Account.restoreAccountWithId(mMockContext, a3.mId); 4811ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// assertNull(a3b.mSecuritySyncKey); 4821ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// } finally { 4831ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// Controller.injectMockControllerForTest(null); 4841ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler// } 4851ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler } 4861ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 4871ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler /** 4881ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler * Test the scanner that finds expiring accounts 4891ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler */ 4901ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler public void testFindExpiringAccount() { 4911ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler SecurityPolicy sp = getSecurityPolicy(); 4921ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 4931ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler Account a1 = ProviderTestUtils.setupAccount("expiring-1", true, mMockContext); 4941ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 4951ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // With no expiring accounts, this should return null. 4961ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler long nextExpiringAccountId = sp.findShortestExpiration(mMockContext); 4971ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(-1, nextExpiringAccountId); 4981ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 4991ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // Add a single expiring account 5001ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler Account a2 = ProviderTestUtils.setupAccount("expiring-2", false, mMockContext); 501469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet p2 = new PolicySet(20, PolicySet.PASSWORD_MODE_STRONG, 25, 26, false, 30, 0, 0, 502469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler false); 5031ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler p2.writeAccount(a2, "sync-key-2", true, mMockContext); 5041ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 5051ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // The expiring account should be returned 5061ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler nextExpiringAccountId = sp.findShortestExpiration(mMockContext); 5071ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(a2.mId, nextExpiringAccountId); 5081ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 5091ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // Add an account with a longer expiration 5101ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler Account a3 = ProviderTestUtils.setupAccount("expiring-3", false, mMockContext); 511469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet p3 = new PolicySet(20, PolicySet.PASSWORD_MODE_STRONG, 25, 26, false, 60, 0, 0, 512469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler false); 5131ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler p3.writeAccount(a3, "sync-key-3", true, mMockContext); 5141ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 5151ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // The original expiring account (a2) should be returned 5161ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler nextExpiringAccountId = sp.findShortestExpiration(mMockContext); 5171ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(a2.mId, nextExpiringAccountId); 5181ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 5191ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // Add an account with a shorter expiration 5201ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler Account a4 = ProviderTestUtils.setupAccount("expiring-4", false, mMockContext); 521469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet p4 = new PolicySet(20, PolicySet.PASSWORD_MODE_STRONG, 25, 26, false, 15, 0, 0, 522469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler false); 5231ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler p4.writeAccount(a4, "sync-key-4", true, mMockContext); 5241ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 5251ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // The new expiring account (a4) should be returned 5261ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler nextExpiringAccountId = sp.findShortestExpiration(mMockContext); 5271ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(a4.mId, nextExpiringAccountId); 5281ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler } 5291ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 5301ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler /** 5311ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler * Lightweight subclass of the Controller class allows injection of mock context 5321ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler */ 5331ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler public static class TestController extends Controller { 5341ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 5351ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler protected TestController(Context providerContext, Context systemContext) { 5361ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler super(systemContext); 5371ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler setProviderContext(providerContext); 53802d59d21949a77c60859b615312f02e6d8003490Marc Blank } 539af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler } 5401ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 5411ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler /** 5421ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler * Test the scanner that wipes expiring accounts 5431ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler */ 5441ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler public void testWipeExpiringAccounts() { 5451ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler SecurityPolicy sp = getSecurityPolicy(); 5461ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler TestController testController = new TestController(mMockContext, getContext()); 5471ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 5481ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // Two accounts - a1 is normal, a2 has security (but no expiration) 5491ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler Account a1 = ProviderTestUtils.setupAccount("expired-1", true, mMockContext); 5501ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler Account a2 = ProviderTestUtils.setupAccount("expired-2", false, mMockContext); 551469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet p2 = new PolicySet(20, PolicySet.PASSWORD_MODE_STRONG, 25, 26, false, 0, 0, 0, 552469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler false); 5531ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler p2.writeAccount(a2, "sync-key-2", true, mMockContext); 5541ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 5551ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // Add a mailbox & messages to each account 5561ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler long account1Id = a1.mId; 5571ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler long account2Id = a2.mId; 5581ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler Mailbox box1 = ProviderTestUtils.setupMailbox("box1", account1Id, true, mMockContext); 5591ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler long box1Id = box1.mId; 5601ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler ProviderTestUtils.setupMessage("message1", account1Id, box1Id, false, true, mMockContext); 5611ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler ProviderTestUtils.setupMessage("message2", account1Id, box1Id, false, true, mMockContext); 5621ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler Mailbox box2 = ProviderTestUtils.setupMailbox("box2", account2Id, true, mMockContext); 5631ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler long box2Id = box2.mId; 5641ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler ProviderTestUtils.setupMessage("message3", account2Id, box2Id, false, true, mMockContext); 5651ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler ProviderTestUtils.setupMessage("message4", account2Id, box2Id, false, true, mMockContext); 5661ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 5671ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // Run the expiration code - should do nothing 5681ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler boolean wiped = sp.wipeExpiredAccounts(mMockContext, testController); 5691ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertFalse(wiped); 5701ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // check mailboxes & messages not wiped 5711ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(2, EmailContent.count(mMockContext, Account.CONTENT_URI)); 5721ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(2, EmailContent.count(mMockContext, Mailbox.CONTENT_URI)); 5731ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(4, EmailContent.count(mMockContext, Message.CONTENT_URI)); 5741ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 5751ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // Add 3rd account that really expires 5761ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler Account a3 = ProviderTestUtils.setupAccount("expired-3", false, mMockContext); 577469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler PolicySet p3 = new PolicySet(20, PolicySet.PASSWORD_MODE_STRONG, 25, 26, false, 30, 0, 0, 578469f2987dc11d153434e50eb04dd6b83b924d09dAndy Stadler false); 5791ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler p3.writeAccount(a3, "sync-key-3", true, mMockContext); 5801ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 5811ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // Add mailbox & messages to 3rd account 5821ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler long account3Id = a3.mId; 5831ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler Mailbox box3 = ProviderTestUtils.setupMailbox("box3", account3Id, true, mMockContext); 5841ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler long box3Id = box3.mId; 5851ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler ProviderTestUtils.setupMessage("message5", account3Id, box3Id, false, true, mMockContext); 5861ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler ProviderTestUtils.setupMessage("message6", account3Id, box3Id, false, true, mMockContext); 5871ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 5881ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // check new counts 5891ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(3, EmailContent.count(mMockContext, Account.CONTENT_URI)); 5901ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(3, EmailContent.count(mMockContext, Mailbox.CONTENT_URI)); 5911ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(6, EmailContent.count(mMockContext, Message.CONTENT_URI)); 5921ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 5931ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // Run the expiration code - wipe acct #3 5941ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler wiped = sp.wipeExpiredAccounts(mMockContext, testController); 5951ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertTrue(wiped); 5961ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // check new counts - account survives but data is wiped 5971ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(3, EmailContent.count(mMockContext, Account.CONTENT_URI)); 5981ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(2, EmailContent.count(mMockContext, Mailbox.CONTENT_URI)); 5991ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(4, EmailContent.count(mMockContext, Message.CONTENT_URI)); 6001ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler 6011ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler // Check security hold states - only #3 should be in hold 6021ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler Account account = Account.restoreAccountWithId(mMockContext, account1Id); 6031ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(0, account.mFlags & Account.FLAGS_SECURITY_HOLD); 6041ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler account = Account.restoreAccountWithId(mMockContext, account2Id); 6051ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(0, account.mFlags & Account.FLAGS_SECURITY_HOLD); 6061ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler account = Account.restoreAccountWithId(mMockContext, account3Id); 6071ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler assertEquals(Account.FLAGS_SECURITY_HOLD, account.mFlags & Account.FLAGS_SECURITY_HOLD); 6081ca111c19c83d54ad23bd8615d9c648e09ec3366Andy Stadler } 609345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler} 610