Restructured unit test folders to support the new build system
This commit is contained in:
parent
8e16ad08c8
commit
b0fdb2e8f1
@ -31,6 +31,8 @@ android {
|
|||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdkVersion 10
|
minSdkVersion 10
|
||||||
targetSdkVersion 18
|
targetSdkVersion 18
|
||||||
|
testPackageName "de.test.antennapod"
|
||||||
|
testInstrumentationRunner "instrumentationTest.de.test.antennapod.AntennaPodTestRunner"
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
@ -43,8 +45,6 @@ android {
|
|||||||
res.srcDirs = ['res']
|
res.srcDirs = ['res']
|
||||||
assets.srcDirs = ['assets']
|
assets.srcDirs = ['assets']
|
||||||
}
|
}
|
||||||
|
|
||||||
instrumentTest.setRoot('tests')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package de.danoeh.antennapod.test;
|
package instrumentationTest.de.test.antennapod.syndication.handler;
|
||||||
|
|
||||||
import java.io.BufferedOutputStream;
|
import java.io.BufferedOutputStream;
|
||||||
import java.io.File;
|
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;
|
int num_retries = 20;
|
||||||
boolean successful = false;
|
boolean successful = false;
|
||||||
|
|
||||||
@ -57,7 +57,9 @@ public class FeedHandlerTest extends AndroidTestCase {
|
|||||||
BufferedOutputStream out = null;
|
BufferedOutputStream out = null;
|
||||||
try {
|
try {
|
||||||
in = getInputStream(feed.getDownload_url());
|
in = getInputStream(feed.getDownload_url());
|
||||||
assertNotNull(in);
|
if (in == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
out = new BufferedOutputStream(new FileOutputStream(
|
out = new BufferedOutputStream(new FileOutputStream(
|
||||||
feed.getFile_url()));
|
feed.getFile_url()));
|
||||||
byte[] buffer = new byte[8 * 1024];
|
byte[] buffer = new byte[8 * 1024];
|
||||||
@ -67,6 +69,7 @@ public class FeedHandlerTest extends AndroidTestCase {
|
|||||||
}
|
}
|
||||||
out.flush();
|
out.flush();
|
||||||
successful = true;
|
successful = true;
|
||||||
|
return true;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} finally {
|
} finally {
|
||||||
@ -84,7 +87,9 @@ public class FeedHandlerTest extends AndroidTestCase {
|
|||||||
if (!successful) {
|
if (!successful) {
|
||||||
Log.e(TAG, "Download failed after " + num_retries + " retries");
|
Log.e(TAG, "Download failed after " + num_retries + " retries");
|
||||||
throw new IOException();
|
throw new IOException();
|
||||||
}
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isFeedValid(Feed feed) {
|
private boolean isFeedValid(Feed feed) {
|
||||||
@ -143,13 +148,13 @@ public class FeedHandlerTest extends AndroidTestCase {
|
|||||||
try {
|
try {
|
||||||
Log.i(TAG, "Testing feed with url " + feed.getDownload_url());
|
Log.i(TAG, "Testing feed with url " + feed.getDownload_url());
|
||||||
FeedHandler handler = new FeedHandler();
|
FeedHandler handler = new FeedHandler();
|
||||||
downloadFeed(feed);
|
if (downloadFeed(feed)) {
|
||||||
handler.parseFeed(feed);
|
handler.parseFeed(feed);
|
||||||
assertTrue(isFeedValid(feed));
|
assertTrue(isFeedValid(feed));
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.e(TAG, "Error when trying to test " + feed.getDownload_url());
|
Log.e(TAG, "Error when trying to test " + feed.getDownload_url());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
fail();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package de.danoeh.antennapod.test;
|
package instrumentationTest.de.test.antennapod.syndication.handler;
|
||||||
|
|
||||||
public class TestFeeds {
|
public class TestFeeds {
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package de.danoeh.antennapod.test;
|
package instrumentationTest.de.test.antennapod.util;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
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 INVALID1 = "ab/c: <abc";
|
||||||
private static final String INVALID2 = "abc abc ";
|
private static final String INVALID2 = "abc abc ";
|
||||||
|
|
||||||
|
public FilenameGeneratorTest() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
public void testGenerateFileName() throws IOException {
|
public void testGenerateFileName() throws IOException {
|
||||||
String result = FileNameGenerator.generateFileName(VALID1);
|
String result = FileNameGenerator.generateFileName(VALID1);
|
||||||
assertEquals(result, VALID1);
|
assertEquals(result, VALID1);
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -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"
|
|
||||||
};
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user