ExportTestProvider.java revision 677ef21613a9d35053ec098444832ce4125a847e
14199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/*
24199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Copyright (C) 2010 The Android Open Source Project
34199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
44199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License"); you may not
54199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * use this file except in compliance with the License. You may obtain a copy of
64199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * the License at
74199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
84199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * http://www.apache.org/licenses/LICENSE-2.0
94199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *
104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software
114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * License for the specific language governing permissions and limitations under
144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * the License.
154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */
16677ef21613a9d35053ec098444832ce4125a847eDaisuke Miyakawapackage com.android.vcard.tests.testutils;
174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.content.ContentResolver;
194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.content.ContentValues;
204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.content.Entity;
214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.content.EntityIterator;
224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.database.Cursor;
234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.net.Uri;
244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.Contacts;
254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.Data;
264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.provider.ContactsContract.RawContacts;
275f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawaimport android.test.AndroidTestCase;
284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.test.mock.MockContentProvider;
294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.test.mock.MockCursor;
304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport junit.framework.TestCase;
324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.ArrayList;
344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.Iterator;
354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.List;
364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
371680191a2a208fd61123810a88ce9def83e222baDaisuke Miyakawapublic class ExportTestProvider extends MockContentProvider {
384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    final private ArrayList<ContactEntry> mContactEntryList = new ArrayList<ContactEntry>();
394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    private static class MockEntityIterator implements EntityIterator {
417e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa        private final List<Entity> mEntityList;
427e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa        private Iterator<Entity> mIterator;
434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public MockEntityIterator(List<ContentValues> contentValuesList) {
454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mEntityList = new ArrayList<Entity>();
464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            Entity entity = new Entity(new ContentValues());
474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            for (ContentValues contentValues : contentValuesList) {
484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    entity.addSubValue(Data.CONTENT_URI, contentValues);
494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mEntityList.add(entity);
514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mIterator = mEntityList.iterator();
524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
547e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa        @Override
554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public boolean hasNext() {
564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return mIterator.hasNext();
574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
597e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa        @Override
604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public Entity next() {
614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return mIterator.next();
624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
647e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa        @Override
654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public void remove() {
664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            throw new UnsupportedOperationException("remove not supported");
674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
697e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa        @Override
704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public void reset() {
714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            mIterator = mEntityList.iterator();
724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
747e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa        @Override
754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        public void close() {
764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
795f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa    public ExportTestProvider(AndroidTestCase androidTestCase) {
804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public ContactEntry buildInputEntry() {
834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ContactEntry contactEntry = new ContactEntry();
844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        mContactEntryList.add(contactEntry);
854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return contactEntry;
864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    /**
894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * An old method which had existed but was removed from ContentResolver.
914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * <p>
934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * We still keep using this method since we don't have a propeer way to know
944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * which value in the ContentValue corresponds to the entry in Contacts database.
954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     * </p>
964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa     */
974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public EntityIterator queryEntities(Uri uri,
984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            String selection, String[] selectionArgs, String sortOrder) {
995f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa        TestCase.assertTrue(uri != null);
1005f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa        TestCase.assertTrue(ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()));
1014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final String authority = uri.getAuthority();
1025f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa        TestCase.assertTrue(RawContacts.CONTENT_URI.getAuthority().equals(authority));
1035f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa        TestCase.assertTrue((Data.CONTACT_ID + "=?").equals(selection));
1045f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa        TestCase.assertEquals(1, selectionArgs.length);
1054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        final int id = Integer.parseInt(selectionArgs[0]);
1065f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa        TestCase.assertTrue(id >= 0 && id < mContactEntryList.size());
1074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return new MockEntityIterator(mContactEntryList.get(id).getList());
1094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
1104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    @Override
1124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    public Cursor query(Uri uri,String[] projection,
1134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            String selection, String[] selectionArgs, String sortOrder) {
1147e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198Daisuke Miyakawa        TestCase.assertTrue(VCardVerifier.CONTACTS_TEST_CONTENT_URI.equals(uri));
1154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // In this test, following arguments are not supported.
1165f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa        TestCase.assertNull(selection);
1175f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa        TestCase.assertNull(selectionArgs);
1185f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa        TestCase.assertNull(sortOrder);
1194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return new MockCursor() {
1214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            int mCurrentPosition = -1;
1224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            @Override
1244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            public int getCount() {
1254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return mContactEntryList.size();
1264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            @Override
1294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            public boolean moveToFirst() {
1304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                mCurrentPosition = 0;
1314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return true;
1324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            @Override
1354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            public boolean moveToNext() {
1364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                if (mCurrentPosition < mContactEntryList.size()) {
1374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    mCurrentPosition++;
1384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    return true;
1394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                } else {
1404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                    return false;
1414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                }
1424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            @Override
1454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            public boolean isBeforeFirst() {
1464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return mCurrentPosition < 0;
1474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            @Override
1504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            public boolean isAfterLast() {
1514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return mCurrentPosition >= mContactEntryList.size();
1524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            @Override
1554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            public int getColumnIndex(String columnName) {
1565f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa                TestCase.assertEquals(Contacts._ID, columnName);
1574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return 0;
1584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            @Override
1614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            public int getInt(int columnIndex) {
1625f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa                TestCase.assertEquals(0, columnIndex);
1635f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa                TestCase.assertTrue(mCurrentPosition >= 0
1644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                        && mCurrentPosition < mContactEntryList.size());
1654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return mCurrentPosition;
1664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            @Override
1694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            public String getString(int columnIndex) {
1704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return String.valueOf(getInt(columnIndex));
1714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            @Override
1744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            public void close() {
1754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        };
1774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
1784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}