package instrumentationTest.de.test.antennapod.storage;
import android.content.Context;
import android.test.InstrumentationTestCase;
import de.danoeh.antennapodsp.feed.Feed;
import de.danoeh.antennapodsp.feed.FeedItem;
import de.danoeh.antennapodsp.feed.FeedMedia;
import de.danoeh.antennapodsp.storage.DBReader;
import de.danoeh.antennapodsp.storage.PodDBAdapter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import static instrumentationTest.de.test.antennapod.storage.DBTestUtils.saveFeedlist;
/**
* Test class for DBReader
*/
public class DBReaderTest extends InstrumentationTestCase {
@Override
protected void tearDown() throws Exception {
super.tearDown();
final Context context = getInstrumentation().getTargetContext();
assertTrue(PodDBAdapter.deleteDatabase(context));
}
@Override
protected void setUp() throws Exception {
super.setUp();
final Context context = getInstrumentation().getTargetContext();
context.deleteDatabase(PodDBAdapter.DATABASE_NAME);
// make sure database is created
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
adapter.close();
}
private void expiredFeedListTestHelper(long lastUpdate, long expirationTime, boolean shouldReturn) {
final Context context = getInstrumentation().getTargetContext();
Feed feed = new Feed(0, new Date(lastUpdate), "feed", "link", "descr", null,
null, null, null, "feed", null, null, "url", false);
feed.setItems(new ArrayList<FeedItem>());
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
adapter.setCompleteFeed(feed);
adapter.close();
assertTrue(feed.getId() != 0);
List<Feed> expiredFeeds = DBReader.getExpiredFeedsList(context, expirationTime);
assertNotNull(expiredFeeds);
if (shouldReturn) {
assertTrue(expiredFeeds.size() == 1);
assertTrue(expiredFeeds.get(0).getId() == feed.getId());
} else {
assertTrue(expiredFeeds.isEmpty());
}
}
public void testGetExpiredFeedsListShouldReturnFeed() {
final long expirationTime = 1000 * 60 * 60; // 1 hour
expiredFeedListTestHelper(System.currentTimeMillis() - expirationTime - 1, expirationTime, true);
}
public void testGetExpiredFeedsListShouldNotReturnFeed() {
final long expirationTime = 1000 * 60 * 60; // 1 hour
expiredFeedListTestHelper(System.currentTimeMillis() - expirationTime / 2, expirationTime, false);
}
public void testGetFeedList() {
final Context context = getInstrumentation().getTargetContext();
List<Feed> feeds = saveFeedlist(context, 10, 0, false);
List<Feed> savedFeeds = DBReader.getFeedList(context);
assertNotNull(savedFeeds);
assertTrue(savedFeeds.size() == feeds.size());
for (int i = 0; i < feeds.size(); i++) {
assertTrue(savedFeeds.get(i).getId() == feeds.get(i).getId());
}
}
public void testGetFeedListSortOrder() {
final Context context = getInstrumentation().getTargetContext();
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
Feed feed1 = new Feed(0, new Date(), "A", "link", "d", null, null, null, "rss", "A", null, "", "", true);
Feed feed2 = new Feed(0, new Date(), "b", "link", "d", null, null, null, "rss", "b", null, "", "", true);
Feed feed3 = new Feed(0, new Date(), "C", "link", "d", null, null, null, "rss", "C", null, "", "", true);
Feed feed4 = new Feed(0, new Date(), "d", "link", "d", null, null, null, "rss", "d", null, "", "", true);
adapter.setCompleteFeed(feed1);
adapter.setCompleteFeed(feed2);
adapter.setCompleteFeed(feed3);
adapter.setCompleteFeed(feed4);
assertTrue(feed1.getId() != 0);
assertTrue(feed2.getId() != 0);
assertTrue(feed3.getId() != 0);
assertTrue(feed4.getId() != 0);
adapter.close();
List<Feed> saved = DBReader.getFeedList(context);
assertNotNull(saved);
assertEquals("Wrong size: ", 4, saved.size());
assertEquals("Wrong id of feed 1: ", feed1.getId(), saved.get(0).getId());
assertEquals("Wrong id of feed 2: ", feed2.getId(), saved.get(1).getId());
assertEquals("Wrong id of feed 3: ", feed3.getId(), saved.get(2).getId());
assertEquals("Wrong id of feed 4: ", feed4.getId(), saved.get(3).getId());
}
public void testFeedListDownloadUrls() {
final Context context = getInstrumentation().getTargetContext();
List<Feed> feeds = saveFeedlist(context, 10, 0, false);
List<String> urls = DBReader.getFeedListDownloadUrls(context);
assertNotNull(urls);
assertTrue(urls.size() == feeds.size());
for (int i = 0; i < urls.size(); i++) {
assertEquals(urls.get(i), feeds.get(i).getDownload_url());
}
}
public void testLoadFeedDataOfFeedItemlist() {
final Context context = getInstrumentation().getTargetContext();
final int numFeeds = 10;
final int numItems = 1;
List<Feed> feeds = saveFeedlist(context, numFeeds, numItems, false);
List<FeedItem> items = new ArrayList<FeedItem>();
for (Feed f : feeds) {
for (FeedItem item : f.getItems()) {
item.setFeed(null);
item.setFeedId(f.getId());
items.add(item);
}
}
DBReader.loadFeedDataOfFeedItemlist(context, items);
for (int i = 0; i < numFeeds; i++) {
for (int j = 0; j < numItems; j++) {
FeedItem item = feeds.get(i).getItems().get(j);
assertNotNull(item.getFeed());
assertTrue(item.getFeed().getId() == feeds.get(i).getId());
assertTrue(item.getFeedId() == item.getFeed().getId());
}
}
}
public void testGetFeedItemList() {
final Context context = getInstrumentation().getTargetContext();
final int numFeeds = 1;
final int numItems = 10;
Feed feed = saveFeedlist(context, numFeeds, numItems, false).get(0);
List<FeedItem> items = feed.getItems();
feed.setItems(null);
List<FeedItem> savedItems = DBReader.getFeedItemList(context, feed);
assertNotNull(savedItems);
assertTrue(savedItems.size() == items.size());
for (int i = 0; i < savedItems.size(); i++) {
assertTrue(items.get(i).getId() == savedItems.get(i).getId());
}
}
private List<FeedItem> saveQueue(int numItems) {
if (numItems <= 0) {
throw new IllegalArgumentException("numItems<=0");
}
final Context context = getInstrumentation().getTargetContext();
List<Feed> feeds = saveFeedlist(context, numItems, numItems, false);
List<FeedItem> allItems = new ArrayList<FeedItem>();
for (Feed f : feeds) {
allItems.addAll(f.getItems());
}
// take random items from every feed
Random random = new Random();
List<FeedItem> queue = new ArrayList<FeedItem>();
while (queue.size() < numItems) {
int index = random.nextInt(numItems);
if (!queue.contains(allItems.get(index))) {
queue.add(allItems.get(index));
}
}
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
adapter.setQueue(queue);
adapter.close();
return queue;
}
public void testGetQueueIDList() {
final Context context = getInstrumentation().getTargetContext();
final int numItems = 10;
List<FeedItem> queue = saveQueue(numItems);
List<Long> ids = DBReader.getQueueIDList(context);
assertNotNull(ids);
assertTrue(queue.size() == ids.size());
for (int i = 0; i < queue.size(); i++) {
assertTrue(ids.get(i) != 0);
assertTrue(queue.get(i).getId() == ids.get(i));
}
}
public void testGetQueue() {
final Context context = getInstrumentation().getTargetContext();
final int numItems = 10;
List<FeedItem> queue = saveQueue(numItems);
List<FeedItem> savedQueue = DBReader.getQueue(context);
assertNotNull(savedQueue);
assertTrue(queue.size() == savedQueue.size());
for (int i = 0; i < queue.size(); i++) {
assertTrue(savedQueue.get(i).getId() != 0);
assertTrue(queue.get(i).getId() == savedQueue.get(i).getId());
}
}
private List<FeedItem> saveDownloadedItems(int numItems) {
if (numItems <= 0) {
throw new IllegalArgumentException("numItems<=0");
}
final Context context = getInstrumentation().getTargetContext();
List<Feed> feeds = saveFeedlist(context, numItems, numItems, true);
List<FeedItem> items = new ArrayList<FeedItem>();
for (Feed f : feeds) {
items.addAll(f.getItems());
}
List<FeedItem> downloaded = new ArrayList<FeedItem>();
Random random = new Random();
while (downloaded.size() < numItems) {
int i = random.nextInt(numItems);
if (!downloaded.contains(items.get(i))) {
FeedItem item = items.get(i);
item.getMedia().setDownloaded(true);
item.getMedia().setFile_url("file" + i);
downloaded.add(item);
}
}
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
adapter.setFeedItemlist(downloaded);
adapter.close();
return downloaded;
}
public void testGetDownloadedItems() {
final Context context = getInstrumentation().getTargetContext();
final int numItems = 10;
List<FeedItem> downloaded = saveDownloadedItems(numItems);
List<FeedItem> downloaded_saved = DBReader.getDownloadedItems(context);
assertNotNull(downloaded_saved);
assertTrue(downloaded_saved.size() == downloaded.size());
for (FeedItem item : downloaded_saved) {
assertNotNull(item.getMedia());
assertTrue(item.getMedia().isDownloaded());
assertNotNull(item.getMedia().getDownload_url());
}
}
private List<FeedItem> saveUnreadItems(int numItems) {
if (numItems <= 0) {
throw new IllegalArgumentException("numItems<=0");
}
final Context context = getInstrumentation().getTargetContext();
List<Feed> feeds = saveFeedlist(context, numItems, numItems, true);
List<FeedItem> items = new ArrayList<FeedItem>();
for (Feed f : feeds) {
items.addAll(f.getItems());
}
List<FeedItem> unread = new ArrayList<FeedItem>();
Random random = new Random();
while (unread.size() < numItems) {
int i = random.nextInt(numItems);
if (!unread.contains(items.get(i))) {
FeedItem item = items.get(i);
item.setRead(false);
unread.add(item);
}
}
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
adapter.setFeedItemlist(unread);
adapter.close();
return unread;
}
public void testGetUnreadItemsList() {
final Context context = getInstrumentation().getTargetContext();
final int numItems = 10;
List<FeedItem> unread = saveUnreadItems(numItems);
List<FeedItem> unreadSaved = DBReader.getUnreadItemsList(context);
assertNotNull(unreadSaved);
assertTrue(unread.size() == unreadSaved.size());
for (FeedItem item : unreadSaved) {
assertFalse(item.isRead());
}
}
public void testGetUnreadItemIds() {
final Context context = getInstrumentation().getTargetContext();
final int numItems = 10;
List<FeedItem> unread = saveUnreadItems(numItems);
long[] unreadIds = new long[unread.size()];
for (int i = 0; i < unread.size(); i++) {
unreadIds[i] = unread.get(i).getId();
}
long[] unreadSaved = DBReader.getUnreadItemIds(context);
assertNotNull(unreadSaved);
assertTrue(unread.size() == unreadSaved.length);
for (long savedId : unreadSaved) {
boolean found = false;
for (long id : unreadIds) {
if (id == savedId) {
found = true;
break;
}
}
assertTrue(found);
}
}
public void testGetPlaybackHistory() {
final Context context = getInstrumentation().getTargetContext();
final int numItems = 10;
final int playedItems = 5;
final int numFeeds = 1;
Feed feed = DBTestUtils.saveFeedlist(context, numFeeds, numItems, true).get(0);
long[] ids = new long[playedItems];
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
for (int i = 0; i < playedItems; i++) {
FeedMedia m = feed.getItems().get(i).getMedia();
m.setPlaybackCompletionDate(new Date(i + 1));
adapter.setFeedMediaPlaybackCompletionDate(m);
ids[ids.length - 1 - i] = m.getItem().getId();
}
adapter.close();
List<FeedItem> saved = DBReader.getPlaybackHistory(context);
assertNotNull(saved);
assertEquals("Wrong size: ", playedItems, saved.size());
for (int i = 0; i < playedItems; i++) {
FeedItem item = saved.get(i);
assertNotNull(item.getMedia().getPlaybackCompletionDate());
assertEquals("Wrong sort order: ", item.getId(), ids[i]);
}
}
}