summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaisuke Miyakawa <dmiyakawa@google.com>2011-03-03 11:03:28 -0800
committerDaisuke Miyakawa <dmiyakawa@google.com>2011-03-04 11:58:55 -0800
commit7e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198 (patch)
tree55d14dfa45916b0ae1aa959b8f25e22cd821a044
parenta11303ccb430ca40210900823807027cc842bf6c (diff)
downloadandroid_frameworks_opt_vcard-7e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198.tar.gz
android_frameworks_opt_vcard-7e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198.tar.bz2
android_frameworks_opt_vcard-7e4e86eb5ad2c8a68ca7005ef4dee64a82ce0198.zip
Tiny refactoring, clean up.
- isolate test-related stuffs - suppress warning - let constructor accept ContentResolver, which is useful when test has custom ContentResolver apart from Context object. - prohibit multiple init() calls Change-Id: I0da5af56bf04e8eafbef376668a09002cb62d3f5
-rw-r--r--java/com/android/vcard/VCardComposer.java141
-rw-r--r--tests/src/com/android/vcard/tests/test_utils/ExportTestProvider.java13
-rw-r--r--tests/src/com/android/vcard/tests/test_utils/ExportTestResolver.java4
-rw-r--r--tests/src/com/android/vcard/tests/test_utils/VCardVerifier.java41
4 files changed, 140 insertions, 59 deletions
diff --git a/java/com/android/vcard/VCardComposer.java b/java/com/android/vcard/VCardComposer.java
index 2b2495c..d1e0eb6 100644
--- a/java/com/android/vcard/VCardComposer.java
+++ b/java/com/android/vcard/VCardComposer.java
@@ -100,6 +100,7 @@ import java.util.Map;
*/
public class VCardComposer {
private static final String LOG_TAG = "VCardComposer";
+ private static final boolean DEBUG = false;
public static final String FAILURE_REASON_FAILED_TO_GET_DATABASE_INFO =
"Failed to get database information";
@@ -116,22 +117,11 @@ public class VCardComposer {
public static final String NO_ERROR = "No error";
- public static final String VCARD_TYPE_STRING_DOCOMO = "docomo";
-
// Strictly speaking, "Shift_JIS" is the most appropriate, but we use upper version here,
// since usual vCard devices for Japanese devices already use it.
private static final String SHIFT_JIS = "SHIFT_JIS";
private static final String UTF_8 = "UTF-8";
- /**
- * Special URI for testing.
- */
- public static final String VCARD_TEST_AUTHORITY = "com.android.unit_tests.vcard";
- public static final Uri VCARD_TEST_AUTHORITY_URI =
- Uri.parse("content://" + VCARD_TEST_AUTHORITY);
- public static final Uri CONTACTS_TEST_CONTENT_URI =
- Uri.withAppendedPath(VCARD_TEST_AUTHORITY_URI, "contacts");
-
private static final Map<Integer, String> sImMap;
static {
@@ -161,9 +151,6 @@ public class VCardComposer {
* </p>
*/
public final class HandlerForOutputStream implements OneEntryHandler {
- @SuppressWarnings("hiding")
- private static final String LOG_TAG = "VCardComposer.HandlerForOutputStream";
-
private final OutputStream mOutputStream; // mWriter will close this.
private Writer mWriter;
@@ -238,12 +225,14 @@ public class VCardComposer {
private final boolean mIsDoCoMo;
private Cursor mCursor;
+ private boolean mCursorSuppliedFromOutside;
private int mIdColumn;
private Uri mContentUriForRawContactsEntity = RawContactsEntity.CONTENT_URI;
private final String mCharset;
private final List<OneEntryHandler> mHandlerList;
+ private boolean mInitDone;
private String mErrorReason = NO_ERROR;
/**
@@ -280,7 +269,7 @@ public class VCardComposer {
}
/**
- * Construct for supporting call log entry vCard composing.
+ * Constructs for supporting call log entry vCard composing.
*
* @param context Context to be used during the composition.
* @param vcardType The type of vCard, typically available via {@link VCardConfig}.
@@ -291,10 +280,20 @@ public class VCardComposer {
*/
public VCardComposer(final Context context, final int vcardType, String charset,
final boolean careHandlerErrors) {
+ this(context, context.getContentResolver(), vcardType, charset, careHandlerErrors);
+ }
+
+ /**
+ * Just for testing for now.
+ * @param resolver {@link ContentResolver} which used by this object.
+ * @hide
+ */
+ public VCardComposer(final Context context, ContentResolver resolver,
+ final int vcardType, String charset, final boolean careHandlerErrors) {
mContext = context;
mVCardType = vcardType;
mCareHandlerErrors = careHandlerErrors;
- mContentResolver = context.getContentResolver();
+ mContentResolver = resolver;
mIsDoCoMo = VCardConfig.isDoCoMo(vcardType);
mHandlerList = new ArrayList<OneEntryHandler>();
@@ -372,6 +371,11 @@ public class VCardComposer {
}
/**
+ * Initializes this object using default {@link Contacts#CONTENT_URI}.
+ *
+ * You can call this method or a variant of this method just once. In other words, you cannot
+ * reuse this object.
+ *
* @return Returns true when initialization is successful and all the other
* methods are available. Returns false otherwise.
*/
@@ -388,14 +392,21 @@ public class VCardComposer {
* Cursor cursor = mContentResolver.query(
* contentUriForRawContactsEntity, null, selection, selectionArgs, null)
* </code>
+ *
+ * You can call this method or a variant of this method just once. In other words, you cannot
+ * reuse this object.
*/
public boolean initWithRawContactsEntityUri(Uri contentUriForRawContactsEntity) {
mContentUriForRawContactsEntity = contentUriForRawContactsEntity;
return init(null, null);
}
+ /**
+ * Initializes this object using default {@link Contacts#CONTENT_URI} and given selection
+ * arguments.
+ */
public boolean init(final String selection, final String[] selectionArgs) {
- return init(Contacts.CONTENT_URI, selection, selectionArgs, null);
+ return init(Contacts.CONTENT_URI, sContactsProjection, selection, selectionArgs, null);
}
/**
@@ -403,7 +414,48 @@ public class VCardComposer {
*/
public boolean init(final Uri contentUri, final String selection,
final String[] selectionArgs, final String sortOrder) {
- if (contentUri == null) {
+ return init(contentUri, sContactsProjection, selection, selectionArgs, sortOrder);
+ }
+
+ private boolean init(final Uri contentUri, final String[] projection,
+ final String selection, final String[] selectionArgs, final String sortOrder) {
+ if (!Contacts.CONTENT_URI.equals(contentUri)) {
+ if (DEBUG) Log.d(LOG_TAG, "Unexpected contentUri: " + contentUri);
+ mErrorReason = FAILURE_REASON_UNSUPPORTED_URI;
+ return false;
+ }
+ if (!initInterFirstPart()) {
+ return false;
+ }
+ if (!initInterCursorCreationPart(contentUri, projection, selection, selectionArgs,
+ sortOrder)) {
+ return false;
+ }
+ if (!initInterMainPart()) {
+ return false;
+ }
+ return initInterLastPart();
+ }
+
+ /**
+ * Just for testing for now. Do not use.
+ * @hide
+ */
+ public boolean init(Cursor cursor) {
+ if (!initInterFirstPart()) {
+ return false;
+ }
+ mCursorSuppliedFromOutside = true;
+ mCursor = cursor;
+ if (!initInterMainPart()) {
+ return false;
+ }
+ return initInterLastPart();
+ }
+
+ private boolean initInterFirstPart() {
+ if (mInitDone) {
+ Log.e(LOG_TAG, "init() is already called");
return false;
}
@@ -412,6 +464,11 @@ public class VCardComposer {
mHandlerList.size());
for (OneEntryHandler handler : mHandlerList) {
if (!handler.onInit(mContext)) {
+ if (DEBUG) {
+ Log.d(LOG_TAG,
+ String.format("One of OneEntryHandler (%s) return false on init.",
+ handler.toString()));
+ }
for (OneEntryHandler finished : finishedList) {
finished.onTerminate();
}
@@ -425,36 +482,39 @@ public class VCardComposer {
}
}
- final String[] projection;
- if (Contacts.CONTENT_URI.equals(contentUri) ||
- CONTACTS_TEST_CONTENT_URI.equals(contentUri)) {
- projection = sContactsProjection;
- } else {
- mErrorReason = FAILURE_REASON_UNSUPPORTED_URI;
- return false;
- }
+ return true;
+ }
+
+ private boolean initInterCursorCreationPart(
+ final Uri contentUri, final String[] projection,
+ final String selection, final String[] selectionArgs, final String sortOrder) {
+ mCursorSuppliedFromOutside = false;
mCursor = mContentResolver.query(
contentUri, projection, selection, selectionArgs, sortOrder);
if (mCursor == null) {
+ Log.e(LOG_TAG, String.format("Cursor became null unexpectedly"));
mErrorReason = FAILURE_REASON_FAILED_TO_GET_DATABASE_INFO;
return false;
}
+ return true;
+ }
- if (getCount() == 0 || !mCursor.moveToFirst()) {
- try {
- mCursor.close();
- } catch (SQLiteException e) {
- Log.e(LOG_TAG, "SQLiteException on Cursor#close(): " + e.getMessage());
- } finally {
- mCursor = null;
- mErrorReason = FAILURE_REASON_NO_ENTRY;
+ private boolean initInterMainPart() {
+ if (mCursor.getCount() == 0 || !mCursor.moveToFirst()) {
+ if (DEBUG) {
+ Log.d(LOG_TAG,
+ String.format("mCursor has an error (getCount: %d): ", mCursor.getCount()));
}
+ closeCursorIfAppropriate();
return false;
}
-
mIdColumn = mCursor.getColumnIndex(Contacts._ID);
+ return true;
+ }
+ private boolean initInterLastPart() {
+ mInitDone = true;
mTerminateCalled = false;
return true;
}
@@ -468,7 +528,7 @@ public class VCardComposer {
* @hide just for testing.
*/
public boolean createOneEntry(Method getEntityIteratorMethod) {
- if (mCursor == null || mCursor.isAfterLast()) {
+ if (!mInitDone) {
mErrorReason = FAILURE_REASON_NOT_INITIALIZED;
return false;
}
@@ -619,7 +679,12 @@ public class VCardComposer {
handler.onTerminate();
}
- if (mCursor != null) {
+ closeCursorIfAppropriate();
+ mTerminateCalled = true;
+ }
+
+ private void closeCursorIfAppropriate() {
+ if (!mCursorSuppliedFromOutside && mCursor != null) {
try {
mCursor.close();
} catch (SQLiteException e) {
@@ -627,8 +692,6 @@ public class VCardComposer {
}
mCursor = null;
}
-
- mTerminateCalled = true;
}
@Override
diff --git a/tests/src/com/android/vcard/tests/test_utils/ExportTestProvider.java b/tests/src/com/android/vcard/tests/test_utils/ExportTestProvider.java
index 87cf1d8..e1b4bcf 100644
--- a/tests/src/com/android/vcard/tests/test_utils/ExportTestProvider.java
+++ b/tests/src/com/android/vcard/tests/test_utils/ExportTestProvider.java
@@ -28,8 +28,6 @@ import android.test.AndroidTestCase;
import android.test.mock.MockContentProvider;
import android.test.mock.MockCursor;
-import com.android.vcard.VCardComposer;
-
import junit.framework.TestCase;
import java.util.ArrayList;
@@ -40,8 +38,8 @@ public class ExportTestProvider extends MockContentProvider {
final private ArrayList<ContactEntry> mContactEntryList = new ArrayList<ContactEntry>();
private static class MockEntityIterator implements EntityIterator {
- List<Entity> mEntityList;
- Iterator<Entity> mIterator;
+ private final List<Entity> mEntityList;
+ private Iterator<Entity> mIterator;
public MockEntityIterator(List<ContentValues> contentValuesList) {
mEntityList = new ArrayList<Entity>();
@@ -53,22 +51,27 @@ public class ExportTestProvider extends MockContentProvider {
mIterator = mEntityList.iterator();
}
+ @Override
public boolean hasNext() {
return mIterator.hasNext();
}
+ @Override
public Entity next() {
return mIterator.next();
}
+ @Override
public void remove() {
throw new UnsupportedOperationException("remove not supported");
}
+ @Override
public void reset() {
mIterator = mEntityList.iterator();
}
+ @Override
public void close() {
}
}
@@ -108,7 +111,7 @@ public class ExportTestProvider extends MockContentProvider {
@Override
public Cursor query(Uri uri,String[] projection,
String selection, String[] selectionArgs, String sortOrder) {
- TestCase.assertTrue(VCardComposer.CONTACTS_TEST_CONTENT_URI.equals(uri));
+ TestCase.assertTrue(VCardVerifier.CONTACTS_TEST_CONTENT_URI.equals(uri));
// In this test, following arguments are not supported.
TestCase.assertNull(selection);
TestCase.assertNull(selectionArgs);
diff --git a/tests/src/com/android/vcard/tests/test_utils/ExportTestResolver.java b/tests/src/com/android/vcard/tests/test_utils/ExportTestResolver.java
index b89b9d1..7a8f4b3 100644
--- a/tests/src/com/android/vcard/tests/test_utils/ExportTestResolver.java
+++ b/tests/src/com/android/vcard/tests/test_utils/ExportTestResolver.java
@@ -19,13 +19,11 @@ import android.provider.ContactsContract.RawContacts;
import android.test.AndroidTestCase;
import android.test.mock.MockContentResolver;
-import com.android.vcard.VCardComposer;
-
public class ExportTestResolver extends MockContentResolver {
private final ExportTestProvider mProvider;
public ExportTestResolver(AndroidTestCase androidTestCase) {
mProvider = new ExportTestProvider(androidTestCase);
- addProvider(VCardComposer.VCARD_TEST_AUTHORITY, mProvider);
+ addProvider(VCardVerifier.VCARD_TEST_AUTHORITY, mProvider);
addProvider(RawContacts.CONTENT_URI.getAuthority(), mProvider);
}
diff --git a/tests/src/com/android/vcard/tests/test_utils/VCardVerifier.java b/tests/src/com/android/vcard/tests/test_utils/VCardVerifier.java
index f9fa463..29fc835 100644
--- a/tests/src/com/android/vcard/tests/test_utils/VCardVerifier.java
+++ b/tests/src/com/android/vcard/tests/test_utils/VCardVerifier.java
@@ -15,15 +15,6 @@
*/
package com.android.vcard.tests.test_utils;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.EntityIterator;
-import android.net.Uri;
-import android.test.AndroidTestCase;
-import android.test.mock.MockContext;
-import android.text.TextUtils;
-import android.util.Log;
-
import com.android.vcard.VCardComposer;
import com.android.vcard.VCardConfig;
import com.android.vcard.VCardEntryConstructor;
@@ -33,6 +24,17 @@ import com.android.vcard.VCardParser;
import com.android.vcard.VCardUtils;
import com.android.vcard.exception.VCardException;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.EntityIterator;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.ContactsContract.Contacts;
+import android.test.AndroidTestCase;
+import android.test.mock.MockContext;
+import android.text.TextUtils;
+import android.util.Log;
+
import junit.framework.TestCase;
import java.io.ByteArrayInputStream;
@@ -55,6 +57,15 @@ import java.util.Arrays;
public class VCardVerifier {
private static final String LOG_TAG = "VCardVerifier";
+ /**
+ * Special URI for testing.
+ */
+ /* package */ static final String VCARD_TEST_AUTHORITY = "com.android.unit_tests.vcard";
+ private static final Uri VCARD_TEST_AUTHORITY_URI =
+ Uri.parse("content://" + VCARD_TEST_AUTHORITY);
+ /* package */ static final Uri CONTACTS_TEST_CONTENT_URI =
+ Uri.withAppendedPath(VCARD_TEST_AUTHORITY_URI, "contacts");
+
private static class CustomMockContext extends MockContext {
final ContentResolver mResolver;
public CustomMockContext(ContentResolver resolver) {
@@ -68,13 +79,16 @@ public class VCardVerifier {
}
private class VCardVerifierInternal implements VCardComposer.OneEntryHandler {
+ @Override
public boolean onInit(Context context) {
return true;
}
+ @Override
public boolean onEntryCreated(String vcard) {
verifyOneVCardForExport(vcard);
return true;
}
+ @Override
public void onTerminate() {
}
}
@@ -344,11 +358,14 @@ public class VCardVerifier {
}
private void verifyForExportTest() {
- final VCardComposer composer =
- new VCardComposer(new CustomMockContext(mExportTestResolver), mVCardType, mCharset);
+ final CustomMockContext context = new CustomMockContext(mExportTestResolver);
+ final ContentResolver resolver = context.getContentResolver();
+ final VCardComposer composer = new VCardComposer(context, mVCardType, mCharset);
+ // projection is ignored.
+ final Cursor cursor = resolver.query(CONTACTS_TEST_CONTENT_URI, null, null, null, null);
composer.addHandler(mLineVerifier);
composer.addHandler(mVCardVerifierInternal);
- if (!composer.init(VCardComposer.CONTACTS_TEST_CONTENT_URI, null, null, null)) {
+ if (!composer.init(cursor)) {
AndroidTestCase.fail("init() failed. Reason: " + composer.getErrorReason());
}
AndroidTestCase.assertFalse(composer.isAfterLast());