summaryrefslogtreecommitdiffstats
path: root/tests/AndroidTests/src/com/android
diff options
context:
space:
mode:
authorDaisuke Miyakawa <dmiyakawa@google.com>2009-11-03 15:56:38 +0900
committerDaisuke Miyakawa <dmiyakawa@google.com>2009-11-03 16:53:58 +0900
commit66da163d4115688a8be7abb96c409a9858f9a8cd (patch)
treefc156652d5acf2b173e7642d9986a1bc6a417985 /tests/AndroidTests/src/com/android
parent21cbd52b7acb8f3fbcbd256a62f27f1476e9c89e (diff)
downloadframeworks_base-66da163d4115688a8be7abb96c409a9858f9a8cd.zip
frameworks_base-66da163d4115688a8be7abb96c409a9858f9a8cd.tar.gz
frameworks_base-66da163d4115688a8be7abb96c409a9858f9a8cd.tar.bz2
Move some useful logic to VCardTestsBase.java
Internal issue number: 2195990
Diffstat (limited to 'tests/AndroidTests/src/com/android')
-rw-r--r--tests/AndroidTests/src/com/android/unit_tests/vcard/VCardExporterTests.java380
-rw-r--r--tests/AndroidTests/src/com/android/unit_tests/vcard/VCardTestsBase.java372
2 files changed, 367 insertions, 385 deletions
diff --git a/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardExporterTests.java b/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardExporterTests.java
index f65210e..e6a7a51 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardExporterTests.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardExporterTests.java
@@ -16,32 +16,9 @@
package com.android.unit_tests.vcard;
-import android.content.ContentProvider;
-import android.content.ContentProviderOperation;
-import android.content.ContentProviderResult;
-import android.content.ContentResolver;
import android.content.ContentValues;
-import android.content.Context;
-import android.content.Entity;
-import android.content.EntityIterator;
-import android.content.res.AssetFileDescriptor;
-import android.database.Cursor;
-import android.database.CursorWindow;
-import android.database.IBulkCursor;
-import android.database.IContentObserver;
-import android.net.Uri;
-import android.os.IBinder;
-import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
import android.pim.vcard.VCardComposer;
import android.pim.vcard.VCardConfig;
-import android.pim.vcard.VCardParser;
-import android.pim.vcard.VCardParser_V21;
-import android.pim.vcard.VCardParser_V30;
-import android.pim.vcard.exception.VCardException;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Event;
import android.provider.ContactsContract.CommonDataKinds.Im;
@@ -53,102 +30,10 @@ import android.provider.ContactsContract.CommonDataKinds.Photo;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.CommonDataKinds.Website;
-import android.test.mock.MockContentResolver;
-import android.test.mock.MockContext;
-import android.test.mock.MockCursor;
-import android.util.Log;
import com.android.unit_tests.vcard.PropertyNodesVerifier.TypeSet;
-import junit.framework.TestCase;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Almost a dead copy of android.test.mock.MockContentProvider, but different in that this
- * class extends ContentProvider, not implementing IContentProvider,
- * so that MockContentResolver is able to accept this class :(
- */
-class MockContentProvider extends ContentProvider {
- @Override
- public boolean onCreate() {
- return true;
- }
-
- @Override
- public int bulkInsert(Uri url, ContentValues[] initialValues) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @SuppressWarnings("unused")
- public IBulkCursor bulkQuery(Uri url, String[] projection, String selection,
- String[] selectionArgs, String sortOrder, IContentObserver observer,
- CursorWindow window) throws RemoteException {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @Override
- @SuppressWarnings("unused")
- public int delete(Uri url, String selection, String[] selectionArgs) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @Override
- public String getType(Uri url) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @Override
- public Uri insert(Uri url, ContentValues initialValues) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @Override
- public ParcelFileDescriptor openFile(Uri url, String mode) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @Override
- public AssetFileDescriptor openAssetFile(Uri uri, String mode) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @Override
- public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @Override
- public Cursor query(Uri url, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- /**
- * @hide
- */
- @Override
- public EntityIterator queryEntities(Uri url, String selection, String[] selectionArgs,
- String sortOrder) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- @Override
- public int update(Uri url, ContentValues values, String selection, String[] selectionArgs) {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-
- public IBinder asBinder() {
- throw new UnsupportedOperationException("unimplemented mock method");
- }
-}
/**
* Tests for the code related to vCard exporter, inculding vCard composer.
@@ -156,274 +41,9 @@ class MockContentProvider extends ContentProvider {
* the result of this class will not be reliable.
*/
public class VCardExporterTests extends VCardTestsBase {
- private static final int V21 = 0;
- private static final int V30 = 1;
-
private static final byte[] sPhotoByteArray =
VCardImporterTests.sPhotoByteArrayForComplicatedCase;
- public class ExportTestResolver extends MockContentResolver {
- ExportTestProvider mProvider = new ExportTestProvider();
- public ExportTestResolver() {
- addProvider(VCardComposer.VCARD_TEST_AUTHORITY, mProvider);
- addProvider(RawContacts.CONTENT_URI.getAuthority(), mProvider);
- }
-
- public ContentValues buildData(String mimeType) {
- return mProvider.buildData(mimeType);
- }
- }
-
- public static class MockEntityIterator implements EntityIterator {
- Collection<Entity> mEntityCollection;
- Iterator<Entity> mIterator;
-
- // TODO: Support multiple vCard entries.
- public MockEntityIterator(Collection<ContentValues> contentValuesCollection) {
- mEntityCollection = new ArrayList<Entity>();
- Entity entity = new Entity(new ContentValues());
- for (ContentValues contentValues : contentValuesCollection) {
- entity.addSubValue(Data.CONTENT_URI, contentValues);
- }
- mEntityCollection.add(entity);
- mIterator = mEntityCollection.iterator();
- }
-
- public boolean hasNext() {
- return mIterator.hasNext();
- }
-
- public Entity next() {
- return mIterator.next();
- }
-
- public void reset() {
- mIterator = mEntityCollection.iterator();
- }
-
- public void close() {
- }
- }
-
- public class ExportTestProvider extends MockContentProvider {
- List<ContentValues> mContentValuesList = new ArrayList<ContentValues>();
- public ContentValues buildData(String mimeType) {
- ContentValues contentValues = new ContentValues();
- contentValues.put(Data.MIMETYPE, mimeType);
- mContentValuesList.add(contentValues);
- return contentValues;
- }
-
- @Override
- public EntityIterator queryEntities(Uri uri, String selection, String[] selectionArgs,
- String sortOrder) {
- assert(uri != null);
- assert(ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()));
- final String authority = uri.getAuthority();
- assert(RawContacts.CONTENT_URI.getAuthority().equals(authority));
-
- return new MockEntityIterator(mContentValuesList);
- }
-
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
- assert(VCardComposer.CONTACTS_TEST_CONTENT_URI.equals(uri));
- // Support multiple rows.
- return new MockCursor() {
- int mCurrentPosition = -1;
-
- @Override
- public int getCount() {
- return 1;
- }
-
- @Override
- public boolean moveToFirst() {
- mCurrentPosition = 0;
- return true;
- }
-
- @Override
- public boolean moveToNext() {
- if (mCurrentPosition == 0 || mCurrentPosition == -1) {
- mCurrentPosition++;
- return true;
- } else {
- return false;
- }
- }
-
- @Override
- public boolean isBeforeFirst() {
- return mCurrentPosition < 0;
- }
-
- @Override
- public boolean isAfterLast() {
- return mCurrentPosition > 0;
- }
-
- @Override
- public int getColumnIndex(String columnName) {
- assertEquals(Contacts._ID, columnName);
- return 0;
- }
-
- @Override
- public int getInt(int columnIndex) {
- assertEquals(0, columnIndex);
- return 0;
- }
-
- @Override
- public String getString(int columnIndex) {
- return String.valueOf(getInt(columnIndex));
- }
-
- @Override
- public void close() {
- }
- };
- }
- }
-
- public static class VCardVerificationHandler implements VCardComposer.OneEntryHandler {
- final private TestCase mTestCase;
- final private List<PropertyNodesVerifier> mPropertyNodesVerifierList;
- final private boolean mIsV30;
- // To allow duplication, use list instead of set.
- // TODO: support multiple vCard entries.
- final private List<String> mExpectedLineList;
- final private ContactStructVerifier mContactStructVerifier;
- final private int mVCardType;
- int mCount;
-
- public VCardVerificationHandler(final TestCase testCase, final int version) {
- this(testCase, null, version);
- }
-
- public VCardVerificationHandler(final TestCase testCase,
- ContactStructVerifier contactStructVerifier, final int version) {
- mTestCase = testCase;
- mPropertyNodesVerifierList = new ArrayList<PropertyNodesVerifier>();
- mIsV30 = (version == V30);
- mExpectedLineList = new ArrayList<String>();
- mContactStructVerifier = contactStructVerifier;
- mVCardType = (version == V30 ? VCardConfig.VCARD_TYPE_V30_GENERIC_UTF8
- : VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8);
- mCount = 1;
- }
-
- public PropertyNodesVerifier addNewVerifier() {
- PropertyNodesVerifier verifier = new PropertyNodesVerifier(mTestCase);
- mPropertyNodesVerifierList.add(verifier);
- verifier.addNodeWithOrder("VERSION", mIsV30 ? "3.0" : "2.1");
- return verifier;
- }
-
- public PropertyNodesVerifier addNewVerifierWithEmptyName() {
- PropertyNodesVerifier verifier = addNewVerifier();
- if (mIsV30) {
- verifier.addNodeWithOrder("N", "").addNodeWithOrder("FN", "");
- }
- return verifier;
- }
-
- public VCardVerificationHandler addExpectedLine(String line) {
- mExpectedLineList.add(line);
- return this;
- }
-
- public boolean onInit(final Context context) {
- return true;
- }
-
- public boolean onEntryCreated(final String vcard) {
- if (!mExpectedLineList.isEmpty()) {
- verifyLines(vcard);
- }
- verifyNodes(vcard);
- return true;
- }
-
- private void verifyLines(final String vcard) {
- final String[] lineArray = vcard.split("\\r?\\n");
- final int length = lineArray.length;
- for (int i = 0; i < length; i++) {
- final String line = lineArray[i];
- // TODO: support multiple vcard entries.
- if ("BEGIN:VCARD".equals(line) || "END:VCARD".equals(line) ||
- (mIsV30 ? "VERSION:3.0" : "VERSION:2.1").equals(line)) {
- continue;
- }
- final int index = mExpectedLineList.indexOf(line);
- if (index >= 0) {
- mExpectedLineList.remove(index);
- } else {
- mTestCase.fail("Unexpected line: " + line);
- }
- }
- if (!mExpectedLineList.isEmpty()) {
- StringBuffer buffer = new StringBuffer();
- for (String expectedLine : mExpectedLineList) {
- buffer.append(expectedLine);
- buffer.append("\n");
- }
- mTestCase.fail("Expected line(s) not found:" + buffer.toString());
- }
- }
-
- private void verifyNodes(final String vcard) {
- if (mPropertyNodesVerifierList.size() == 0) {
- mTestCase.fail("Too many vCard entries seems to be inserted(No."
- + mCount + " of the entries (No.1 is the first entry))");
- }
- PropertyNodesVerifier propertyNodesVerifier =
- mPropertyNodesVerifierList.get(0);
- mPropertyNodesVerifierList.remove(0);
- VCardParser parser = (mIsV30 ? new VCardParser_V30(true) : new VCardParser_V21());
- VNodeBuilder builder = new VNodeBuilder();
- InputStream is;
- try {
- is = new ByteArrayInputStream(vcard.getBytes("UTF-8"));
- mTestCase.assertEquals(true, parser.parse(is, null, builder));
- is.close();
- mTestCase.assertEquals(1, builder.vNodeList.size());
- propertyNodesVerifier.verify(builder.vNodeList.get(0));
- if (mContactStructVerifier != null) {
- Log.d("@@@", vcard);
- is = new ByteArrayInputStream(vcard.getBytes("UTF-8"));
- mContactStructVerifier.verify(is, mVCardType);
- is.close();
- }
- } catch (IOException e) {
- mTestCase.fail("Unexpected IOException: " + e.getMessage());
- } catch (VCardException e) {
- mTestCase.fail("Unexpected VCardException: " + e.getMessage());
- } finally {
- mCount++;
- }
- }
-
- public void onTerminate() {
- }
- }
-
- private class CustomMockContext extends MockContext {
- final ContentResolver mResolver;
- public CustomMockContext(ContentResolver resolver) {
- mResolver = resolver;
- }
-
- @Override
- public ContentResolver getContentResolver() {
- return mResolver;
- }
- }
-
- //// Followings are actual tests ////
-
private void verifyOneComposition(ExportTestResolver resolver,
VCardVerificationHandler handler, int version) {
final boolean isV30 = (version == V30);
diff --git a/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardTestsBase.java b/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardTestsBase.java
index 733c58f..4c899b3 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardTestsBase.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/vcard/VCardTestsBase.java
@@ -16,17 +16,32 @@
package com.android.unit_tests.vcard;
+import android.content.ContentProvider;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
+import android.content.ContentResolver;
import android.content.ContentValues;
+import android.content.Context;
+import android.content.Entity;
+import android.content.EntityIterator;
+import android.content.res.AssetFileDescriptor;
+import android.database.Cursor;
+import android.database.CursorWindow;
+import android.database.IBulkCursor;
+import android.database.IContentObserver;
import android.net.Uri;
+import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
import android.pim.vcard.EntryCommitter;
+import android.pim.vcard.VCardComposer;
import android.pim.vcard.VCardConfig;
import android.pim.vcard.VCardDataBuilder;
import android.pim.vcard.VCardParser;
import android.pim.vcard.VCardParser_V21;
import android.pim.vcard.VCardParser_V30;
import android.pim.vcard.exception.VCardException;
+import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.CommonDataKinds.Email;
@@ -43,11 +58,15 @@ import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
import android.provider.ContactsContract.CommonDataKinds.Website;
import android.test.AndroidTestCase;
-import android.test.mock.MockContentProvider;
import android.test.mock.MockContentResolver;
+import android.test.mock.MockContext;
+import android.test.mock.MockCursor;
import android.text.TextUtils;
import android.util.Log;
+import junit.framework.TestCase;
+
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
@@ -55,6 +74,8 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
@@ -62,10 +83,103 @@ import java.util.TreeMap;
import java.util.Map.Entry;
/**
+ * Almost a dead copy of android.test.mock.MockContentProvider, but different in that this
+ * class extends ContentProvider, not implementing IContentProvider,
+ * so that MockContentResolver is able to accept this class :(
+ */
+class MockContentProvider extends ContentProvider {
+ @Override
+ public boolean onCreate() {
+ return true;
+ }
+
+ @Override
+ public int bulkInsert(Uri url, ContentValues[] initialValues) {
+ throw new UnsupportedOperationException("unimplemented mock method");
+ }
+
+ @SuppressWarnings("unused")
+ public IBulkCursor bulkQuery(Uri url, String[] projection, String selection,
+ String[] selectionArgs, String sortOrder, IContentObserver observer,
+ CursorWindow window) throws RemoteException {
+ throw new UnsupportedOperationException("unimplemented mock method");
+ }
+
+ @Override
+ @SuppressWarnings("unused")
+ public int delete(Uri url, String selection, String[] selectionArgs) {
+ throw new UnsupportedOperationException("unimplemented mock method");
+ }
+
+ @Override
+ public String getType(Uri url) {
+ throw new UnsupportedOperationException("unimplemented mock method");
+ }
+
+ @Override
+ public Uri insert(Uri url, ContentValues initialValues) {
+ throw new UnsupportedOperationException("unimplemented mock method");
+ }
+
+ @Override
+ public ParcelFileDescriptor openFile(Uri url, String mode) {
+ throw new UnsupportedOperationException("unimplemented mock method");
+ }
+
+ @Override
+ public AssetFileDescriptor openAssetFile(Uri uri, String mode) {
+ throw new UnsupportedOperationException("unimplemented mock method");
+ }
+
+ @Override
+ public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) {
+ throw new UnsupportedOperationException("unimplemented mock method");
+ }
+
+ @Override
+ public Cursor query(Uri url, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ throw new UnsupportedOperationException("unimplemented mock method");
+ }
+
+ /**
+ * @hide
+ */
+ @Override
+ public EntityIterator queryEntities(Uri url, String selection, String[] selectionArgs,
+ String sortOrder) {
+ throw new UnsupportedOperationException("unimplemented mock method");
+ }
+
+ @Override
+ public int update(Uri url, ContentValues values, String selection, String[] selectionArgs) {
+ throw new UnsupportedOperationException("unimplemented mock method");
+ }
+
+ public IBinder asBinder() {
+ throw new UnsupportedOperationException("unimplemented mock method");
+ }
+}
+
+class CustomMockContext extends MockContext {
+ final ContentResolver mResolver;
+ public CustomMockContext(ContentResolver resolver) {
+ mResolver = resolver;
+ }
+
+ @Override
+ public ContentResolver getContentResolver() {
+ return mResolver;
+ }
+}
+
+/**
* BaseClass for vCard unit tests with utility classes.
* Please do not add each unit test here.
*/
/* package */ class VCardTestsBase extends AndroidTestCase {
+ public static final int V21 = 0;
+ public static final int V30 = 1;
public class ImportVerificationResolver extends MockContentResolver {
ImportVerificationProvider mVerificationProvider = new ImportVerificationProvider();
@@ -137,12 +251,10 @@ import java.util.Map.Entry;
fakeResultArray[i] = new ContentProviderResult(uri);
}
- Log.d("@@@", "size: " + size);
for (int i = 0; i < size; i++) {
ContentProviderOperation operation = operations.get(i);
ContentValues contentValues = operation.resolveValueBackReferences(
fakeResultArray, i);
- Log.d("@@@", convertToEasilyReadableString(contentValues));
}
for (int i = 0; i < size; i++) {
ContentProviderOperation operation = operations.get(i);
@@ -175,9 +287,10 @@ import java.util.Map.Entry;
for (String key: keyToBeRemoved) {
actualContentValues.remove(key);
}
+ /* for testing
Log.d("@@@",
String.format("MimeType: %s, data: %s",
- mimeType, actualContentValues.toString()));
+ mimeType, actualContentValues.toString())); */
// Remove RAW_CONTACT_ID entry just for safety, since we do not care
// how resolver-related code handles the entry in this unit test,
if (actualContentValues.containsKey(Data.RAW_CONTACT_ID)) {
@@ -191,10 +304,11 @@ import java.util.Map.Entry;
}
boolean checked = false;
for (ContentValues expectedContentValues : contentValuesCollection) {
+ /* for testing
Log.d("@@@", "expected: "
+ convertToEasilyReadableString(expectedContentValues));
Log.d("@@@", "actual : "
- + convertToEasilyReadableString(actualContentValues));
+ + convertToEasilyReadableString(actualContentValues)); */
if (equalsForContentValues(expectedContentValues,
actualContentValues)) {
assertTrue(contentValuesCollection.remove(expectedContentValues));
@@ -278,6 +392,254 @@ import java.util.Map.Entry;
}
}
+ public class ExportTestResolver extends MockContentResolver {
+ ExportTestProvider mProvider = new ExportTestProvider();
+ public ExportTestResolver() {
+ addProvider(VCardComposer.VCARD_TEST_AUTHORITY, mProvider);
+ addProvider(RawContacts.CONTENT_URI.getAuthority(), mProvider);
+ }
+
+ public ContentValues buildData(String mimeType) {
+ return mProvider.buildData(mimeType);
+ }
+ }
+
+ public static class MockEntityIterator implements EntityIterator {
+ Collection<Entity> mEntityCollection;
+ Iterator<Entity> mIterator;
+
+ // TODO: Support multiple vCard entries.
+ public MockEntityIterator(Collection<ContentValues> contentValuesCollection) {
+ mEntityCollection = new ArrayList<Entity>();
+ Entity entity = new Entity(new ContentValues());
+ for (ContentValues contentValues : contentValuesCollection) {
+ entity.addSubValue(Data.CONTENT_URI, contentValues);
+ }
+ mEntityCollection.add(entity);
+ mIterator = mEntityCollection.iterator();
+ }
+
+ public boolean hasNext() {
+ return mIterator.hasNext();
+ }
+
+ public Entity next() {
+ return mIterator.next();
+ }
+
+ public void reset() {
+ mIterator = mEntityCollection.iterator();
+ }
+
+ public void close() {
+ }
+ }
+
+ public class ExportTestProvider extends MockContentProvider {
+ List<ContentValues> mContentValuesList = new ArrayList<ContentValues>();
+ public ContentValues buildData(String mimeType) {
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(Data.MIMETYPE, mimeType);
+ mContentValuesList.add(contentValues);
+ return contentValues;
+ }
+
+ @Override
+ public EntityIterator queryEntities(Uri uri, String selection, String[] selectionArgs,
+ String sortOrder) {
+ assert(uri != null);
+ assert(ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()));
+ final String authority = uri.getAuthority();
+ assert(RawContacts.CONTENT_URI.getAuthority().equals(authority));
+
+ return new MockEntityIterator(mContentValuesList);
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ assert(VCardComposer.CONTACTS_TEST_CONTENT_URI.equals(uri));
+ // Support multiple rows.
+ return new MockCursor() {
+ int mCurrentPosition = -1;
+
+ @Override
+ public int getCount() {
+ return 1;
+ }
+
+ @Override
+ public boolean moveToFirst() {
+ mCurrentPosition = 0;
+ return true;
+ }
+
+ @Override
+ public boolean moveToNext() {
+ if (mCurrentPosition == 0 || mCurrentPosition == -1) {
+ mCurrentPosition++;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean isBeforeFirst() {
+ return mCurrentPosition < 0;
+ }
+
+ @Override
+ public boolean isAfterLast() {
+ return mCurrentPosition > 0;
+ }
+
+ @Override
+ public int getColumnIndex(String columnName) {
+ assertEquals(Contacts._ID, columnName);
+ return 0;
+ }
+
+ @Override
+ public int getInt(int columnIndex) {
+ assertEquals(0, columnIndex);
+ return 0;
+ }
+
+ @Override
+ public String getString(int columnIndex) {
+ return String.valueOf(getInt(columnIndex));
+ }
+
+ @Override
+ public void close() {
+ }
+ };
+ }
+ }
+
+ public static class VCardVerificationHandler implements VCardComposer.OneEntryHandler {
+ final private TestCase mTestCase;
+ final private List<PropertyNodesVerifier> mPropertyNodesVerifierList;
+ final private boolean mIsV30;
+ // To allow duplication, use list instead of set.
+ // TODO: support multiple vCard entries.
+ final private List<String> mExpectedLineList;
+ final private ContactStructVerifier mContactStructVerifier;
+ final private int mVCardType;
+ int mCount;
+
+ public VCardVerificationHandler(final TestCase testCase, final int version) {
+ this(testCase, null, version);
+ }
+
+ public VCardVerificationHandler(final TestCase testCase,
+ ContactStructVerifier contactStructVerifier, final int version) {
+ mTestCase = testCase;
+ mPropertyNodesVerifierList = new ArrayList<PropertyNodesVerifier>();
+ mIsV30 = (version == V30);
+ mExpectedLineList = new ArrayList<String>();
+ mContactStructVerifier = contactStructVerifier;
+ mVCardType = (version == V30 ? VCardConfig.VCARD_TYPE_V30_GENERIC_UTF8
+ : VCardConfig.VCARD_TYPE_V21_GENERIC_UTF8);
+ mCount = 1;
+ }
+
+ public PropertyNodesVerifier addNewVerifier() {
+ PropertyNodesVerifier verifier = new PropertyNodesVerifier(mTestCase);
+ mPropertyNodesVerifierList.add(verifier);
+ verifier.addNodeWithOrder("VERSION", mIsV30 ? "3.0" : "2.1");
+ return verifier;
+ }
+
+ public PropertyNodesVerifier addNewVerifierWithEmptyName() {
+ PropertyNodesVerifier verifier = addNewVerifier();
+ if (mIsV30) {
+ verifier.addNodeWithOrder("N", "").addNodeWithOrder("FN", "");
+ }
+ return verifier;
+ }
+
+ public VCardVerificationHandler addExpectedLine(String line) {
+ mExpectedLineList.add(line);
+ return this;
+ }
+
+ public boolean onInit(final Context context) {
+ return true;
+ }
+
+ public boolean onEntryCreated(final String vcard) {
+ if (!mExpectedLineList.isEmpty()) {
+ verifyLines(vcard);
+ }
+ verifyNodes(vcard);
+ return true;
+ }
+
+ private void verifyLines(final String vcard) {
+ final String[] lineArray = vcard.split("\\r?\\n");
+ final int length = lineArray.length;
+ for (int i = 0; i < length; i++) {
+ final String line = lineArray[i];
+ // TODO: support multiple vcard entries.
+ if ("BEGIN:VCARD".equals(line) || "END:VCARD".equals(line) ||
+ (mIsV30 ? "VERSION:3.0" : "VERSION:2.1").equals(line)) {
+ continue;
+ }
+ final int index = mExpectedLineList.indexOf(line);
+ if (index >= 0) {
+ mExpectedLineList.remove(index);
+ } else {
+ mTestCase.fail("Unexpected line: " + line);
+ }
+ }
+ if (!mExpectedLineList.isEmpty()) {
+ StringBuffer buffer = new StringBuffer();
+ for (String expectedLine : mExpectedLineList) {
+ buffer.append(expectedLine);
+ buffer.append("\n");
+ }
+ mTestCase.fail("Expected line(s) not found:" + buffer.toString());
+ }
+ }
+
+ private void verifyNodes(final String vcard) {
+ if (mPropertyNodesVerifierList.size() == 0) {
+ mTestCase.fail("Too many vCard entries seems to be inserted(No."
+ + mCount + " of the entries (No.1 is the first entry))");
+ }
+ PropertyNodesVerifier propertyNodesVerifier =
+ mPropertyNodesVerifierList.get(0);
+ mPropertyNodesVerifierList.remove(0);
+ VCardParser parser = (mIsV30 ? new VCardParser_V30(true) : new VCardParser_V21());
+ VNodeBuilder builder = new VNodeBuilder();
+ InputStream is;
+ try {
+ is = new ByteArrayInputStream(vcard.getBytes("UTF-8"));
+ mTestCase.assertEquals(true, parser.parse(is, null, builder));
+ is.close();
+ mTestCase.assertEquals(1, builder.vNodeList.size());
+ propertyNodesVerifier.verify(builder.vNodeList.get(0));
+ if (mContactStructVerifier != null) {
+ Log.d("@@@", vcard);
+ is = new ByteArrayInputStream(vcard.getBytes("UTF-8"));
+ mContactStructVerifier.verify(is, mVCardType);
+ is.close();
+ }
+ } catch (IOException e) {
+ mTestCase.fail("Unexpected IOException: " + e.getMessage());
+ } catch (VCardException e) {
+ mTestCase.fail("Unexpected VCardException: " + e.getMessage());
+ } finally {
+ mCount++;
+ }
+ }
+
+ public void onTerminate() {
+ }
+ }
+
/**
* Utility method to print ContentValues whose content is printed with sorted keys.
*/