1fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy/*
2fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy * Copyright (C) 2011 The Android Open Source Project
3fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy *
4fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy * Licensed under the Apache License, Version 2.0 (the "License");
5fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy * you may not use this file except in compliance with the License.
6fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy * You may obtain a copy of the License at
7fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy *
8fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy *      http://www.apache.org/licenses/LICENSE-2.0
9fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy *
10fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy * Unless required by applicable law or agreed to in writing, software
11fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy * distributed under the License is distributed on an "AS IS" BASIS,
12fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy * See the License for the specific language governing permissions and
14fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy * limitations under the License.
15fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy */
16fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
17fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedypackage com.android.emailcommon.provider;
18fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
199b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantlerimport android.os.Parcel;
20fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedyimport android.test.AndroidTestCase;
219b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantlerimport android.test.mock.MockContext;
22fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedyimport android.test.suitebuilder.annotation.SmallTest;
23fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
249250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieuximport org.json.JSONException;
259250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieuximport org.json.JSONObject;
269250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux
279250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieuximport java.util.Arrays;
289250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux
29fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy/**
30fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy * Unit tests for the HostAuth inner class.
31fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy * These tests must be locally complete - no server(s) required.
32fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy */
33fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy@SmallTest
34fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedypublic class HostAuthTests extends AndroidTestCase {
35fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
36fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy    /**
37fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy     * Test user name and password are set correctly
38fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy     */
39fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy    public void testSetLogin() {
40fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        HostAuth ha = new HostAuth();
41fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setLogin("user:password");
42fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals("user", ha.mLogin);
43fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals("password", ha.mPassword);
44fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
45fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        // special characters are not removed during insertion
46fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setLogin("%20us%20er%20:password");
47fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals("%20us%20er%20", ha.mLogin);
48fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals("password", ha.mPassword);
49fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
50fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        // special characters are not removed during insertion
51fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setLogin("user:%20pass%20word%20");
52fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals("user", ha.mLogin);
53fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals("%20pass%20word%20", ha.mPassword);
54fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
55fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setLogin("user:");
56fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals("user", ha.mLogin);
57fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals("", ha.mPassword);
58fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
59fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setLogin(":password");
60fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals("", ha.mLogin);
61fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals("password", ha.mPassword);
62fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
63fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setLogin("");
64fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertNull(ha.mLogin);
65fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertNull(ha.mPassword);
66fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
67fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setLogin(null);
68fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertNull(ha.mLogin);
69fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertNull(ha.mPassword);
70fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
71fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setLogin("userpassword");
72fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals("userpassword", ha.mLogin);
73fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertNull(ha.mPassword);
74fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy    }
75fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
76fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy    /**
77fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy     * Test the authentication flag is set correctly when setting user name and password
78fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy     */
79fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy    public void testSetLoginAuthenticate() {
80fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        HostAuth ha = new HostAuth();
81fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
82fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.mFlags = 0x00000000;
83fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setLogin("user", "password");
84fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(HostAuth.FLAG_AUTHENTICATE, ha.mFlags);
85fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
86fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.mFlags = 0x00000000;
87fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setLogin("user", "");
88fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(HostAuth.FLAG_AUTHENTICATE, ha.mFlags);
89fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
90951eb080f98e86d50cb549ee52fb72d8f07196c3Tony Mantler        ha.mFlags = 0xffffffff;
91fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setLogin("", "password");
92951eb080f98e86d50cb549ee52fb72d8f07196c3Tony Mantler        assertEquals(~HostAuth.FLAG_AUTHENTICATE, ha.mFlags);
93fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
94fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.mFlags = 0x00000000;
95fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setLogin("user", null);
96fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(HostAuth.FLAG_AUTHENTICATE, ha.mFlags);
97fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
98fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.mFlags = 0xffffffff;
99fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setLogin(null, "password");
100fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(~HostAuth.FLAG_AUTHENTICATE, ha.mFlags);
101fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
102fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.mFlags = 0xffffffff;
103fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setLogin(null, null);
104fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(~HostAuth.FLAG_AUTHENTICATE, ha.mFlags);
105fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy    }
106fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
107fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy    /**
108fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy     * Test setting the connection using a protocol and flags
109fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy     */
110fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy    public void testSetConnectionFlags() {
111fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        HostAuth ha = new HostAuth();
112fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
113fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        // Different port types don't affect flags
114fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setConnection("imap", "server", 123, 0);
115fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(0, ha.mFlags);
116fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setConnection("imap", "server", -1, 0);
117fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(0, ha.mFlags);
118fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
119fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        // Different protocol types don't affect flags
120fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setConnection("pop3", "server", 123, 0);
121fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(0, ha.mFlags);
122fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setConnection("pop3", "server", -1, 0);
123fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(0, ha.mFlags);
124fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setConnection("eas", "server", 123, 0);
125fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(0, ha.mFlags);
126fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setConnection("eas", "server", -1, 0);
127fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(0, ha.mFlags);
128fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setConnection("smtp", "server", 123, 0);
129fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(0, ha.mFlags);
130fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        ha.setConnection("smtp", "server", -1, 0);
131fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(0, ha.mFlags);
132fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
133fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        // Sets SSL flag
134313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        ha.setConnection("imap", "server", HostAuth.PORT_UNKNOWN, HostAuth.FLAG_SSL);
135fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(HostAuth.FLAG_SSL, ha.mFlags);
136fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
137fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        // Sets SSL+Trusted flags
138313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        ha.setConnection("imap", "server", HostAuth.PORT_UNKNOWN,
139313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo                HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL);
140fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, ha.mFlags);
141fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
142fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        // Sets TLS flag
143313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        ha.setConnection("imap", "server", HostAuth.PORT_UNKNOWN, HostAuth.FLAG_TLS);
144fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(HostAuth.FLAG_TLS, ha.mFlags);
145fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
146fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        // Sets TLS+Trusted flags
147313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        ha.setConnection("imap", "server", HostAuth.PORT_UNKNOWN,
148313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo                HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL);
149fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(HostAuth.FLAG_TLS | HostAuth.FLAG_TRUST_ALL, ha.mFlags);
150fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
151fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        // Test other defined flags; should not affect mFlags
152313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        ha.setConnection("imap", "server", HostAuth.PORT_UNKNOWN, HostAuth.FLAG_AUTHENTICATE);
153fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        assertEquals(0, ha.mFlags);
154fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
155fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy        // Test every other bit; should not affect mFlags
1567037a0bd3d8e925a9115f475f5c0d05ddae2eeeeJerry Xie        // mFlag is evalutated to the following:
1577037a0bd3d8e925a9115f475f5c0d05ddae2eeeeJerry Xie        // mFlag = (0 & (some operation)) | (0xfffffff4 & 0x1b)
1587037a0bd3d8e925a9115f475f5c0d05ddae2eeeeJerry Xie        // mFlag = 0 | 0x10
1597037a0bd3d8e925a9115f475f5c0d05ddae2eeeeJerry Xie        // mFlag = 0x10
160313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        ha.setConnection("imap", "server", HostAuth.PORT_UNKNOWN, 0xfffffff4);
1617037a0bd3d8e925a9115f475f5c0d05ddae2eeeeJerry Xie        assertEquals(0x10, ha.mFlags);
162fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy    }
163fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
164313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo    public void testSetConnectionWithCerts() {
165313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        HostAuth ha = new HostAuth();
166313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo
167313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        ha.setConnection("eas", "server", HostAuth.PORT_UNKNOWN, HostAuth.FLAG_SSL, "client-cert");
168313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        assertEquals(HostAuth.FLAG_SSL, ha.mFlags);
169313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        assertEquals("client-cert", ha.mClientCertAlias);
170313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo
171313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        ha.setConnection("eas", "server", HostAuth.PORT_UNKNOWN, HostAuth.FLAG_TLS, "client-cert");
172313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        assertEquals(HostAuth.FLAG_TLS, ha.mFlags);
173313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        assertEquals("client-cert", ha.mClientCertAlias);
174313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo
175313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        // Note that we can still trust all server certificates, even if we present a client
176313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        // user certificate.
177313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        ha.setConnection("eas", "server", HostAuth.PORT_UNKNOWN,
178313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo                HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, "client-cert");
179313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        assertEquals(HostAuth.FLAG_SSL | HostAuth.FLAG_TRUST_ALL, ha.mFlags);
180313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        assertEquals("client-cert", ha.mClientCertAlias);
181313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo
182313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        try {
183313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo            ha.setConnection(
184313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo                    "eas", "server", HostAuth.PORT_UNKNOWN, 0 /* no flags */, "client-cert");
185313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo            fail("Shouldn't be able to set a client certificate on an unsecure connection");
186313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        } catch (IllegalArgumentException expected) {
1879b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler            // ignore
188313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        }
189313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo    }
1909b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler
1919b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler    public void testParceling() {
1929b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        final HostAuth orig = new HostAuth();
1939b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        // Fill in some data
1949b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        orig.mPort = 993;
1959b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        orig.mProtocol = "imap";
1969b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        orig.mAddress = "example.com";
1979b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        orig.mLogin = "user";
1989b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        orig.mPassword = "supersecret";
1999b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        orig.mDomain = "domain";
2009b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        orig.mClientCertAlias = "certalias";
2019b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler
2029b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        final Parcel p1 = Parcel.obtain();
2039b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        orig.writeToParcel(p1, 0);
2049b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        p1.setDataPosition(0);
2059b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        final HostAuth unparceled1 = new HostAuth(p1);
2069b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        p1.recycle();
2079b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        assertEquals(orig, unparceled1);
2089b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        assertEquals(orig.mCredentialKey, unparceled1.mCredentialKey);
2099b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        assertEquals(orig.mCredential, unparceled1.mCredential);
2109b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler
2119b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        orig.getOrCreateCredential(new MockContext());
2129b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler
2139b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        final Parcel p2 = Parcel.obtain();
2149b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        orig.writeToParcel(p2, 0);
2159b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        p2.setDataPosition(0);
2169b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        final HostAuth unparceled2 = new HostAuth(p2);
2179b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        p2.recycle();
2189b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        assertEquals(orig, unparceled2);
2199b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        assertEquals(orig.mCredentialKey, unparceled2.mCredentialKey);
2209b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler        assertEquals(orig.mCredential, unparceled2.mCredential);
2219b8dafe23aed2c50cab349aec0e20c3a7a28ec31Tony Mantler    }
2229250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux
2239250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux    public void testDeserializeFromJSON() throws JSONException {
2249250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        final JSONObject json = new JSONObject();
2259250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        json.put(EmailContent.HostAuthColumns.PROTOCOL, "IMAP");
2269250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        json.put(EmailContent.HostAuthColumns.ADDRESS, "dhoff@example.com");
2279250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        json.put(EmailContent.HostAuthColumns.PORT, 1337);
2289250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        json.put(EmailContent.HostAuthColumns.FLAGS, 293847);
2299250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        json.put(EmailContent.HostAuthColumns.LOGIN, "dhoff");
2309250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        json.put(EmailContent.HostAuthColumns.PASSWORD, "daknightrida");
2319250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        json.put(EmailContent.HostAuthColumns.DOMAIN, "example.com");
2329250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        json.put(EmailContent.HostAuthColumns.CLIENT_CERT_ALIAS, "I'm a client cert alias");
2339250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        json.put(HostAuth.JSON_TAG_CREDENTIAL, Credential.EMPTY.toJson());
2349250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux
2359250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        // deserialize the json
2369250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        final HostAuth ha = HostAuth.fromJson(json);
2379250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux
2389250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        // verify that all fields deserialized as expected
2399250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals("IMAP", ha.mProtocol);
2409250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals("dhoff@example.com", ha.mAddress);
2419250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals(1337, ha.mPort);
2429250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals(293847, ha.mFlags);
2439250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals("dhoff", ha.mLogin);
2449250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals("daknightrida", ha.mPassword);
2459250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals("example.com", ha.mDomain);
2469250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals("I'm a client cert alias", ha.mClientCertAlias);
2479250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals(Credential.EMPTY, ha.mCredential);
2489250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux
2499250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertNull(ha.mServerCert); // server cert is not serialized; field defaults to null
2509250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals(-1, ha.mCredentialKey); // cred key is not serialized; field defaults to -1
2519250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux    }
2529250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux
2539250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux    public void testSerializeAndDeserializeWithJSON() {
2549250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        final HostAuth before = new HostAuth();
2559250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        before.mProtocol = "IMAP";
2569250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        before.mAddress = "dhoff@example.com";
2579250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        before.mPort = 1337;
2589250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        before.mFlags = 293847;
2599250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        before.setLogin("dhoff", "daknightrida");
2609250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        before.mDomain = "example.com";
2619250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        before.mClientCertAlias = "I'm a client cert alias";
2629250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        before.mServerCert = new byte[] {(byte) 0xFF, (byte) 0xAA};
2639250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        before.mCredentialKey = 9873425;
2649250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        before.mCredential = Credential.EMPTY;
2659250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux
2669250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        // this must be called before serialization occurs
2679250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        before.ensureLoaded(getContext());
2689250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux
2699250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        // serialize and deserialize
2709250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        final HostAuth after = HostAuth.fromJson(before.toJson());
2719250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux
2729250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals(before.mProtocol, after.mProtocol);
2739250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals(before.mAddress, after.mAddress);
2749250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals(before.mPort, after.mPort);
2759250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals(before.mFlags, after.mFlags);
2769250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertTrue(Arrays.equals(before.getLogin(), after.getLogin()));
2779250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals(before.mDomain, after.mDomain);
2789250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals(before.mClientCertAlias, after.mClientCertAlias);
2799250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals(before.mCredential, after.mCredential);
2809250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux
2819250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertNull(after.mServerCert); // server cert is not serialized; field defaults to null
2829250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux        assertEquals(-1, after.mCredentialKey); // cred key is not serialized; field defaults to 0
2839250f4787222f8bc3afe539a2f351fd8d9875fbaJames Lemieux    }
284fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy}
285fe68c0e7c2672e09076038b36ad24f095633d313Todd Kennedy
286