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