|
2 | 2 | * Nextcloud - Android Client |
3 | 3 | * |
4 | 4 | * SPDX-FileCopyrightText: 2017 JARP <jarp@customer-187-174-218-184.uninet-ide.com.mx |
| 5 | + * SPDX-FileCopyrightText: 2026 Alper Ozturk <alper.ozturk@nextcloud.com> |
5 | 6 | * SPDX-FileCopyrightText: 2019 Tobias Kaminsky <tobias@kaminsky.me> |
6 | 7 | * SPDX-FileCopyrightText: 2021 Chris Narkiewicz <hello@ezaquarii.com> |
7 | 8 | * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only |
8 | 9 | */ |
9 | | -package com.owncloud.android.datamodel; |
10 | | - |
11 | | -import android.accounts.Account; |
12 | | -import android.accounts.AccountManager; |
13 | | -import android.content.ActivityNotFoundException; |
14 | | -import android.content.ContentResolver; |
15 | | -import android.content.Context; |
16 | | - |
17 | | -import com.nextcloud.client.account.CurrentAccountProvider; |
18 | | -import com.nextcloud.client.account.User; |
19 | | -import com.nextcloud.client.account.UserAccountManager; |
20 | | -import com.nextcloud.client.account.UserAccountManagerImpl; |
21 | | -import com.nextcloud.client.database.entity.UploadEntityKt; |
22 | | -import com.nextcloud.test.RandomStringGenerator; |
23 | | -import com.owncloud.android.AbstractIT; |
24 | | -import com.owncloud.android.MainApp; |
25 | | -import com.owncloud.android.db.OCUpload; |
26 | | -import com.owncloud.android.db.UploadResult; |
27 | | -import com.owncloud.android.files.services.NameCollisionPolicy; |
28 | | -import com.owncloud.android.lib.common.accounts.AccountUtils; |
29 | | -import com.owncloud.android.operations.UploadFileOperation; |
30 | | - |
31 | | -import org.junit.After; |
32 | | -import org.junit.Before; |
33 | | -import org.junit.Test; |
34 | | -import org.junit.runner.RunWith; |
35 | | - |
36 | | -import java.io.File; |
37 | | -import java.util.ArrayList; |
38 | | -import java.util.Random; |
39 | | -import java.util.UUID; |
40 | | - |
41 | | -import androidx.test.core.app.ApplicationProvider; |
42 | | -import androidx.test.ext.junit.runners.AndroidJUnit4; |
43 | | -import androidx.test.filters.SmallTest; |
44 | | - |
45 | | -import static org.junit.Assert.assertEquals; |
46 | | -import static org.junit.Assert.assertFalse; |
47 | | -import static org.junit.Assert.assertNotNull; |
48 | | -import static org.junit.Assert.assertNull; |
49 | | -import static org.junit.Assert.assertTrue; |
| 10 | +package com.owncloud.android.datamodel |
| 11 | + |
| 12 | +import android.accounts.Account |
| 13 | +import android.accounts.AccountManager |
| 14 | +import android.content.ActivityNotFoundException |
| 15 | +import android.content.Context |
| 16 | +import androidx.test.core.app.ApplicationProvider |
| 17 | +import androidx.test.ext.junit.runners.AndroidJUnit4 |
| 18 | +import androidx.test.filters.SmallTest |
| 19 | +import com.nextcloud.client.account.CurrentAccountProvider |
| 20 | +import com.nextcloud.client.account.User |
| 21 | +import com.nextcloud.client.account.UserAccountManager |
| 22 | +import com.nextcloud.client.account.UserAccountManagerImpl |
| 23 | +import com.nextcloud.client.database.entity.toUploadEntity |
| 24 | +import com.nextcloud.test.RandomStringGenerator.make |
| 25 | +import com.owncloud.android.AbstractIT |
| 26 | +import com.owncloud.android.MainApp |
| 27 | +import com.owncloud.android.db.OCUpload |
| 28 | +import com.owncloud.android.db.UploadResult |
| 29 | +import com.owncloud.android.files.services.NameCollisionPolicy |
| 30 | +import com.owncloud.android.lib.common.accounts.AccountUtils |
| 31 | +import com.owncloud.android.operations.UploadFileOperation |
| 32 | +import org.junit.After |
| 33 | +import org.junit.Assert |
| 34 | +import org.junit.Before |
| 35 | +import org.junit.Test |
| 36 | +import org.junit.runner.RunWith |
| 37 | +import org.mockito.Mock |
| 38 | +import org.mockito.MockitoAnnotations |
| 39 | +import java.io.File |
| 40 | +import java.util.Random |
| 41 | +import java.util.UUID |
| 42 | +import java.util.function.Supplier |
50 | 43 |
|
51 | 44 | /** |
52 | 45 | * Created by JARP on 6/7/17. |
53 | 46 | */ |
54 | | -@RunWith(AndroidJUnit4.class) |
| 47 | +@RunWith(AndroidJUnit4::class) |
55 | 48 | @SmallTest |
56 | | -public class UploadStorageManagerTest extends AbstractIT { |
57 | | - private UploadsStorageManager uploadsStorageManager; |
58 | | - private CurrentAccountProvider currentAccountProvider = () -> null; |
59 | | - private UserAccountManager userAccountManager; |
60 | | - private User user2; |
| 49 | +class UploadStorageManagerTest : AbstractIT() { |
| 50 | + private lateinit var uploadsStorageManager: UploadsStorageManager |
| 51 | + |
| 52 | + @Mock |
| 53 | + private lateinit var currentAccountProvider: CurrentAccountProvider |
| 54 | + |
| 55 | + private lateinit var userAccountManager: UserAccountManager |
| 56 | + |
| 57 | + private lateinit var user2: User |
61 | 58 |
|
62 | 59 | @Before |
63 | | - public void setUp() { |
64 | | - Context instrumentationCtx = ApplicationProvider.getApplicationContext(); |
65 | | - ContentResolver contentResolver = instrumentationCtx.getContentResolver(); |
66 | | - uploadsStorageManager = new UploadsStorageManager(currentAccountProvider, contentResolver); |
67 | | - userAccountManager = UserAccountManagerImpl.fromContext(targetContext); |
| 60 | + fun setUp() { |
| 61 | + MockitoAnnotations.openMocks(this) |
68 | 62 |
|
69 | | - Account temp = new Account("test2@test.com", MainApp.getAccountType(targetContext)); |
| 63 | + val instrumentationCtx = ApplicationProvider.getApplicationContext<Context>() |
| 64 | + val contentResolver = instrumentationCtx.contentResolver |
| 65 | + uploadsStorageManager = UploadsStorageManager(currentAccountProvider, contentResolver) |
| 66 | + userAccountManager = UserAccountManagerImpl.fromContext(targetContext) |
| 67 | + |
| 68 | + val temp = Account("test2@test.com", MainApp.getAccountType(targetContext)) |
70 | 69 | if (!userAccountManager.exists(temp)) { |
71 | | - AccountManager platformAccountManager = AccountManager.get(targetContext); |
72 | | - platformAccountManager.addAccountExplicitly(temp, "testPassword", null); |
73 | | - platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_ACCOUNT_VERSION, |
74 | | - Integer.toString(UserAccountManager.ACCOUNT_VERSION)); |
75 | | - platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_VERSION, "14.0.0.0"); |
76 | | - platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_BASE_URL, "test.com"); |
77 | | - platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_USER_ID, "test"); // same as userId |
| 70 | + val platformAccountManager = AccountManager.get(targetContext) |
| 71 | + platformAccountManager.addAccountExplicitly(temp, "testPassword", null) |
| 72 | + platformAccountManager.setUserData( |
| 73 | + temp, |
| 74 | + AccountUtils.Constants.KEY_OC_ACCOUNT_VERSION, |
| 75 | + UserAccountManager.ACCOUNT_VERSION.toString() |
| 76 | + ) |
| 77 | + platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_VERSION, "14.0.0.0") |
| 78 | + platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_BASE_URL, "test.com") |
| 79 | + platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_USER_ID, "test") // same as userId |
78 | 80 | } |
79 | 81 |
|
80 | | - final UserAccountManager userAccountManager = UserAccountManagerImpl.fromContext(targetContext); |
81 | | - user2 = userAccountManager.getUser("test2@test.com").orElseThrow(ActivityNotFoundException::new); |
| 82 | + val userAccountManager: UserAccountManager = UserAccountManagerImpl.fromContext(targetContext) |
| 83 | + user2 = userAccountManager.getUser("test2@test.com") |
| 84 | + .orElseThrow(Supplier { ActivityNotFoundException() }) |
82 | 85 | } |
83 | 86 |
|
84 | 87 | @Test |
85 | | - public void testDeleteAllUploads() { |
| 88 | + fun testDeleteAllUploads() { |
86 | 89 | // Clean |
87 | | - for (User user : userAccountManager.getAllUsers()) { |
88 | | - uploadsStorageManager.removeUserUploads(user); |
| 90 | + for (user in userAccountManager.getAllUsers()) { |
| 91 | + uploadsStorageManager.removeUserUploads(user) |
89 | 92 | } |
90 | | - int accountRowsA = 3; |
91 | | - int accountRowsB = 4; |
92 | | - insertUploads(account, accountRowsA); |
93 | | - insertUploads(user2.toPlatformAccount(), accountRowsB); |
94 | | - |
95 | | - assertEquals("Expected 4 removed uploads files", |
96 | | - 4, |
97 | | - uploadsStorageManager.removeUserUploads(user2)); |
| 93 | + val accountRowsA = 3 |
| 94 | + val accountRowsB = 4 |
| 95 | + insertUploads(account, accountRowsA) |
| 96 | + insertUploads(user2.toPlatformAccount(), accountRowsB) |
| 97 | + |
| 98 | + Assert.assertEquals( |
| 99 | + "Expected 4 removed uploads files", |
| 100 | + 4, |
| 101 | + uploadsStorageManager.removeUserUploads(user2).toLong() |
| 102 | + ) |
98 | 103 | } |
99 | 104 |
|
100 | 105 | @Test |
101 | | - public void largeTest() { |
102 | | - int size = 3000; |
103 | | - ArrayList<OCUpload> uploads = new ArrayList<>(); |
| 106 | + fun largeTest() { |
| 107 | + val size = 3000 |
| 108 | + val uploads = ArrayList<OCUpload?>() |
104 | 109 |
|
105 | | - deleteAllUploads(); |
106 | | - assertEquals(0, uploadsStorageManager.getAllStoredUploads().length); |
| 110 | + deleteAllUploads() |
| 111 | + Assert.assertEquals(0, uploadsStorageManager.getAllStoredUploads().size.toLong()) |
107 | 112 |
|
108 | | - for (int i = 0; i < size; i++) { |
109 | | - OCUpload upload = createUpload(account); |
| 113 | + for (i in 0..<size) { |
| 114 | + val upload = createUpload(account) |
110 | 115 |
|
111 | | - uploads.add(upload); |
112 | | - uploadsStorageManager.uploadDao.insertOrReplace(UploadEntityKt.toUploadEntity(upload)); |
| 116 | + uploads.add(upload) |
| 117 | + uploadsStorageManager.uploadDao.insertOrReplace(upload.toUploadEntity()) |
113 | 118 | } |
114 | 119 |
|
115 | | - OCUpload[] storedUploads = uploadsStorageManager.getAllStoredUploads(); |
116 | | - assertEquals(size, storedUploads.length); |
117 | | - assertEquals(uploads.size(), storedUploads.length); |
| 120 | + val storedUploads = uploadsStorageManager.getAllStoredUploads() |
| 121 | + Assert.assertEquals(size.toLong(), storedUploads.size.toLong()) |
| 122 | + Assert.assertEquals(uploads.size.toLong(), storedUploads.size.toLong()) |
118 | 123 |
|
119 | | - for (int i = 0; i < size; i++) { |
120 | | - assertTrue("Upload " + (i+1) + "/" + size + " not found in stored uploads: " + storedUploads[i].getLocalPath(), |
121 | | - contains(uploads, storedUploads[i])); |
| 124 | + for (i in 0..<size) { |
| 125 | + Assert.assertTrue( |
| 126 | + "Upload " + (i + 1) + "/" + size + " not found in stored uploads: " + storedUploads[i].localPath, |
| 127 | + contains(uploads, storedUploads[i]) |
| 128 | + ) |
122 | 129 | } |
123 | 130 | } |
124 | 131 |
|
125 | 132 | @Test |
126 | | - public void testIsSame() { |
127 | | - OCUpload upload1 = new OCUpload("/test", "/test", account.name); |
128 | | - upload1.setUseWifiOnly(true); |
129 | | - OCUpload upload2 = new OCUpload("/test", "/test", account.name); |
130 | | - upload2.setUseWifiOnly(true); |
| 133 | + fun testIsSame() { |
| 134 | + val upload1 = OCUpload("/test", "/test", account.name) |
| 135 | + upload1.isUseWifiOnly = true |
| 136 | + val upload2 = OCUpload("/test", "/test", account.name) |
| 137 | + upload2.isUseWifiOnly = true |
131 | 138 |
|
132 | | - assertTrue(upload1.isSame(upload2)); |
| 139 | + Assert.assertTrue(upload1.isSame(upload2)) |
133 | 140 |
|
134 | | - upload2.setUseWifiOnly(false); |
135 | | - assertFalse(upload1.isSame(upload2)); |
| 141 | + upload2.isUseWifiOnly = false |
| 142 | + Assert.assertFalse(upload1.isSame(upload2)) |
136 | 143 |
|
137 | | - assertFalse(upload1.isSame(null)); |
138 | | - assertFalse(upload1.isSame(new OCFile("/test"))); |
| 144 | + Assert.assertFalse(upload1.isSame(null)) |
| 145 | + Assert.assertFalse(upload1.isSame(OCFile("/test"))) |
139 | 146 | } |
140 | 147 |
|
141 | | - private boolean contains(ArrayList<OCUpload> uploads, OCUpload storedUpload) { |
142 | | - for (int i = 0; i < uploads.size(); i++) { |
| 148 | + private fun contains(uploads: ArrayList<OCUpload?>, storedUpload: OCUpload): Boolean { |
| 149 | + for (i in uploads.indices) { |
143 | 150 | if (storedUpload.isSame(uploads.get(i), true)) { |
144 | | - return true; |
| 151 | + return true |
145 | 152 | } |
146 | 153 | } |
147 | | - return false; |
| 154 | + return false |
148 | 155 | } |
149 | 156 |
|
150 | | - @Test(expected = IllegalArgumentException.class) |
151 | | - public void corruptedUpload() { |
152 | | - OCUpload corruptUpload = new OCUpload(File.separator + "LocalPath", |
153 | | - OCFile.PATH_SEPARATOR + "RemotePath", |
154 | | - account.name); |
155 | | - |
156 | | - corruptUpload.setLocalPath(null); |
157 | | - uploadsStorageManager.uploadDao.insertOrReplace(UploadEntityKt.toUploadEntity(corruptUpload)); |
158 | | - uploadsStorageManager.getAllStoredUploads(); |
| 157 | + @Test(expected = IllegalArgumentException::class) |
| 158 | + fun corruptedUpload() { |
| 159 | + val corruptUpload = OCUpload( |
| 160 | + File.separator + "LocalPath", |
| 161 | + OCFile.PATH_SEPARATOR + "RemotePath", |
| 162 | + account.name |
| 163 | + ) |
| 164 | + |
| 165 | + corruptUpload.localPath = null |
| 166 | + uploadsStorageManager.uploadDao.insertOrReplace(corruptUpload.toUploadEntity()) |
| 167 | + uploadsStorageManager.getAllStoredUploads() |
159 | 168 | } |
160 | 169 |
|
161 | 170 | @Test |
162 | | - public void getById() { |
163 | | - OCUpload upload = createUpload(account); |
164 | | - long id = uploadsStorageManager.uploadDao.insertOrReplace(UploadEntityKt.toUploadEntity(upload)); |
165 | | - OCUpload newUpload = uploadsStorageManager.getUploadById(id); |
166 | | - |
167 | | - assertNotNull(newUpload); |
168 | | - assertEquals(upload.getLocalAction(), newUpload.getLocalAction()); |
169 | | - assertEquals(upload.getFolderUnlockToken(), newUpload.getFolderUnlockToken()); |
| 171 | + fun getById() { |
| 172 | + val upload = createUpload(account) |
| 173 | + val id = uploadsStorageManager.uploadDao.insertOrReplace(upload.toUploadEntity()) |
| 174 | + val newUpload = uploadsStorageManager.getUploadById(id) |
| 175 | + |
| 176 | + Assert.assertNotNull(newUpload) |
| 177 | + Assert.assertEquals(upload.localAction.toLong(), newUpload!!.localAction.toLong()) |
| 178 | + Assert.assertEquals(upload.folderUnlockToken, newUpload.folderUnlockToken) |
170 | 179 | } |
171 | 180 |
|
172 | 181 | @Test |
173 | | - public void getByIdNull() { |
174 | | - OCUpload newUpload = uploadsStorageManager.getUploadById(-1); |
175 | | - |
176 | | - assertNull(newUpload); |
| 182 | + fun getByIdNull() { |
| 183 | + val newUpload = uploadsStorageManager.getUploadById(-1) |
| 184 | + Assert.assertNull(newUpload) |
177 | 185 | } |
178 | 186 |
|
179 | | - private void insertUploads(Account account, int rowsToInsert) { |
180 | | - for (int i = 0; i < rowsToInsert; i++) { |
181 | | - uploadsStorageManager.uploadDao.insertOrReplace(UploadEntityKt.toUploadEntity(createUpload(account))); |
| 187 | + private fun insertUploads(account: Account, rowsToInsert: Int) { |
| 188 | + for (i in 0..<rowsToInsert) { |
| 189 | + uploadsStorageManager.uploadDao.insertOrReplace(createUpload(account).toUploadEntity()) |
182 | 190 | } |
183 | 191 | } |
184 | 192 |
|
185 | | - public String generateUniqueNumber() { |
186 | | - UUID uuid = UUID.randomUUID(); |
187 | | - return uuid.toString(); |
| 193 | + fun generateUniqueNumber(): String { |
| 194 | + val uuid = UUID.randomUUID() |
| 195 | + return uuid.toString() |
188 | 196 | } |
189 | 197 |
|
190 | | - private OCUpload createUpload(Account account) { |
191 | | - OCUpload upload = new OCUpload(File.separator + "very long long long long long long long long long long long " + |
192 | | - "long long long long long long long long long long long long long long " + |
193 | | - "long long long long long long long long long long long long long long " + |
194 | | - "long long long long long long long LocalPath " + |
195 | | - generateUniqueNumber(), |
196 | | - OCFile.PATH_SEPARATOR + "very long long long long long long long long long " + |
197 | | - "long long long long long long long long long long long long long long " + |
198 | | - "long long long long long long long long long long long long long long " + |
199 | | - "long long long long long long long long long long long long RemotePath " + |
200 | | - generateUniqueNumber(), |
201 | | - account.name); |
202 | | - |
203 | | - upload.setFileSize(new Random().nextInt(20000) * 10000); |
204 | | - upload.setUploadStatus(UploadsStorageManager.UploadStatus.UPLOAD_IN_PROGRESS); |
205 | | - upload.setLocalAction(2); |
206 | | - upload.setNameCollisionPolicy(NameCollisionPolicy.ASK_USER); |
207 | | - upload.setCreateRemoteFolder(false); |
208 | | - upload.setUploadEndTimestamp(System.currentTimeMillis()); |
209 | | - upload.setLastResult(UploadResult.DELAYED_FOR_WIFI); |
210 | | - upload.setCreatedBy(UploadFileOperation.CREATED_BY_USER); |
211 | | - upload.setUseWifiOnly(true); |
212 | | - upload.setWhileChargingOnly(false); |
213 | | - upload.setFolderUnlockToken(RandomStringGenerator.make(10)); |
214 | | - |
215 | | - return upload; |
| 198 | + private fun createUpload(account: Account): OCUpload { |
| 199 | + val upload = OCUpload( |
| 200 | + File.separator + "very long long long long long long long long long long long " + |
| 201 | + "long long long long long long long long long long long long long long " + |
| 202 | + "long long long long long long long long long long long long long long " + |
| 203 | + "long long long long long long long LocalPath " + |
| 204 | + generateUniqueNumber(), |
| 205 | + OCFile.PATH_SEPARATOR + "very long long long long long long long long long " + |
| 206 | + "long long long long long long long long long long long long long long " + |
| 207 | + "long long long long long long long long long long long long long long " + |
| 208 | + "long long long long long long long long long long long long RemotePath " + |
| 209 | + generateUniqueNumber(), |
| 210 | + account.name |
| 211 | + ) |
| 212 | + |
| 213 | + upload.fileSize = (Random().nextInt(20000) * 10000).toLong() |
| 214 | + upload.setUploadStatus(UploadsStorageManager.UploadStatus.UPLOAD_IN_PROGRESS) |
| 215 | + upload.localAction = 2 |
| 216 | + upload.nameCollisionPolicy = NameCollisionPolicy.ASK_USER |
| 217 | + upload.isCreateRemoteFolder = false |
| 218 | + upload.uploadEndTimestamp = System.currentTimeMillis() |
| 219 | + upload.lastResult = UploadResult.DELAYED_FOR_WIFI |
| 220 | + upload.createdBy = UploadFileOperation.CREATED_BY_USER |
| 221 | + upload.isUseWifiOnly = true |
| 222 | + upload.isWhileChargingOnly = false |
| 223 | + upload.folderUnlockToken = make(10) |
| 224 | + |
| 225 | + return upload |
216 | 226 | } |
217 | 227 |
|
218 | | - private void deleteAllUploads() { |
219 | | - uploadsStorageManager.removeAllUploads(); |
| 228 | + private fun deleteAllUploads() { |
| 229 | + uploadsStorageManager.removeAllUploads() |
220 | 230 |
|
221 | | - assertEquals(0, uploadsStorageManager.getAllStoredUploads().length); |
| 231 | + Assert.assertEquals(0, uploadsStorageManager.getAllStoredUploads().size.toLong()) |
222 | 232 | } |
223 | 233 |
|
224 | 234 | @After |
225 | | - public void tearDown() { |
226 | | - deleteAllUploads(); |
227 | | - userAccountManager.removeUser(user2); |
| 235 | + fun tearDown() { |
| 236 | + deleteAllUploads() |
| 237 | + userAccountManager.removeUser(user2) |
228 | 238 | } |
229 | 239 | } |
0 commit comments