diff options
author | ByteHamster <ByteHamster@users.noreply.github.com> | 2022-10-23 12:10:07 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-23 12:10:07 +0200 |
commit | cac231a461c11f64eae3284553d6b69f6f65a052 (patch) | |
tree | 41f489afc026da647c13860193c788031e5b9dfc /core/src/test/java | |
parent | e6613807c08e74433424883ff0e6f30c50f66fc6 (diff) | |
parent | c7e41c31b61e830eabf4df6eeb06d86d36939d97 (diff) | |
download | AntennaPod-cac231a461c11f64eae3284553d6b69f6f65a052.zip |
Merge pull request #6153 from ByteHamster/fast-document-file
Speed up local folder refresh
Diffstat (limited to 'core/src/test/java')
-rw-r--r-- | core/src/test/java/androidx/documentfile/provider/AssetsDocumentFile.java | 138 | ||||
-rw-r--r-- | core/src/test/java/de/danoeh/antennapod/core/feed/LocalFeedUpdaterTest.java | 98 |
2 files changed, 39 insertions, 197 deletions
diff --git a/core/src/test/java/androidx/documentfile/provider/AssetsDocumentFile.java b/core/src/test/java/androidx/documentfile/provider/AssetsDocumentFile.java deleted file mode 100644 index 8a8205c10..000000000 --- a/core/src/test/java/androidx/documentfile/provider/AssetsDocumentFile.java +++ /dev/null @@ -1,138 +0,0 @@ -package androidx.documentfile.provider; - -import android.content.res.AssetManager; -import android.net.Uri; -import android.webkit.MimeTypeMap; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import java.io.IOException; - -/** - * <p>Wraps an Android assets file or folder as a DocumentFile object.</p> - * - * <p>This is used to emulate access to the external storage.</p> - */ -public class AssetsDocumentFile extends DocumentFile { - - /** - * Absolute file path in the assets folder. - */ - @NonNull - private final String fileName; - - @NonNull - private final AssetManager assetManager; - - public AssetsDocumentFile(@NonNull String fileName, @NonNull AssetManager assetManager) { - super(null); - this.fileName = fileName; - this.assetManager = assetManager; - } - - @Nullable - @Override - public DocumentFile createFile(@NonNull String mimeType, @NonNull String displayName) { - return null; - } - - @Nullable - @Override - public DocumentFile createDirectory(@NonNull String displayName) { - return null; - } - - @NonNull - @Override - public Uri getUri() { - return Uri.parse(fileName); - } - - @Nullable - @Override - public String getName() { - int pos = fileName.indexOf('/'); - if (pos >= 0) { - return fileName.substring(pos + 1); - } else { - return fileName; - } - } - - @Nullable - @Override - public String getType() { - String extension = MimeTypeMap.getFileExtensionFromUrl(fileName); - return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); - } - - @Override - public boolean isDirectory() { - return false; - } - - @Override - public boolean isFile() { - return true; - } - - @Override - public boolean isVirtual() { - return false; - } - - @Override - public long lastModified() { - return 0; - } - - @Override - public long length() { - return 0; - } - - @Override - public boolean canRead() { - return true; - } - - @Override - public boolean canWrite() { - return false; - } - - @Override - public boolean delete() { - return false; - } - - @Override - public boolean exists() { - return true; - } - - @NonNull - @Override - public DocumentFile[] listFiles() { - try { - String[] files = assetManager.list(fileName); - if (files == null) { - return new DocumentFile[0]; - } - DocumentFile[] result = new DocumentFile[files.length]; - for (int i = 0; i < files.length; i++) { - String subFileName = fileName + '/' + files[i]; - result[i] = new AssetsDocumentFile(subFileName, assetManager); - } - return result; - } catch (IOException e) { - return new DocumentFile[0]; - } - } - - @Override - public boolean renameTo(@NonNull String displayName) { - return false; - } -} diff --git a/core/src/test/java/de/danoeh/antennapod/core/feed/LocalFeedUpdaterTest.java b/core/src/test/java/de/danoeh/antennapod/core/feed/LocalFeedUpdaterTest.java index 05b0584ed..4cf746ba4 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/feed/LocalFeedUpdaterTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/feed/LocalFeedUpdaterTest.java @@ -7,11 +7,10 @@ import android.net.Uri; import android.webkit.MimeTypeMap; import androidx.annotation.NonNull; -import androidx.documentfile.provider.AssetsDocumentFile; -import androidx.documentfile.provider.DocumentFile; import androidx.test.platform.app.InstrumentationRegistry; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; +import de.danoeh.antennapod.core.util.FastDocumentFile; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.storage.database.PodDBAdapter; @@ -24,11 +23,12 @@ import org.mockito.Mockito; import org.robolectric.RobolectricTestRunner; import org.robolectric.shadows.ShadowMediaMetadataRetriever; -import java.io.IOException; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.Objects; import de.danoeh.antennapod.core.ApplicationCallbacks; import de.danoeh.antennapod.core.ClientConfig; @@ -60,8 +60,8 @@ public class LocalFeedUpdaterTest { */ private static final String FEED_URL = "content://com.android.externalstorage.documents/tree/primary%3ADownload%2Flocal-feed"; - private static final String LOCAL_FEED_DIR1 = "local-feed1"; - private static final String LOCAL_FEED_DIR2 = "local-feed2"; + private static final String LOCAL_FEED_DIR1 = "src/test/assets/local-feed1"; + private static final String LOCAL_FEED_DIR2 = "src/test/assets/local-feed2"; private Context context; @@ -172,74 +172,61 @@ public class LocalFeedUpdaterTest { Feed feed = verifySingleFeedInDatabase(); List<FeedItem> feedItems = DBReader.getFeedItemList(feed); - FeedItem feedItem = feedItems.get(0); - - assertEquals("track1.mp3", feedItem.getTitle()); - - Date pubDate = feedItem.getPubDate(); - Calendar calendar = GregorianCalendar.getInstance(); - calendar.setTime(pubDate); - assertEquals(2020, calendar.get(Calendar.YEAR)); - assertEquals(6 - 1, calendar.get(Calendar.MONTH)); - assertEquals(1, calendar.get(Calendar.DAY_OF_MONTH)); - assertEquals(22, calendar.get(Calendar.HOUR_OF_DAY)); - assertEquals(23, calendar.get(Calendar.MINUTE)); - assertEquals(24, calendar.get(Calendar.SECOND)); + assertEquals("track1.mp3", feedItems.get(0).getTitle()); } @Test public void testGetImageUrl_EmptyFolder() { - DocumentFile documentFolder = mockDocumentFolder(); - String imageUrl = LocalFeedUpdater.getImageUrl(documentFolder); + String imageUrl = LocalFeedUpdater.getImageUrl(Collections.emptyList(), Uri.EMPTY); assertThat(imageUrl, startsWith(Feed.PREFIX_GENERATIVE_COVER)); } @Test public void testGetImageUrl_NoImageButAudioFiles() { - DocumentFile documentFolder = mockDocumentFolder(mockDocumentFile("audio.mp3", "audio/mp3")); - String imageUrl = LocalFeedUpdater.getImageUrl(documentFolder); + List<FastDocumentFile> folder = Collections.singletonList(mockDocumentFile("audio.mp3", "audio/mp3")); + String imageUrl = LocalFeedUpdater.getImageUrl(folder, Uri.EMPTY); assertThat(imageUrl, startsWith(Feed.PREFIX_GENERATIVE_COVER)); } @Test public void testGetImageUrl_PreferredImagesFilenames() { for (String filename : LocalFeedUpdater.PREFERRED_FEED_IMAGE_FILENAMES) { - DocumentFile documentFolder = mockDocumentFolder(mockDocumentFile("audio.mp3", "audio/mp3"), + List<FastDocumentFile> folder = Arrays.asList(mockDocumentFile("audio.mp3", "audio/mp3"), mockDocumentFile(filename, "image/jpeg")); // image MIME type doesn't matter - String imageUrl = LocalFeedUpdater.getImageUrl(documentFolder); + String imageUrl = LocalFeedUpdater.getImageUrl(folder, Uri.EMPTY); assertThat(imageUrl, endsWith(filename)); } } @Test public void testGetImageUrl_OtherImageFilenameJpg() { - DocumentFile documentFolder = mockDocumentFolder(mockDocumentFile("audio.mp3", "audio/mp3"), + List<FastDocumentFile> folder = Arrays.asList(mockDocumentFile("audio.mp3", "audio/mp3"), mockDocumentFile("my-image.jpg", "image/jpeg")); - String imageUrl = LocalFeedUpdater.getImageUrl(documentFolder); + String imageUrl = LocalFeedUpdater.getImageUrl(folder, Uri.EMPTY); assertThat(imageUrl, endsWith("my-image.jpg")); } @Test public void testGetImageUrl_OtherImageFilenameJpeg() { - DocumentFile documentFolder = mockDocumentFolder(mockDocumentFile("audio.mp3", "audio/mp3"), + List<FastDocumentFile> folder = Arrays.asList(mockDocumentFile("audio.mp3", "audio/mp3"), mockDocumentFile("my-image.jpeg", "image/jpeg")); - String imageUrl = LocalFeedUpdater.getImageUrl(documentFolder); + String imageUrl = LocalFeedUpdater.getImageUrl(folder, Uri.EMPTY); assertThat(imageUrl, endsWith("my-image.jpeg")); } @Test public void testGetImageUrl_OtherImageFilenamePng() { - DocumentFile documentFolder = mockDocumentFolder(mockDocumentFile("audio.mp3", "audio/mp3"), + List<FastDocumentFile> folder = Arrays.asList(mockDocumentFile("audio.mp3", "audio/mp3"), mockDocumentFile("my-image.png", "image/png")); - String imageUrl = LocalFeedUpdater.getImageUrl(documentFolder); + String imageUrl = LocalFeedUpdater.getImageUrl(folder, Uri.EMPTY); assertThat(imageUrl, endsWith("my-image.png")); } @Test public void testGetImageUrl_OtherImageFilenameUnsupportedMimeType() { - DocumentFile documentFolder = mockDocumentFolder(mockDocumentFile("audio.mp3", "audio/mp3"), + List<FastDocumentFile> folder = Arrays.asList(mockDocumentFile("audio.mp3", "audio/mp3"), mockDocumentFile("my-image.svg", "image/svg+xml")); - String imageUrl = LocalFeedUpdater.getImageUrl(documentFolder); + String imageUrl = LocalFeedUpdater.getImageUrl(folder, Uri.EMPTY); assertThat(imageUrl, startsWith(Feed.PREFIX_GENERATIVE_COVER)); } @@ -248,9 +235,8 @@ public class LocalFeedUpdaterTest { * * @param localFeedDir assets local feed folder with media files */ - private void mapDummyMetadata(@NonNull String localFeedDir) throws IOException { - String[] fileNames = context.getAssets().list(localFeedDir); - for (String fileName : fileNames) { + private void mapDummyMetadata(@NonNull String localFeedDir) { + for (String fileName : Objects.requireNonNull(new File(localFeedDir).list())) { String path = localFeedDir + '/' + fileName; ShadowMediaMetadataRetriever.addMetadata(path, MediaMetadataRetriever.METADATA_KEY_DURATION, "10"); @@ -259,24 +245,21 @@ public class LocalFeedUpdaterTest { ShadowMediaMetadataRetriever.addMetadata(path, MediaMetadataRetriever.METADATA_KEY_DATE, "20200601T222324"); } - } /** - * Calls the method {@link LocalFeedUpdater#updateFeed(Feed, Context)} with - * the given local feed folder. + * Calls the method LocalFeedUpdater#tryUpdateFeed with the given local feed folder. * * @param localFeedDir assets local feed folder with media files */ private void callUpdateFeed(@NonNull String localFeedDir) { - DocumentFile documentFile = new AssetsDocumentFile(localFeedDir, context.getAssets()); - try (MockedStatic<DocumentFile> dfMock = Mockito.mockStatic(DocumentFile.class)) { + try (MockedStatic<FastDocumentFile> dfMock = Mockito.mockStatic(FastDocumentFile.class)) { // mock external storage - dfMock.when(() -> DocumentFile.fromTreeUri(any(), any())).thenReturn(documentFile); + dfMock.when(() -> FastDocumentFile.list(any(), any())).thenReturn(mockLocalFolder(localFeedDir)); // call method to test Feed feed = new Feed(FEED_URL, null); - LocalFeedUpdater.updateFeed(feed, context, null); + LocalFeedUpdater.tryUpdateFeed(feed, context, null, null); } } @@ -306,21 +289,18 @@ public class LocalFeedUpdaterTest { * Create a DocumentFile mock object. */ @NonNull - private static DocumentFile mockDocumentFile(@NonNull String fileName, @NonNull String mimeType) { - DocumentFile file = mock(DocumentFile.class); - when(file.getName()).thenReturn(fileName); - when(file.getUri()).thenReturn(Uri.parse("file:///path/" + fileName)); - when(file.getType()).thenReturn(mimeType); - return file; + private static FastDocumentFile mockDocumentFile(@NonNull String fileName, @NonNull String mimeType) { + return new FastDocumentFile(fileName, mimeType, Uri.parse("file:///path/" + fileName), 0, 0); } - /** - * Create a DocumentFile folder mock object with a list of files. - */ - @NonNull - private static DocumentFile mockDocumentFolder(DocumentFile... files) { - DocumentFile documentFolder = mock(DocumentFile.class); - when(documentFolder.listFiles()).thenReturn(files); - return documentFolder; + private static List<FastDocumentFile> mockLocalFolder(String folderName) { + List<FastDocumentFile> files = new ArrayList<>(); + for (File f : Objects.requireNonNull(new File(folderName).listFiles())) { + String extension = MimeTypeMap.getFileExtensionFromUrl(f.getPath()); + String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); + files.add(new FastDocumentFile(f.getName(), mimeType, + Uri.parse(f.toURI().toString()), f.length(), f.lastModified())); + } + return files; } } |