diff options
5 files changed, 193 insertions, 12 deletions
diff --git a/src/de/danoeh/antennapod/storage/DBTasks.java b/src/de/danoeh/antennapod/storage/DBTasks.java index b1efda658..741699bdf 100644 --- a/src/de/danoeh/antennapod/storage/DBTasks.java +++ b/src/de/danoeh/antennapod/storage/DBTasks.java @@ -406,12 +406,13 @@ public final class DBTasks { private static int performAutoCleanup(final Context context, final int episodeNumber) { - List<FeedItem> candidates = DBReader.getDownloadedItems(context); - List<FeedItem> queue = DBReader.getQueue(context); + List<FeedItem> candidates = new ArrayList<FeedItem>(); + List<FeedItem> downloadedItems = DBReader.getDownloadedItems(context); + QueueAccess queue = QueueAccess.IDListAccess(DBReader.getQueueIDList(context)); List<FeedItem> delete; - for (FeedItem item : candidates) { + for (FeedItem item : downloadedItems) { if (item.hasMedia() && item.getMedia().isDownloaded() - && !queue.contains(item) && item.isRead()) { + && !queue.contains(item.getId()) && item.isRead()) { candidates.add(item); } @@ -440,7 +441,13 @@ public final class DBTasks { } for (FeedItem item : delete) { - DBWriter.deleteFeedMediaOfItem(context, item.getId()); + try { + DBWriter.deleteFeedMediaOfItem(context, item.getId()).get(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } } int counter = delete.size(); diff --git a/src/de/danoeh/antennapod/storage/PodDBAdapter.java b/src/de/danoeh/antennapod/storage/PodDBAdapter.java index 317035017..5799c6896 100644 --- a/src/de/danoeh/antennapod/storage/PodDBAdapter.java +++ b/src/de/danoeh/antennapod/storage/PodDBAdapter.java @@ -278,6 +278,13 @@ public class PodDBAdapter { //db.close(); } + public static boolean deleteDatabase(Context context) { + Log.w(TAG, "Deleting database"); + dbHelperSingleton.close(); + dbHelperSingleton = null; + return context.deleteDatabase(DATABASE_NAME); + } + /** * Inserts or updates a feed entry * @@ -763,7 +770,7 @@ public class PodDBAdapter { final String query = "SELECT " + SEL_FI_SMALL_STR + " FROM " + TABLE_NAME_FEED_ITEMS + " INNER JOIN " + TABLE_NAME_FEED_MEDIA + " ON " + TABLE_NAME_FEED_ITEMS + "." + KEY_ID + "=" - + TABLE_NAME_FEED_MEDIA + "." + KEY_ID + " WHERE " + + TABLE_NAME_FEED_MEDIA + "." + KEY_FEEDITEM + " WHERE " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOADED + ">0"; Cursor c = db.rawQuery(query, null); return c; diff --git a/src/instrumentationTest/de/test/antennapod/service/download/HttpDownloaderTest.java b/src/instrumentationTest/de/test/antennapod/service/download/HttpDownloaderTest.java index f91592869..8df35ce67 100644 --- a/src/instrumentationTest/de/test/antennapod/service/download/HttpDownloaderTest.java +++ b/src/instrumentationTest/de/test/antennapod/service/download/HttpDownloaderTest.java @@ -2,18 +2,21 @@ package instrumentationTest.de.test.antennapod.service.download; import java.io.File; +import android.test.InstrumentationTestCase; 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 { +public class HttpDownloaderTest extends InstrumentationTestCase { private static final String TAG = "HttpDownloaderTest"; private static final String DOWNLOAD_DIR = "testdownloads"; private static boolean successful = true; + private File destDir; + public HttpDownloaderTest() { super(); } @@ -21,17 +24,23 @@ public class HttpDownloaderTest extends AndroidTestCase { @Override protected void tearDown() throws Exception { super.tearDown(); - File externalDir = getContext().getExternalFilesDir(DOWNLOAD_DIR); - assertNotNull(externalDir); - File[] contents = externalDir.listFiles(); + File[] contents = destDir.listFiles(); for (File f : contents) { assertTrue(f.delete()); } } + @Override + protected void setUp() throws Exception { + super.setUp(); + destDir = getInstrumentation().getTargetContext().getExternalFilesDir(DOWNLOAD_DIR); + assertNotNull(destDir); + assertTrue(destDir.exists()); + } + private FeedFileImpl setupFeedFile(String downloadUrl, String title) { FeedFileImpl feedfile = new FeedFileImpl(downloadUrl); - String fileUrl = new File(getContext().getExternalFilesDir(DOWNLOAD_DIR).getAbsolutePath(), title).getAbsolutePath(); + String fileUrl = new File(destDir, title).getAbsolutePath(); File file = new File(fileUrl); Log.d(TAG, "Deleting file: " + file.delete()); feedfile.setFile_url(fileUrl); diff --git a/src/instrumentationTest/de/test/antennapod/storage/DBTasksTest.java b/src/instrumentationTest/de/test/antennapod/storage/DBTasksTest.java index ef48b8d5f..6dd9ef92b 100644 --- a/src/instrumentationTest/de/test/antennapod/storage/DBTasksTest.java +++ b/src/instrumentationTest/de/test/antennapod/storage/DBTasksTest.java @@ -1,9 +1,167 @@ package instrumentationTest.de.test.antennapod.storage; +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; import android.test.InstrumentationTestCase; +import de.danoeh.antennapod.feed.Feed; +import de.danoeh.antennapod.feed.FeedItem; +import de.danoeh.antennapod.feed.FeedMedia; +import de.danoeh.antennapod.preferences.UserPreferences; +import de.danoeh.antennapod.storage.DBTasks; +import de.danoeh.antennapod.storage.PodDBAdapter; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; /** * Test class for DBTasks */ public class DBTasksTest extends InstrumentationTestCase { + private static final String TEST_FOLDER = "testDBTasks"; + private static final int EPISODE_CACHE_SIZE = 5; + + private File destFolder; + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + final Context context = getInstrumentation().getTargetContext(); + assertTrue(PodDBAdapter.deleteDatabase(context)); + + for (File f : destFolder.listFiles()) { + assertTrue(f.delete()); + } + assertTrue(destFolder.delete()); + + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + destFolder = getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER); + assertNotNull(destFolder); + assertTrue(destFolder.exists()); + assertTrue(destFolder.canWrite()); + + final Context context = getInstrumentation().getTargetContext(); + context.deleteDatabase(PodDBAdapter.DATABASE_NAME); + // make sure database is created + PodDBAdapter adapter = new PodDBAdapter(context); + adapter.open(); + adapter.close(); + + SharedPreferences.Editor prefEdit = PreferenceManager.getDefaultSharedPreferences(getInstrumentation().getTargetContext().getApplicationContext()).edit(); + prefEdit.putString(UserPreferences.PREF_EPISODE_CACHE_SIZE, Integer.toString(EPISODE_CACHE_SIZE)); + prefEdit.commit(); + } + + public void testPerformAutoCleanupShouldDelete() throws IOException { + final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; + + Feed feed = new Feed("url", new Date(), "title"); + List<FeedItem> items = new ArrayList<FeedItem>(); + feed.setItems(items); + List<File> files = new ArrayList<File>(); + for (int i = 0; i < NUM_ITEMS; i++) { + FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), true, feed); + + File f = new File(destFolder, "file " + i); + assertTrue(f.createNewFile()); + files.add(f); + item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, new Date(NUM_ITEMS - i))); + items.add(item); + } + + PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getTargetContext()); + adapter.open(); + adapter.setCompleteFeed(feed); + adapter.close(); + + assertTrue(feed.getId() != 0); + for (FeedItem item : items) { + assertTrue(item.getId() != 0); + assertTrue(item.getMedia().getId() != 0); + } + DBTasks.performAutoCleanup(getInstrumentation().getTargetContext()); + for (int i = 0; i < files.size(); i++) { + if (i < EPISODE_CACHE_SIZE) { + assertTrue(files.get(i).exists()); + } else { + assertFalse(files.get(i).exists()); + } + } + } + + public void testPerformAutoCleanupShouldNotDeleteBecauseUnread() throws IOException { + final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; + + Feed feed = new Feed("url", new Date(), "title"); + List<FeedItem> items = new ArrayList<FeedItem>(); + feed.setItems(items); + List<File> files = new ArrayList<File>(); + for (int i = 0; i < NUM_ITEMS; i++) { + FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), false, feed); + + File f = new File(destFolder, "file " + i); + assertTrue(f.createNewFile()); + assertTrue(f.exists()); + files.add(f); + item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, new Date(NUM_ITEMS - i))); + items.add(item); + } + + PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getTargetContext()); + adapter.open(); + adapter.setCompleteFeed(feed); + adapter.close(); + + assertTrue(feed.getId() != 0); + for (FeedItem item : items) { + assertTrue(item.getId() != 0); + assertTrue(item.getMedia().getId() != 0); + } + DBTasks.performAutoCleanup(getInstrumentation().getTargetContext()); + for (File file : files) { + assertTrue(file.exists()); + } + } + + public void testPerformAutoCleanupShouldNotDeleteBecauseInQueue() throws IOException { + final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; + + Feed feed = new Feed("url", new Date(), "title"); + List<FeedItem> items = new ArrayList<FeedItem>(); + feed.setItems(items); + List<File> files = new ArrayList<File>(); + for (int i = 0; i < NUM_ITEMS; i++) { + FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), true, feed); + + File f = new File(destFolder, "file " + i); + assertTrue(f.createNewFile()); + assertTrue(f.exists()); + files.add(f); + item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, new Date(NUM_ITEMS - i))); + items.add(item); + } + + PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getTargetContext()); + adapter.open(); + adapter.setCompleteFeed(feed); + adapter.setQueue(items); + adapter.close(); + + assertTrue(feed.getId() != 0); + for (FeedItem item : items) { + assertTrue(item.getId() != 0); + assertTrue(item.getMedia().getId() != 0); + } + DBTasks.performAutoCleanup(getInstrumentation().getTargetContext()); + for (File file : files) { + assertTrue(file.exists()); + } + } } diff --git a/src/instrumentationTest/de/test/antennapod/storage/DBWriterTest.java b/src/instrumentationTest/de/test/antennapod/storage/DBWriterTest.java index 37fff1de7..04ec265d7 100644 --- a/src/instrumentationTest/de/test/antennapod/storage/DBWriterTest.java +++ b/src/instrumentationTest/de/test/antennapod/storage/DBWriterTest.java @@ -31,7 +31,7 @@ public class DBWriterTest extends InstrumentationTestCase { protected void tearDown() throws Exception { super.tearDown(); final Context context = getInstrumentation().getTargetContext(); - context.deleteDatabase(PodDBAdapter.DATABASE_NAME); + assertTrue(PodDBAdapter.deleteDatabase(getInstrumentation().getTargetContext())); File testDir = context.getExternalFilesDir(TEST_FOLDER); assertNotNull(testDir); |