Add a unit test for handleOneRequestSimple().

Bug: 2733143

Change-Id: I40af33e7d5b4df8100a494de18dc0002368d79c2
diff --git a/src/com/android/contacts/vcard/ExportVCardActivity.java b/src/com/android/contacts/vcard/ExportVCardActivity.java
index 43ae858..fbe6d48 100644
--- a/src/com/android/contacts/vcard/ExportVCardActivity.java
+++ b/src/com/android/contacts/vcard/ExportVCardActivity.java
@@ -18,9 +18,7 @@
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.app.ProgressDialog;
 import android.content.ComponentName;
-import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -28,23 +26,17 @@
 import android.content.res.Resources;
 import android.net.Uri;
 import android.os.Bundle;
-import android.os.Handler;
 import android.os.IBinder;
 import android.os.Message;
 import android.os.Messenger;
-import android.os.PowerManager;
 import android.os.RemoteException;
 import android.text.TextUtils;
 import android.util.Log;
 
 import com.android.contacts.R;
 import com.android.vcard.VCardComposer;
-import com.android.vcard.VCardConfig;
 
 import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.Queue;
diff --git a/src/com/android/contacts/vcard/ImportProcessor.java b/src/com/android/contacts/vcard/ImportProcessor.java
index 6f765f9..427d62d 100644
--- a/src/com/android/contacts/vcard/ImportProcessor.java
+++ b/src/com/android/contacts/vcard/ImportProcessor.java
@@ -101,7 +101,9 @@
             return new VCardEntryCommitter(mResolver);
         }
     }
-    /* package */ CommitterGenerator mCommitterGenerator = new DefaultCommitterGenerator();
+
+    private CommitterGenerator mCommitterGenerator =
+        new DefaultCommitterGenerator();
 
     public ImportProcessor(final Context context) {
         mContext = context;
@@ -124,7 +126,7 @@
         }
     }
 
