diff --git a/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt b/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt index a24c592a12d4..9ade2d21c80e 100644 --- a/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt +++ b/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt @@ -25,19 +25,17 @@ import kotlin.random.Random @Suppress("TooManyFunctions", "MagicNumber") class FileDeletionTests : AbstractIT() { - private lateinit var tempDir: File + private val createdFilePaths = mutableListOf() @Before fun setup() { - val parent = System.getProperty("java.io.tmpdir") - val childPath = "file_deletion_test_${System.currentTimeMillis()}" - tempDir = File(parent, childPath) - tempDir.mkdirs() + createdFilePaths.clear() } @After fun cleanup() { - tempDir.deleteRecursively() + createdFilePaths.forEach { File(it).delete() } + createdFilePaths.clear() } private fun getRandomRemoteId(): String = Random @@ -45,6 +43,17 @@ class FileDeletionTests : AbstractIT() { .toString() .padEnd(32, '0') + private fun createFileAtExpectedPath(ocFile: OCFile, content: String = "Temporary test content"): File { + val expectedPath = FileStorageUtils.getDefaultSavePathFor(user.accountName, ocFile) + val localFile = File(expectedPath).apply { + parentFile?.mkdirs() + createNewFile() + writeText(content) + } + createdFilePaths.add(localFile.absolutePath) + return localFile + } + private fun createAndSaveSingleFileWithLocalCopy(): OCFile { val now = System.currentTimeMillis() @@ -59,11 +68,7 @@ class FileDeletionTests : AbstractIT() { permissions = "RWDNV" } - val localFile = File(tempDir, "TestFile_${file.fileId}.txt").apply { - parentFile?.mkdirs() - createNewFile() - writeText("Temporary test content") - } + val localFile = createFileAtExpectedPath(file) file.storagePath = localFile.absolutePath storageManager.saveFile(file) @@ -117,11 +122,11 @@ class FileDeletionTests : AbstractIT() { listOf(rootFolder, subFolder, file1, file2).forEach { storageManager.saveFile(it) } - val file1Path = File(tempDir, "file1_${file1.fileId}.txt").apply { createNewFile() } - val file2Path = File(tempDir, "file2_${file2.fileId}.txt").apply { createNewFile() } + val localFile1 = createFileAtExpectedPath(file1) + val localFile2 = createFileAtExpectedPath(file2) - file1.storagePath = file1Path.absolutePath - file2.storagePath = file2Path.absolutePath + file1.storagePath = localFile1.absolutePath + file2.storagePath = localFile2.absolutePath storageManager.saveFile(file1) storageManager.saveFile(file2) @@ -132,69 +137,85 @@ class FileDeletionTests : AbstractIT() { private fun getMixedOcFiles(): List { val now = System.currentTimeMillis() - fun createFolder(id: Long, parentId: Long, path: String): OCFile = OCFile(path).apply { - fileId = id + fun saveFolder(parentId: Long, path: String): OCFile = OCFile(path).apply { this.parentId = parentId remoteId = getRandomRemoteId() mimeType = MimeType.DIRECTORY creationTimestamp = now modificationTimestamp = now permissions = "RWDNVCK" - } - - fun createFile(id: Long, parentId: Long, path: String, size: Long, mime: String): OCFile = OCFile(path).apply { - fileId = id - this.parentId = parentId - remoteId = getRandomRemoteId() - fileLength = size - creationTimestamp = now - mimeType = mime - modificationTimestamp = now - permissions = "RWDNV" - } - - val list = mutableListOf() - - list.add(createFolder(1, 0, "/")) - - list.add(createFolder(5, 2, "/Documents/Projects")) - list.add(createFile(9, 5, "/Documents/Projects/spec.txt", 12000, MimeType.TEXT_PLAIN)) - list.add(createFolder(2, 1, "/Documents")) - list.add(createFile(11, 7, "/Photos/Vacation/img2.jpg", 300000, MimeType.JPEG)) - list.add(createFolder(7, 3, "/Photos/Vacation")) - list.add(createFile(4, 2, "/Documents/example.pdf", 150000, MimeType.PDF)) - list.add(createFolder(3, 1, "/Photos")) - list.add(createFile(12, 3, "/Photos/cover.png", 80000, MimeType.PNG)) - list.add(createFile(6, 5, "/Documents/Projects/readme.txt", 2000, MimeType.TEXT_PLAIN)) - list.add(createFolder(8, 5, "/Documents/Projects/Archive")) - list.add(createFile(13, 8, "/Documents/Projects/Archive/old.bmp", 900000, MimeType.BMP)) - list.add(createFile(10, 7, "/Photos/Vacation/img1.jpg", 250000, MimeType.JPEG)) - list.add(createFolder(14, 1, "/Temp")) - list.add(createFile(15, 14, "/Temp/tmp_file_1.txt", 400, MimeType.TEXT_PLAIN)) - list.add(createFile(16, 14, "/Temp/tmp_file_2.txt", 800, MimeType.TEXT_PLAIN)) - list.add(createFolder(17, 14, "/Temp/Nested")) - list.add(createFile(18, 17, "/Temp/Nested/deep.txt", 100, MimeType.TEXT_PLAIN)) - list.add(createFile(19, 2, "/Documents/notes.txt", 1500, MimeType.TEXT_PLAIN)) - list.add(createFolder(20, 3, "/Photos/EmptyFolder")) - - list.forEach { ocFile -> - if (!ocFile.isFolder) { - val localFile = File(tempDir, ocFile.remoteId).apply { - parentFile?.mkdirs() - createNewFile() - writeText("test content") - } - ocFile.storagePath = localFile.absolutePath - storageManager.saveFile(ocFile) - } else { - // For folders, create the folder in tempDir - val localFolder = File(tempDir, ocFile.remoteId).apply { mkdirs() } - ocFile.storagePath = localFolder.absolutePath - storageManager.saveFile(ocFile) + }.also { storageManager.saveFile(it) } + + fun saveFileWithLocalCopy(parentId: Long, path: String, size: Long, mime: String): OCFile { + val ocFile = OCFile(path).apply { + this.parentId = parentId + remoteId = getRandomRemoteId() + fileLength = size + creationTimestamp = now + mimeType = mime + modificationTimestamp = now + permissions = "RWDNV" + storagePath = FileStorageUtils.getDefaultSavePathFor(user.accountName, this) + } + val localFile = File(ocFile.storagePath).apply { + parentFile?.mkdirs() + createNewFile() + writeText("test content") } + createdFilePaths.add(localFile.absolutePath) + storageManager.saveFile(ocFile) + return ocFile } - return list + val root = saveFolder(0, "/") + val documents = saveFolder(root.fileId, "/Documents") + val photos = saveFolder(root.fileId, "/Photos") + val temp = saveFolder(root.fileId, "/Temp") + val projects = saveFolder(documents.fileId, "/Documents/Projects") + val vacation = saveFolder(photos.fileId, "/Photos/Vacation") + val archive = saveFolder(projects.fileId, "/Documents/Projects/Archive") + val nested = saveFolder(temp.fileId, "/Temp/Nested") + val emptyFolder = saveFolder(photos.fileId, "/Photos/EmptyFolder") + + val allEntries = mutableListOf(root, documents, photos, temp, projects, vacation, archive, nested, emptyFolder) + + allEntries.add( + saveFileWithLocalCopy( + projects.fileId, + "/Documents/Projects/spec.txt", + 12000, + MimeType.TEXT_PLAIN + ) + ) + allEntries.add(saveFileWithLocalCopy(vacation.fileId, "/Photos/Vacation/img2.jpg", 300000, MimeType.JPEG)) + allEntries.add(saveFileWithLocalCopy(documents.fileId, "/Documents/example.pdf", 150000, MimeType.PDF)) + allEntries.add(saveFileWithLocalCopy(photos.fileId, "/Photos/cover.png", 80000, MimeType.PNG)) + allEntries.add( + saveFileWithLocalCopy( + projects.fileId, + "/Documents/Projects/readme.txt", + 2000, + MimeType.TEXT_PLAIN + ) + ) + allEntries.add( + saveFileWithLocalCopy( + archive.fileId, + "/Documents/Projects/Archive/old.bmp", + 900000, + MimeType.BMP + ) + ) + allEntries.add(saveFileWithLocalCopy(vacation.fileId, "/Photos/Vacation/img1.jpg", 250000, MimeType.JPEG)) + allEntries.add(saveFileWithLocalCopy(temp.fileId, "/Temp/tmp_file_1.txt", 400, MimeType.TEXT_PLAIN)) + allEntries.add(saveFileWithLocalCopy(temp.fileId, "/Temp/tmp_file_2.txt", 800, MimeType.TEXT_PLAIN)) + allEntries.add(saveFileWithLocalCopy(nested.fileId, "/Temp/Nested/deep.txt", 100, MimeType.TEXT_PLAIN)) + allEntries.add(saveFileWithLocalCopy(documents.fileId, "/Documents/notes.txt", 1500, MimeType.TEXT_PLAIN)) + + return allEntries.sortedWith( + compareBy { it.isFolder } + .thenByDescending { it.remotePath.count { c -> c == '/' } } + ) } @Test diff --git a/app/src/androidTest/java/com/nextcloud/utils/UploadDateTests.kt b/app/src/androidTest/java/com/nextcloud/utils/UploadDateTests.kt index be7cf735a580..795148f2b3e5 100644 --- a/app/src/androidTest/java/com/nextcloud/utils/UploadDateTests.kt +++ b/app/src/androidTest/java/com/nextcloud/utils/UploadDateTests.kt @@ -14,16 +14,13 @@ import androidx.test.platform.app.InstrumentationRegistry import com.nextcloud.client.database.entity.UploadEntity import com.nextcloud.client.database.entity.toOCUpload import com.nextcloud.client.database.entity.toUploadEntity -import com.nextcloud.utils.date.DateFormatPattern import com.owncloud.android.R import com.owncloud.android.utils.DisplayUtils import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull import org.junit.Before import org.junit.Test -import java.text.SimpleDateFormat import java.util.Date -import java.util.Locale class UploadDateTests { @@ -97,12 +94,12 @@ class UploadDateTests { @Test fun getRelativeDateTimeStringReturnsFutureAsAbsoluteWhenShowFutureIsFalse() { - val formatter = SimpleDateFormat("MMM d, yyyy h:mm:ss a", Locale.US) - val expected = formatter.format(Date(System.currentTimeMillis() + ONE_MINUTE)) + val time = System.currentTimeMillis() + ONE_MINUTE + val expected = java.text.DateFormat.getDateTimeInstance().format(Date(time)) val result = DisplayUtils.getRelativeDateTimeString( context, - System.currentTimeMillis() + ONE_MINUTE, + time, DateUtils.SECOND_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, 0, @@ -130,8 +127,19 @@ class UploadDateTests { @Test fun getRelativeDateTimeStringReturnsAbbreviatedStringForOneWeekAgo() { val time = System.currentTimeMillis() - ONE_WEEK - val formatter = SimpleDateFormat(DateFormatPattern.MonthWithDate.pattern, Locale.US) - val expected = formatter.format(Date(time)) + val expectedString = DateUtils.getRelativeDateTimeString( + context, + time, + DateUtils.MINUTE_IN_MILLIS, + DateUtils.WEEK_IN_MILLIS, + 0 + ).toString() + val parts = expectedString.split(",") + val expected = if (parts.size == 2) { + if (parts[1].contains(":") && !parts[0].contains(":")) parts[0].trim() else parts[1].trim() + } else { + expectedString + } assertRelativeDateTimeString(time, expected) } @@ -139,8 +147,19 @@ class UploadDateTests { @Test fun getRelativeDateTimeStringReturnsAbbreviatedStringForOneMonthAgo() { val time = System.currentTimeMillis() - ONE_MONTH - val formatter = SimpleDateFormat(DateFormatPattern.MonthWithDate.pattern, Locale.US) - val expected = formatter.format(Date(time)) + val expectedString = DateUtils.getRelativeDateTimeString( + context, + time, + DateUtils.SECOND_IN_MILLIS, + DateUtils.WEEK_IN_MILLIS, + 0 + ).toString() + val parts = expectedString.split(",") + val expected = if (parts.size == 2) { + if (parts[1].contains(":") && !parts[0].contains(":")) parts[0].trim() else parts[1].trim() + } else { + expectedString + } assertRelativeDateTimeString(time, expected, DateUtils.SECOND_IN_MILLIS) } @@ -148,8 +167,19 @@ class UploadDateTests { @Test fun getRelativeDateTimeStringReturnsAbsoluteStringForOneYearAgo() { val time = System.currentTimeMillis() - ONE_YEAR - val formatter = SimpleDateFormat("M/d/YYYY", Locale.US) - val expected = formatter.format(Date(time)) + val expectedString = DateUtils.getRelativeDateTimeString( + context, + time, + DateUtils.SECOND_IN_MILLIS, + DateUtils.WEEK_IN_MILLIS, + 0 + ).toString() + val parts = expectedString.split(",") + val expected = if (parts.size == 2) { + if (parts[1].contains(":") && !parts[0].contains(":")) parts[0].trim() else parts[1].trim() + } else { + expectedString + } assertRelativeDateTimeString(time, expected, DateUtils.SECOND_IN_MILLIS) } @@ -194,7 +224,19 @@ class UploadDateTests { assertEquals(expected, result) testTimestamp = System.currentTimeMillis() - 7 * DateUtils.DAY_IN_MILLIS - expected = SimpleDateFormat(DateFormatPattern.MonthWithDate.pattern, Locale.US).format(testTimestamp) + val expectedString = DateUtils.getRelativeDateTimeString( + context, + testTimestamp, + DateUtils.DAY_IN_MILLIS, + DateUtils.WEEK_IN_MILLIS, + 0 + ).toString() + val parts = expectedString.split(",") + expected = if (parts.size == 2) { + if (parts[1].contains(":") && !parts[0].contains(":")) parts[0].trim() else parts[1].trim() + } else { + expectedString + } result = DisplayUtils.getRelativeDateTimeString( context, testTimestamp, diff --git a/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java b/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java index 1b0e1b8d3c17..09fafceb8c13 100644 --- a/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java +++ b/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java @@ -205,12 +205,12 @@ public void uploadOCUpload(OCUpload ocUpload, int localBehaviour) { ConnectivityService connectivityServiceMock = new ConnectivityService() { @Override public void isNetworkAndServerAvailable(@NonNull GenericCallback callback) { - + callback.onComplete(true); } @Override public boolean isConnected() { - return false; + return true; } @Override @@ -248,7 +248,7 @@ public boolean isPowerSavingEnabled() { user, null, ocUpload, - NameCollisionPolicy.DEFAULT, + NameCollisionPolicy.OVERWRITE, localBehaviour, targetContext, false, diff --git a/app/src/androidTest/java/com/owncloud/android/DownloadIT.java b/app/src/androidTest/java/com/owncloud/android/DownloadIT.java deleted file mode 100644 index f8fd99517f1c..000000000000 --- a/app/src/androidTest/java/com/owncloud/android/DownloadIT.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2020 Tobias Kaminsky - * SPDX-FileCopyrightText: 2020 Chris Narkiewicz - * SPDX-FileCopyrightText: 2020 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only - */ -package com.owncloud.android; - -import android.net.Uri; - -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.db.OCUpload; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.operations.DownloadFileOperation; -import com.owncloud.android.operations.RefreshFolderOperation; -import com.owncloud.android.operations.RemoveFileOperation; -import com.owncloud.android.utils.FileStorageUtils; - -import org.junit.After; -import org.junit.Test; - -import java.io.File; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertTrue; - -/** - * Tests related to file downloads. - */ -public class DownloadIT extends AbstractOnServerIT { - private static final String FOLDER = "/testUpload/"; - - @After - public void after() { - RemoteOperationResult result = new RefreshFolderOperation(getStorageManager().getFileByPath("/"), - System.currentTimeMillis() / 1000L, - false, - true, - getStorageManager(), - user, - targetContext) - .execute(client); - - // cleanup only if folder exists - if (result.isSuccess() && getStorageManager().getFileByDecryptedRemotePath(FOLDER) != null) { - new RemoveFileOperation(getStorageManager().getFileByDecryptedRemotePath(FOLDER), - false, - user, - false, - targetContext, - getStorageManager()) - .execute(client); - } - } - - @Test - public void verifyDownload() { - OCUpload ocUpload = new OCUpload(FileStorageUtils.getTemporalPath(account.name) + "/nonEmpty.txt", - FOLDER + "nonEmpty.txt", - account.name); - - uploadOCUpload(ocUpload); - - OCUpload ocUpload2 = new OCUpload(FileStorageUtils.getTemporalPath(account.name) + "/nonEmpty.txt", - FOLDER + "nonEmpty2.txt", - account.name); - - uploadOCUpload(ocUpload2); - - refreshFolder("/"); - refreshFolder(FOLDER); - - OCFile file1 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty.txt"); - OCFile file2 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty2.txt"); - verifyDownload(file1, file2); - - assertTrue(new DownloadFileOperation(user, file1, targetContext).execute(client).isSuccess()); - assertTrue(new DownloadFileOperation(user, file2, targetContext).execute(client).isSuccess()); - - refreshFolder(FOLDER); - - file1 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty.txt"); - file2 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty2.txt"); - - verifyDownload(file1, file2); - } - - private void verifyDownload(OCFile file1, OCFile file2) { - assertNotNull(file1); - assertNotNull(file2); - assertNotSame(file1.getStoragePath(), file2.getStoragePath()); - - assertTrue(new File(file1.getStoragePath()).exists()); - assertTrue(new File(file2.getStoragePath()).exists()); - - // test against hardcoded path to make sure that it is correct - assertEquals("/storage/emulated/0/Android/media/"+targetContext.getPackageName()+"/nextcloud/" + - Uri.encode(account.name, "@") + "/testUpload/nonEmpty.txt", - file1.getStoragePath()); - assertEquals("/storage/emulated/0/Android/media/"+targetContext.getPackageName()+"/nextcloud/" + - Uri.encode(account.name, "@") + "/testUpload/nonEmpty2.txt", - file2.getStoragePath()); - } -} diff --git a/app/src/androidTest/java/com/owncloud/android/DownloadIT.kt b/app/src/androidTest/java/com/owncloud/android/DownloadIT.kt new file mode 100644 index 000000000000..e5c3591597c4 --- /dev/null +++ b/app/src/androidTest/java/com/owncloud/android/DownloadIT.kt @@ -0,0 +1,114 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2020 Tobias Kaminsky + * SPDX-FileCopyrightText: 2020 Chris Narkiewicz + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH + * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only + */ +package com.owncloud.android + +import android.net.Uri +import com.owncloud.android.datamodel.OCFile +import com.owncloud.android.db.OCUpload +import com.owncloud.android.operations.DownloadFileOperation +import com.owncloud.android.operations.RefreshFolderOperation +import com.owncloud.android.operations.RemoveFileOperation +import com.owncloud.android.utils.FileStorageUtils +import org.junit.After +import org.junit.Assert +import org.junit.Test +import kotlin.io.path.Path +import kotlin.io.path.exists + +class DownloadIT : AbstractOnServerIT() { + @After + override fun after() { + val result = RefreshFolderOperation( + storageManager.getFileByPath("/"), + System.currentTimeMillis() / 1000L, + false, + true, + storageManager, + user, + targetContext + ) + .execute(client) + + // cleanup only if folder exists + if (result.isSuccess && storageManager.getFileByDecryptedRemotePath(FOLDER) != null) { + RemoveFileOperation( + storageManager.getFileByDecryptedRemotePath(FOLDER)!!, + false, + user, + false, + targetContext, + storageManager + ) + .execute(client) + } + } + + @Test + fun verifyDownload() { + val ocUpload = OCUpload( + FileStorageUtils.getTemporalPath(account.name) + "/nonEmpty.txt", + FOLDER + "nonEmpty.txt", + account.name + ) + + uploadOCUpload(ocUpload) + + val ocUpload2 = OCUpload( + FileStorageUtils.getTemporalPath(account.name) + "/nonEmpty.txt", + FOLDER + "nonEmpty2.txt", + account.name + ) + + uploadOCUpload(ocUpload2) + + refreshFolder(FOLDER) + + var file1 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty.txt") + var file2 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty2.txt") + + val operation1 = DownloadFileOperation(user, file1, targetContext) + val operation1Result = operation1.execute(client) + Assert.assertTrue(operation1Result.isSuccess) + + val operation2 = DownloadFileOperation(user, file2, targetContext) + val operation2Result = operation2.execute(client) + Assert.assertTrue(operation2Result.isSuccess) + + refreshFolder(FOLDER) + file1 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty.txt") + file2 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty2.txt") + + verifyDownload(file1, file2) + } + + private fun verifyDownload(file1: OCFile?, file2: OCFile?) { + Assert.assertNotNull(file1) + Assert.assertNotNull(file2) + Assert.assertNotSame(file1!!.storagePath, file2!!.storagePath) + + Assert.assertTrue(Path(file1.storagePath).exists()) + Assert.assertTrue(Path(file2.storagePath).exists()) + + // test against hardcoded path to make sure that it is correct + Assert.assertEquals( + "/storage/emulated/0/Android/media/" + targetContext.packageName + "/nextcloud/" + + Uri.encode(account.name, "@") + "/testUpload/nonEmpty.txt", + file1.storagePath + ) + Assert.assertEquals( + "/storage/emulated/0/Android/media/" + targetContext.packageName + "/nextcloud/" + + Uri.encode(account.name, "@") + "/testUpload/nonEmpty2.txt", + file2.storagePath + ) + } + + companion object { + private const val FOLDER = "/testUpload/" + } +} diff --git a/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt b/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt index dd1b256c86d6..04ffe036c818 100644 --- a/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt +++ b/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt @@ -12,11 +12,6 @@ package com.owncloud.android.datamodel import android.accounts.Account import android.accounts.AccountManager import android.content.ActivityNotFoundException -import android.content.Context -import androidx.test.core.app.ApplicationProvider -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.filters.SmallTest -import com.nextcloud.client.account.CurrentAccountProvider import com.nextcloud.client.account.User import com.nextcloud.client.account.UserAccountManager import com.nextcloud.client.account.UserAccountManagerImpl @@ -33,38 +28,21 @@ import org.junit.After import org.junit.Assert import org.junit.Before import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.Mock import org.mockito.MockitoAnnotations import java.io.File import java.util.Random import java.util.UUID import java.util.function.Supplier -/** - * Created by JARP on 6/7/17. - */ -@RunWith(AndroidJUnit4::class) -@SmallTest class UploadStorageManagerTest : AbstractIT() { private lateinit var uploadsStorageManager: UploadsStorageManager - - @Mock - private lateinit var currentAccountProvider: CurrentAccountProvider - private lateinit var userAccountManager: UserAccountManager - private lateinit var user2: User @Before fun setUp() { MockitoAnnotations.openMocks(this) - - val instrumentationCtx = ApplicationProvider.getApplicationContext() - val contentResolver = instrumentationCtx.contentResolver - uploadsStorageManager = UploadsStorageManager(currentAccountProvider, contentResolver) userAccountManager = UserAccountManagerImpl.fromContext(targetContext) - val temp = Account("test2@test.com", MainApp.getAccountType(targetContext)) if (!userAccountManager.exists(temp)) { val platformAccountManager = AccountManager.get(targetContext) @@ -78,10 +56,13 @@ class UploadStorageManagerTest : AbstractIT() { platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_BASE_URL, "test.com") platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_USER_ID, "test") // same as userId } - - val userAccountManager: UserAccountManager = UserAccountManagerImpl.fromContext(targetContext) user2 = userAccountManager.getUser("test2@test.com") .orElseThrow(Supplier { ActivityNotFoundException() }) + uploadsStorageManager = + UploadsStorageManager( + UserAccountManagerImpl.fromContext(targetContext), + targetContext.contentResolver + ) } @Test @@ -227,13 +208,14 @@ class UploadStorageManagerTest : AbstractIT() { private fun deleteAllUploads() { uploadsStorageManager.removeAllUploads() - Assert.assertEquals(0, uploadsStorageManager.getAllStoredUploads().size.toLong()) } @After fun tearDown() { - deleteAllUploads() - userAccountManager.removeUser(user2) + if (::user2.isInitialized) { + deleteAllUploads() + userAccountManager.removeUser(user2) + } } } diff --git a/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java b/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java index 3e5cfcfa101d..3a9d0bc0a766 100644 --- a/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java +++ b/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java @@ -1510,6 +1510,8 @@ public static String getNewAvailableRemotePath(OwnCloudClient client, int count = 2; boolean exists; String newPath; + + // FIXME: Causing infinite loop during tests due to ExistenceCheckRemoteOperation result do { suffix = " (" + count + ")"; newPath = extPos >= 0 ? remotePathWithoutExtension + suffix + "." + extension : remotePath + suffix;