SecurityPolicyTests.java revision 0fb092b38912c7cff776a51872840bb2089ebe08
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;
20345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport com.android.email.provider.EmailProvider;
21345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport com.android.email.provider.ProviderTestUtils;
22345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport com.android.email.provider.EmailContent.Account;
23345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport com.android.email.provider.EmailContent.AccountColumns;
24345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
25345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport android.content.ContentUris;
26345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport android.content.ContentValues;
27345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport android.content.Context;
28d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadlerimport android.content.ContextWrapper;
29345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport android.net.Uri;
30345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport android.test.ProviderTestCase2;
31345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport android.test.suitebuilder.annotation.MediumTest;
32345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerimport android.test.suitebuilder.annotation.SmallTest;
33345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
34345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler/**
35345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler * This is a series of unit tests for backup/restore of the SecurityPolicy class.
36345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler */
37345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler@MediumTest
38345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadlerpublic class SecurityPolicyTests extends ProviderTestCase2<EmailProvider> {
39345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
40345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    private Context mMockContext;
41345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
42d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler    private static final PolicySet EMPTY_POLICY_SET =
43d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler        new PolicySet(0, PolicySet.PASSWORD_MODE_NONE, 0, 0, false);
44d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler
45345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    public SecurityPolicyTests() {
46345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        super(EmailProvider.class, EmailProvider.EMAIL_AUTHORITY);
47345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    }
48345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
49345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    @Override
50345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    protected void setUp() throws Exception {
51345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        super.setUp();
52345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
53d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler        mMockContext = new MockContext2(getMockContext(), this.mContext);
54345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    }
55345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
56345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    /**
57345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     * Delete any dummy accounts we set up for this test
58345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     */
59345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    @Override
60345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    protected void tearDown() throws Exception {
61345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        super.tearDown();
62345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    }
63345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
64345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    /**
650fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki     * Private context wrapper used to add back getPackageName() for these tests.
660fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki     *
670fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki     * This class also implements {@link Context} method(s) that is called during tests.
68d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler     */
69d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler    private static class MockContext2 extends ContextWrapper {
70d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler
71d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler        private final Context mRealContext;
72d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler
73d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler        public MockContext2(Context mockContext, Context realContext) {
74d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler            super(mockContext);
75d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler            mRealContext = realContext;
76d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler        }
77d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler
78d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler        @Override
790fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki        public Context getApplicationContext() {
800fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki            return this;
810fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki        }
820fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki
830fb092b38912c7cff776a51872840bb2089ebe08Makoto Onuki        @Override
84d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler        public String getPackageName() {
85d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler            return mRealContext.getPackageName();
86d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler        }
87d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler    }
88d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler
89d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler    /**
90345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     * Retrieve the security policy object, and inject the mock context so it works as expected
91345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     */
92345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    private SecurityPolicy getSecurityPolicy() {
93345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        SecurityPolicy sp = SecurityPolicy.getInstance(mMockContext);
94345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        sp.setContext(mMockContext);
95345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        return sp;
96345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    }
97345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
98345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    /**
99345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     * Test business logic of aggregating accounts with policies
100345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     */
101345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    public void testAggregator() {
102345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        SecurityPolicy sp = getSecurityPolicy();
103345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
104d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler        // with no accounts, should return empty set
105d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler        assertTrue(EMPTY_POLICY_SET.equals(sp.computeAggregatePolicy()));
106345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
107d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler        // with accounts having no security, empty set
108345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        Account a1 = ProviderTestUtils.setupAccount("no-sec-1", false, mMockContext);
109345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        a1.mSecurityFlags = 0;
110345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        a1.save(mMockContext);
111345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        Account a2 = ProviderTestUtils.setupAccount("no-sec-2", false, mMockContext);
112345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        a2.mSecurityFlags = 0;
113345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        a2.save(mMockContext);
114d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler        assertTrue(EMPTY_POLICY_SET.equals(sp.computeAggregatePolicy()));
115345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
116345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        // with a single account in security mode, should return same security as in account
1173d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler        // first test with partially-populated policies
118345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        Account a3 = ProviderTestUtils.setupAccount("sec-3", false, mMockContext);
1193d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler        PolicySet p3ain = new PolicySet(10, PolicySet.PASSWORD_MODE_SIMPLE, 0, 0, false);
1203d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler        p3ain.writeAccount(a3, null, true, mMockContext);
1213d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler        PolicySet p3aout = sp.computeAggregatePolicy();
1223d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler        assertNotNull(p3aout);
1233d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler        assertEquals(p3ain, p3aout);
1243d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler
1253d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler        // Repeat that test with fully-populated policies
1263d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler        PolicySet p3bin = new PolicySet(10, PolicySet.PASSWORD_MODE_SIMPLE, 15, 16, false);
1273d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler        p3bin.writeAccount(a3, null, true, mMockContext);
1283d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler        PolicySet p3bout = sp.computeAggregatePolicy();
1293d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler        assertNotNull(p3bout);
1303d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler        assertEquals(p3bin, p3bout);
131345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
132345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        // add another account which mixes it up (some fields will change, others will not)
133345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        // pw length and pw mode - max logic - will change because larger #s here
134345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        // fail count and lock timer - min logic - will *not* change because larger #s here
135345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        // wipe required - OR logic - will *not* change here because false
136345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        PolicySet p4in = new PolicySet(20, PolicySet.PASSWORD_MODE_STRONG, 25, 26, false);
137345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        Account a4 = ProviderTestUtils.setupAccount("sec-4", false, mMockContext);
1383d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler        p4in.writeAccount(a4, null, true, mMockContext);
139345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        PolicySet p4out = sp.computeAggregatePolicy();
140345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertNotNull(p4out);
141345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(20, p4out.mMinPasswordLength);
142345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(PolicySet.PASSWORD_MODE_STRONG, p4out.mPasswordMode);
143345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(15, p4out.mMaxPasswordFails);
144345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(16, p4out.mMaxScreenLockTime);
145345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertFalse(p4out.mRequireRemoteWipe);
146345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
147345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        // add another account which mixes it up (the remaining fields will change)
148345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        // pw length and pw mode - max logic - will *not* change because smaller #s here
149345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        // fail count and lock timer - min logic - will change because smaller #s here
150345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        // wipe required - OR logic - will change here because true
151345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        PolicySet p5in = new PolicySet(4, PolicySet.PASSWORD_MODE_NONE, 5, 6, true);
152345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        Account a5 = ProviderTestUtils.setupAccount("sec-5", false, mMockContext);
1533d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler        p5in.writeAccount(a5, null, true, mMockContext);
154345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        PolicySet p5out = sp.computeAggregatePolicy();
155345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertNotNull(p5out);
156345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(20, p5out.mMinPasswordLength);
157345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(PolicySet.PASSWORD_MODE_STRONG, p5out.mPasswordMode);
158345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(5, p5out.mMaxPasswordFails);
159345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(6, p5out.mMaxScreenLockTime);
160345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertTrue(p5out.mRequireRemoteWipe);
161345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    }
162345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
163345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    /**
164345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     * Make sure aggregator (and any other direct DB accessors) handle the case of upgraded
165345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     * accounts properly (where the security flags will be NULL instead of zero).
166345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     */
167345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    public void testNullFlags() {
168345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        SecurityPolicy sp = getSecurityPolicy();
169345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
170345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        Account a1 = ProviderTestUtils.setupAccount("null-sec-1", true, mMockContext);
171345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        ContentValues cv = new ContentValues();
172345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        cv.putNull(AccountColumns.SECURITY_FLAGS);
173345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, a1.mId);
174345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        mMockContext.getContentResolver().update(uri, cv, null, null);
175345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
176345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        Account a2 = ProviderTestUtils.setupAccount("no-sec-2", false, mMockContext);
177345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        a2.mSecurityFlags = 0;
178345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        a2.save(mMockContext);
179d62860821c2dbc14ab493b888cb129bd5addd53dAndrew Stadler        assertTrue(EMPTY_POLICY_SET.equals(sp.computeAggregatePolicy()));
180345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    }
181345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
182345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    /**
183345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     * Make sure the fields are encoded properly for their max ranges.  This is looking
184345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     * for any encoding mask/shift errors, which would cause bits to overflow into other fields.
185345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     */
186345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    @SmallTest
187a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler    public void testFieldIsolation() {
188345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        PolicySet p = new PolicySet(PolicySet.PASSWORD_LENGTH_MAX, 0, 0, 0, false);
189345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(PolicySet.PASSWORD_LENGTH_MAX, p.mMinPasswordLength);
190345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mPasswordMode);
191345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mMaxPasswordFails);
192345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mMaxScreenLockTime);
193345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertFalse(p.mRequireRemoteWipe);
194345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
195345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        p = new PolicySet(0, PolicySet.PASSWORD_MODE_STRONG, 0, 0, false);
196345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mMinPasswordLength);
197345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(PolicySet.PASSWORD_MODE_STRONG, p.mPasswordMode);
198345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mMaxPasswordFails);
199345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mMaxScreenLockTime);
200345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertFalse(p.mRequireRemoteWipe);
201345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
202345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        p = new PolicySet(0, 0, PolicySet.PASSWORD_MAX_FAILS_MAX, 0, false);
203345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mMinPasswordLength);
204345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mPasswordMode);
205345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(PolicySet.PASSWORD_MAX_FAILS_MAX, p.mMaxPasswordFails);
206345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mMaxScreenLockTime);
207345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertFalse(p.mRequireRemoteWipe);
208345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
209345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        p = new PolicySet(0, 0, 0, PolicySet.SCREEN_LOCK_TIME_MAX, false);
210345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mMinPasswordLength);
211345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mPasswordMode);
212345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mMaxPasswordFails);
213345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(PolicySet.SCREEN_LOCK_TIME_MAX, p.mMaxScreenLockTime);
214345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertFalse(p.mRequireRemoteWipe);
215345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
216345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        p = new PolicySet(0, 0, 0, 0, true);
217345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mMinPasswordLength);
218345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mPasswordMode);
219345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mMaxPasswordFails);
220345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(0, p.mMaxScreenLockTime);
221345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertTrue(p.mRequireRemoteWipe);
222345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    }
223345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
224345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    /**
225a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler     * Test creation of policies with unsupported ranges
226a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler     */
227a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler    @SmallTest
228a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler    public void testFieldRanges() {
229a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler        SecurityPolicy sp = getSecurityPolicy();
230a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler        // Overlong password length cannot be supported
231a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler        PolicySet p = new PolicySet(PolicySet.PASSWORD_LENGTH_MAX + 1, 0, 0, 0, false);
232a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler        assertFalse(sp.isSupported(p));
233a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler
234a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler        // Too many wipes before reboot can be supported (by reducing to the max)
235a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler        p = new PolicySet(0, 0, PolicySet.PASSWORD_MAX_FAILS_MAX + 1, 0, false);
236a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler        assertTrue(sp.isSupported(p));
237a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler        assertEquals(PolicySet.PASSWORD_MAX_FAILS_MAX, p.mMaxPasswordFails);
238a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler
239a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler        // Too long lock time can be supported (by reducing to the max)
240a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler        p = new PolicySet(0, 0, 0, PolicySet.SCREEN_LOCK_TIME_MAX + 1, false);
241a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler        assertTrue(sp.isSupported(p));
242a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler        assertEquals(PolicySet.SCREEN_LOCK_TIME_MAX, p.mMaxScreenLockTime);
243a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler    }
244a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler
245a843d40ba1d3eb77e76b4a28aa911588f0fd81a1Andrew Stadler    /**
246345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     * Test encoding into an Account and out again
247345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     */
248345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    @SmallTest
249345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    public void testAccountEncoding() {
250345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        PolicySet p1 = new PolicySet(1, PolicySet.PASSWORD_MODE_STRONG, 3, 4, true);
251345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        Account a = new Account();
252345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        final String SYNC_KEY = "test_sync_key";
2533d2b3b3b3554be2ac23d9a49fee00faa9693e857Andrew Stadler        p1.writeAccount(a, SYNC_KEY, false, null);
254345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        PolicySet p2 = new PolicySet(a);
255345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertEquals(p1, p2);
256345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    }
257345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
258345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    /**
259345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     * Test equality & hash.  Note, the tests for inequality are poor, as each field should
260345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     * be tested individually.
261345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler     */
262345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    @SmallTest
263345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    public void testEqualsAndHash() {
264345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        PolicySet p1 = new PolicySet(1, PolicySet.PASSWORD_MODE_STRONG, 3, 4, true);
265345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        PolicySet p2 = new PolicySet(1, PolicySet.PASSWORD_MODE_STRONG, 3, 4, true);
266345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        PolicySet p3 = new PolicySet(2, PolicySet.PASSWORD_MODE_SIMPLE, 5, 6, true);
267345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertTrue(p1.equals(p2));
268345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertFalse(p2.equals(p3));
269345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertTrue(p1.hashCode() == p2.hashCode());
270345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler        assertFalse(p2.hashCode() == p3.hashCode());
271345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler    }
272345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler
2732a5eeea9213005060256054ec773e72406415ce4Andrew Stadler    /**
2742a5eeea9213005060256054ec773e72406415ce4Andrew Stadler     * Test the API to set/clear policy hold flags in an account
2752a5eeea9213005060256054ec773e72406415ce4Andrew Stadler     */
2762a5eeea9213005060256054ec773e72406415ce4Andrew Stadler    public void testSetClearHoldFlag() {
2772a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        SecurityPolicy sp = getSecurityPolicy();
2782a5eeea9213005060256054ec773e72406415ce4Andrew Stadler
2792a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        Account a1 = ProviderTestUtils.setupAccount("holdflag-1", false, mMockContext);
2802a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        a1.mFlags = Account.FLAGS_NOTIFY_NEW_MAIL;
2812a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        a1.save(mMockContext);
2822a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        Account a2 = ProviderTestUtils.setupAccount("holdflag-2", false, mMockContext);
2839e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma        a2.mFlags = Account.FLAGS_VIBRATE_ALWAYS | Account.FLAGS_SECURITY_HOLD;
2842a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        a2.save(mMockContext);
2852a5eeea9213005060256054ec773e72406415ce4Andrew Stadler
2862a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        // confirm clear until set
2872a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        Account a1a = Account.restoreAccountWithId(mMockContext, a1.mId);
2882a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        assertEquals(Account.FLAGS_NOTIFY_NEW_MAIL, a1a.mFlags);
2892a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        sp.setAccountHoldFlag(a1, true);
2902a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        assertEquals(Account.FLAGS_NOTIFY_NEW_MAIL | Account.FLAGS_SECURITY_HOLD, a1.mFlags);
2912a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        Account a1b = Account.restoreAccountWithId(mMockContext, a1.mId);
2922a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        assertEquals(Account.FLAGS_NOTIFY_NEW_MAIL | Account.FLAGS_SECURITY_HOLD, a1b.mFlags);
2932a5eeea9213005060256054ec773e72406415ce4Andrew Stadler
2942a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        // confirm set until cleared
2952a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        Account a2a = Account.restoreAccountWithId(mMockContext, a2.mId);
2969e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma        assertEquals(Account.FLAGS_VIBRATE_ALWAYS | Account.FLAGS_SECURITY_HOLD, a2a.mFlags);
2972a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        sp.setAccountHoldFlag(a2, false);
2989e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma        assertEquals(Account.FLAGS_VIBRATE_ALWAYS, a2.mFlags);
2992a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        Account a2b = Account.restoreAccountWithId(mMockContext, a2.mId);
3009e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma        assertEquals(Account.FLAGS_VIBRATE_ALWAYS, a2b.mFlags);
3012a5eeea9213005060256054ec773e72406415ce4Andrew Stadler    }
3022a5eeea9213005060256054ec773e72406415ce4Andrew Stadler
3032a5eeea9213005060256054ec773e72406415ce4Andrew Stadler    /**
3042a5eeea9213005060256054ec773e72406415ce4Andrew Stadler     * Test the API to clear all policy hold flags in all accounts)
3052a5eeea9213005060256054ec773e72406415ce4Andrew Stadler     */
3062a5eeea9213005060256054ec773e72406415ce4Andrew Stadler    public void testClearHoldFlags() {
3072a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        SecurityPolicy sp = getSecurityPolicy();
3082a5eeea9213005060256054ec773e72406415ce4Andrew Stadler
3092a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        Account a1 = ProviderTestUtils.setupAccount("holdflag-1", false, mMockContext);
3102a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        a1.mFlags = Account.FLAGS_NOTIFY_NEW_MAIL;
3112a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        a1.save(mMockContext);
3122a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        Account a2 = ProviderTestUtils.setupAccount("holdflag-2", false, mMockContext);
3139e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma        a2.mFlags = Account.FLAGS_VIBRATE_ALWAYS | Account.FLAGS_SECURITY_HOLD;
3142a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        a2.save(mMockContext);
3152a5eeea9213005060256054ec773e72406415ce4Andrew Stadler
3162a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        // bulk clear
3172a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        sp.clearAccountHoldFlags();
3182a5eeea9213005060256054ec773e72406415ce4Andrew Stadler
3192a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        // confirm new values as expected - no hold flags; other flags unmolested
3202a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        Account a1a = Account.restoreAccountWithId(mMockContext, a1.mId);
3212a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        assertEquals(Account.FLAGS_NOTIFY_NEW_MAIL, a1a.mFlags);
3222a5eeea9213005060256054ec773e72406415ce4Andrew Stadler        Account a2a = Account.restoreAccountWithId(mMockContext, a2.mId);
3239e2ddca59d048fc9ac55278b193ee36b330a7981Jim Shuma        assertEquals(Account.FLAGS_VIBRATE_ALWAYS, a2a.mFlags);
3242a5eeea9213005060256054ec773e72406415ce4Andrew Stadler    }
325af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler
326af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler    /**
327af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler     * Test the response to disabling DeviceAdmin status
328af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler     */
329af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler    public void testDisableAdmin() {
330af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        Account a1 = ProviderTestUtils.setupAccount("disable-1", false, mMockContext);
331af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        PolicySet p1 = new PolicySet(10, PolicySet.PASSWORD_MODE_SIMPLE, 0, 0, false);
332af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        p1.writeAccount(a1, "sync-key-1", true, mMockContext);
333af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler
334af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        Account a2 = ProviderTestUtils.setupAccount("disable-2", false, mMockContext);
335af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        PolicySet p2 = new PolicySet(20, PolicySet.PASSWORD_MODE_STRONG, 25, 26, false);
336af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        p2.writeAccount(a2, "sync-key-2", true, mMockContext);
337af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler
338af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        Account a3 = ProviderTestUtils.setupAccount("disable-3", false, mMockContext);
339af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        a3.mSecurityFlags = 0;
340af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        a3.mSecuritySyncKey = null;
341af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        a3.save(mMockContext);
342af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler
343af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        SecurityPolicy sp = getSecurityPolicy();
344af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler
345af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        // Confirm that "enabling" device admin does not change security status (flags & sync key)
346af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        PolicySet before = sp.getAggregatePolicy();
347af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        sp.onAdminEnabled(true);        // "enabled" should not change anything
348af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        PolicySet after1 = sp.getAggregatePolicy();
349af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        assertEquals(before, after1);
350af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        Account a1a = Account.restoreAccountWithId(mMockContext, a1.mId);
351af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        assertNotNull(a1a.mSecuritySyncKey);
352af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        Account a2a = Account.restoreAccountWithId(mMockContext, a2.mId);
353af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        assertNotNull(a2a.mSecuritySyncKey);
354af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        Account a3a = Account.restoreAccountWithId(mMockContext, a3.mId);
355af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        assertNull(a3a.mSecuritySyncKey);
356af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler
357af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        // Revoke device admin status.  In the accounts we set up, security values should be reset
358af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        sp.onAdminEnabled(false);        // "disabled" should clear policies
359af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        PolicySet after2 = sp.getAggregatePolicy();
360af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        assertEquals(SecurityPolicy.NO_POLICY_SET, after2);
361af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        Account a1b = Account.restoreAccountWithId(mMockContext, a1.mId);
362af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        assertNull(a1b.mSecuritySyncKey);
363af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        Account a2b = Account.restoreAccountWithId(mMockContext, a2.mId);
364af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        assertNull(a2b.mSecuritySyncKey);
365af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        Account a3b = Account.restoreAccountWithId(mMockContext, a3.mId);
366af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler        assertNull(a3b.mSecuritySyncKey);
367af55e3e436991fde91cdc80efe2786eb8f509d15Andrew Stadler    }
368345fb8b737c1632fb2a7e69ac44b8612be6237edAndrew Stadler}
369