-    public synchronized void pushRequest(ImportRequest parameter) {
+    public synchronized void pushRequest(final ImportRequest request) {
         ensureInit();
 
         final boolean needThreadStart;
@@ -137,11 +139,11 @@
         } else {
             needThreadStart = false;
         }
-        final int count = parameter.entryCount;
+        final int count = request.entryCount;
         if (count > 0) {
             mNotifier.addTotalCount(count);
         }
-        mPendingRequests.add(parameter);
+        mPendingRequests.add(request);
         if (needThreadStart) {
             mThreadStarter.start();
         }
@@ -188,14 +190,14 @@
     /**
      * Would be run inside synchronized block.
      */
-    /* package */ boolean handleOneRequest(final ImportRequest parameter) {
+    /* package */ boolean handleOneRequest(final ImportRequest request) {
         if (mCanceled) {
             Log.i(LOG_TAG, "Canceled before actually handling parameter ("
-                    + parameter.uri + ")");
+                    + request.uri + ")");
             return false;
         }
         final int[] possibleVCardVersions;
-        if (parameter.vcardVersion == ImportVCardActivity.VCARD_VERSION_AUTO_DETECT) {
+        if (request.vcardVersion == ImportVCardActivity.VCARD_VERSION_AUTO_DETECT) {
             /**
              * Note: this code assumes that a given Uri is able to be opened more than once,
              * which may not be true in certain conditions.
@@ -206,14 +208,14 @@
             };
         } else {
             possibleVCardVersions = new int[] {
-                    parameter.vcardVersion
+                    request.vcardVersion
             };
         }
 
-        final Uri uri = parameter.uri;
-        final Account account = parameter.account;
-        final int estimatedVCardType = parameter.estimatedVCardType;
-        final String estimatedCharset = parameter.estimatedCharset;
+        final Uri uri = request.uri;
+        final Account account = request.account;
+        final int estimatedVCardType = request.estimatedVCardType;
+        final String estimatedCharset = request.estimatedCharset;
 
         final VCardEntryConstructor constructor =
                 new VCardEntryConstructor(estimatedVCardType, account, estimatedCharset);
@@ -360,11 +362,20 @@
         }
     }
 
-    public List<Uri> getCreatedUris() {
+    public List<Uri> getCreatedUrisForTest() {
         return mCreatedUris;
     }
 
-    public List<Uri> getFailedUris() {
+    public List<Uri> getFailedUrisForTest() {
         return mFailedUris;
     }
-}
\ No newline at end of file
+
+    public void injectCommitterGeneratorForTest(
+            final CommitterGenerator generator) {
+        mCommitterGenerator = generator;
+    }
+
+    public void initNotifierForTest() {
+        mNotifier.init(mContext, mNotificationManager);
+    }
+}
diff --git a/src/com/android/contacts/vcard/ImportProgressNotifier.java b/src/com/android/contacts/vcard/ImportProgressNotifier.java
index e6f1037..23987c7 100644
--- a/src/com/android/contacts/vcard/ImportProgressNotifier.java
+++ b/src/com/android/contacts/vcard/ImportProgressNotifier.java
@@ -20,6 +20,7 @@
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
+import android.util.Log;
 import android.widget.RemoteViews;
 
 import com.android.contacts.ContactsListActivity;
@@ -40,6 +41,7 @@
 
     public void init(Context context, NotificationManager notificationManager) {
         mContext = context;
+        Log.d("@@@", "context: " + mContext);
         mNotificationManager = notificationManager;
     }
 
@@ -58,7 +60,8 @@
         //   we don't need to hurry to show something.
 
         // TODO: should not create this every time?
-        final RemoteViews remoteViews = new RemoteViews(mContext.getPackageName(),
+        final RemoteViews remoteViews =
+                new RemoteViews(mContext.getPackageName(),
                 R.layout.status_bar_ongoing_event_progress_bar);
 
         final String title = mContext.getString(R.string.reading_vcard_title);
@@ -76,9 +79,13 @@
         remoteViews.setTextViewText(R.id.description, description);
         remoteViews.setProgressBar(R.id.progress_bar, mTotalCount, mCurrentCount,
                 mTotalCount == -1);
-        final String percentage =
-                mContext.getString(R.string.percentage,
-                        String.valueOf(mCurrentCount * 100/mTotalCount));
+        final String percentage;
+        if (mTotalCount > 0) {
+            percentage = mContext.getString(R.string.percentage,
+                    String.valueOf(mCurrentCount * 100/mTotalCount));
+        } else {
+            percentage = "";
+        }
 
         remoteViews.setTextViewText(R.id.progress_text, percentage);
         remoteViews.setImageViewResource(R.id.appIcon, android.R.drawable.stat_sys_download);
diff --git a/tests/assets/v30_simple.vcf b/tests/assets/v30_simple.vcf
new file mode 100644
index 0000000..418661f
--- /dev/null
+++ b/tests/assets/v30_simple.vcf
@@ -0,0 +1,13 @@
+BEGIN:VCARD

+VERSION:3.0

+FN:And Roid

+N:And;Roid;;;

+ORG:Open;Handset; Alliance

+SORT-STRING:android

+TEL;TYPE=PREF;TYPE=VOICE:0300000000

+CLASS:PUBLIC

+X-GNO:0

+X-GN:group0

+X-REDUCTION:0

+REV:20081031T065854Z

+END:VCARD

diff --git a/tests/src/com/android/contacts/vcard/ImportProcessorTest.java b/tests/src/com/android/contacts/vcard/ImportProcessorTest.java
index 543dce9..72245ba 100644
--- a/tests/src/com/android/contacts/vcard/ImportProcessorTest.java
+++ b/tests/src/com/android/contacts/vcard/ImportProcessorTest.java
@@ -22,6 +22,8 @@
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.contacts.vcard.ImportProcessor.CommitterGenerator;
+import com.android.vcard.VCardEntryCommitter;
 import com.android.vcard.VCardInterpreter;
 import com.android.vcard.VCardSourceDetector;
 
@@ -100,7 +102,7 @@
     }
 
     /**
-     * Confirm {@link ImportProcessor#readOneVCard(android.net.Uri, int, String,
+     * Confirms {@link ImportProcessor#readOneVCard(android.net.Uri, int, String,
      * com.android.vcard.VCardInterpreter, int[])} successfully handles correct input.
      */
     public void testProcessSimple() throws IOException {
@@ -115,39 +117,64 @@
         assertTrue(mImportProcessor.readOneVCard(
                 uri, vcardType, charset, interpreter, versions));
     }
+
+    /**
+     * Confirms {@link ImportProcessor#handleOneRequest(ImportRequest)} accepts
+     * one request and import it.
+     */
+    public void testHandleOneRequestSimple() throws IOException {
+        CommitterGenerator generator = new CommitterGenerator() {
+            public VCardEntryCommitter generate(ContentResolver resolver) {
+                return new MockVCardEntryCommitter();
+            }
+        };
+        mImportProcessor.injectCommitterGeneratorForTest(generator);
+        mImportProcessor.initNotifierForTest();
+
+        final ImportRequest request = new ImportRequest(
+                null,  // account
+                copyToLocal("v30_simple.vcf"),
+                VCardSourceDetector.PARSE_TYPE_UNKNOWN,
+                null,  // estimatedCharset
+                ImportVCardActivity.VCARD_VERSION_AUTO_DETECT,
+                1);
+        assertTrue(mImportProcessor.handleOneRequest(request));
+        assertEquals(1, mImportProcessor.getCreatedUrisForTest().size());
+    }
 }
 
 /* package */ class EmptyVCardInterpreter implements VCardInterpreter {
+    @Override
     public void end() {
     }
-
+    @Override
     public void endEntry() {
     }
-
+    @Override
     public void endProperty() {
     }
-
+    @Override
     public void propertyGroup(String group) {
     }
-
+    @Override
     public void propertyName(String name) {
     }
-
+    @Override
     public void propertyParamType(String type) {
     }
-
+    @Override
     public void propertyParamValue(String value) {
     }
-
+    @Override
     public void propertyValues(List<String> values) {
     }
-
+    @Override
     public void start() {
     }
-
+    @Override
     public void startEntry() {
     }
-
+    @Override
     public void startProperty() {
     }
-}
\ No newline at end of file
+}
diff --git a/tests/src/com/android/contacts/vcard/MockVCardEntryCommitter.java b/tests/src/com/android/contacts/vcard/MockVCardEntryCommitter.java
new file mode 100644
index 0000000..4765b38
--- /dev/null
+++ b/tests/src/com/android/contacts/vcard/MockVCardEntryCommitter.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.contacts.vcard;
+
+import android.net.Uri;
+
+import com.android.vcard.VCardEntry;
+import com.android.vcard.VCardEntryCommitter;
+
+import java.util.ArrayList;
+
+public class MockVCardEntryCommitter extends VCardEntryCommitter {
+
+    private final ArrayList<Uri> mUris = new ArrayList<Uri>(); 
+
+    public MockVCardEntryCommitter() {
+        super(null);
+    }
+
+    /**
+     * Exists for forcing super class to do nothing.
+     */
+    @Override
+    public void onStart() {
+    }
+
+    /**
+     * Exists for forcing super class to do nothing.
+     */
+    @Override
+    public void onEnd() {
+    }
+
+    @Override
+    public void onEntryCreated(final VCardEntry vcardEntry) {
+        mUris.add(null);
+    }
+
+    @Override
+    public ArrayList<Uri> getCreatedUris() {
+        return mUris;
+    }
+}
\ No newline at end of file