Home | History | Annotate | Download | only in email
      1 /*
      2  * Copyright (C) 2010 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;
     18 
     19 import com.android.email.activity.setup.AccountSettingsUtils.Provider;
     20 
     21 import android.content.Context;
     22 import android.os.Bundle;
     23 import android.test.AndroidTestCase;
     24 
     25 public class VendorPolicyLoaderTest extends AndroidTestCase {
     26     private String mTestApkPackageName;
     27 
     28     @Override
     29     protected void setUp() throws Exception {
     30         super.setUp();
     31         mTestApkPackageName = getContext().getPackageName() + ".tests";
     32     }
     33 
     34     @Override
     35     protected void tearDown() throws Exception {
     36         super.tearDown();
     37         VendorPolicyLoader.clearInstanceForTest();
     38     }
     39 
     40     /**
     41      * Test for the case where the helper package doesn't exist.
     42      */
     43     public void testPackageNotExist() {
     44         VendorPolicyLoader pl = new VendorPolicyLoader(getContext(), "no.such.package",
     45                 "no.such.Class", true);
     46 
     47         // getPolicy() shouldn't throw any exception.
     48         assertEquals(Bundle.EMPTY, pl.getPolicy(null, null));
     49     }
     50 
     51     public void testIsSystemPackage() {
     52         final Context c = getContext();
     53         assertEquals(false, VendorPolicyLoader.isSystemPackage(c, "no.such.package"));
     54         assertEquals(false, VendorPolicyLoader.isSystemPackage(c, mTestApkPackageName));
     55         assertEquals(true, VendorPolicyLoader.isSystemPackage(c, "com.android.settings"));
     56     }
     57 
     58     /**
     59      * Actually call {@link VendorPolicyLoader#getPolicy}, using MockVendorPolicy as a vendor
     60      * policy.
     61      */
     62     public void testGetPolicy() {
     63         MockVendorPolicy.inject(getContext());
     64         VendorPolicyLoader pl = VendorPolicyLoader.getInstance(getContext());
     65 
     66         // Prepare result
     67         Bundle result = new Bundle();
     68         result.putInt("ret", 1);
     69         MockVendorPolicy.mockResult = result;
     70 
     71         // Arg to pass
     72         Bundle args = new Bundle();
     73         args.putString("arg1", "a");
     74 
     75         // Call!
     76         Bundle actualResult = pl.getPolicy("policy1", args);
     77 
     78         // Check passed args
     79         assertEquals("policy", "policy1", MockVendorPolicy.passedPolicy);
     80         assertEquals("arg", "a", MockVendorPolicy.passedBundle.getString("arg1"));
     81 
     82         // Check return value
     83         assertEquals("result", 1, actualResult.getInt("ret"));
     84     }
     85 
     86     /**
     87      * Same as {@link #testGetPolicy}, but with the system-apk check.  It's a test for the case
     88      * where we have a non-system vendor policy installed, which shouldn't be used.
     89      */
     90     public void testGetPolicyNonSystem() {
     91         VendorPolicyLoader pl = new VendorPolicyLoader(getContext(), mTestApkPackageName,
     92                 MockVendorPolicy.class.getName(), false);
     93 
     94         MockVendorPolicy.passedPolicy = null;
     95 
     96         // getPolicy() shouldn't throw any exception.
     97         assertEquals(Bundle.EMPTY, pl.getPolicy("policy1", null));
     98 
     99         // MockVendorPolicy.getPolicy() shouldn't get called.
    100         assertNull(MockVendorPolicy.passedPolicy);
    101     }
    102 
    103     /**
    104      * Test that any vendor policy that happens to be installed returns legal values
    105      * for getImapIdValues() per its API.
    106      *
    107      * Note, in most cases very little will happen in this test, because there is
    108      * no vendor policy package.  Most of this test exists to test a vendor policy
    109      * package itself, to make sure that its API returns reasonable values.
    110      */
    111     public void testGetImapIdValues() {
    112         VendorPolicyLoader pl = VendorPolicyLoader.getInstance(getContext());
    113         String id = pl.getImapIdValues("user-name", "server.yahoo.com",
    114                 "IMAP4rev1 STARTTLS AUTH=GSSAPI");
    115         // null is a reasonable result
    116         if (id == null) return;
    117 
    118         // if non-null, basic sanity checks on format
    119         assertEquals("\"", id.charAt(0));
    120         assertEquals("\"", id.charAt(id.length()-1));
    121         // see if we can break it up properly
    122         String[] elements = id.split("\"");
    123         assertEquals(0, elements.length % 4);
    124         for (int i = 0; i < elements.length; ) {
    125             // Because we split at quotes, we expect to find:
    126             // [i] = null or one or more spaces
    127             // [i+1] = key
    128             // [i+2] = one or more spaces
    129             // [i+3] = value
    130             // Here are some incomplete checks of the above
    131             assertTrue(elements[i] == null || elements[i].startsWith(" "));
    132             assertTrue(elements[i+1].charAt(0) != ' ');
    133             assertTrue(elements[i+2].startsWith(" "));
    134             assertTrue(elements[i+3].charAt(0) != ' ');
    135             i += 4;
    136         }
    137     }
    138 
    139     /**
    140      * Test that findProviderForDomain() returns legal values, or functions properly when
    141      * none is installed.
    142      */
    143     public void testFindProviderForDomain() {
    144         VendorPolicyLoader pl = VendorPolicyLoader.getInstance(getContext());
    145         Provider p = pl.findProviderForDomain("yahoo.com");
    146         // null is a reasonable result (none installed)
    147         if (p == null) return;
    148 
    149         // if non-null, basic sanity checks on format
    150         assertNull(p.id);
    151         assertNull(p.label);
    152         assertEquals("yahoo.com", p.domain);
    153         assertNotNull(p.incomingUriTemplate);
    154         assertNotNull(p.incomingUsernameTemplate);
    155         assertNotNull(p.outgoingUriTemplate);
    156         assertNotNull(p.outgoingUsernameTemplate);
    157         assertTrue(p.note == null || p.note.length() > 0);  // no empty string
    158     }
    159 }
    160