• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 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.emailcommon.utility;
18 
19 import com.android.email.DBTestHelper;
20 import com.android.email.R;
21 import com.android.email.TestUtils;
22 import com.android.email.provider.ProviderTestUtils;
23 import com.android.emailcommon.provider.Account;
24 import com.android.emailcommon.provider.EmailContent.Attachment;
25 import com.android.emailcommon.provider.EmailContent.MailboxColumns;
26 import com.android.emailcommon.provider.EmailContent.Message;
27 import com.android.emailcommon.provider.Mailbox;
28 import com.android.emailcommon.utility.Utility.NewFileCreator;
29 
30 import android.content.Context;
31 import android.database.Cursor;
32 import android.database.CursorWrapper;
33 import android.database.MatrixCursor;
34 import android.graphics.drawable.Drawable;
35 import android.net.Uri;
36 import android.os.Environment;
37 import android.test.AndroidTestCase;
38 import android.test.MoreAsserts;
39 import android.test.suitebuilder.annotation.SmallTest;
40 import android.text.SpannableStringBuilder;
41 import android.text.TextUtils;
42 import android.widget.TextView;
43 
44 import java.io.File;
45 import java.io.FileNotFoundException;
46 import java.io.FileOutputStream;
47 import java.io.IOException;
48 import java.io.OutputStream;
49 import java.util.ArrayList;
50 import java.util.Collection;
51 import java.util.HashSet;
52 import java.util.Set;
53 
54 /**
55  * This is a series of unit tests for the Utility class.  These tests must be locally
56  * complete - no server(s) required.
57  *
58  * You can run this entire test case with:
59  *   runtest -c com.android.email.UtilityUnitTests email
60  */
61 @SmallTest
62 public class UtilityUnitTests extends AndroidTestCase {
63 
b(int... array)64     private static byte[] b(int... array) {
65         return TestUtils.b(array);
66     }
67 
testToUtf8()68     public void testToUtf8() {
69         assertNull(Utility.toUtf8(null));
70         MoreAsserts.assertEquals(new byte[] {}, Utility.toUtf8(""));
71         MoreAsserts.assertEquals(b('a'), Utility.toUtf8("a"));
72         MoreAsserts.assertEquals(b('A', 'B', 'C'), Utility.toUtf8("ABC"));
73         MoreAsserts.assertEquals(b(0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E),
74                 Utility.toUtf8("\u65E5\u672C\u8A9E"));
75     }
76 
testFromUtf8()77     public void testFromUtf8() {
78         assertNull(Utility.fromUtf8(null));
79         assertEquals("", Utility.fromUtf8(new byte[] {}));
80         assertEquals("a", Utility.fromUtf8(b('a')));
81         assertEquals("ABC", Utility.fromUtf8(b('A', 'B', 'C')));
82         assertEquals("\u65E5\u672C\u8A9E",
83                 Utility.fromUtf8(b(0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E)));
84     }
85 
testIsFirstUtf8Byte()86     public void testIsFirstUtf8Byte() {
87         // 1 byte in UTF-8.
88         checkIsFirstUtf8Byte("0"); // First 2 bits: 00
89         checkIsFirstUtf8Byte("A"); // First 2 bits: 01
90 
91         checkIsFirstUtf8Byte("\u00A2"); // 2 bytes in UTF-8.
92         checkIsFirstUtf8Byte("\u20AC"); // 3 bytes in UTF-8.
93         checkIsFirstUtf8Byte("\uD852\uDF62"); // 4 bytes in UTF-8.  (surrogate pair)
94     }
95 
checkIsFirstUtf8Byte(String aChar)96     private void checkIsFirstUtf8Byte(String aChar) {
97         byte[] bytes = Utility.toUtf8(aChar);
98         assertTrue("0", Utility.isFirstUtf8Byte(bytes[0]));
99         for (int i = 1; i < bytes.length; i++) {
100             assertFalse(Integer.toString(i), Utility.isFirstUtf8Byte(bytes[i]));
101         }
102     }
103 
testByteToHex()104     public void testByteToHex() {
105         for (int i = 0; i <= 0xFF; i++) {
106             String hex = Utility.byteToHex((byte) i);
107             assertEquals("val=" + i, 2, hex.length());
108             assertEquals("val=" + i, i, Integer.parseInt(hex, 16));
109         }
110     }
111 
testReplaceBareLfWithCrlf()112     public void testReplaceBareLfWithCrlf() {
113         assertEquals("", Utility.replaceBareLfWithCrlf(""));
114         assertEquals("", Utility.replaceBareLfWithCrlf("\r"));
115         assertEquals("\r\n", Utility.replaceBareLfWithCrlf("\r\n"));
116         assertEquals("\r\n", Utility.replaceBareLfWithCrlf("\n"));
117         assertEquals("\r\n\r\n\r\n", Utility.replaceBareLfWithCrlf("\n\n\n"));
118         assertEquals("A\r\nB\r\nC\r\nD", Utility.replaceBareLfWithCrlf("A\nB\r\nC\nD"));
119     }
120 
testGetSmallHash()121     public void testGetSmallHash() {
122         assertEquals("1438642069", Utility.getSmallHash(""));
123         assertEquals("1354919068", Utility.getSmallHash("abc"));
124     }
125 
testGetSmallSha1()126     public void testGetSmallSha1() {
127         byte[] sha1 = new byte[20];
128 
129         // White box test.  Not so great, but to make sure it may detect careless mistakes...
130         assertEquals(0, Utility.getSmallHashFromSha1(sha1));
131 
132         for (int i = 0; i < sha1.length; i++) {
133             sha1[i] = (byte) 0xFF;
134         }
135         assertEquals(Integer.MAX_VALUE, Utility.getSmallHashFromSha1(sha1));
136 
137         // Boundary check
138         for (int i = 0; i < 16; i++) {
139             sha1[19] = (byte) i;
140             Utility.getSmallHashFromSha1(sha1);
141         }
142     }
143 
testCleanUpMimeDate()144     public void testCleanUpMimeDate() {
145         assertNull(Utility.cleanUpMimeDate(null));
146         assertEquals("", Utility.cleanUpMimeDate(""));
147         assertEquals("abc", Utility.cleanUpMimeDate("abc"));
148         assertEquals("GMT", Utility.cleanUpMimeDate("GMT"));
149         assertEquals("0000", Utility.cleanUpMimeDate("0000"));
150         assertEquals("-0000", Utility.cleanUpMimeDate("-0000"));
151         assertEquals("+1234", Utility.cleanUpMimeDate("GMT+1234"));
152         assertEquals("-1234", Utility.cleanUpMimeDate("GMT-1234"));
153         assertEquals("gmt-1234", Utility.cleanUpMimeDate("gmt-1234"));
154         assertEquals("GMT-123", Utility.cleanUpMimeDate("GMT-123"));
155 
156         assertEquals("Thu, 10 Dec 09 15:08:08 -0700",
157                 Utility.cleanUpMimeDate("Thu, 10 Dec 09 15:08:08 GMT-0700"));
158         assertEquals("Thu, 10 Dec 09 15:08:08 -0700",
159                 Utility.cleanUpMimeDate("Thu, 10 Dec 09 15:08:08 -0700"));
160     }
161 
162     private static class MyNewFileCreator implements NewFileCreator {
163         private final HashSet<String> mExistingFileNames;
164 
MyNewFileCreator(String... fileNames)165         public MyNewFileCreator(String... fileNames) {
166             mExistingFileNames = new HashSet<String>();
167             for (String f : fileNames) {
168                 mExistingFileNames.add(f);
169             }
170         }
171 
createNewFile(File f)172         @Override public boolean createNewFile(File f) {
173             return !mExistingFileNames.contains(f.getAbsolutePath());
174         }
175     }
176 
testCreateUniqueFile()177     public void testCreateUniqueFile() throws Exception {
178         final MyNewFileCreator noFiles = new MyNewFileCreator();
179 
180         // Case 1: Files don't exist.
181         checkCreateUniqueFile("/a", noFiles, "/", "a");
182         checkCreateUniqueFile("/a.txt", noFiles, "/", "a.txt");
183 
184         checkCreateUniqueFile("/a/b/a", noFiles, "/a/b", "a");
185         checkCreateUniqueFile("/a/b/a.txt", noFiles, "/a/b", "a.txt");
186 
187         // Case 2: Files exist already.
188         final MyNewFileCreator files = new MyNewFileCreator(
189                 "/a", "/a.txt", "/a/b/a", "/a/b/a.txt",
190                 "/a-2.txt",
191                 "/a/b/a-2", "/a/b/a-3",
192                 "/a/b/a-2.txt", "/a/b/a-3.txt", "/a/b/a-4.txt"
193                 );
194 
195         checkCreateUniqueFile("/a-2", files, "/", "a");
196         checkCreateUniqueFile("/a-3.txt", files, "/", "a.txt");
197 
198         checkCreateUniqueFile("/a/b/a-4", files, "/a/b", "a");
199         checkCreateUniqueFile("/a/b/a-5.txt", files, "/a/b", "a.txt");
200     }
201 
checkCreateUniqueFile(String expectedFileName, NewFileCreator nfc, String dir, String fileName)202     private void checkCreateUniqueFile(String expectedFileName, NewFileCreator nfc,
203             String dir, String fileName) throws Exception {
204         assertEquals(expectedFileName,
205                 Utility.createUniqueFileInternal(nfc, new File(dir), fileName).toString());
206     }
207 
208     /**
209      * Test that we have the necessary permissions to write to external storage.
210      */
testExternalStoragePermissions()211     public void testExternalStoragePermissions() throws FileNotFoundException, IOException {
212         File file = null;
213         try {
214             // If there's no storage available, this test is moot
215             if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
216                 return;
217             }
218             file = Utility.createUniqueFile(Environment.getExternalStorageDirectory(),
219                     "write-test");
220             OutputStream out = new FileOutputStream(file);
221             out.write(1);
222             out.close();
223         } finally {
224             try {
225                 if (file != null) {
226                     if (file.exists()) {
227                         file.delete();
228                     }
229                 }
230             } catch (Exception e) {
231                 // ignore cleanup error - it still throws the original
232             }
233         }
234     }
235 
testIsPortFieldValid()236     public void testIsPortFieldValid() {
237         TextView view = new TextView(getContext());
238         // null, empty, negative, and non integer strings aren't valid
239         view.setText(null);
240         assertFalse(Utility.isPortFieldValid(view));
241         view.setText("");
242         assertFalse(Utility.isPortFieldValid(view));
243         view.setText("-1");
244         assertFalse(Utility.isPortFieldValid(view));
245         view.setText("1403.75");
246         assertFalse(Utility.isPortFieldValid(view));
247         view.setText("0");
248         assertFalse(Utility.isPortFieldValid(view));
249         view.setText("65536");
250         assertFalse(Utility.isPortFieldValid(view));
251         view.setText("i'm not valid");
252         assertFalse(Utility.isPortFieldValid(view));
253         // These next values are valid
254         view.setText("1");
255         assertTrue(Utility.isPortFieldValid(view));
256         view.setText("65535");
257         assertTrue(Utility.isPortFieldValid(view));
258     }
259 
testToPrimitiveLongArray()260     public void testToPrimitiveLongArray() {
261         assertEquals(0, Utility.toPrimitiveLongArray(createLongCollection()).length);
262 
263         final long[] one = Utility.toPrimitiveLongArray(createLongCollection(1));
264         assertEquals(1, one.length);
265         assertEquals(1, one[0]);
266 
267         final long[] two = Utility.toPrimitiveLongArray(createLongCollection(3, 4));
268         assertEquals(2, two.length);
269         assertEquals(3, two[0]);
270         assertEquals(4, two[1]);
271     }
272 
testToLongSet()273     public void testToLongSet() {
274         assertEquals(0, Utility.toLongSet(new long[] {}).size());
275 
276         final Set<Long> one = Utility.toLongSet(new long[] {1});
277         assertEquals(1, one.size());
278         assertTrue(one.contains(1L));
279 
280         final Set<Long> two = Utility.toLongSet(new long[] {1, 2});
281         assertEquals(2, two.size());
282         assertTrue(two.contains(1L));
283         assertTrue(two.contains(2L));
284     }
285 
testGetContentFileName()286     public void testGetContentFileName() throws Exception {
287         Context providerContext = DBTestHelper.ProviderContextSetupHelper.getProviderContext(
288                 mContext);
289 
290         final long ACCOUNT_ID = 1;
291         final long MESSAGE_ID = 10;
292 
293         Account account = ProviderTestUtils.setupAccount("account", true, providerContext);
294         Mailbox mailbox = ProviderTestUtils.setupMailbox("box", account.mId, true, providerContext);
295 
296         // Set up an attachment.
297         Attachment att = ProviderTestUtils.setupAttachment(mailbox.mId, "name", 123, true,
298                 providerContext);
299         long attachmentId = att.mId;
300         Uri uri = AttachmentUtilities.getAttachmentUri(account.mId, attachmentId);
301 
302         // Case 1: exists in the provider.
303         assertEquals("name", Utility.getContentFileName(providerContext, uri));
304 
305         // Case 2: doesn't exist in the provider
306         Uri notExistUri = AttachmentUtilities.getAttachmentUri(account.mId, 123456789);
307         String lastPathSegment = notExistUri.getLastPathSegment();
308         assertEquals(lastPathSegment, Utility.getContentFileName(providerContext, notExistUri));
309     }
310 
getLastUpdateKey(Context mockContext, long mailboxId)311     private long getLastUpdateKey(Context mockContext, long mailboxId) {
312         return Utility.getFirstRowLong(mockContext, Mailbox.CONTENT_URI,
313                 new String[] { MailboxColumns.LAST_SEEN_MESSAGE_KEY }, MailboxColumns.ID + "=?",
314                 new String[] { Long.toString(mailboxId) }, null, 0, -1L);
315     }
316 
testUpdateLastSeenMessageKey()317     public void testUpdateLastSeenMessageKey() throws Exception {
318         Context mockContext = DBTestHelper.ProviderContextSetupHelper.getProviderContext(mContext);
319 
320         // Setup account & message stuff
321         Account account1 = ProviderTestUtils.setupAccount("account1", true, mockContext);
322         Account account2 = ProviderTestUtils.setupAccount("account2", true, mockContext);
323         Account account3 = ProviderTestUtils.setupAccount("account3", true, mockContext);
324         Account account4 = ProviderTestUtils.setupAccount("account4", true, mockContext);
325         Mailbox mailbox1_1 = ProviderTestUtils.setupMailbox("mbox1_1", account1.mId, true,
326                 mockContext, Mailbox.TYPE_INBOX);
327         Mailbox mailbox1_2 = ProviderTestUtils.setupMailbox("mbox1_2", account1.mId, true,
328                 mockContext, Mailbox.TYPE_MAIL);
329         Mailbox mailbox1_3 = ProviderTestUtils.setupMailbox("mbox1_3", account1.mId, true,
330                 mockContext, Mailbox.TYPE_DRAFTS);
331         Mailbox mailbox1_4 = ProviderTestUtils.setupMailbox("mbox1_4", account1.mId, true,
332                 mockContext, Mailbox.TYPE_OUTBOX);
333         Mailbox mailbox1_5 = ProviderTestUtils.setupMailbox("mbox1_5", account1.mId, true,
334                 mockContext, Mailbox.TYPE_TRASH);
335         Mailbox mailbox2_1 = ProviderTestUtils.setupMailbox("mbox2_1", account2.mId, true,
336                 mockContext, Mailbox.TYPE_MAIL);
337         Mailbox mailbox3_1 = ProviderTestUtils.setupMailbox("mbox3_1", account3.mId, true,
338                 mockContext, Mailbox.TYPE_MAIL);
339         Mailbox mailbox3_2 = ProviderTestUtils.setupMailbox("mbox3_2", account3.mId, true,
340                 mockContext, Mailbox.TYPE_INBOX);
341         Mailbox mailbox4_1 = ProviderTestUtils.setupMailbox("mbox4_1", account4.mId, true,
342                 mockContext, Mailbox.TYPE_INBOX);
343         Message message1_1_1 = ProviderTestUtils.setupMessage("message_1_1_1", account1.mId,
344                 mailbox1_1.mId, false, true, mockContext);
345         Message message1_1_2 = ProviderTestUtils.setupMessage("message_1_1_2", account1.mId,
346                 mailbox1_1.mId, false, true, mockContext);
347         Message message1_1_3 = ProviderTestUtils.setupMessage("message_1_1_3", account1.mId,
348                 mailbox1_1.mId, false, true, mockContext);
349         Message message1_2_1 = ProviderTestUtils.setupMessage("message_1_2_1", account1.mId,
350                 mailbox1_2.mId, false, true, mockContext);
351         Message message1_3_1 = ProviderTestUtils.setupMessage("message_1_3_1", account1.mId,
352                 mailbox1_3.mId, false, true, mockContext);
353         Message message1_4_1 = ProviderTestUtils.setupMessage("message_1_4_1", account1.mId,
354                 mailbox1_4.mId, false, true, mockContext);
355         Message message1_5_1 = ProviderTestUtils.setupMessage("message_1_5_1", account1.mId,
356                 mailbox1_5.mId, false, true, mockContext);
357         Message message2_1_1 = ProviderTestUtils.setupMessage("message_2_1_1", account2.mId,
358                 mailbox2_1.mId, false, true, mockContext);
359         Message message2_1_2 = ProviderTestUtils.setupMessage("message_2_1_2", account2.mId,
360                 mailbox2_1.mId, false, true, mockContext);
361         Message message3_1_1 = ProviderTestUtils.setupMessage("message_3_1_1", account3.mId,
362                 mailbox3_1.mId, false, true, mockContext);
363         Message message4_1_1 = ProviderTestUtils.setupMessage("message_4_1_1", account4.mId,
364                 mailbox4_1.mId, false, true, mockContext);
365         Message message4_1_2 = ProviderTestUtils.setupMessage("message_4_1_2", account4.mId,
366                 mailbox4_1.mId, false, true, mockContext);
367         Message message4_1_3 = ProviderTestUtils.setupMessage("message_4_1_3", account4.mId,
368                 mailbox4_1.mId, false, true, mockContext);
369         Message message4_1_4 = ProviderTestUtils.setupMessage("message_4_1_4", account4.mId,
370                 mailbox4_1.mId, false, true, mockContext);
371 
372         // Verify the default case
373         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_1.mId));
374         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_2.mId));
375         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_3.mId));
376         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_4.mId));
377         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_5.mId));
378         assertEquals(0L, getLastUpdateKey(mockContext, mailbox2_1.mId));
379         assertEquals(0L, getLastUpdateKey(mockContext, mailbox3_1.mId));
380         assertEquals(0L, getLastUpdateKey(mockContext, mailbox3_2.mId));
381         assertEquals(0L, getLastUpdateKey(mockContext, mailbox4_1.mId));
382 
383         // Test account; only INBOX is modified
384         Utility.updateLastSeenMessageKey(mockContext, account1.mId).get();
385         assertEquals(message1_1_3.mId, getLastUpdateKey(mockContext, mailbox1_1.mId));
386         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_2.mId));
387         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_3.mId));
388         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_4.mId));
389         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_5.mId));
390         assertEquals(0L, getLastUpdateKey(mockContext, mailbox2_1.mId));
391         assertEquals(0L, getLastUpdateKey(mockContext, mailbox3_1.mId));
392         assertEquals(0L, getLastUpdateKey(mockContext, mailbox3_2.mId));
393         assertEquals(0L, getLastUpdateKey(mockContext, mailbox4_1.mId));
394 
395         // Missing INBOX
396         Utility.updateLastSeenMessageKey(mockContext, account2.mId).get();
397         assertEquals(message1_1_3.mId, getLastUpdateKey(mockContext, mailbox1_1.mId));
398         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_2.mId));
399         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_3.mId));
400         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_4.mId));
401         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_5.mId));
402         assertEquals(0L, getLastUpdateKey(mockContext, mailbox2_1.mId));
403         assertEquals(0L, getLastUpdateKey(mockContext, mailbox3_1.mId));
404         assertEquals(0L, getLastUpdateKey(mockContext, mailbox3_2.mId));
405         assertEquals(0L, getLastUpdateKey(mockContext, mailbox4_1.mId));
406 
407         // No messages in mailbox
408         Utility.updateLastSeenMessageKey(mockContext, account3.mId).get();
409         assertEquals(message1_1_3.mId, getLastUpdateKey(mockContext, mailbox1_1.mId));
410         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_2.mId));
411         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_3.mId));
412         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_4.mId));
413         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_5.mId));
414         assertEquals(0L, getLastUpdateKey(mockContext, mailbox2_1.mId));
415         assertEquals(0L, getLastUpdateKey(mockContext, mailbox3_1.mId));
416         assertEquals(0L, getLastUpdateKey(mockContext, mailbox3_2.mId));
417         assertEquals(0L, getLastUpdateKey(mockContext, mailbox4_1.mId));
418 
419         // Test combined accounts
420         Utility.updateLastSeenMessageKey(mockContext, 0x1000000000000000L).get();
421         assertEquals(message1_1_3.mId, getLastUpdateKey(mockContext, mailbox1_1.mId));
422         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_2.mId));
423         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_3.mId));
424         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_4.mId));
425         assertEquals(0L, getLastUpdateKey(mockContext, mailbox1_5.mId));
426         assertEquals(0L, getLastUpdateKey(mockContext, mailbox2_1.mId));
427         assertEquals(0L, getLastUpdateKey(mockContext, mailbox3_1.mId));
428         assertEquals(0L, getLastUpdateKey(mockContext, mailbox3_2.mId));
429         assertEquals(message4_1_4.mId, getLastUpdateKey(mockContext, mailbox4_1.mId));
430     }
431 
432     // used by testToPrimitiveLongArray
createLongCollection(long... values)433     private static Collection<Long> createLongCollection(long... values) {
434         ArrayList<Long> ret = new ArrayList<Long>();
435         for (long value : values) {
436             ret.add(value);
437         }
438         return ret;
439     }
440 
testDumpCursor()441     public void testDumpCursor() {
442         // Just make sure the method won't crash and returns non-empty string.
443         final Cursor c1 = new MatrixCursor(new String[] {"col"});
444         final Cursor c2 = new CursorWrapper(c1);
445 
446         // Note it's a subclass of CursorWrapper.
447         final Cursor c3 = new CursorWrapper(c2) {
448         };
449 
450         assertFalse(TextUtils.isEmpty(Utility.dumpCursor(c1)));
451         assertFalse(TextUtils.isEmpty(Utility.dumpCursor(c2)));
452         assertFalse(TextUtils.isEmpty(Utility.dumpCursor(c3)));
453         assertFalse(TextUtils.isEmpty(Utility.dumpCursor(null)));
454 
455         // Test again with closed cursor.
456         c1.close();
457         assertFalse(TextUtils.isEmpty(Utility.dumpCursor(c1)));
458         assertFalse(TextUtils.isEmpty(Utility.dumpCursor(c2)));
459         assertFalse(TextUtils.isEmpty(Utility.dumpCursor(c3)));
460         assertFalse(TextUtils.isEmpty(Utility.dumpCursor(null)));
461     }
462 
testCloseTraceCursorWrapper()463     public void testCloseTraceCursorWrapper() {
464         final Cursor org = new MatrixCursor(new String[] {"col"});
465         final Utility.CloseTraceCursorWrapper c =
466                 Utility.CloseTraceCursorWrapper.alwaysCreateForTest(org);
467 
468         // Not closed -- no stack trace
469         assertNull(Utility.CloseTraceCursorWrapper.getTraceIfAvailable(c));
470         Utility.CloseTraceCursorWrapper.log(c); // shouldn't crash
471 
472         // Close, now stack trace should be available
473         c.close();
474         assertNotNull(Utility.CloseTraceCursorWrapper.getTraceIfAvailable(c));
475         Utility.CloseTraceCursorWrapper.log(c);
476 
477         // shouldn't crash
478         Utility.CloseTraceCursorWrapper.log(null);
479     }
480 
testAppendBold()481     public void testAppendBold() {
482         SpannableStringBuilder ssb = new SpannableStringBuilder();
483         ssb.append("no");
484 
485         assertEquals(ssb, Utility.appendBold(ssb, "BO"));
486 
487         assertEquals("noBO", ssb.toString());
488         // TODO check style -- but how?
489     }
490 
testAreStringsEqual()491     public void testAreStringsEqual() {
492         String s1;
493         String s2;
494 
495         s1 = new String("Foo");
496         s2 = s1;
497         assertTrue(Utility.areStringsEqual(s1, s2));
498 
499         s2 = new String("Foo");
500         assertTrue(Utility.areStringsEqual(s1, s2));
501 
502         s2 = "Bar";
503         assertFalse(Utility.areStringsEqual(s1, s2));
504 
505         s2 = null;
506         assertFalse(Utility.areStringsEqual(s1, s2));
507 
508         s1 = null;
509         s2 = "Bar";
510         assertFalse(Utility.areStringsEqual(s1, s2));
511 
512         s1 = null;
513         s2 = null;
514         assertTrue(Utility.areStringsEqual(s1, s2));
515     }
516 
testIsServerNameValid()517     public void testIsServerNameValid() {
518         assertTrue(Utility.isServerNameValid("a"));
519         assertTrue(Utility.isServerNameValid("gmail"));
520         assertTrue(Utility.isServerNameValid("gmail.com"));
521         assertTrue(Utility.isServerNameValid("gmail.com.x.y.z"));
522         assertTrue(Utility.isServerNameValid("  gmail.com.x.y.z  "));
523 
524         assertFalse(Utility.isServerNameValid(""));
525         assertFalse(Utility.isServerNameValid("$"));
526         assertFalse(Utility.isServerNameValid("  "));
527     }
528 
toColleciton(long... values)529     private static Collection<Long> toColleciton(long... values) {
530         ArrayList<Long> ret = new ArrayList<Long>();
531         for (long v : values) {
532             ret.add(v);
533         }
534         return ret;
535     }
536 
testBuildInSelection()537     public void testBuildInSelection() {
538         assertEquals("", Utility.buildInSelection("c", null));
539         assertEquals("", Utility.buildInSelection("c", toColleciton()));
540         assertEquals("c in (1)", Utility.buildInSelection("c", toColleciton(1)));
541         assertEquals("c in (1,2)", Utility.buildInSelection("c", toColleciton(1, 2)));
542         assertEquals("c in (1,2,-500)", Utility.buildInSelection("c", toColleciton(1, 2, -500)));
543     }
544 }
545