Home | History | Annotate | Download | only in browse
      1 /*******************************************************************************
      2  *      Copyright (C) 2012 Google Inc.
      3  *      Licensed to The Android Open Source Project.
      4  *
      5  *      Licensed under the Apache License, Version 2.0 (the "License");
      6  *      you may not use this file except in compliance with the License.
      7  *      You may obtain a copy of the License at
      8  *
      9  *           http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *      Unless required by applicable law or agreed to in writing, software
     12  *      distributed under the License is distributed on an "AS IS" BASIS,
     13  *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *      See the License for the specific language governing permissions and
     15  *      limitations under the License.
     16  *******************************************************************************/
     17 
     18 package com.android.mail.browse;
     19 
     20 import android.content.ContentProviderOperation;
     21 import android.content.ContentProviderResult;
     22 import android.content.ContentUris;
     23 import android.content.ContentValues;
     24 import android.content.Context;
     25 import android.content.OperationApplicationException;
     26 import android.database.Cursor;
     27 import android.net.Uri;
     28 import android.os.RemoteException;
     29 import android.test.ProviderTestCase2;
     30 import android.test.mock.MockContentResolver;
     31 import android.test.suitebuilder.annotation.SmallTest;
     32 
     33 import java.util.ArrayList;
     34 
     35 @SmallTest
     36 public class TestProviderTests extends ProviderTestCase2<TestProvider> {
     37     Context mMockContext;
     38     MockContentResolver mMockResolver;
     39 
     40     private static final String CANHAZ_AUTHORITY = "com.android.canhaz";
     41     private static final String PONY_TABLE = "pony";
     42     private static final String PONY_COLUMN_NAME = "name";
     43     private static final String PONY_COLUMN_TYPE = "type";
     44     private static final String PONY_COLUMN_LEGS= "legs";
     45     private static final String PONY_COLUMN_CAN_RIDE = "canRide";
     46     private static final String[] PONY_PROJECTION = {TestProvider.ID_COLUMN, PONY_COLUMN_NAME,
     47         PONY_COLUMN_TYPE, PONY_COLUMN_LEGS, PONY_COLUMN_CAN_RIDE};
     48     private static final int PONY_ID = 0;
     49     private static final int PONY_NAME = 1;
     50     private static final int PONY_TYPE = 2;
     51     private static final int PONY_LEGS = 3;
     52     private static final int PONY_CAN_RIDE = 4;
     53 
     54     public TestProviderTests() {
     55         super(TestProvider.class, TestProvider.AUTHORITY);
     56     }
     57 
     58     @Override
     59     public void setUp() throws Exception {
     60         super.setUp();
     61         mMockContext = getMockContext();
     62         mMockResolver = (MockContentResolver)mMockContext.getContentResolver();
     63         mMockResolver.addProvider(CANHAZ_AUTHORITY, new TestProvider(mMockContext));
     64     }
     65 
     66     @Override
     67     public void tearDown() throws Exception {
     68         super.tearDown();
     69     }
     70 
     71     private static ContentValues ponyValues(String name, String type, int legs, boolean canRide) {
     72         ContentValues cv = new ContentValues();
     73         cv.put(PONY_COLUMN_NAME, name);
     74         cv.put(PONY_COLUMN_TYPE, type);
     75         cv.put(PONY_COLUMN_LEGS, legs);
     76         cv.put(PONY_COLUMN_CAN_RIDE, canRide ? 1 : 0);
     77         return cv;
     78     }
     79 
     80     private ContentProviderResult[] setupPonies() throws RemoteException,
     81             OperationApplicationException {
     82         // The Uri is content://com.android.canhaz/pony
     83         Uri uri = new Uri.Builder().scheme("content").authority(CANHAZ_AUTHORITY)
     84             .path(PONY_TABLE).build();
     85         // Our array of CPO's to be used with applyBatch
     86         ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
     87 
     88         // Insert two ponies
     89         ContentValues pony1 = ponyValues("Flicka", "wayward", 4, true);
     90         ops.add(ContentProviderOperation.newInsert(uri).withValues(pony1).build());
     91         ContentValues pony2 = ponyValues("Elise", "dastardly", 3, false);
     92         ops.add(ContentProviderOperation.newInsert(uri).withValues(pony2).build());
     93         // Apply the batch with one insert operation
     94         return mMockResolver.applyBatch(TestProvider.AUTHORITY, ops);
     95     }
     96 
     97     private static Uri getPonyUri() {
     98         return new Uri.Builder().scheme("content").authority(CANHAZ_AUTHORITY)
     99             .path(PONY_TABLE).build();
    100     }
    101 
    102     public void testInsertQueryandDelete() throws RemoteException, OperationApplicationException {
    103         // The Uri is content://com.android.canhaz/pony
    104         ContentProviderResult[] results = setupPonies();
    105         Uri uri = getPonyUri();
    106 
    107         // Check the results
    108         assertNotNull(results);
    109         assertEquals(2, results.length);
    110         // Make sure that we've created matcher entries for pony and pony/#
    111         assertEquals(TestProvider.TABLE, TestProvider.sURIMatcher.match(TestProvider.uri(uri)));
    112         assertEquals(TestProvider.RECORD,
    113                 TestProvider.sURIMatcher.match(TestProvider.uri(results[0].uri)));
    114         Cursor c = mMockResolver.query(TestProvider.uri(uri), PONY_PROJECTION, null, null, null);
    115         assertNotNull(c);
    116         assertEquals(2, c.getCount());
    117         long eliseId = -1;
    118         long flickaId = -1;
    119         while (c.moveToNext()) {
    120             String name = c.getString(PONY_NAME);
    121             if ("Flicka".equals(name)) {
    122                 assertEquals("Flicka", c.getString(PONY_NAME));
    123                 assertEquals("wayward", c.getString(PONY_TYPE));
    124                 assertEquals(4, c.getInt(PONY_LEGS));
    125                 assertEquals(1, c.getInt(PONY_CAN_RIDE));
    126                 flickaId = c.getLong(PONY_ID);
    127             } else if ("Elise".equals(name)) {
    128                 assertEquals("dastardly", c.getString(PONY_TYPE));
    129                 assertEquals(3, c.getInt(PONY_LEGS));
    130                 assertEquals(0, c.getInt(PONY_CAN_RIDE));
    131                 eliseId = c.getLong(PONY_ID);
    132             } else {
    133                 fail("Wrong record: " + name);
    134             }
    135         }
    136 
    137         // eliseId and flickaId should have been set
    138         assertNotSame(-1, eliseId);
    139         assertNotSame(-1, flickaId);
    140         // Delete the elise record
    141         assertEquals(1, mMockResolver.delete(ContentUris.withAppendedId(TestProvider.uri(uri),
    142                 eliseId), null, null));
    143         c = mMockResolver.query(TestProvider.uri(uri), PONY_PROJECTION, null, null, null);
    144         assertNotNull(c);
    145         // There should be one left (Flicka)
    146         assertEquals(1, c.getCount());
    147         assertTrue(c.moveToNext());
    148         assertEquals("Flicka", c.getString(PONY_NAME));
    149     }
    150 
    151     public void testUpdate() throws RemoteException, OperationApplicationException {
    152         // The Uri is content://com.android.canhaz/pony
    153         Uri uri = getPonyUri();
    154         setupPonies();
    155         Cursor c = mMockResolver.query(TestProvider.uri(uri), PONY_PROJECTION, null, null, null);
    156         assertNotNull(c);
    157         assertEquals(2, c.getCount());
    158         // Give all the ponies 5 legs
    159         ContentValues cv = new ContentValues();
    160         cv.put(PONY_COLUMN_LEGS, 5);
    161         assertEquals(2, mMockResolver.update(TestProvider.uri(uri), cv, null, null));
    162         c = mMockResolver.query(TestProvider.uri(uri), PONY_PROJECTION, null, null, null);
    163         assertNotNull(c);
    164         // We should still have two records, and each should have 5 legs, but otherwise be the same
    165         assertEquals(2, c.getCount());
    166         long eliseId = -1;
    167         long flickaId = -1;
    168         while (c.moveToNext()) {
    169             String name = c.getString(PONY_NAME);
    170             if ("Flicka".equals(name)) {
    171                 assertEquals("Flicka", c.getString(PONY_NAME));
    172                 assertEquals("wayward", c.getString(PONY_TYPE));
    173                 assertEquals(5, c.getInt(PONY_LEGS));
    174                 assertEquals(1, c.getInt(PONY_CAN_RIDE));
    175                 flickaId = c.getLong(PONY_ID);
    176             } else if ("Elise".equals(name)) {
    177                 assertEquals("dastardly", c.getString(PONY_TYPE));
    178                 assertEquals(5, c.getInt(PONY_LEGS));
    179                 assertEquals(0, c.getInt(PONY_CAN_RIDE));
    180                 eliseId = c.getLong(PONY_ID);
    181             } else {
    182                 fail("Wrong record: " + name);
    183             }
    184         }
    185         // eliseId and flickaId should have been set
    186         assertNotSame(-1, eliseId);
    187         assertNotSame(-1, flickaId);
    188     }
    189 }
    190