Merge pull request #691 from mfietz/issue/app-tests

Fixes non-working app tests, especially GUI tests
This commit is contained in:
Tom Hennen 2015-03-25 20:24:38 -04:00
commit f5a824ce1b
6 changed files with 81 additions and 35 deletions

View File

@ -2,7 +2,12 @@ package de.test.antennapod.service.download;
import android.test.InstrumentationTestCase; import android.test.InstrumentationTestCase;
import android.util.Log; import android.util.Log;
import java.io.File;
import java.io.IOException;
import de.danoeh.antennapod.core.feed.FeedFile; import de.danoeh.antennapod.core.feed.FeedFile;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.service.download.DownloadRequest; import de.danoeh.antennapod.core.service.download.DownloadRequest;
import de.danoeh.antennapod.core.service.download.DownloadStatus; import de.danoeh.antennapod.core.service.download.DownloadStatus;
import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.service.download.Downloader;
@ -10,9 +15,6 @@ import de.danoeh.antennapod.core.service.download.HttpDownloader;
import de.danoeh.antennapod.core.util.DownloadError; import de.danoeh.antennapod.core.util.DownloadError;
import de.test.antennapod.util.service.download.HTTPBin; import de.test.antennapod.util.service.download.HTTPBin;
import java.io.File;
import java.io.IOException;
public class HttpDownloaderTest extends InstrumentationTestCase { public class HttpDownloaderTest extends InstrumentationTestCase {
private static final String TAG = "HttpDownloaderTest"; private static final String TAG = "HttpDownloaderTest";
private static final String DOWNLOAD_DIR = "testdownloads"; private static final String DOWNLOAD_DIR = "testdownloads";
@ -41,6 +43,7 @@ public class HttpDownloaderTest extends InstrumentationTestCase {
@Override @Override
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
UserPreferences.createInstance(getInstrumentation().getTargetContext());
destDir = getInstrumentation().getTargetContext().getExternalFilesDir(DOWNLOAD_DIR); destDir = getInstrumentation().getTargetContext().getExternalFilesDir(DOWNLOAD_DIR);
assertNotNull(destDir); assertNotNull(destDir);
assertTrue(destDir.exists()); assertTrue(destDir.exists());
@ -90,7 +93,7 @@ public class HttpDownloaderTest extends InstrumentationTestCase {
} }
public void testGzip() { public void testGzip() {
download("http://httpbin.org/gzip", "testGzip", true); download(HTTPBin.BASE_URL + "/gzip/100", "testGzip", true);
} }
public void test404() { public void test404() {

View File

@ -3,12 +3,13 @@ package de.test.antennapod.ui;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.test.ActivityInstrumentationTestCase2; import android.test.ActivityInstrumentationTestCase2;
import android.view.View; import android.widget.ListView;
import com.robotium.solo.Solo; import com.robotium.solo.Solo;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.DefaultOnlineFeedViewActivity; import de.danoeh.antennapod.activity.DefaultOnlineFeedViewActivity;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.activity.PreferenceActivityGingerbread;
import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.core.storage.PodDBAdapter;
import de.danoeh.antennapod.preferences.PreferenceController; import de.danoeh.antennapod.preferences.PreferenceController;
@ -49,10 +50,14 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv
super.tearDown(); super.tearDown();
} }
private void openNavDrawer() {
solo.clickOnScreen(50, 50);
}
public void testAddFeed() throws Exception { public void testAddFeed() throws Exception {
uiTestUtils.addHostedFeedData(); uiTestUtils.addHostedFeedData();
final Feed feed = uiTestUtils.hostedFeeds.get(0); final Feed feed = uiTestUtils.hostedFeeds.get(0);
solo.setNavigationDrawer(Solo.OPENED); openNavDrawer();
solo.clickOnText(solo.getString(R.string.add_feed_label)); solo.clickOnText(solo.getString(R.string.add_feed_label));
solo.enterText(0, feed.getDownload_url()); solo.enterText(0, feed.getDownload_url());
solo.clickOnButton(0); solo.clickOnButton(0);
@ -65,39 +70,43 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv
public void testClickNavDrawer() throws Exception { public void testClickNavDrawer() throws Exception {
uiTestUtils.addLocalFeedData(false); uiTestUtils.addLocalFeedData(false);
final View home = solo.getView(UITestUtils.HOME_VIEW);
// all episodes // all episodes
openNavDrawer();
solo.clickOnText(solo.getString(R.string.all_episodes_label));
solo.waitForView(android.R.id.list); solo.waitForView(android.R.id.list);
assertEquals(solo.getString(R.string.all_episodes_label), getActionbarTitle()); assertEquals(solo.getString(R.string.all_episodes_label), getActionbarTitle());
// queue // queue
solo.clickOnView(home); openNavDrawer();
solo.clickOnText(solo.getString(R.string.queue_label)); solo.clickOnText(solo.getString(R.string.queue_label));
solo.waitForView(android.R.id.list); solo.waitForView(android.R.id.list);
assertEquals(solo.getString(R.string.queue_label), getActionbarTitle()); assertEquals(solo.getString(R.string.queue_label), getActionbarTitle());
// downloads // downloads
solo.clickOnView(home); openNavDrawer();
solo.clickOnText(solo.getString(R.string.downloads_label)); solo.clickOnText(solo.getString(R.string.downloads_label));
solo.waitForView(android.R.id.list); solo.waitForView(android.R.id.list);
assertEquals(solo.getString(R.string.downloads_label), getActionbarTitle()); assertEquals(solo.getString(R.string.downloads_label), getActionbarTitle());
// playback history // playback history
solo.clickOnView(home); openNavDrawer();
solo.clickOnText(solo.getString(R.string.playback_history_label)); solo.clickOnText(solo.getString(R.string.playback_history_label));
solo.waitForView(android.R.id.list); solo.waitForView(android.R.id.list);
assertEquals(solo.getString(R.string.playback_history_label), getActionbarTitle()); assertEquals(solo.getString(R.string.playback_history_label), getActionbarTitle());
// add podcast // add podcast
solo.clickOnView(home); openNavDrawer();
solo.clickOnText(solo.getString(R.string.add_feed_label)); solo.clickOnText(solo.getString(R.string.add_feed_label));
solo.waitForView(R.id.txtvFeedurl); solo.waitForView(R.id.txtvFeedurl);
assertEquals(solo.getString(R.string.add_feed_label), getActionbarTitle()); assertEquals(solo.getString(R.string.add_feed_label), getActionbarTitle());
// podcasts // podcasts
ListView list = (ListView)solo.getView(R.id.nav_list);
for (int i = 0; i < uiTestUtils.hostedFeeds.size(); i++) { for (int i = 0; i < uiTestUtils.hostedFeeds.size(); i++) {
Feed f = uiTestUtils.hostedFeeds.get(i); Feed f = uiTestUtils.hostedFeeds.get(i);
solo.clickOnView(home); solo.clickOnScreen(50, 50); // open nav drawer
solo.scrollListToLine(list, i);
solo.clickOnText(f.getTitle()); solo.clickOnText(f.getTitle());
solo.waitForView(android.R.id.list); solo.waitForView(android.R.id.list);
assertEquals("", getActionbarTitle()); assertEquals("", getActionbarTitle());
@ -109,7 +118,7 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv
} }
public void testGoToPreferences() { public void testGoToPreferences() {
solo.setNavigationDrawer(Solo.CLOSED); openNavDrawer();
solo.clickOnMenuItem(solo.getString(R.string.settings_label)); solo.clickOnMenuItem(solo.getString(R.string.settings_label));
solo.waitForActivity(PreferenceController.getPreferenceActivity()); solo.waitForActivity(PreferenceController.getPreferenceActivity());
} }

View File

@ -5,7 +5,11 @@ import android.content.SharedPreferences;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.test.ActivityInstrumentationTestCase2; import android.test.ActivityInstrumentationTestCase2;
import android.widget.TextView; import android.widget.TextView;
import com.robotium.solo.Solo; import com.robotium.solo.Solo;
import java.util.List;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.AudioplayerActivity; import de.danoeh.antennapod.activity.AudioplayerActivity;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.activity.MainActivity;
@ -16,8 +20,6 @@ import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.core.storage.PodDBAdapter;
import java.util.List;
/** /**
* Test cases for starting and ending playback from the MainActivity and AudioPlayerActivity * Test cases for starting and ending playback from the MainActivity and AudioPlayerActivity
*/ */
@ -40,6 +42,7 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity>
PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getTargetContext()); PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getTargetContext());
adapter.open(); adapter.open();
adapter.close(); adapter.close();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getInstrumentation().getTargetContext()); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getInstrumentation().getTargetContext());
prefs.edit().putBoolean(UserPreferences.PREF_UNPAUSE_ON_HEADSET_RECONNECT, false).commit(); prefs.edit().putBoolean(UserPreferences.PREF_UNPAUSE_ON_HEADSET_RECONNECT, false).commit();
prefs.edit().putBoolean(UserPreferences.PREF_PAUSE_ON_HEADSET_DISCONNECT, false).commit(); prefs.edit().putBoolean(UserPreferences.PREF_PAUSE_ON_HEADSET_DISCONNECT, false).commit();
@ -59,6 +62,10 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity>
super.tearDown(); super.tearDown();
} }
private void openNavDrawer() {
solo.clickOnScreen(50, 50);
}
private void setContinuousPlaybackPreference(boolean value) { private void setContinuousPlaybackPreference(boolean value) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getInstrumentation().getTargetContext()); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getInstrumentation().getTargetContext());
prefs.edit().putBoolean(UserPreferences.PREF_FOLLOW_QUEUE, value).commit(); prefs.edit().putBoolean(UserPreferences.PREF_FOLLOW_QUEUE, value).commit();
@ -71,7 +78,9 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity>
private void startLocalPlayback() { private void startLocalPlayback() {
assertTrue(solo.waitForActivity(MainActivity.class)); assertTrue(solo.waitForActivity(MainActivity.class));
solo.setNavigationDrawer(Solo.CLOSED); openNavDrawer();
solo.clickOnText(solo.getString(R.string.all_episodes_label));
solo.waitForView(android.R.id.list);
solo.clickOnView(solo.getView(R.id.butSecondaryAction)); solo.clickOnView(solo.getView(R.id.butSecondaryAction));
assertTrue(solo.waitForActivity(AudioplayerActivity.class)); assertTrue(solo.waitForActivity(AudioplayerActivity.class));
assertTrue(solo.waitForView(solo.getView(R.id.butPlay))); assertTrue(solo.waitForView(solo.getView(R.id.butPlay)));
@ -79,10 +88,10 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity>
private void startLocalPlaybackFromQueue() { private void startLocalPlaybackFromQueue() {
assertTrue(solo.waitForActivity(MainActivity.class)); assertTrue(solo.waitForActivity(MainActivity.class));
solo.clickOnView(solo.getView(UITestUtils.HOME_VIEW)); openNavDrawer();
solo.clickOnText(solo.getString(R.string.queue_label)); solo.clickOnText(solo.getString(R.string.queue_label));
assertTrue(solo.waitForView(solo.getView(R.id.butSecondaryAction))); assertTrue(solo.waitForView(solo.getView(R.id.butSecondaryAction)));
solo.clickOnImageButton(0); solo.clickOnImageButton(1);
assertTrue(solo.waitForActivity(AudioplayerActivity.class)); assertTrue(solo.waitForActivity(AudioplayerActivity.class));
assertTrue(solo.waitForView(solo.getView(R.id.butPlay))); assertTrue(solo.waitForView(solo.getView(R.id.butPlay)));
} }
@ -108,7 +117,7 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity>
setContinuousPlaybackPreference(false); setContinuousPlaybackPreference(false);
uiTestUtils.addLocalFeedData(true); uiTestUtils.addLocalFeedData(true);
List<FeedItem> queue = DBReader.getQueue(getInstrumentation().getTargetContext()); List<FeedItem> queue = DBReader.getQueue(getInstrumentation().getTargetContext());
FeedItem second = queue.get(1); FeedItem second = queue.get(0);
startLocalPlaybackFromQueue(); startLocalPlaybackFromQueue();
assertTrue(solo.waitForText(second.getTitle())); assertTrue(solo.waitForText(second.getTitle()));
@ -147,4 +156,6 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity>
public void testReplayEpisodeContinuousPlaybackOff() throws Exception { public void testReplayEpisodeContinuousPlaybackOff() throws Exception {
replayEpisodeCheck(false); replayEpisodeCheck(false);
} }
} }

