/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.email.provider;

import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent;
import com.android.emailcommon.provider.EmailContent.Attachment;
import com.android.emailcommon.provider.EmailContent.AttachmentColumns;
import com.android.emailcommon.provider.EmailContent.Message;
import com.android.emailcommon.provider.Mailbox;
import com.android.emailcommon.provider.Policy;

import android.content.Context;
import android.os.Parcel;
import android.test.ProviderTestCase2;
import android.test.suitebuilder.annotation.MediumTest;

import java.util.ArrayList;

/**
 * This is a series of unit tests for the Policy class
 *
 * You can run this entire test case with:
 *   runtest -c com.android.email.provider.PolicyTests email
 */

@MediumTest
public class PolicyTests extends ProviderTestCase2<EmailProvider> {

    private static final String CANT_DOWNLOAD_SELECTION = "(" + AttachmentColumns.FLAGS + "&" +
        Attachment.FLAG_POLICY_DISALLOWS_DOWNLOAD + ")!=0";

    private Context mMockContext;

    public PolicyTests() {
        super(EmailProvider.class, EmailContent.AUTHORITY);
    }

    @Override
    public void setUp() throws Exception {
        super.setUp();
        mMockContext = getMockContext();
        // Invalidate all caches, since we reset the database for each test
        ContentCache.invalidateAllCaches();
    }

    @Override
    public void tearDown() throws Exception {
        super.tearDown();
    }

    public void testGetAccountIdWithPolicyKey() {
        String securitySyncKey = "key";
        // Setup two accounts with policies
        Account account1 = ProviderTestUtils.setupAccount("acct1", true, mMockContext);
        Policy policy1 = new Policy();
        Policy.setAccountPolicy(mMockContext, account1, policy1, securitySyncKey);
        Account account2 = ProviderTestUtils.setupAccount("acct2", true, mMockContext);
        Policy policy2 = new Policy();
        Policy.setAccountPolicy(mMockContext, account2, policy2, securitySyncKey);
        // Get the accounts back from the database
        account1.refresh(mMockContext);
        account2.refresh(mMockContext);
        // Both should have valid policies
        assertTrue(account1.mPolicyKey > 0);
        // And they should be findable via getAccountIdWithPolicyKey
        assertTrue(account2.mPolicyKey > 0);
        assertEquals(account1.mId, Policy.getAccountIdWithPolicyKey(mMockContext,
                account1.mPolicyKey));
        assertEquals(account2.mId, Policy.getAccountIdWithPolicyKey(mMockContext,
                account2.mPolicyKey));
    }

    public void testSetAndClearAccountPolicy() {
        String securitySyncKey = "key";
        Account account = ProviderTestUtils.setupAccount("acct", true, mMockContext);
        // Nothing up my sleeve
        assertEquals(0, account.mPolicyKey);
        assertEquals(0, EmailContent.count(mMockContext, Policy.CONTENT_URI));
        Policy policy = new Policy();
        Policy.setAccountPolicy(mMockContext, account, policy, securitySyncKey);
        account.refresh(mMockContext);
        // We should have a policyKey now
        assertTrue(account.mPolicyKey > 0);
        Policy dbPolicy = Policy.restorePolicyWithId(mMockContext, account.mPolicyKey);
        // The policy should exist in the database
        assertNotNull(dbPolicy);
        // And it should be the same as the original
        assertEquals(policy, dbPolicy);
        // The account should have the security sync key set
        assertEquals(securitySyncKey, account.mSecuritySyncKey);
        Policy.clearAccountPolicy(mMockContext, account);
        account.refresh(mMockContext);
        // Make sure policyKey is cleared and policy is deleted
        assertEquals(0, account.mPolicyKey);
        assertEquals(0, EmailContent.count(mMockContext, Policy.CONTENT_URI));
        account.refresh(mMockContext);
        // The account's security sync key should also be null
        assertNull(account.mSecuritySyncKey);
    }

