Index: chrome/android/javatests_shell/src/org/chromium/chrome/browser/feedback/FeedbackCollectorTest.java |
diff --git a/chrome/android/javatests_shell/src/org/chromium/chrome/browser/feedback/FeedbackCollectorTest.java b/chrome/android/javatests_shell/src/org/chromium/chrome/browser/feedback/FeedbackCollectorTest.java |
index 0d863d3a6f790df7245fdd1a9029a241ef47ada1..9e3362be4da9eb179090872321339c666450c407 100644 |
--- a/chrome/android/javatests_shell/src/org/chromium/chrome/browser/feedback/FeedbackCollectorTest.java |
+++ b/chrome/android/javatests_shell/src/org/chromium/chrome/browser/feedback/FeedbackCollectorTest.java |
@@ -4,6 +4,7 @@ |
package org.chromium.chrome.browser.feedback; |
+import android.app.Activity; |
import android.graphics.Bitmap; |
import android.os.Bundle; |
import android.test.suitebuilder.annotation.SmallTest; |
@@ -14,12 +15,18 @@ import org.chromium.chrome.browser.profiles.Profile; |
import org.chromium.chrome.shell.ChromeShellActivity; |
import org.chromium.chrome.shell.ChromeShellTab; |
import org.chromium.chrome.shell.ChromeShellTestBase; |
+import org.chromium.content.browser.test.util.UiUtils; |
import java.util.HashMap; |
import java.util.Map; |
import java.util.concurrent.Callable; |
+import java.util.concurrent.Semaphore; |
+import java.util.concurrent.TimeUnit; |
+import java.util.concurrent.atomic.AtomicBoolean; |
import java.util.concurrent.atomic.AtomicReference; |
+import javax.annotation.Nullable; |
+ |
/** |
* Test for {@link FeedbackCollector}. |
*/ |
@@ -39,18 +46,51 @@ public class FeedbackCollectorTest extends ChromeShellTestBase { |
* no real tasks are started during creation. |
*/ |
class TestFeedbackCollector extends FeedbackCollector { |
- TestFeedbackCollector(Profile profile, String url) { |
- super(profile, url); |
+ private final AtomicBoolean mTimedOut = new AtomicBoolean(false); |
+ |
+ TestFeedbackCollector( |
+ Activity activity, Profile profile, String url, FeedbackResult callback) { |
+ super(activity, profile, url, callback); |
} |
@Override |
- void init() { |
+ void init(Activity activity) { |
mTestConnectivityTask = |
new TestConnectivityTask(mProfile, CONNECTIVITY_TASK_TIMEOUT_MS, null); |
mConnectivityTask = mTestConnectivityTask; |
} |
@Override |
+ public void onResult(final ConnectivityTask.FeedbackData feedbackData) { |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ TestFeedbackCollector.super.onResult(feedbackData); |
+ } |
+ }); |
+ } |
+ |
+ @Override |
+ public void onGotBitmap(@Nullable final Bitmap bitmap, final boolean success) { |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ TestFeedbackCollector.super.onGotBitmap(bitmap, success); |
+ } |
+ }); |
+ } |
+ |
+ @Override |
+ void maybePostResult() { |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ TestFeedbackCollector.super.maybePostResult(); |
+ } |
+ }); |
+ } |
+ |
+ @Override |
public void add(final String key, final String value) { |
ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
@Override |
@@ -109,6 +149,15 @@ public class FeedbackCollectorTest extends ChromeShellTestBase { |
} |
}); |
} |
+ |
+ @Override |
+ boolean hasTimedOut() { |
+ return mTimedOut.get(); |
+ } |
+ |
+ void setTimedOut(boolean timedOut) { |
+ mTimedOut.set(timedOut); |
+ } |
} |
static class TestConnectivityTask extends ConnectivityTask { |
@@ -150,7 +199,7 @@ public class FeedbackCollectorTest extends ChromeShellTestBase { |
@SmallTest |
@Feature({"Feedback"}) |
public void testGatheringOfData() { |
- mCollector = createCollector("http://www.example.com/"); |
+ mCollector = createCollector("http://www.example.com/", null); |
ConnectivityTask.FeedbackData feedbackData = createFeedbackData(); |
mTestConnectivityTask.setFeedbackData(feedbackData); |
mCollector.setDescription("some description"); |
@@ -166,6 +215,113 @@ public class FeedbackCollectorTest extends ChromeShellTestBase { |
assertEquals(bitmap, mCollector.getScreenshot()); |
} |
+ @SmallTest |
+ @Feature({"Feedback"}) |
+ public void testGatheringOfDataWithCallback() throws InterruptedException { |
+ final Semaphore semaphore = new Semaphore(0); |
+ final AtomicBoolean hasResult = new AtomicBoolean(false); |
+ FeedbackCollector.FeedbackResult callback = new FeedbackCollector.FeedbackResult() { |
+ @Override |
+ public void onResult(FeedbackCollector collector) { |
+ hasResult.set(true); |
+ semaphore.release(); |
+ } |
+ }; |
+ mCollector = createCollector("http://www.example.com/", callback); |
+ assertFalse("Result should not be ready directly after creation.", hasResult.get()); |
+ ConnectivityTask.FeedbackData feedbackData = createFeedbackData(); |
+ mCollector.onResult(feedbackData); |
+ assertFalse("Result should not be ready after connectivity data.", hasResult.get()); |
+ mCollector.setDescription("some description"); |
+ mCollector.add("foo", "bar"); |
+ Bitmap bitmap = createBitmap(); |
+ mCollector.onGotBitmap(bitmap, true); |
+ |
+ // Wait until the callback has been called. |
+ assertTrue("Failed to acquire semaphore.", semaphore.tryAcquire(1, TimeUnit.SECONDS)); |
+ assertTrue("Result should be ready after retrieving all data.", hasResult.get()); |
+ |
+ Bundle bundle = mCollector.getBundle(); |
+ assertEquals("http://www.example.com/", bundle.getString(FeedbackCollector.URL_KEY)); |
+ assertEquals("CONNECTED", bundle.getString(ConnectivityTask.CHROME_HTTPS_KEY)); |
+ assertEquals("some description", mCollector.getDescription()); |
+ assertEquals("bar", bundle.getString("foo")); |
+ assertEquals(bitmap, mCollector.getScreenshot()); |
+ } |
+ |
+ @SmallTest |
+ @Feature({"Feedback"}) |
+ public void testGatheringOfDataTimesOut() throws InterruptedException { |
+ final Semaphore semaphore = new Semaphore(0); |
+ final AtomicBoolean hasResult = new AtomicBoolean(false); |
+ FeedbackCollector.FeedbackResult callback = new FeedbackCollector.FeedbackResult() { |
+ @Override |
+ public void onResult(FeedbackCollector collector) { |
+ hasResult.set(true); |
+ semaphore.release(); |
+ } |
+ }; |
+ mCollector = createCollector(null, callback); |
+ assertFalse("Result should not be ready directly after creation.", hasResult.get()); |
+ ConnectivityTask.FeedbackData feedbackData = createFeedbackData(); |
+ // Set the feedback data on the connectivity task instead of through callback. |
+ mTestConnectivityTask.setFeedbackData(feedbackData); |
+ assertFalse("Result should not be ready after connectivity data.", hasResult.get()); |
+ Bitmap bitmap = createBitmap(); |
+ mCollector.onGotBitmap(bitmap, true); |
+ |
+ // This timeout task should trigger the callback. |
+ mCollector.setTimedOut(true); |
+ mCollector.maybePostResult(); |
+ UiUtils.settleDownUI(getInstrumentation()); |
+ |
+ // Wait until the callback has been called. |
+ assertTrue("Failed to acquire semaphore.", semaphore.tryAcquire(1, TimeUnit.SECONDS)); |
+ assertTrue("Result should be ready after retrieving all data.", hasResult.get()); |
+ |
+ Bundle bundle = mCollector.getBundle(); |
+ assertEquals("CONNECTED", bundle.getString(ConnectivityTask.CHROME_HTTPS_KEY)); |
+ assertEquals(bitmap, mCollector.getScreenshot()); |
+ } |
+ |
+ @SmallTest |
+ @Feature({"Feedback"}) |
+ public void testGatheringOfDataAlwaysWaitForScreenshot() throws InterruptedException { |
+ final Semaphore semaphore = new Semaphore(0); |
+ final AtomicBoolean hasResult = new AtomicBoolean(false); |
+ FeedbackCollector.FeedbackResult callback = new FeedbackCollector.FeedbackResult() { |
+ @Override |
+ public void onResult(FeedbackCollector collector) { |
+ hasResult.set(true); |
+ semaphore.release(); |
+ } |
+ }; |
+ mCollector = createCollector(null, callback); |
+ assertFalse("Result should not be ready directly after creation.", hasResult.get()); |
+ ConnectivityTask.FeedbackData feedbackData = createFeedbackData(); |
+ mCollector.onResult(feedbackData); |
+ assertFalse("Result should not be ready after connectivity data.", hasResult.get()); |
+ |
+ // This timeout task should not trigger the callback. |
+ mCollector.setTimedOut(true); |
+ mCollector.maybePostResult(); |
+ UiUtils.settleDownUI(getInstrumentation()); |
+ assertFalse("Result should not be ready after timeout.", hasResult.get()); |
+ |
+ // Trigger callback by finishing taking the screenshot. |
+ Bitmap bitmap = createBitmap(); |
+ mCollector.onGotBitmap(bitmap, true); |
+ |
+ // Wait until the callback has been called. |
+ assertTrue("Failed to acquire semaphore.", semaphore.tryAcquire(1, TimeUnit.SECONDS)); |
+ assertTrue("Result should be ready after retrieving all data.", hasResult.get()); |
+ |
+ Bundle bundle = mCollector.getBundle(); |
+ // The FeedbackData should have been gathered from the ConnectivityTask directly. |
+ assertEquals("CONNECTED", bundle.getString(ConnectivityTask.CHROME_HTTPS_KEY)); |
+ assertEquals(bitmap, mCollector.getScreenshot()); |
+ } |
+ |
private static ConnectivityTask.FeedbackData createFeedbackData() { |
Map<ConnectivityTask.Type, Integer> connections = new HashMap<>(); |
connections.put(ConnectivityTask.Type.CHROME_HTTPS, ConnectivityCheckResult.CONNECTED); |
@@ -176,11 +332,12 @@ public class FeedbackCollectorTest extends ChromeShellTestBase { |
return Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_4444); |
} |
- private TestFeedbackCollector createCollector(final String url) { |
+ private TestFeedbackCollector createCollector( |
+ final String url, final FeedbackCollector.FeedbackResult callback) { |
return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<TestFeedbackCollector>() { |
@Override |
public TestFeedbackCollector call() { |
- return new TestFeedbackCollector(mProfile, url); |
+ return new TestFeedbackCollector(mActivity, mProfile, url, callback); |
} |
}); |
} |