Index: chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestBase.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestBase.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestBase.java |
index a138fb42285c69fb0b5e54d514be78f3174df255..8766cc78492295c99777f0dfd1ea611c0d19d32d 100644 |
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestBase.java |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestBase.java |
@@ -4,6 +4,7 @@ |
package org.chromium.chrome.browser.payments; |
+import android.os.Handler; |
import android.view.View; |
import android.view.ViewGroup; |
import android.widget.CheckBox; |
@@ -17,6 +18,7 @@ import org.chromium.chrome.R; |
import org.chromium.chrome.browser.ChromeActivity; |
import org.chromium.chrome.browser.autofill.CardUnmaskPrompt; |
import org.chromium.chrome.browser.autofill.CardUnmaskPrompt.CardUnmaskObserverForTest; |
+import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentAppFactoryAddition; |
import org.chromium.chrome.browser.payments.PaymentRequestImpl.PaymentRequestServiceObserverForTest; |
import org.chromium.chrome.browser.payments.ui.EditorTextField; |
import org.chromium.chrome.browser.payments.ui.PaymentRequestSection.OptionSection; |
@@ -29,8 +31,13 @@ import org.chromium.content.browser.test.util.Criteria; |
import org.chromium.content.browser.test.util.CriteriaHelper; |
import org.chromium.content.browser.test.util.DOMUtils; |
import org.chromium.content_public.browser.WebContents; |
+import org.chromium.mojom.payments.PaymentItem; |
+import org.json.JSONObject; |
+import java.util.ArrayList; |
+import java.util.HashSet; |
import java.util.List; |
+import java.util.Set; |
import java.util.concurrent.Callable; |
import java.util.concurrent.ExecutionException; |
import java.util.concurrent.TimeoutException; |
@@ -42,6 +49,18 @@ import java.util.concurrent.atomic.AtomicReference; |
abstract class PaymentRequestTestBase extends ChromeActivityTestCaseBase<ChromeActivity> |
implements PaymentRequestObserverForTest, PaymentRequestServiceObserverForTest, |
CardUnmaskObserverForTest { |
+ /** Flag for installing a payment app without instruments. */ |
+ protected static final int NO_INSTRUMENTS = 0; |
+ |
+ /** Flag for installing a payment app with instruments. */ |
+ protected static final int HAVE_INSTRUMENTS = 1; |
+ |
+ /** Flag for installing a fast payment app. */ |
+ protected static final int IMMEDIATE_RESPONSE = 0; |
+ |
+ /** Flag for installing a slow payment app. */ |
+ protected static final int DELAYED_RESPONSE = 1; |
+ |
protected final PaymentsCallbackHelper<PaymentRequestUI> mReadyForInput; |
protected final PaymentsCallbackHelper<PaymentRequestUI> mReadyToPay; |
protected final PaymentsCallbackHelper<PaymentRequestUI> mReadyToClose; |
@@ -240,14 +259,23 @@ abstract class PaymentRequestTestBase extends ChromeActivityTestCaseBase<ChromeA |
}); |
} |
+ /** Returns the label corresponding to the payment instrument at the specified |index|. */ |
+ protected String getPaymentInstrumentLabel(final int index) throws ExecutionException { |
+ return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() { |
+ @Override |
+ public String call() { |
+ return ((OptionSection) mUI.getPaymentMethodSectionForTest()) |
+ .getOptionLabelsForTest(index).getText().toString(); |
+ } |
+ }); |
+ } |
+ |
/** |
* Returns the label corresponding to the contact detail suggestion at the specified |
* |suggestionIndex|. |
*/ |
protected String getContactDetailsSuggestionLabel(final int suggestionIndex) |
throws ExecutionException { |
- assert (suggestionIndex < getNumberOfContactDetailSuggestions()); |
- |
return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() { |
@Override |
public String call() { |
@@ -257,9 +285,18 @@ abstract class PaymentRequestTestBase extends ChromeActivityTestCaseBase<ChromeA |
}); |
} |
- /** |
- * Returns the the number of contact detail suggestions, |
- */ |
+ /** Returns the the number of payment instruments. */ |
+ protected int getNumberOfPaymentInstruments() throws ExecutionException { |
+ return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() { |
+ @Override |
+ public Integer call() { |
+ return ((OptionSection) mUI.getPaymentMethodSectionForTest()) |
+ .getNumberOfOptionLabelsForTest(); |
+ } |
+ }); |
+ } |
+ |
+ /** Returns the the number of contact detail suggestions. */ |
protected int getNumberOfContactDetailSuggestions() throws ExecutionException { |
return ThreadUtils.runOnUiThreadBlocking(new Callable<Integer>() { |
@Override |
@@ -528,4 +565,87 @@ abstract class PaymentRequestTestBase extends ChromeActivityTestCaseBase<ChromeA |
notifyCalled(); |
} |
} |
+ |
+ /** |
+ * Installs a payment app for testing. |
+ * |
+ * @param instrumentPresence Whether the app has any payment instruments. Either NO_INSTRUMENTS |
+ * or HAVE_INSTRUMENTS. |
+ * @param responseSpeed How quickly the app will respond to "get instruments" query. Either |
+ * IMMEDIATE_RESPONSE or DELAYED_RESPONSE. |
+ */ |
+ protected void installPaymentApp(final int instrumentPresence, final int responseSpeed) { |
+ PaymentAppFactory.setAdditionalFactory(new PaymentAppFactoryAddition() { |
+ @Override |
+ public List<PaymentApp> create(WebContents webContents) { |
+ List<PaymentApp> additionalApps = new ArrayList<>(); |
+ additionalApps.add(new BobPay(instrumentPresence, responseSpeed)); |
+ return additionalApps; |
+ } |
+ }); |
+ } |
+ |
+ /** A payment app implementation for test. */ |
+ private static class BobPay implements PaymentApp { |
+ private final int mInstrumentPresence; |
+ private final int mResponseSpeed; |
+ |
+ BobPay(int instrumentPresence, int responseSpeed) { |
+ mInstrumentPresence = instrumentPresence; |
+ mResponseSpeed = responseSpeed; |
+ } |
+ |
+ @Override |
+ public void getInstruments(JSONObject details, final InstrumentsCallback |
+ instrumentsCallback) { |
+ final List<PaymentInstrument> instruments = new ArrayList<>(); |
+ if (mInstrumentPresence == HAVE_INSTRUMENTS) instruments.add(new BobPayInstrument()); |
+ Runnable instrumentsReady = new Runnable() { |
+ @Override |
+ public void run() { |
+ ThreadUtils.assertOnUiThread(); |
+ instrumentsCallback.onInstrumentsReady(BobPay.this, instruments); |
+ } |
+ }; |
+ if (mResponseSpeed == IMMEDIATE_RESPONSE) { |
+ instrumentsReady.run(); |
+ } else { |
+ new Handler().postDelayed(instrumentsReady, 100); |
+ } |
+ } |
+ |
+ @Override |
+ public Set<String> getSupportedMethodNames() { |
+ Set<String> methodNames = new HashSet<>(); |
+ methodNames.add("https://bobpay.com"); |
+ return methodNames; |
+ } |
+ |
+ @Override |
+ public String getIdentifier() { |
+ return "https://bobpay.com"; |
+ } |
+ } |
+ |
+ /** A payment instrument implementation for test. */ |
+ private static class BobPayInstrument extends PaymentInstrument { |
+ BobPayInstrument() { |
+ super("https://bobpay.com", "Bob Pay", null, NO_ICON); |
+ } |
+ |
+ @Override |
+ public String getMethodName() { |
+ return "https://bobpay.com"; |
+ } |
+ |
+ @Override |
+ public void getDetails(String merchantName, String origin, PaymentItem total, |
+ List<PaymentItem> cart, JSONObject details, DetailsCallback detailsCallback) { |
+ detailsCallback.onInstrumentDetailsReady( |
+ "https://bobpay.com", "{\"transaction\": 1337}"); |
+ } |
+ |
+ @Override |
+ public void dismiss() {} |
+ } |
} |