diff options
Diffstat (limited to 'javatests/com/google/android/libraries/mobiledatadownload/testing/RobolectricFileDownloader.java')
-rw-r--r-- | javatests/com/google/android/libraries/mobiledatadownload/testing/RobolectricFileDownloader.java | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/javatests/com/google/android/libraries/mobiledatadownload/testing/RobolectricFileDownloader.java b/javatests/com/google/android/libraries/mobiledatadownload/testing/RobolectricFileDownloader.java index 504c151..52ab804 100644 --- a/javatests/com/google/android/libraries/mobiledatadownload/testing/RobolectricFileDownloader.java +++ b/javatests/com/google/android/libraries/mobiledatadownload/testing/RobolectricFileDownloader.java @@ -15,6 +15,7 @@ */ package com.google.android.libraries.mobiledatadownload.testing; +import static com.google.common.util.concurrent.Futures.immediateFailedFuture; import static com.google.common.util.concurrent.Futures.immediateVoidFuture; import android.net.Uri; @@ -23,9 +24,11 @@ import com.google.android.libraries.mobiledatadownload.downloader.DownloadReques import com.google.android.libraries.mobiledatadownload.downloader.FileDownloader; import com.google.android.libraries.mobiledatadownload.file.SynchronousFileStorage; import com.google.android.libraries.mobiledatadownload.file.backends.FileUri; +import com.google.common.util.concurrent.ExecutionSequencer; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.devtools.build.runtime.RunfilesPaths; +import java.io.IOException; import java.nio.file.Path; /** @@ -42,22 +45,43 @@ import java.nio.file.Path; public final class RobolectricFileDownloader implements FileDownloader { private final String testDataRelativePath; + private final SynchronousFileStorage fileStorage; + private final ListeningExecutorService executor; private final FileDownloader delegateDownloader; + // Sequence downloads to prevent any potential overwrites + private final ExecutionSequencer executionSequencer = ExecutionSequencer.create(); + public RobolectricFileDownloader( String testDataRelativePath, SynchronousFileStorage fileStorage, ListeningExecutorService executor) { this.testDataRelativePath = testDataRelativePath; + this.fileStorage = fileStorage; + this.executor = executor; this.delegateDownloader = new LocalFileDownloader(fileStorage, executor); } @Override public ListenableFuture<Void> startDownloading(DownloadRequest downloadRequest) { + return executionSequencer.submitAsync( + () -> startDownloadingInternal(downloadRequest), executor); + } + + private ListenableFuture<Void> startDownloadingInternal(DownloadRequest downloadRequest) { Uri fileUri = downloadRequest.fileUri(); String urlToDownload = downloadRequest.urlToDownload(); DownloadConstraints downloadConstraints = downloadRequest.downloadConstraints(); + // If the file already exists, return immediately + try { + if (fileStorage.exists(fileUri)) { + return immediateVoidFuture(); + } + } catch (IOException e) { + return immediateFailedFuture(e); + } + // We need to translate the real urlToDownload to the one representing the local file in // testdata folder. Uri uriToDownload = Uri.parse(urlToDownload.trim()); |