1f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki/* 2f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * Copyright (C) 2010 The Android Open Source Project 3f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * 4f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License"); 5f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * you may not use this file except in compliance with the License. 6f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * You may obtain a copy of the License at 7f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * 8f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * http://www.apache.org/licenses/LICENSE-2.0 9f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * 10f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * Unless required by applicable law or agreed to in writing, software 11f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS, 12f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * See the License for the specific language governing permissions and 14f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * limitations under the License. 15f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki */ 16f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 17f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onukipackage com.android.email; 18f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 19f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onukiimport android.content.Context; 20f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onukiimport android.os.Bundle; 21f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onukiimport android.test.AndroidTestCase; 223555dc03bf2243dc275c9c832702abbee3b64387Jerry Xieimport android.test.suitebuilder.annotation.SmallTest; 23f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 2417d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xieimport com.android.emailcommon.VendorPolicyLoader; 2517d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xieimport com.android.emailcommon.VendorPolicyLoader.Provider; 2617d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie 273555dc03bf2243dc275c9c832702abbee3b64387Jerry Xie@SmallTest 28f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onukipublic class VendorPolicyLoaderTest extends AndroidTestCase { 2936d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki private String mTestApkPackageName; 3036d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki 3136d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki @Override 3236d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki protected void setUp() throws Exception { 3336d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki super.setUp(); 3436d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki mTestApkPackageName = getContext().getPackageName() + ".tests"; 3536d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki } 3636d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki 3736d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki @Override 3836d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki protected void tearDown() throws Exception { 3936d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki super.tearDown(); 4036d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki VendorPolicyLoader.clearInstanceForTest(); 4136d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki } 4236d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki 43f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki /** 44f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * Test for the case where the helper package doesn't exist. 45f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki */ 46f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki public void testPackageNotExist() { 47f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki VendorPolicyLoader pl = new VendorPolicyLoader(getContext(), "no.such.package", 48f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki "no.such.Class", true); 49f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 50f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki // getPolicy() shouldn't throw any exception. 51f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki assertEquals(Bundle.EMPTY, pl.getPolicy(null, null)); 52f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki } 53f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 54f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki public void testIsSystemPackage() { 55f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki final Context c = getContext(); 56f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki assertEquals(false, VendorPolicyLoader.isSystemPackage(c, "no.such.package")); 5736d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki assertEquals(false, VendorPolicyLoader.isSystemPackage(c, mTestApkPackageName)); 58f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki assertEquals(true, VendorPolicyLoader.isSystemPackage(c, "com.android.settings")); 59f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki } 60f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 61f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki /** 62f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * Actually call {@link VendorPolicyLoader#getPolicy}, using MockVendorPolicy as a vendor 63f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * policy. 64f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki */ 65f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki public void testGetPolicy() { 6636d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki MockVendorPolicy.inject(getContext()); 6736d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki VendorPolicyLoader pl = VendorPolicyLoader.getInstance(getContext()); 68f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 69f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki // Prepare result 70f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki Bundle result = new Bundle(); 71f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki result.putInt("ret", 1); 72f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki MockVendorPolicy.mockResult = result; 73f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 74f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki // Arg to pass 75f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki Bundle args = new Bundle(); 76f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki args.putString("arg1", "a"); 77f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 78f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki // Call! 79f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki Bundle actualResult = pl.getPolicy("policy1", args); 80f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 81f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki // Check passed args 8236d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki assertEquals("policy", "policy1", MockVendorPolicy.passedPolicy); 83f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki assertEquals("arg", "a", MockVendorPolicy.passedBundle.getString("arg1")); 84f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 85f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki // Check return value 86f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki assertEquals("result", 1, actualResult.getInt("ret")); 87f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki } 88f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 89f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki /** 90f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * Same as {@link #testGetPolicy}, but with the system-apk check. It's a test for the case 91f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * where we have a non-system vendor policy installed, which shouldn't be used. 92f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki */ 93f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki public void testGetPolicyNonSystem() { 9436d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki VendorPolicyLoader pl = new VendorPolicyLoader(getContext(), mTestApkPackageName, 95f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki MockVendorPolicy.class.getName(), false); 96f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 97f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki MockVendorPolicy.passedPolicy = null; 98f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 99f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki // getPolicy() shouldn't throw any exception. 100f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki assertEquals(Bundle.EMPTY, pl.getPolicy("policy1", null)); 101f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 102f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki // MockVendorPolicy.getPolicy() shouldn't get called. 103f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki assertNull(MockVendorPolicy.passedPolicy); 104f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki } 105f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki 106ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler /** 107ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler * Test that any vendor policy that happens to be installed returns legal values 108ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler * for getImapIdValues() per its API. 10936d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki * 110ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler * Note, in most cases very little will happen in this test, because there is 111ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler * no vendor policy package. Most of this test exists to test a vendor policy 112ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler * package itself, to make sure that its API returns reasonable values. 113ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler */ 114ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler public void testGetImapIdValues() { 115ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler VendorPolicyLoader pl = VendorPolicyLoader.getInstance(getContext()); 116ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler String id = pl.getImapIdValues("user-name", "server.yahoo.com", 117ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler "IMAP4rev1 STARTTLS AUTH=GSSAPI"); 118ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler // null is a reasonable result 119ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler if (id == null) return; 120ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler 121ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler // if non-null, basic sanity checks on format 122ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler assertEquals("\"", id.charAt(0)); 123ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler assertEquals("\"", id.charAt(id.length()-1)); 124ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler // see if we can break it up properly 125ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler String[] elements = id.split("\""); 126ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler assertEquals(0, elements.length % 4); 127ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler for (int i = 0; i < elements.length; ) { 128ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler // Because we split at quotes, we expect to find: 129ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler // [i] = null or one or more spaces 130ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler // [i+1] = key 131ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler // [i+2] = one or more spaces 132ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler // [i+3] = value 133ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler // Here are some incomplete checks of the above 134ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler assertTrue(elements[i] == null || elements[i].startsWith(" ")); 135ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler assertTrue(elements[i+1].charAt(0) != ' '); 136ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler assertTrue(elements[i+2].startsWith(" ")); 137ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler assertTrue(elements[i+3].charAt(0) != ' '); 13836d3dfaeac1a80561ef41a78ecc9bf3583d0ca7bMakoto Onuki i += 4; 139ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler } 140ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler } 1410434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler 1420434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler /** 1430434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler * Test that findProviderForDomain() returns legal values, or functions properly when 1440434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler * none is installed. 1450434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler */ 1460434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler public void testFindProviderForDomain() { 1470434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler VendorPolicyLoader pl = VendorPolicyLoader.getInstance(getContext()); 1480434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler Provider p = pl.findProviderForDomain("yahoo.com"); 1490434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler // null is a reasonable result (none installed) 1500434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler if (p == null) return; 1510434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler 1520434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler // if non-null, basic sanity checks on format 1530434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler assertNull(p.id); 1540434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler assertNull(p.label); 1550434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler assertEquals("yahoo.com", p.domain); 1560434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler assertNotNull(p.incomingUriTemplate); 1570434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler assertNotNull(p.incomingUsernameTemplate); 1580434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler assertNotNull(p.outgoingUriTemplate); 1590434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler assertNotNull(p.outgoingUsernameTemplate); 1600434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler assertTrue(p.note == null || p.note.length() > 0); // no empty string 1610434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler } 162f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki} 163