Home | History | Annotate | Download | only in email
      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.email;
     18 
     19 import com.android.email.provider.EmailContent.Mailbox;
     20 
     21 import android.content.Context;
     22 import android.graphics.drawable.Drawable;
     23 import android.telephony.TelephonyManager;
     24 import android.test.AndroidTestCase;
     25 import android.test.MoreAsserts;
     26 import android.test.suitebuilder.annotation.SmallTest;
     27 import android.util.Log;
     28 import android.widget.TextView;
     29 
     30 import java.util.HashSet;
     31 import java.util.Set;
     32 
     33 /**
     34  * This is a series of unit tests for the Utility class.  These tests must be locally
     35  * complete - no server(s) required.
     36  */
     37 @SmallTest
     38 public class UtilityUnitTests extends AndroidTestCase {
     39 
     40     /**
     41      * Tests of the IMAP quoting rules function.
     42      */
     43     public void testImapQuote() {
     44 
     45         // Simple strings should come through with simple quotes
     46         assertEquals("\"abcd\"", Utility.imapQuoted("abcd"));
     47 
     48         // Quoting internal double quotes with \
     49         assertEquals("\"ab\\\"cd\"", Utility.imapQuoted("ab\"cd"));
     50 
     51         // Quoting internal \ with \\
     52         assertEquals("\"ab\\\\cd\"", Utility.imapQuoted("ab\\cd"));
     53     }
     54 
     55     /**
     56      * Tests of the syncronization of array and types of the display folder names
     57      */
     58     public void testGetDisplayName() {
     59         Context context = getContext();
     60         String expect, name;
     61         expect = context.getString(R.string.mailbox_name_display_inbox);
     62         name = Utility.FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_INBOX);
     63         assertEquals(expect, name);
     64         expect = null;
     65         name = Utility.FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_MAIL);
     66         assertEquals(expect, name);
     67         expect = null;
     68         name = Utility.FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_PARENT);
     69         assertEquals(expect, name);
     70         expect = context.getString(R.string.mailbox_name_display_drafts);
     71         name = Utility.FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_DRAFTS);
     72         assertEquals(expect, name);
     73         expect = context.getString(R.string.mailbox_name_display_outbox);
     74         name = Utility.FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_OUTBOX);
     75         assertEquals(expect, name);
     76         expect = context.getString(R.string.mailbox_name_display_sent);
     77         name = Utility.FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_SENT);
     78         assertEquals(expect, name);
     79         expect = context.getString(R.string.mailbox_name_display_trash);
     80         name = Utility.FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_TRASH);
     81         assertEquals(expect, name);
     82         expect = context.getString(R.string.mailbox_name_display_junk);
     83         name = Utility.FolderProperties.getInstance(context).getDisplayName(Mailbox.TYPE_JUNK);
     84         assertEquals(expect, name);
     85         // Testing illegal index
     86         expect = null;
     87         name = Utility.FolderProperties.getInstance(context).getDisplayName(8);
     88         assertEquals(expect, name);
     89     }
     90 
     91     /**
     92      * Confirm that all of the special icons are available and unique
     93      */
     94     public void testSpecialIcons() {
     95         Utility.FolderProperties fp = Utility.FolderProperties.getInstance(mContext);
     96 
     97         // Make sure they're available
     98         Drawable inbox = fp.getIconIds(Mailbox.TYPE_INBOX);
     99         Drawable mail = fp.getIconIds(Mailbox.TYPE_MAIL);
    100         Drawable parent = fp.getIconIds(Mailbox.TYPE_PARENT);
    101         Drawable drafts = fp.getIconIds(Mailbox.TYPE_DRAFTS);
    102         Drawable outbox = fp.getIconIds(Mailbox.TYPE_OUTBOX);
    103         Drawable sent = fp.getIconIds(Mailbox.TYPE_SENT);
    104         Drawable trash = fp.getIconIds(Mailbox.TYPE_TRASH);
    105         Drawable junk = fp.getIconIds(Mailbox.TYPE_JUNK);
    106 
    107         // Make sure they're unique
    108         Set<Drawable> set = new HashSet<Drawable>();
    109         set.add(inbox);
    110         set.add(mail);
    111         set.add(parent);
    112         set.add(drafts);
    113         set.add(outbox);
    114         set.add(sent);
    115         set.add(trash);
    116         set.add(junk);
    117         assertEquals(8, set.size());
    118     }
    119 
    120     private static byte[] b(int... array) {
    121         return TestUtils.b(array);
    122     }
    123 
    124     public void testToUtf8() {
    125         assertNull(Utility.toUtf8(null));
    126         MoreAsserts.assertEquals(new byte[] {}, Utility.toUtf8(""));
    127         MoreAsserts.assertEquals(b('a'), Utility.toUtf8("a"));
    128         MoreAsserts.assertEquals(b('A', 'B', 'C'), Utility.toUtf8("ABC"));
    129         MoreAsserts.assertEquals(b(0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E),
    130                 Utility.toUtf8("\u65E5\u672C\u8A9E"));
    131     }
    132 
    133     public void testFromUtf8() {
    134         assertNull(Utility.fromUtf8(null));
    135         assertEquals("", Utility.fromUtf8(new byte[] {}));
    136         assertEquals("a", Utility.fromUtf8(b('a')));
    137         assertEquals("ABC", Utility.fromUtf8(b('A', 'B', 'C')));
    138         assertEquals("\u65E5\u672C\u8A9E",
    139                 Utility.fromUtf8(b(0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC, 0xE8, 0xAA, 0x9E)));
    140     }
    141 
    142     public void testIsFirstUtf8Byte() {
    143         // 1 byte in UTF-8.
    144         checkIsFirstUtf8Byte("0"); // First 2 bits: 00
    145         checkIsFirstUtf8Byte("A"); // First 2 bits: 01
    146 
    147         checkIsFirstUtf8Byte("\u00A2"); // 2 bytes in UTF-8.
    148         checkIsFirstUtf8Byte("\u20AC"); // 3 bytes in UTF-8.
    149         checkIsFirstUtf8Byte("\uD852\uDF62"); // 4 bytes in UTF-8.  (surrogate pair)
    150     }
    151 
    152     private void checkIsFirstUtf8Byte(String aChar) {
    153         byte[] bytes = Utility.toUtf8(aChar);
    154         assertTrue("0", Utility.isFirstUtf8Byte(bytes[0]));
    155         for (int i = 1; i < bytes.length; i++) {
    156             assertFalse(Integer.toString(i), Utility.isFirstUtf8Byte(bytes[i]));
    157         }
    158     }
    159 
    160     public void testByteToHex() {
    161         for (int i = 0; i <= 0xFF; i++) {
    162             String hex = Utility.byteToHex((byte) i);
    163             assertEquals("val=" + i, 2, hex.length());
    164             assertEquals("val=" + i, i, Integer.parseInt(hex, 16));
    165         }
    166     }
    167 
    168     public void testReplaceBareLfWithCrlf() {
    169         assertEquals("", Utility.replaceBareLfWithCrlf(""));
    170         assertEquals("", Utility.replaceBareLfWithCrlf("\r"));
    171         assertEquals("\r\n", Utility.replaceBareLfWithCrlf("\r\n"));
    172         assertEquals("\r\n", Utility.replaceBareLfWithCrlf("\n"));
    173         assertEquals("\r\n\r\n\r\n", Utility.replaceBareLfWithCrlf("\n\n\n"));
    174         assertEquals("A\r\nB\r\nC\r\nD", Utility.replaceBareLfWithCrlf("A\nB\r\nC\nD"));
    175     }
    176 
    177     public void testGetConsistentDeviceId() {
    178         TelephonyManager tm =
    179                 (TelephonyManager) getContext().getSystemService(Context.TELEPHONY_SERVICE);
    180         if (tm == null) {
    181             Log.w(Email.LOG_TAG, "TelephonyManager not supported.  Skipping.");
    182             return;
    183         }
    184         final String deviceId = Utility.getConsistentDeviceId(getContext());
    185         assertNotNull(deviceId);
    186 
    187         final String deviceId2 = Utility.getConsistentDeviceId(getContext());
    188         // Should be consistent.
    189         assertEquals(deviceId, deviceId2);
    190     }
    191 
    192     public void testGetSmallSha1() {
    193         byte[] sha1 = new byte[20];
    194 
    195         // White box test.  Not so great, but to make sure it may detect careless mistakes...
    196         assertEquals(0, Utility.getSmallHashFromSha1(sha1));
    197 
    198         for (int i = 0; i < sha1.length; i++) {
    199             sha1[i] = (byte) 0xFF;
    200         }
    201         assertEquals(Integer.MAX_VALUE, Utility.getSmallHashFromSha1(sha1));
    202 
    203         // Boundary check
    204         for (int i = 0; i < 16; i++) {
    205             sha1[19] = (byte) i;
    206             Utility.getSmallHashFromSha1(sha1);
    207         }
    208     }
    209 
    210     public void testCleanUpMimeDate() {
    211         assertNull(Utility.cleanUpMimeDate(null));
    212         assertEquals("", Utility.cleanUpMimeDate(""));
    213         assertEquals("abc", Utility.cleanUpMimeDate("abc"));
    214         assertEquals("GMT", Utility.cleanUpMimeDate("GMT"));
    215         assertEquals("0000", Utility.cleanUpMimeDate("0000"));
    216         assertEquals("-0000", Utility.cleanUpMimeDate("-0000"));
    217         assertEquals("+1234", Utility.cleanUpMimeDate("GMT+1234"));
    218         assertEquals("-1234", Utility.cleanUpMimeDate("GMT-1234"));
    219         assertEquals("gmt-1234", Utility.cleanUpMimeDate("gmt-1234"));
    220         assertEquals("GMT-123", Utility.cleanUpMimeDate("GMT-123"));
    221 
    222         assertEquals("Thu, 10 Dec 09 15:08:08 -0700",
    223                 Utility.cleanUpMimeDate("Thu, 10 Dec 09 15:08:08 GMT-0700"));
    224         assertEquals("Thu, 10 Dec 09 15:08:08 -0700",
    225                 Utility.cleanUpMimeDate("Thu, 10 Dec 09 15:08:08 -0700"));
    226     }
    227 
    228     public void testIsPortFieldValid() {
    229         TextView view = new TextView(getContext());
    230         // null, empty, negative, and non integer strings aren't valid
    231         view.setText(null);
    232         assertFalse(Utility.isPortFieldValid(view));
    233         view.setText("");
    234         assertFalse(Utility.isPortFieldValid(view));
    235         view.setText("-1");
    236         assertFalse(Utility.isPortFieldValid(view));
    237         view.setText("1403.75");
    238         assertFalse(Utility.isPortFieldValid(view));
    239         view.setText("0");
    240         assertFalse(Utility.isPortFieldValid(view));
    241         view.setText("65536");
    242         assertFalse(Utility.isPortFieldValid(view));
    243         view.setText("i'm not valid");
    244         assertFalse(Utility.isPortFieldValid(view));
    245         // These next values are valid
    246         view.setText("1");
    247         assertTrue(Utility.isPortFieldValid(view));
    248         view.setText("65535");
    249         assertTrue(Utility.isPortFieldValid(view));
    250     }
    251 }
    252