1654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank/*
2654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank * Copyright (C) 2010 The Android Open Source Project
3654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank *
4654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank * Licensed under the Apache License, Version 2.0 (the "License");
5654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank * you may not use this file except in compliance with the License.
6654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank * You may obtain a copy of the License at
7654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank *
8654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank *      http://www.apache.org/licenses/LICENSE-2.0
9654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank *
10654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank * Unless required by applicable law or agreed to in writing, software
11654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank * distributed under the License is distributed on an "AS IS" BASIS,
12654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank * See the License for the specific language governing permissions and
14654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank * limitations under the License.
15654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank */
16654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank
1731d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blankpackage com.android.emailcommon.utility;
18654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank
194cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onukiimport com.android.email.provider.EmailProvider;
204cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onukiimport com.android.email.provider.ProviderTestUtils;
21f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blankimport com.android.emailcommon.provider.Account;
22a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent;
23a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Attachment;
24a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.Message;
25a7bc0319a75184ad706bb35c049af107ac3688e6Marc Blankimport com.android.emailcommon.provider.EmailContent.MessageColumns;
2653ea83ebf91f820692e8fa8e781f5cc982dd94dbBen Komaloimport com.android.emailcommon.provider.Mailbox;
27654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank
28654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blankimport android.content.Context;
297093746dd5017b1dacb726eb7b083922de15612eMakoto Onukiimport android.net.Uri;
30654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blankimport android.test.ProviderTestCase2;
31654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blankimport android.test.suitebuilder.annotation.MediumTest;
32654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank
334dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blankimport java.io.File;
344dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blankimport java.io.FileWriter;
354dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blankimport java.io.IOException;
364dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank
37654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank/**
38654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank * This is a series of medium tests for the Utility class.  These tests must be locally
39654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank * complete - no server(s) required.
40654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank *
41654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank * You can run this entire test case with:
420ff0e155c51250bedc35b5b585003c8cb87f2244Marc Blank *   runtest -c com.android.emailcommon.utility.UtilityMediumTests email
43654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank */
44654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank@MediumTest
45654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blankpublic class UtilityMediumTests extends ProviderTestCase2<EmailProvider> {
46654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank
47654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank    EmailProvider mProvider;
48654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank    Context mMockContext;
49654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank
50654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank    public UtilityMediumTests() {
5131d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank        super(EmailProvider.class, EmailContent.AUTHORITY);
52654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank    }
53654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank
54654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank    @Override
55654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank    public void setUp() throws Exception {
56654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        super.setUp();
57654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        mMockContext = getMockContext();
58654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank    }
59654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank
60654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank    public void testFindExistingAccount() {
61654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        // Create two accounts
62654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        Account account1 = ProviderTestUtils.setupAccount("account1", false, mMockContext);
63654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        account1.mHostAuthRecv = ProviderTestUtils.setupHostAuth("ha1", -1, false, mMockContext);
64654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        account1.mHostAuthSend = ProviderTestUtils.setupHostAuth("ha1", -1, false, mMockContext);
65654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        account1.save(mMockContext);
66654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        Account account2 = ProviderTestUtils.setupAccount("account2", false, mMockContext);
67654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        account2.mHostAuthRecv = ProviderTestUtils.setupHostAuth("ha2", -1, false, mMockContext);
68654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        account2.mHostAuthSend = ProviderTestUtils.setupHostAuth("ha2", -1, false, mMockContext);
69654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        account2.save(mMockContext);
70654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        // Make sure we can find them
71654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        Account acct = Utility.findExistingAccount(mMockContext, -1, "address-ha1", "login-ha1");
72654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        assertNotNull(acct);
73654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        assertEquals("account1", acct.mDisplayName);
74654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        acct = Utility.findExistingAccount(mMockContext, -1, "address-ha2", "login-ha2");
75654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        assertNotNull(acct);
76654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        assertEquals("account2", acct.mDisplayName);
77654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        // We shouldn't find account
78654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        acct = Utility.findExistingAccount(mMockContext, -1, "address-ha3", "login-ha3");
79654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        assertNull(acct);
80654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        // Try to find account1, excluding account1
81654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        acct = Utility.findExistingAccount(mMockContext, account1.mId, "address-ha1", "login-ha1");
82654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank        assertNull(acct);
830ff0e155c51250bedc35b5b585003c8cb87f2244Marc Blank
840ff0e155c51250bedc35b5b585003c8cb87f2244Marc Blank        // Make sure we properly handle an underscore in the login name
850ff0e155c51250bedc35b5b585003c8cb87f2244Marc Blank        Account account3 = ProviderTestUtils.setupAccount("account3", false, mMockContext);
860ff0e155c51250bedc35b5b585003c8cb87f2244Marc Blank        account3.mHostAuthRecv = ProviderTestUtils.setupHostAuth("foo_ba", -1, false, mMockContext);
870ff0e155c51250bedc35b5b585003c8cb87f2244Marc Blank        account3.mHostAuthSend = ProviderTestUtils.setupHostAuth("foo_ba", -1, false, mMockContext);
880ff0e155c51250bedc35b5b585003c8cb87f2244Marc Blank        account3.save(mMockContext);
890ff0e155c51250bedc35b5b585003c8cb87f2244Marc Blank        acct = Utility.findExistingAccount(mMockContext, -1, "address-foo_ba", "login-foo.ba");
900ff0e155c51250bedc35b5b585003c8cb87f2244Marc Blank        assertNull(acct);
910ff0e155c51250bedc35b5b585003c8cb87f2244Marc Blank        acct = Utility.findExistingAccount(mMockContext, -1, "address-foo_ba", "login-foo_ba");
920ff0e155c51250bedc35b5b585003c8cb87f2244Marc Blank        assertNotNull(acct);
93654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank    }
944dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank
954dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank    public void testAttachmentExists() throws IOException {
964dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        Account account = ProviderTestUtils.setupAccount("account", true, mMockContext);
974dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        // We return false with null attachment
984dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        assertFalse(Utility.attachmentExists(mMockContext, null));
994dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank
1004dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        Mailbox mailbox =
1014dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank            ProviderTestUtils.setupMailbox("mailbox", account.mId, true, mMockContext);
1024dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        Message message = ProviderTestUtils.setupMessage("foo", account.mId, mailbox.mId, false,
1034dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank                true, mMockContext);
1044dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        Attachment attachment = ProviderTestUtils.setupAttachment(message.mId, "filename.ext",
1054dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank                69105, true, mMockContext);
1064dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        attachment.mContentBytes = null;
1074dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        // With no contentUri, we should return false
1084dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        assertFalse(Utility.attachmentExists(mMockContext, attachment));
1094dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank
1104dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        attachment.mContentBytes = new byte[0];
1114dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        // With contentBytes set, we should return true
1124dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        assertTrue(Utility.attachmentExists(mMockContext, attachment));
1134dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank
1144dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        attachment.mContentBytes = null;
1154dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        // Generate a file name in our data directory, and use that for contentUri
1164dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        File file = mMockContext.getFileStreamPath("test.att");
1174dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        // Delete the file if it already exists
1184dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        if (file.exists()) {
1194dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank            assertTrue(file.delete());
1204dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        }
1214dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        // Should return false, because the file doesn't exist
1224dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        assertFalse(Utility.attachmentExists(mMockContext, attachment));
1234dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank
1244dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        assertTrue(file.createNewFile());
1254dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        // Put something in the file
1264dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        FileWriter writer = new FileWriter(file);
1274dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        writer.write("Foo");
1284dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        writer.flush();
1294dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        writer.close();
1304dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        attachment.mContentUri = "file://" + file.getAbsolutePath();
1314dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        // Now, this should return true
1324dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank        assertTrue(Utility.attachmentExists(mMockContext, attachment));
1334dcb1c5fdaacc40309b77af2a32532bc60218523Marc Blank    }
1344cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki
1357093746dd5017b1dacb726eb7b083922de15612eMakoto Onuki    public void testBuildLimitOneUri() {
1367093746dd5017b1dacb726eb7b083922de15612eMakoto Onuki        // EmailProvider supports "?limit="
137bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        assertEquals(Uri.parse("content://com.android.email.provider?limit=1"),
138bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                Utility.buildLimitOneUri(Uri.parse("content://com.android.email.provider")));
1397093746dd5017b1dacb726eb7b083922de15612eMakoto Onuki
1407093746dd5017b1dacb726eb7b083922de15612eMakoto Onuki        // Others don't -- so don't add it.
141bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        assertEquals(Uri.parse("content://com.android.email.attachmentprovider"),
142bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                Utility.buildLimitOneUri(Uri.parse("content://com.android.email.attachmentprovider"
1437093746dd5017b1dacb726eb7b083922de15612eMakoto Onuki                        )));
1447093746dd5017b1dacb726eb7b083922de15612eMakoto Onuki        assertEquals(Uri.parse("content://gmail-ls/android@gmail.com"),
1457093746dd5017b1dacb726eb7b083922de15612eMakoto Onuki                Utility.buildLimitOneUri(Uri.parse("content://gmail-ls/android@gmail.com"
1467093746dd5017b1dacb726eb7b083922de15612eMakoto Onuki                        )));
1477093746dd5017b1dacb726eb7b083922de15612eMakoto Onuki    }
1487093746dd5017b1dacb726eb7b083922de15612eMakoto Onuki
1494cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki    public void testGetFirstRowLong() {
1504cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        Account account1 = ProviderTestUtils.setupAccount("1", true, mMockContext);
1514cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        Account account2 = ProviderTestUtils.setupAccount("X1", true, mMockContext);
1524cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        Account account3 = ProviderTestUtils.setupAccount("X2", true, mMockContext);
1534cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki
1544cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        // case 1. Account found
1554cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        assertEquals((Long) account2.mId, Utility.getFirstRowLong(
1564cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                mMockContext, Account.CONTENT_URI, EmailContent.ID_PROJECTION,
1574cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                Account.DISPLAY_NAME + " like :1", new String[] {"X%"},
1584cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                Account.DISPLAY_NAME,
1594cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                EmailContent.ID_PROJECTION_COLUMN));
1604cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        // different sort order
1614cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        assertEquals((Long) account3.mId, Utility.getFirstRowLong(
1624cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                mMockContext, Account.CONTENT_URI, EmailContent.ID_PROJECTION,
1634cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                Account.DISPLAY_NAME + " like :1", new String[] {"X%"},
1644cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                Account.DISPLAY_NAME + " desc",
1654cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                EmailContent.ID_PROJECTION_COLUMN));
1664cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki
1674cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        // case 2. no row found
1684cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        assertEquals(null, Utility.getFirstRowLong(
1694cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                mMockContext, Account.CONTENT_URI, EmailContent.ID_PROJECTION,
1704cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                Account.DISPLAY_NAME + " like :1", new String[] {"NO SUCH ACCOUNT"},
1714cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                null,
1724cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                EmailContent.ID_PROJECTION_COLUMN));
1734cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki
1744cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        // case 3. no row found with default value
1754cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        assertEquals((Long) (-1L), Utility.getFirstRowLong(
1764cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                mMockContext, Account.CONTENT_URI, EmailContent.ID_PROJECTION,
1774cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                Account.DISPLAY_NAME + " like :1", new String[] {"NO SUCH ACCOUNT"},
1784cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                null,
1794cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                EmailContent.ID_PROJECTION_COLUMN, -1L));
1804cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki    }
1814cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki
1824cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki    public void testGetFirstRowInt() {
1834cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        Account account1 = ProviderTestUtils.setupAccount("1", true, mMockContext);
1844cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        Account account2 = ProviderTestUtils.setupAccount("X1", true, mMockContext);
1854cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        Account account3 = ProviderTestUtils.setupAccount("X2", true, mMockContext);
1864cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki
1874cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        // case 1. Account found
1884cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        assertEquals((Integer)(int) account2.mId, Utility.getFirstRowInt(
1894cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                mMockContext, Account.CONTENT_URI, EmailContent.ID_PROJECTION,
1904cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                Account.DISPLAY_NAME + " like :1", new String[] {"X%"},
1914cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                Account.DISPLAY_NAME,
1924cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                EmailContent.ID_PROJECTION_COLUMN));
1934cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        // different sort order
1944cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        assertEquals((Integer)(int) account3.mId, Utility.getFirstRowInt(
1954cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                mMockContext, Account.CONTENT_URI, EmailContent.ID_PROJECTION,
1964cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                Account.DISPLAY_NAME + " like :1", new String[] {"X%"},
1974cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                Account.DISPLAY_NAME + " desc",
1984cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                EmailContent.ID_PROJECTION_COLUMN));
1994cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki
2004cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        // case 2. no row found
2014cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        assertEquals(null, Utility.getFirstRowInt(
2024cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                mMockContext, Account.CONTENT_URI, EmailContent.ID_PROJECTION,
2034cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                Account.DISPLAY_NAME + " like :1", new String[] {"NO SUCH ACCOUNT"},
2044cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                null,
2054cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                EmailContent.ID_PROJECTION_COLUMN));
2064cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki
2074cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        // case 3. no row found with default value
2084cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki        assertEquals((Integer) (-1), Utility.getFirstRowInt(
2094cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                mMockContext, Account.CONTENT_URI, EmailContent.ID_PROJECTION,
2104cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                Account.DISPLAY_NAME + " like :1", new String[] {"NO SUCH ACCOUNT"},
2114cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                null,
2124cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki                EmailContent.ID_PROJECTION_COLUMN, -1));
2134cdae2b1b86f44e1abd240b8e14e722555ff9491Makoto Onuki    }
2147183724276e0d829fd01a5bc1f2f6d0f6b6a8818Makoto Onuki
215ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki    public void testGetFirstRowString() {
216ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        final String[] DISPLAY_NAME_PROJECTION = new String[] {Account.DISPLAY_NAME};
217ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki
218ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        Account account1 = ProviderTestUtils.setupAccount("1", true, mMockContext);
219ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        Account account2 = ProviderTestUtils.setupAccount("X1", true, mMockContext);
220ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        Account account3 = ProviderTestUtils.setupAccount("X2", true, mMockContext);
221ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki
222ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        // case 1. Account found
223ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        assertEquals(account2.mDisplayName, Utility.getFirstRowString(
224ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki                mMockContext, Account.CONTENT_URI, DISPLAY_NAME_PROJECTION,
225ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki                Account.DISPLAY_NAME + " like :1", new String[] {"X%"},
226ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki                Account.DISPLAY_NAME, 0));
227ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki
228ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        // different sort order
229ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        assertEquals(account3.mDisplayName, Utility.getFirstRowString(
230ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki                mMockContext, Account.CONTENT_URI, DISPLAY_NAME_PROJECTION,
231ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki                Account.DISPLAY_NAME + " like :1", new String[] {"X%"},
232ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki                Account.DISPLAY_NAME + " desc", 0));
233ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki
234ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        // case 2. no row found
235ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        assertEquals(null, Utility.getFirstRowString(
236ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki                mMockContext, Account.CONTENT_URI, DISPLAY_NAME_PROJECTION,
237ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki                Account.DISPLAY_NAME + " like :1", new String[] {"NO SUCH ACCOUNT"},
238ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki                null, 0));
239ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki
240ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        // case 3. no row found with default value
241ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki        assertEquals("-", Utility.getFirstRowString(
242ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki                mMockContext, Account.CONTENT_URI, DISPLAY_NAME_PROJECTION,
243ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki                Account.DISPLAY_NAME + " like :1", new String[] {"NO SUCH ACCOUNT"},
244ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki                null, 0, "-"));
245ee7205d100eff01a75c292b80f41cd24a2b19b84Makoto Onuki    }
246654cc1f68f81e1f64a8f6242961d0ba507912371Marc Blank}
247