View File

@ -5,12 +5,8 @@ import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.os.Build; import android.os.Build;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.feed.*;
import de.danoeh.antennapod.core.storage.PodDBAdapter;
import de.test.antennapod.util.service.download.HTTPBin;
import de.test.antennapod.util.syndication.feedgenerator.RSS2Generator;
import junit.framework.Assert; import junit.framework.Assert;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -23,6 +19,16 @@ import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.feed.EventDistributor;
import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.feed.FeedImage;
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.feed.FeedMedia;
import de.danoeh.antennapod.core.storage.PodDBAdapter;
import de.test.antennapod.util.service.download.HTTPBin;
import de.test.antennapod.util.syndication.feedgenerator.RSS2Generator;
/** /**
* Utility methods for UI tests. * Utility methods for UI tests.
* Starts a web server that hosts feeds, episodes and images. * Starts a web server that hosts feeds, episodes and images.
@ -174,7 +180,8 @@ public class UITestUtils {
feed.setDownloaded(true); feed.setDownloaded(true);
if (feed.getImage() != null) { if (feed.getImage() != null) {
FeedImage image = feed.getImage(); FeedImage image = feed.getImage();
image.setFile_url(image.getDownload_url()); int fileId = Integer.parseInt(StringUtils.substringAfter(image.getDownload_url(), "files/"));
image.setFile_url(server.accessFile(fileId).getAbsolutePath());
image.setDownloaded(true); image.setDownloaded(true);
} }
if (downloadEpisodes) { if (downloadEpisodes) {

View File

@ -2,15 +2,28 @@ package de.test.antennapod.util.service.download;
import android.util.Base64; import android.util.Base64;
import android.util.Log; import android.util.Log;
import de.danoeh.antennapod.BuildConfig;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.io.*; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLConnection; import java.net.URLConnection;
import java.util.*; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.zip.GZIPOutputStream; import java.util.zip.GZIPOutputStream;
import de.danoeh.antennapod.BuildConfig;
/** /**
* Http server for testing purposes * Http server for testing purposes
* <p/> * <p/>
@ -264,7 +277,7 @@ public class HTTPBin extends NanoHTTPD {
private Response getGzippedResponse(int size) throws IOException { private Response getGzippedResponse(int size) throws IOException {
try { try {
Thread.sleep(5000); Thread.sleep(200);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -272,14 +285,15 @@ public class HTTPBin extends NanoHTTPD {
Random random = new Random(System.currentTimeMillis()); Random random = new Random(System.currentTimeMillis());
random.nextBytes(buffer); random.nextBytes(buffer);
ByteArrayOutputStream compressed = new ByteArrayOutputStream(); ByteArrayOutputStream compressed = new ByteArrayOutputStream(buffer.length);
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(compressed); GZIPOutputStream gzipOutputStream = new GZIPOutputStream(compressed);
gzipOutputStream.write(buffer); gzipOutputStream.write(buffer);
gzipOutputStream.close();
InputStream inputStream = new ByteArrayInputStream(compressed.toByteArray()); InputStream inputStream = new ByteArrayInputStream(compressed.toByteArray());
Response response = new Response(Response.Status.OK, MIME_PLAIN, inputStream); Response response = new Response(Response.Status.OK, MIME_PLAIN, inputStream);
response.addHeader("Content-encoding", "gzip"); response.addHeader("Content-Encoding", "gzip");
response.addHeader("Content-length", String.valueOf(compressed.size())); response.addHeader("Content-Length", String.valueOf(compressed.size()));
return response; return response;
} }

View File

@ -2,10 +2,10 @@ package de.danoeh.antennapod.core.feed;
import android.net.Uri; import android.net.Uri;
import de.danoeh.antennapod.core.asynctask.PicassoImageResource;
import java.io.File; import java.io.File;
import de.danoeh.antennapod.core.asynctask.PicassoImageResource;
public class FeedImage extends FeedFile implements PicassoImageResource { public class FeedImage extends FeedFile implements PicassoImageResource {
public static final int FEEDFILETYPE_FEEDIMAGE = 1; public static final int FEEDFILETYPE_FEEDIMAGE = 1;
@ -65,6 +65,8 @@ public class FeedImage extends FeedFile implements PicassoImageResource {
public Uri getImageUri() { public Uri getImageUri() {
if (file_url != null && downloaded) { if (file_url != null && downloaded) {
return Uri.fromFile(new File(file_url)); return Uri.fromFile(new File(file_url));
} else if(download_url != null) {
return Uri.parse(download_url);
} else { } else {
return null; return null;
} }