• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.email.provider;
18 
19 import android.content.Context;
20 import android.os.Parcel;
21 import android.test.ProviderTestCase2;
22 import android.test.suitebuilder.annotation.MediumTest;
23 import android.test.suitebuilder.annotation.Suppress;
24 
25 import com.android.email.SecurityPolicy;
26 import com.android.emailcommon.provider.Account;
27 import com.android.emailcommon.provider.EmailContent;
28 import com.android.emailcommon.provider.EmailContent.Attachment;
29 import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
30 import com.android.emailcommon.provider.EmailContent.Message;
31 import com.android.emailcommon.provider.Mailbox;
32 import com.android.emailcommon.provider.Policy;
33 
34 import java.util.ArrayList;
35 
36 /**
37  * This is a series of unit tests for the Policy class
38  *
39  * You can run this entire test case with:
40  *   runtest -c com.android.email.provider.PolicyTests email
41  */
42 @Suppress
43 @MediumTest
44 public class PolicyTests extends ProviderTestCase2<EmailProvider> {
45 
46     private static final String CANT_DOWNLOAD_SELECTION = "(" + AttachmentColumns.FLAGS + "&" +
47         Attachment.FLAG_POLICY_DISALLOWS_DOWNLOAD + ")!=0";
48 
49     private Context mMockContext;
50 
PolicyTests()51     public PolicyTests() {
52         super(EmailProvider.class, EmailContent.AUTHORITY);
53     }
54 
55     @Override
setUp()56     public void setUp() throws Exception {
57         super.setUp();
58         mMockContext = getMockContext();
59         // Invalidate all caches, since we reset the database for each test
60         ContentCache.invalidateAllCaches();
61     }
62 
63     @Override
tearDown()64     public void tearDown() throws Exception {
65         super.tearDown();
66     }
67 
testGetAccountIdWithPolicyKey()68     public void testGetAccountIdWithPolicyKey() {
69         String securitySyncKey = "key";
70         // Setup two accounts with policies
71         Account account1 = ProviderTestUtils.setupAccount("acct1", true, mMockContext);
72         Policy policy1 = new Policy();
73         SecurityPolicy.setAccountPolicy(mMockContext, account1, policy1, securitySyncKey);
74         Account account2 = ProviderTestUtils.setupAccount("acct2", true, mMockContext);
75         Policy policy2 = new Policy();
76         SecurityPolicy.setAccountPolicy(mMockContext, account2, policy2, securitySyncKey);
77         // Get the accounts back from the database
78         account1.refresh(mMockContext);
79         account2.refresh(mMockContext);
80         // Both should have valid policies
81         assertTrue(account1.mPolicyKey > 0);
82         // And they should be findable via getAccountIdWithPolicyKey
83         assertTrue(account2.mPolicyKey > 0);
84         assertEquals(account1.mId, Policy.getAccountIdWithPolicyKey(mMockContext,
85                 account1.mPolicyKey));
86         assertEquals(account2.mId, Policy.getAccountIdWithPolicyKey(mMockContext,
87                 account2.mPolicyKey));
88     }
89 
testSetAndClearAccountPolicy()90     public void testSetAndClearAccountPolicy() {
91         String securitySyncKey = "key";
92         Account account = ProviderTestUtils.setupAccount("acct", true, mMockContext);
93         // Nothing up my sleeve
94         assertEquals(0, account.mPolicyKey);
95         assertEquals(0, EmailContent.count(mMockContext, Policy.CONTENT_URI));
96         Policy policy = new Policy();
97         SecurityPolicy.setAccountPolicy(mMockContext, account, policy, securitySyncKey);
98         account.refresh(mMockContext);
99         // We should have a policyKey now
100         assertTrue(account.mPolicyKey > 0);
101         Policy dbPolicy = Policy.restorePolicyWithId(mMockContext, account.mPolicyKey);
102         // The policy should exist in the database
103         assertNotNull(dbPolicy);
104         // And it should be the same as the original
105         assertEquals(policy, dbPolicy);
106         // The account should have the security sync key set
107         assertEquals(securitySyncKey, account.mSecuritySyncKey);
108         SecurityPolicy.clearAccountPolicy(mMockContext, account);
109         account.refresh(mMockContext);
110         // Make sure policyKey is cleared and policy is deleted
111         assertEquals(0, account.mPolicyKey);
112         assertEquals(0, EmailContent.count(mMockContext, Policy.CONTENT_URI));
113         account.refresh(mMockContext);
114         // The account's security sync key should also be null
115         assertNull(account.mSecuritySyncKey);
116     }
117 
setupSimpleAttachment(String name, long size, Account acct)118     private Attachment setupSimpleAttachment(String name, long size, Account acct) {
119         Attachment att = ProviderTestUtils.setupAttachment(-1, name, size, false, mMockContext);
120         att.mAccountKey = acct.mId;
121         return att;
122     }
testSetAttachmentFlagsForNewPolicy()123     public void testSetAttachmentFlagsForNewPolicy() {
124         Account acct = ProviderTestUtils.setupAccount("acct1", true, mMockContext);
125         Policy policy1 = new Policy();
126         policy1.mDontAllowAttachments = true;
127         SecurityPolicy.setAccountPolicy(mMockContext, acct, policy1, null);
128         Mailbox box = ProviderTestUtils.setupMailbox("box1", acct.mId, true, mMockContext);
129         Message msg1 = ProviderTestUtils.setupMessage("message1", acct.mId, box.mId, false, false,
130                 mMockContext);
131         ArrayList<Attachment> atts = new ArrayList<Attachment>();
132         Attachment att1 = setupSimpleAttachment("fileName1", 10001L, acct);
133         atts.add(att1);
134         Attachment att2 = setupSimpleAttachment("fileName2", 20001L, acct);
135         atts.add(att2);
136         msg1.mAttachments = atts;
137         msg1.save(mMockContext);
138         Message msg2 = ProviderTestUtils.setupMessage("message2", acct.mId, box.mId, false, false,
139                 mMockContext);
140         atts.clear();
141         Attachment att3 = setupSimpleAttachment("fileName3", 70001L, acct);
142         atts.add(att3);
143         Attachment att4 = setupSimpleAttachment("fileName4", 5001L, acct);
144         atts.add(att4);
145         msg2.mAttachments = atts;
146         msg2.save(mMockContext);
147         // Make sure we've got our 4 attachments
148         assertEquals(4, EmailContent.count(mMockContext, Attachment.CONTENT_URI));
149         // All should be downloadable
150         assertEquals(0, EmailContent.count(mMockContext, Attachment.CONTENT_URI,
151                 CANT_DOWNLOAD_SELECTION, null));
152         // Enforce our no-attachments policy
153         Policy.setAttachmentFlagsForNewPolicy(mMockContext, acct, policy1);
154         // None should be downloadable
155         assertEquals(4, EmailContent.count(mMockContext, Attachment.CONTENT_URI,
156                 CANT_DOWNLOAD_SELECTION, null));
157 
158         Policy policy2 = new Policy();
159         policy2.mMaxAttachmentSize = 20000;
160         // Switch to new policy that sets a limit, but otherwise allows attachments
161         Policy.setAttachmentFlagsForNewPolicy(mMockContext, acct, policy2);
162         // Two shouldn't be downloadable
163         assertEquals(2, EmailContent.count(mMockContext, Attachment.CONTENT_URI,
164                 CANT_DOWNLOAD_SELECTION, null));
165         // Make sure they're the right ones (att2 and att3)
166         att2 = Attachment.restoreAttachmentWithId(mMockContext, att2.mId);
167         assertTrue((att2.mFlags & Attachment.FLAG_POLICY_DISALLOWS_DOWNLOAD) != 0);
168         att3 = Attachment.restoreAttachmentWithId(mMockContext, att3.mId);
169         assertTrue((att3.mFlags & Attachment.FLAG_POLICY_DISALLOWS_DOWNLOAD) != 0);
170 
171         Policy policy3 = new Policy();
172         policy3.mMaxAttachmentSize = 5001;
173         // Switch to new policy that sets a lower limit
174         Policy.setAttachmentFlagsForNewPolicy(mMockContext, acct, policy3);
175         // Three shouldn't be downloadable
176         assertEquals(3, EmailContent.count(mMockContext, Attachment.CONTENT_URI,
177                 CANT_DOWNLOAD_SELECTION, null));
178         // Make sure the right one is downloadable
179         att4 = Attachment.restoreAttachmentWithId(mMockContext, att4.mId);
180         assertTrue((att4.mFlags & Attachment.FLAG_POLICY_DISALLOWS_DOWNLOAD) == 0);
181 
182         Policy policy4 = new Policy();
183         // Switch to new policy that is without restrictions
184         Policy.setAttachmentFlagsForNewPolicy(mMockContext, acct, policy4);
185         // Nothing should be blocked now
186         assertEquals(0, EmailContent.count(mMockContext, Attachment.CONTENT_URI,
187                 CANT_DOWNLOAD_SELECTION, null));
188    }
189 
testParcel()190     public void testParcel() {
191         Policy policy = new Policy();
192         policy.mPasswordMode = Policy.PASSWORD_MODE_STRONG;
193         policy.mPasswordMinLength = 6;
194         policy.mPasswordComplexChars = 5;
195         policy.mPasswordExpirationDays = 4;
196         policy.mPasswordHistory = 3;
197         policy.mPasswordMaxFails = 8;
198         policy.mMaxScreenLockTime = 600;
199         policy.mRequireRemoteWipe = true;
200         policy.mRequireEncryption = true;
201         policy.mRequireEncryptionExternal = true;
202         policy.mRequireManualSyncWhenRoaming = true;
203         policy.mDontAllowCamera = false;
204         policy.mDontAllowAttachments = true;
205         policy.mDontAllowHtml = false;
206         policy.mMaxAttachmentSize = 22222;
207         policy.mMaxTextTruncationSize = 33333;
208         policy.mMaxHtmlTruncationSize = 44444;
209         policy.mMaxEmailLookback = 5;
210         policy.mMaxCalendarLookback = 6;
211         policy.mPasswordRecoveryEnabled = true;
212         Parcel parcel = Parcel.obtain();
213         policy.writeToParcel(parcel, 0);
214         parcel.setDataPosition(0);
215         Policy readPolicy = Policy.CREATOR.createFromParcel(parcel);
216         assertEquals(policy, readPolicy);
217     }
218 }
219