    private Attachment setupSimpleAttachment(String name, long size, Account acct) {
        Attachment att = ProviderTestUtils.setupAttachment(-1, name, size, false, mMockContext);
        att.mAccountKey = acct.mId;
        return att;
    }
    public void testSetAttachmentFlagsForNewPolicy() {
        Account acct = ProviderTestUtils.setupAccount("acct1", true, mMockContext);
        Policy policy1 = new Policy();
        policy1.mDontAllowAttachments = true;
        Policy.setAccountPolicy(mMockContext, acct, policy1, null);
        Mailbox box = ProviderTestUtils.setupMailbox("box1", acct.mId, true, mMockContext);
        Message msg1 = ProviderTestUtils.setupMessage("message1", acct.mId, box.mId, false, false,
                mMockContext);
        ArrayList<Attachment> atts = new ArrayList<Attachment>();
        Attachment att1 = setupSimpleAttachment("fileName1", 10001L, acct);
        atts.add(att1);
        Attachment att2 = setupSimpleAttachment("fileName2", 20001L, acct);
        atts.add(att2);
        msg1.mAttachments = atts;
        msg1.save(mMockContext);
        Message msg2 = ProviderTestUtils.setupMessage("message2", acct.mId, box.mId, false, false,
                mMockContext);
        atts.clear();
        Attachment att3 = setupSimpleAttachment("fileName3", 70001L, acct);
        atts.add(att3);
        Attachment att4 = setupSimpleAttachment("fileName4", 5001L, acct);
        atts.add(att4);
        msg2.mAttachments = atts;
        msg2.save(mMockContext);
        // Make sure we've got our 4 attachments
        assertEquals(4, EmailContent.count(mMockContext, Attachment.CONTENT_URI));
        // All should be downloadable
        assertEquals(0, EmailContent.count(mMockContext, Attachment.CONTENT_URI,
                CANT_DOWNLOAD_SELECTION, null));
        // Enforce our no-attachments policy
        Policy.setAttachmentFlagsForNewPolicy(mMockContext, acct, policy1);
        // None should be downloadable
        assertEquals(4, EmailContent.count(mMockContext, Attachment.CONTENT_URI,
                CANT_DOWNLOAD_SELECTION, null));

        Policy policy2 = new Policy();
        policy2.mMaxAttachmentSize = 20000;
        // Switch to new policy that sets a limit, but otherwise allows attachments
        Policy.setAttachmentFlagsForNewPolicy(mMockContext, acct, policy2);
        // Two shouldn't be downloadable
        assertEquals(2, EmailContent.count(mMockContext, Attachment.CONTENT_URI,
                CANT_DOWNLOAD_SELECTION, null));
        // Make sure they're the right ones (att2 and att3)
        att2 = Attachment.restoreAttachmentWithId(mMockContext, att2.mId);
        assertTrue((att2.mFlags & Attachment.FLAG_POLICY_DISALLOWS_DOWNLOAD) != 0);
        att3 = Attachment.restoreAttachmentWithId(mMockContext, att3.mId);
        assertTrue((att3.mFlags & Attachment.FLAG_POLICY_DISALLOWS_DOWNLOAD) != 0);

        Policy policy3 = new Policy();
        policy3.mMaxAttachmentSize = 5001;
        // Switch to new policy that sets a lower limit
        Policy.setAttachmentFlagsForNewPolicy(mMockContext, acct, policy3);
        // Three shouldn't be downloadable
        assertEquals(3, EmailContent.count(mMockContext, Attachment.CONTENT_URI,
                CANT_DOWNLOAD_SELECTION, null));
        // Make sure the right one is downloadable
        att4 = Attachment.restoreAttachmentWithId(mMockContext, att4.mId);
        assertTrue((att4.mFlags & Attachment.FLAG_POLICY_DISALLOWS_DOWNLOAD) == 0);

        Policy policy4 = new Policy();
        // Switch to new policy that is without restrictions
        Policy.setAttachmentFlagsForNewPolicy(mMockContext, acct, policy4);
        // Nothing should be blocked now
        assertEquals(0, EmailContent.count(mMockContext, Attachment.CONTENT_URI,
                CANT_DOWNLOAD_SELECTION, null));
   }

    public void testParcel() {
        Policy policy = new Policy();
        policy.mPasswordMode = Policy.PASSWORD_MODE_STRONG;
        policy.mPasswordMinLength = 6;
        policy.mPasswordComplexChars = 5;
        policy.mPasswordExpirationDays = 4;
        policy.mPasswordHistory = 3;
        policy.mPasswordMaxFails = 8;
        policy.mMaxScreenLockTime = 600;
        policy.mRequireRemoteWipe = true;
        policy.mRequireEncryption = true;
        policy.mRequireEncryptionExternal = true;
        policy.mRequireManualSyncWhenRoaming = true;
        policy.mDontAllowCamera = false;
        policy.mDontAllowAttachments = true;
        policy.mDontAllowHtml = false;
        policy.mMaxAttachmentSize = 22222;
        policy.mMaxTextTruncationSize = 33333;
        policy.mMaxHtmlTruncationSize = 44444;
        policy.mMaxEmailLookback = 5;
        policy.mMaxCalendarLookback = 6;
        policy.mPasswordRecoveryEnabled = true;
        Parcel parcel = Parcel.obtain();
        policy.writeToParcel(parcel, 0);
        parcel.setDataPosition(0);
        Policy readPolicy = Policy.CREATOR.createFromParcel(parcel);
        assertEquals(policy, readPolicy);
    }
}
