diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0b00750d60d3cd6cbce439845758e9ba9a878b29..d7af9add38a9e7c2cdc034eea63f83132f8096a5 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -22,8 +22,10 @@ buildDebug:
- app/build/outputs/apk/debug/
test:
- allow_failure: true
- stage: debug
+ stage: release
+ rules:
+ - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+ when: always
script:
- ./gradlew test -PtestAccountName="$testAccountName" -PtestAccountPwd="$testAccountPwd" -PtestServerUrl="$testServerUrl"
artifacts:
@@ -33,7 +35,7 @@ test:
- app/build/reports/tests/*
reports:
junit: app/build/test-results/*/TEST-*.xml
-
+
# Default lint configuration for debug builds
# Manual as we don't want to run them generally for debug builds
.lintDebugDefault:
@@ -164,10 +166,10 @@ pushToPrebuilt:
- rm Apps/*-release.apk
- mv ../${NEW_APK_PATH}/${NEW_APK_NAME} Apps/
# todo: improve to replace sed command, by a new one based on REGEXP (instead of using line number)
- - sed -i "6s/.*/LOCAL_SRC_FILES := ${NEW_APK_NAME}/" Apps/Android.mk
+ - sed -i "6s/.*/LOCAL_SRC_FILES := ${NEW_APK_NAME}/" Apps/Android.mk
- git add Apps
- git status
- git commit -m "App Lounge - ${NEW_APK_VERSION}, ${CI_COMMIT_TAG}" -m "From ${CI_COMMIT_SHA}, pipeline ${CI_PIPELINE_ID}"
- git push
# Sometimes a single push doesn't do all the job, so we have to push twice
- - git push
\ No newline at end of file
+ - git push
diff --git a/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerImpl.kt b/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerImpl.kt
index c4e786c2fe1ded12ee8210ba4d06a6e68d9fe1d1..764cab30a2d8cd637ce93375e3ea0b8239c4b40c 100644
--- a/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerImpl.kt
+++ b/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerImpl.kt
@@ -95,13 +95,18 @@ class UpdatesManagerImpl @Inject constructor(
gPlayInstalledApps.isNotEmpty()
) {
- status = getUpdatesFromApi({
+ val gplayStatus = getUpdatesFromApi({
fusedAPIRepository.getApplicationDetails(
gPlayInstalledApps,
authData,
Origin.GPLAY
)
}, updateList)
+
+ /**
+ If any one of the sources is successful, status should be [ResultStatus.OK]
+ **/
+ status = if (status == ResultStatus.OK) status else gplayStatus
}
val nonFaultyUpdateList = faultyAppRepository.removeFaultyApps(updateList)
diff --git a/app/src/test/java/foundation/e/apps/FakePkgManagerModule.kt b/app/src/test/java/foundation/e/apps/FakePkgManagerModule.kt
new file mode 100644
index 0000000000000000000000000000000000000000..b24f4af3666bcc21e69796318edeeae9cd80127b
--- /dev/null
+++ b/app/src/test/java/foundation/e/apps/FakePkgManagerModule.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright MURENA SAS 2023
+ * Apps Quickly and easily install Android apps onto your device!
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package foundation.e.apps
+
+import android.content.Context
+import android.content.pm.ApplicationInfo
+import foundation.e.apps.data.fused.data.FusedApp
+import foundation.e.apps.data.updates.UpdatesManagerImpl.Companion.PACKAGE_NAME_ANDROID_VENDING
+import foundation.e.apps.data.updates.UpdatesManagerImpl.Companion.PACKAGE_NAME_F_DROID
+import foundation.e.apps.install.pkg.PkgManagerModule
+
+class FakePkgManagerModule(
+ context: Context,
+ val gplayApps: List,
+) : PkgManagerModule(context) {
+
+ val applicationInfo = mutableListOf(
+ ApplicationInfo().apply { this.packageName = "foundation.e.demoone" },
+ ApplicationInfo().apply { this.packageName = "foundation.e.demotwo" },
+ ApplicationInfo().apply { this.packageName = "foundation.e.demothree" }
+ )
+
+ override fun getAllUserApps(): List {
+ return applicationInfo
+ }
+
+ override fun getInstallerName(packageName: String): String {
+ val gplayPackageNames = gplayApps.map { it.package_name }
+
+ return if (gplayPackageNames.contains(packageName)) {
+ PACKAGE_NAME_ANDROID_VENDING
+ } else {
+ PACKAGE_NAME_F_DROID
+ }
+ }
+}
diff --git a/app/src/test/java/foundation/e/apps/FakePreferenceModule.kt b/app/src/test/java/foundation/e/apps/FakePreferenceModule.kt
index 4c5e1bdd1b56a9806c61f091261ca84867bf7ead..538bd64e585bb099ca611c4acb15405bea2b375a 100644
--- a/app/src/test/java/foundation/e/apps/FakePreferenceModule.kt
+++ b/app/src/test/java/foundation/e/apps/FakePreferenceModule.kt
@@ -24,6 +24,7 @@ class FakePreferenceModule(context: Context) : PreferenceManagerModule(context)
var isPWASelectedFake = false
var isOpenSourceelectedFake = false
var isGplaySelectedFake = false
+ var shouldUpdateFromOtherStores = true
override fun isPWASelected(): Boolean {
return isPWASelectedFake
@@ -44,4 +45,8 @@ class FakePreferenceModule(context: Context) : PreferenceManagerModule(context)
else -> "any"
}
}
+
+ override fun shouldUpdateAppsFromOtherStores(): Boolean {
+ return shouldUpdateFromOtherStores
+ }
}
diff --git a/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt b/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt
index fb78eeedac10288d78017add65b017e0fc72ddea..648567559601b3c8a2f094c7c07745ad98c2d9a5 100644
--- a/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt
+++ b/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt
@@ -31,7 +31,6 @@ import foundation.e.apps.data.fused.FusedAPIRepository
import foundation.e.apps.data.fused.FusedApi
import foundation.e.apps.data.fused.data.FusedApp
import foundation.e.apps.data.updates.UpdatesManagerImpl
-import foundation.e.apps.install.pkg.PkgManagerModule
import foundation.e.apps.util.MainCoroutineRule
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
@@ -64,8 +63,7 @@ class UpdateManagerImptTest {
@Mock
private lateinit var context: Context
- @Mock
- private lateinit var pkgManagerModule: PkgManagerModule
+ private lateinit var pkgManagerModule: FakePkgManagerModule
@Mock
private lateinit var fusedAPIRepository: FusedAPIRepository
@@ -90,6 +88,7 @@ class UpdateManagerImptTest {
MockitoAnnotations.openMocks(this)
faultyAppRepository = FaultyAppRepository(FakeFaultyAppDao())
preferenceModule = FakePreferenceModule(context)
+ pkgManagerModule = FakePkgManagerModule(context, getGplayApps())
updatesManagerImpl =
UpdatesManagerImpl(context, pkgManagerModule, fusedAPIRepository, faultyAppRepository, preferenceModule, fdroidRepository)
}
@@ -103,7 +102,6 @@ class UpdateManagerImptTest {
val gplayUpdates = Pair(gplayApps, ResultStatus.OK)
setupMockingForFetchingUpdates(
- applicationInfo,
openSourceUpdates,
gplayUpdates
)
@@ -136,8 +134,7 @@ class UpdateManagerImptTest {
@Test
fun getUpdateWhenInstalledPackageListIsEmpty() = runTest {
val authData = AuthData("e@e.email", "AtadyMsIAtadyM")
- val applicationInfo = mutableListOf()
- Mockito.`when`(pkgManagerModule.getAllUserApps()).thenReturn(applicationInfo)
+ pkgManagerModule.applicationInfo.clear()
val updateResult = updatesManagerImpl.getUpdates(authData)
System.out.println("===> updates: ${updateResult.first.map { it.package_name }}")
@@ -154,7 +151,6 @@ class UpdateManagerImptTest {
val gplayUpdates = Pair(gplayApps, ResultStatus.OK)
setupMockingForFetchingUpdates(
- applicationInfo,
openSourceUpdates,
gplayUpdates
)
@@ -174,7 +170,6 @@ class UpdateManagerImptTest {
val gplayUpdates = Pair(gplayApps, ResultStatus.OK)
setupMockingForFetchingUpdates(
- applicationInfo,
openSourceUpdates,
gplayUpdates
)
@@ -194,14 +189,11 @@ class UpdateManagerImptTest {
val gplayUpdates = Pair(gplayApps, ResultStatus.OK)
setupMockingForFetchingUpdates(
- applicationInfo,
openSourceUpdates,
gplayUpdates
)
val updateResult = updatesManagerImpl.getUpdates(authData)
- System.out.println("===> updates: ${updateResult.first.map { it.package_name }}")
-
assertFalse("fetchupdate", updateResult.first.any { it.origin == Origin.CLEANAPK })
}
@@ -214,16 +206,13 @@ class UpdateManagerImptTest {
val gplayUpdates = Pair(gplayApps, ResultStatus.OK)
setupMockingForFetchingUpdates(
- applicationInfo,
openSourceUpdates,
gplayUpdates
)
val updateResult = updatesManagerImpl.getUpdates(authData)
- System.out.println("===> updates: ${updateResult.first.map { it.package_name }}")
-
assertEquals("fetchupdate", 1, updateResult.first.size)
- assertEquals("fetchupdate", ResultStatus.TIMEOUT, updateResult.second)
+ assertEquals("fetchupdate", ResultStatus.OK, updateResult.second)
}
@Test
@@ -235,7 +224,26 @@ class UpdateManagerImptTest {
val gplayUpdates = Pair(gplayApps, ResultStatus.TIMEOUT)
setupMockingForFetchingUpdates(
- applicationInfo,
+ openSourceUpdates,
+ gplayUpdates
+ )
+
+ val updateResult = updatesManagerImpl.getUpdates(authData)
+ System.out.println("===> updates: ${updateResult.first.map { it.package_name }}")
+
+ assertEquals("fetchupdate", 1, updateResult.first.size)
+ assertEquals("fetchupdate", ResultStatus.OK, updateResult.second)
+ }
+
+ @Test
+ fun getUpdateWhenBothSourcesAreFailed() = runTest {
+ val gplayApps = mutableListOf()
+ val openSourceApps = getOpenSourceApps(Status.UPDATABLE)
+
+ val openSourceUpdates = Pair(openSourceApps, ResultStatus.TIMEOUT)
+ val gplayUpdates = Pair(gplayApps, ResultStatus.TIMEOUT)
+
+ setupMockingForFetchingUpdates(
openSourceUpdates,
gplayUpdates
)
@@ -266,7 +274,7 @@ class UpdateManagerImptTest {
val openSourceUpdates = Pair(openSourceApps, ResultStatus.OK)
val gplayUpdates = Pair(gPlayApps, ResultStatus.OK)
- setupMockingForFetchingUpdates(applicationInfo, openSourceUpdates, gplayUpdates)
+ setupMockingForFetchingUpdates(openSourceUpdates, gplayUpdates)
val updateResult = updatesManagerImpl.getUpdatesOSS()
assertEquals("UpdateOSS", 1, updateResult.first.size)
@@ -281,7 +289,7 @@ class UpdateManagerImptTest {
val openSourceUpdates = Pair(openSourceApps, ResultStatus.OK)
val gplayUpdates = Pair(gPlayApps, ResultStatus.OK)
- setupMockingForFetchingUpdates(applicationInfo, openSourceUpdates, gplayUpdates)
+ setupMockingForFetchingUpdates(openSourceUpdates, gplayUpdates)
val updateResult = updatesManagerImpl.getUpdatesOSS()
assertEquals("UpdateOSS", 0, updateResult.first.size)
@@ -295,7 +303,7 @@ class UpdateManagerImptTest {
val openSourceUpdates = Pair(openSourceApps, ResultStatus.TIMEOUT)
val gplayUpdates = Pair(gPlayApps, ResultStatus.OK)
- setupMockingForFetchingUpdates(applicationInfo, openSourceUpdates, gplayUpdates)
+ setupMockingForFetchingUpdates(openSourceUpdates, gplayUpdates)
val updateResult = updatesManagerImpl.getUpdatesOSS()
assertEquals("UpdateOSS", 0, updateResult.first.size)
@@ -303,7 +311,6 @@ class UpdateManagerImptTest {
}
private suspend fun setupMockingForFetchingUpdates(
- applicationInfo: MutableList,
openSourceUpdates: Pair, ResultStatus>,
gplayUpdates: Pair, ResultStatus>,
selectedApplicationSources: List = mutableListOf(
@@ -312,7 +319,6 @@ class UpdateManagerImptTest {
FusedApi.APP_TYPE_PWA
)
) {
- Mockito.`when`(pkgManagerModule.getAllUserApps()).thenReturn(applicationInfo)
Mockito.`when`(
fusedAPIRepository.getApplicationDetails(
any(),
diff --git a/app/src/test/java/foundation/e/apps/fusedManager/FusedManagerRepositoryTest.kt b/app/src/test/java/foundation/e/apps/fusedManager/FusedManagerRepositoryTest.kt
index cba43e63ef9f5782380ace7088d7ae7cd5f8d1b5..5d47945b1d14ee39d4d34352317bcc1ca65133d8 100644
--- a/app/src/test/java/foundation/e/apps/fusedManager/FusedManagerRepositoryTest.kt
+++ b/app/src/test/java/foundation/e/apps/fusedManager/FusedManagerRepositoryTest.kt
@@ -22,7 +22,6 @@ import android.app.Application
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import foundation.e.apps.data.enums.Status
import foundation.e.apps.data.fdroid.FdroidRepository
-import foundation.e.apps.data.fusedDownload.FusedDownloadDAO
import foundation.e.apps.data.fusedDownload.FusedManagerRepository
import foundation.e.apps.data.fusedDownload.models.FusedDownload
import foundation.e.apps.install.workmanager.InstallWorkManager
@@ -52,7 +51,7 @@ class FusedManagerRepositoryTest {
@get:Rule
var mainCoroutineRule = MainCoroutineRule()
- private lateinit var fusedDownloadDAO: FusedDownloadDAO
+ private lateinit var fusedDownloadDAO: FakeFusedDownloadDAO
private lateinit var fakeFusedManager: FakeFusedManager
@Mock
@@ -88,15 +87,24 @@ class FusedManagerRepositoryTest {
}
@Test
- fun `addDownload when work is already available`() = runTest {
+ fun `addDownload when work and FusedDownload Both are available`() = runTest {
val fusedDownload = initTest(true)
+ fusedDownloadDAO.fusedDownloadList.add(fusedDownload)
val isSuccessful = fusedManagerRepository.addDownload(fusedDownload)
assertFalse("addDownload", isSuccessful)
}
@Test
- fun `addDownload when fusedDownload already exists`() = runTest {
+ fun `addDownload when only work exists`() = runTest {
+ val fusedDownload = initTest(true)
+
+ val isSuccessful = fusedManagerRepository.addDownload(fusedDownload)
+ assertTrue("addDownload", isSuccessful)
+ }
+
+ @Test
+ fun `addDownload when on FusedDownload exists`() = runTest {
val fusedDownload = initTest()
fusedDownloadDAO.addDownload(fusedDownload)