Restructured unit test folders to support the new build system

This commit is contained in:
daniel oeh 2013-08-11 12:52:41 +02:00
parent 8e16ad08c8
commit b0fdb2e8f1
8 changed files with 182 additions and 118 deletions

View File

@ -31,6 +31,8 @@ android {
defaultConfig {
minSdkVersion 10
targetSdkVersion 18
testPackageName "de.test.antennapod"
testInstrumentationRunner "instrumentationTest.de.test.antennapod.AntennaPodTestRunner"
}
sourceSets {
@ -43,8 +45,6 @@ android {
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
instrumentTest.setRoot('tests')
}
buildTypes {

View File

@ -0,0 +1,17 @@
package instrumentationTest.de.test.antennapod;
import android.test.InstrumentationTestRunner;
import android.test.suitebuilder.TestSuiteBuilder;
import android.util.Log;
import instrumentationTest.de.test.antennapod.service.download.HttpDownloaderTest;
import instrumentationTest.de.test.antennapod.util.FilenameGeneratorTest;
import junit.framework.TestSuite;
public class AntennaPodTestRunner extends InstrumentationTestRunner {
@Override
public TestSuite getAllTests() {
return new TestSuiteBuilder(AntennaPodTestRunner.class).includeAllPackagesUnderHere().build();
}
}

View File

@ -0,0 +1,144 @@
package instrumentationTest.de.test.antennapod.service.download;
import java.io.File;
import de.danoeh.antennapod.feed.FeedFile;
import de.danoeh.antennapod.service.download.*;
import android.test.AndroidTestCase;
import android.util.Log;
public class HttpDownloaderTest extends AndroidTestCase {
private static final String TAG = "HttpDownloaderTest";
private static final String DOWNLOAD_DIR = "testdownloads";
private static boolean successful = true;
public HttpDownloaderTest() {
super();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
File externalDir = getContext().getExternalFilesDir(DOWNLOAD_DIR);
assertNotNull(externalDir);
File[] contents = externalDir.listFiles();
for (File f : contents) {
assertTrue(f.delete());
}
}
private FeedFileImpl setupFeedFile(String downloadUrl, String title) {
FeedFileImpl feedfile = new FeedFileImpl(downloadUrl);
String fileUrl = new File(getContext().getExternalFilesDir(DOWNLOAD_DIR).getAbsolutePath(), title).getAbsolutePath();
File file = new File(fileUrl);
Log.d(TAG, "Deleting file: " + file.delete());
feedfile.setFile_url(fileUrl);
return feedfile;
}
private void download(String url, String title, boolean expectedResult) {
FeedFile feedFile = setupFeedFile(url, title);
DownloadRequest request = new DownloadRequest(feedFile.getFile_url(), url, title, 0, feedFile.getTypeAsInt());
Downloader downloader = new HttpDownloader(request);
downloader.call();
DownloadStatus status = downloader.getResult();
assertNotNull(status);
assertTrue(status.isSuccessful() == expectedResult);
assertTrue(status.isDone());
assertTrue(new File(feedFile.getFile_url()).exists());
}
public void testRandomUrls() {
final String[] urls = {
"http://radiobox.omroep.nl/programme/read_programme_podcast/9168/read.rss",
"http://content.zdf.de/podcast/zdf_heute/heute_a.xml",
"http://rss.sciam.com/sciam/60secsciencepodcast",
"http://rss.sciam.com/sciam/60-second-mind",
"http://rss.sciam.com/sciam/60-second-space",
"http://rss.sciam.com/sciam/60-second-health",
"http://rss.sciam.com/sciam/60-second-tech",
"http://risky.biz/feeds/risky-business",
"http://risky.biz/feeds/rb2",
"http://podcast.hr-online.de/lateline/podcast.xml",
"http://bitlove.org/nsemak/mikrodilettanten/feed",
"http://bitlove.org/moepmoeporg/riotburnz/feed",
"http://bitlove.org/moepmoeporg/schachcast/feed",
"http://bitlove.org/moepmoeporg/sundaymoaning/feed",
"http://bitlove.org/motofunk/anekdotkast/feed",
"http://bitlove.org/motofunk/motofunk/feed",
"http://bitlove.org/nerdinand/zch/feed",
"http://podcast.homerj.de/podcasts.xml",
"http://www.dradio.de/rss/podcast/sendungen/wissenschaftundbildung/",
"http://www.dradio.de/rss/podcast/sendungen/wirtschaftundverbraucher/",
"http://www.dradio.de/rss/podcast/sendungen/literatur/",
"http://www.dradio.de/rss/podcast/sendungen/sport/",
"http://www.dradio.de/rss/podcast/sendungen/wirtschaftundgesellschaft/",
"http://www.dradio.de/rss/podcast/sendungen/filmederwoche/",
"http://www.blacksweetstories.com/feed/podcast/",
"http://feeds.5by5.tv/buildanalyze",
"http://bitlove.org/ranzzeit/ranz/feed"
};
for (int i = 0; i < urls.length; i++) {
download(urls[i], Integer.toString(i), true);
}
}
public void testRedirect() {
download("http://httpbin.org/redirect/4", "testRedirect", true);
}
public void testRelativeRedirect() {
download("http://httpbin.org/relative-redirect/4", "testRelativeRedirect", true);
}
public void testGzip() {
download("http://httpbin.org/gzip", "testGzip", true);
}
public void test404() {
download("http://httpbin.org/status/404", "test404", false);
}
public void testCancel() {
final String url = "http://httpbin.org/delay/3";
FeedFileImpl feedFile = setupFeedFile(url, "delay");
final Downloader downloader = new HttpDownloader(new DownloadRequest(feedFile.getFile_url(), url, "delay", 0, feedFile.getTypeAsInt()));
Thread t = new Thread() {
@Override
public void run() {
downloader.call();
}
};
downloader.cancel();
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
DownloadStatus result = downloader.getResult();
assertTrue(result.isDone());
assertFalse(result.isSuccessful());
assertTrue(result.isCancelled());
assertFalse(new File(feedFile.getFile_url()).exists());
}
private static class FeedFileImpl extends FeedFile {
public FeedFileImpl(String download_url) {
super(null, download_url, false);
}
@Override
public String getHumanReadableIdentifier() {
return download_url;
}
@Override
public int getTypeAsInt() {
return 0;
}
}
}

View File

@ -1,4 +1,4 @@
package de.danoeh.antennapod.test;
package instrumentationTest.de.test.antennapod.syndication.handler;
import java.io.BufferedOutputStream;
import java.io.File;
@ -48,7 +48,7 @@ public class FeedHandlerTest extends AndroidTestCase {
}
}
private void downloadFeed(Feed feed) throws IOException {
private boolean downloadFeed(Feed feed) throws IOException {
int num_retries = 20;
boolean successful = false;
@ -57,7 +57,9 @@ public class FeedHandlerTest extends AndroidTestCase {
BufferedOutputStream out = null;
try {
in = getInputStream(feed.getDownload_url());
assertNotNull(in);
if (in == null) {
return false;
}
out = new BufferedOutputStream(new FileOutputStream(
feed.getFile_url()));
byte[] buffer = new byte[8 * 1024];
@ -67,6 +69,7 @@ public class FeedHandlerTest extends AndroidTestCase {
}
out.flush();
successful = true;
return true;
} catch (IOException e) {
e.printStackTrace();
} finally {
@ -84,7 +87,9 @@ public class FeedHandlerTest extends AndroidTestCase {
if (!successful) {
Log.e(TAG, "Download failed after " + num_retries + " retries");
throw new IOException();
}
} else {
return true;
}
}
private boolean isFeedValid(Feed feed) {
@ -143,13 +148,13 @@ public class FeedHandlerTest extends AndroidTestCase {
try {
Log.i(TAG, "Testing feed with url " + feed.getDownload_url());
FeedHandler handler = new FeedHandler();
downloadFeed(feed);
handler.parseFeed(feed);
assertTrue(isFeedValid(feed));
if (downloadFeed(feed)) {
handler.parseFeed(feed);
assertTrue(isFeedValid(feed));
}
} catch (Exception e) {
Log.e(TAG, "Error when trying to test " + feed.getDownload_url());
e.printStackTrace();
fail();
}
}

View File

@ -1,4 +1,4 @@
package de.danoeh.antennapod.test;
package instrumentationTest.de.test.antennapod.syndication.handler;
public class TestFeeds {

View File

@ -1,4 +1,4 @@
package de.danoeh.antennapod.test;
package instrumentationTest.de.test.antennapod.util;
import java.io.File;
import java.io.IOException;
@ -12,6 +12,10 @@ public class FilenameGeneratorTest extends AndroidTestCase {
private static final String INVALID1 = "ab/c: <abc";
private static final String INVALID2 = "abc abc ";
public FilenameGeneratorTest() {
super();
}
public void testGenerateFileName() throws IOException {
String result = FileNameGenerator.generateFileName(VALID1);
assertEquals(result, VALID1);

View File

@ -1,70 +0,0 @@
package de.danoeh.antennapod.test;
import java.io.File;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.service.download.DownloadStatus;
import de.danoeh.antennapod.service.download.Downloader;
import de.danoeh.antennapod.service.download.DownloaderCallback;
import de.danoeh.antennapod.service.download.HttpDownloader;
import android.test.AndroidTestCase;
import android.util.Log;
public class HttpDownloaderTest extends AndroidTestCase {
private static final String TAG = "HttpDownloaderTest";
private static final String DOWNLOAD_DIR = "testdownloads";
private static boolean successful = true;
private static ExecutorService es;
private static DownloaderCallback downloaderCallback = new DownloaderCallback() {
@Override
public void onDownloadCompleted(Downloader downloader) {
DownloadStatus status = downloader.getStatus();
if (status != null) {
final String downloadUrl = status.getFeedFile().getDownload_url();
final String fileUrl = status.getFeedFile().getFile_url();
new File(fileUrl).delete();
if (status.isSuccessful()) {
Log.i(TAG, "Download successful: " + downloadUrl);
} else {
Log.e(TAG, "Download not successful: " + status.toString());
successful = false;
}
} else {
Log.wtf(TAG, "Status was null");
successful = false;
}
if (successful == false) {
es.shutdownNow();
}
}
};
public void testDownload() throws InterruptedException {
es = Executors.newFixedThreadPool(5);
int i = 0;
for (String url : TestDownloads.urls) {
Feed feed = new Feed(url, new Date());
String fileUrl = new File(getContext().getExternalFilesDir(DOWNLOAD_DIR).getAbsolutePath(), Integer.toString(i)).getAbsolutePath();
File file = new File(fileUrl);
Log.d(TAG, "Deleting file: " + file.delete());
feed.setFile_url(fileUrl);
DownloadStatus status = new DownloadStatus(feed, Integer.toString(i));
Downloader downloader = new HttpDownloader(downloaderCallback, status);
es.submit(downloader);
i++;
}
Log.i(TAG, "Awaiting termination");
es.shutdown();
es.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
assertTrue(successful);
}
}

View File

@ -1,36 +0,0 @@
package de.danoeh.antennapod.test;
public class TestDownloads {
public static final String[] urls = {
"http://httpbin.org/redirect/4",
"http://httpbin.org/relative-redirect/4",
"http://jigsaw.w3.org/HTTP/300/307.html",
"http://radiobox.omroep.nl/programme/read_programme_podcast/9168/read.rss",
"http://content.zdf.de/podcast/zdf_heute/heute_a.xml",
"http://rss.sciam.com/sciam/60secsciencepodcast",
"http://rss.sciam.com/sciam/60-second-mind",
"http://rss.sciam.com/sciam/60-second-space",
"http://rss.sciam.com/sciam/60-second-health",
"http://rss.sciam.com/sciam/60-second-tech",
"http://risky.biz/feeds/risky-business",
"http://risky.biz/feeds/rb2",
"http://podcast.hr-online.de/lateline/podcast.xml",
"http://bitlove.org/nsemak/mikrodilettanten/feed",
"http://bitlove.org/moepmoeporg/riotburnz/feed",
"http://bitlove.org/moepmoeporg/schachcast/feed",
"http://bitlove.org/moepmoeporg/sundaymoaning/feed",
"http://bitlove.org/motofunk/anekdotkast/feed",
"http://bitlove.org/motofunk/motofunk/feed",
"http://bitlove.org/nerdinand/zch/feed",
"http://podcast.homerj.de/podcasts.xml",
"http://www.dradio.de/rss/podcast/sendungen/wissenschaftundbildung/",
"http://www.dradio.de/rss/podcast/sendungen/wirtschaftundverbraucher/",
"http://www.dradio.de/rss/podcast/sendungen/literatur/",
"http://www.dradio.de/rss/podcast/sendungen/sport/",
"http://www.dradio.de/rss/podcast/sendungen/wirtschaftundgesellschaft/",
"http://www.dradio.de/rss/podcast/sendungen/filmederwoche/",
"http://www.blacksweetstories.com/feed/podcast/",
"http://feeds.5by5.tv/buildanalyze",
"http://bitlove.org/ranzzeit/ranz/feed"
};
}