Introduce android 13 CI in project

This commit is contained in:
MohitMali 2022-11-22 11:47:15 +05:30
parent 21c6a27881
commit a0449efffa
10 changed files with 202 additions and 151 deletions

View File

@ -15,8 +15,7 @@ jobs:
coverageReport: coverageReport:
strategy: strategy:
matrix: matrix:
api-level: [21,30] api-level: [21,30,33]
target: [ google_apis ]
fail-fast: false fail-fast: false
runs-on: macos-11 runs-on: macos-11
steps: steps:
@ -41,20 +40,41 @@ jobs:
${{ runner.os }}-gradle- ${{ runner.os }}-gradle-
- name: create instrumentation coverage - name: create instrumentation coverage
uses: ReactiveCircus/android-emulator-runner@v2.23.0 uses: ReactiveCircus/android-emulator-runner@v2.25.0
env: env:
GRADLE_OPTS: "-Dorg.gradle.internal.http.connectionTimeout=60000 -Dorg.gradle.internal.http.socketTimeout=60000 -Dorg.gradle.internal.network.retry.max.attempts=6 -Dorg.gradle.internal.network.retry.initial.backOff=2000" GRADLE_OPTS: "-Dorg.gradle.internal.http.connectionTimeout=60000 -Dorg.gradle.internal.http.socketTimeout=60000 -Dorg.gradle.internal.network.retry.max.attempts=6 -Dorg.gradle.internal.network.retry.initial.backOff=2000"
if: ${{ matrix.api-level != 33 }}
with: with:
api-level: ${{ matrix.api-level }} api-level: ${{ matrix.api-level }}
target: default
arch: x86_64 arch: x86_64
profile: pixel_2 profile: pixel_2
ndk: 21.4.7075529 ndk: 21.4.7075529
ram-size: '4096M'
disk-size: '14G'
sdcard-path-or-size: '1000M'
disable-animations: false
script: bash contrib/instrumentation.sh
- name: create instrumentation coverage on google_apis for android 33
uses: ReactiveCircus/android-emulator-runner@v2.25.0
env:
GRADLE_OPTS: "-Dorg.gradle.internal.http.connectionTimeout=60000 -Dorg.gradle.internal.http.socketTimeout=60000 -Dorg.gradle.internal.network.retry.max.attempts=6 -Dorg.gradle.internal.network.retry.initial.backOff=2000"
if: ${{ matrix.api-level == 33 }}
with:
api-level: ${{ matrix.api-level }}
target: google_apis
arch: x86_64
profile: pixel_2
ndk: 21.4.7075529
ram-size: '4096M'
disk-size: '14G'
sdcard-path-or-size: '1000M' sdcard-path-or-size: '1000M'
disable-animations: false disable-animations: false
script: bash contrib/instrumentation.sh script: bash contrib/instrumentation.sh
- name: Upload screenshot result - name: Upload screenshot result
uses: actions/upload-artifact@v1 uses: actions/upload-artifact@v2
if: failure() if: failure()
with: with:
name: ${{ matrix.api-level }} name: ${{ matrix.api-level }}

View File

@ -17,6 +17,7 @@
*/ */
package org.kiwix.kiwixmobile.help package org.kiwix.kiwixmobile.help
import android.os.Build
import androidx.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread import androidx.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.UiDevice
@ -34,18 +35,20 @@ class HelpFragmentTest : BaseActivityTest() {
@Test @Test
fun verifyHelpActivity() { fun verifyHelpActivity() {
runOnUiThread { activityRule.activity.navigate(R.id.helpFragment) } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
help { runOnUiThread { activityRule.activity.navigate(R.id.helpFragment) }
clickOnWhatDoesKiwixDo() help {
assertWhatDoesKiwixDoIsExpanded() clickOnWhatDoesKiwixDo()
clickOnWhatDoesKiwixDo() assertWhatDoesKiwixDoIsExpanded()
clickOnWhereIsContent() clickOnWhatDoesKiwixDo()
assertWhereIsContentIsExpanded() clickOnWhereIsContent()
clickOnWhereIsContent() assertWhereIsContentIsExpanded()
clickOnHowToUpdateContent() clickOnWhereIsContent()
assertHowToUpdateContentIsExpanded() clickOnHowToUpdateContent()
clickOnHowToUpdateContent() assertHowToUpdateContentIsExpanded()
clickOnSendFeedback() clickOnHowToUpdateContent()
clickOnSendFeedback()
}
} }
} }
} }

View File

@ -18,6 +18,7 @@
package org.kiwix.kiwixmobile.initial.download package org.kiwix.kiwixmobile.initial.download
import android.os.Build
import androidx.core.content.edit import androidx.core.content.edit
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
@ -53,15 +54,17 @@ class InitialDownloadTest : BaseActivityTest() {
@Test @Test
fun initialDownloadTest() { fun initialDownloadTest() {
UiThreadStatement.runOnUiThread { activityRule.activity.navigate(R.id.downloadsFragment) } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
initialDownload { UiThreadStatement.runOnUiThread { activityRule.activity.navigate(R.id.downloadsFragment) }
assertLibraryListDisplayed() initialDownload {
refreshList() assertLibraryListDisplayed()
waitForDataToLoad() refreshList()
downloadZimFile() waitForDataToLoad()
assertStorageConfigureDialogDisplayed() downloadZimFile()
clickYesToConfigureStorage() assertStorageConfigureDialogDisplayed()
assertDownloadStart() clickYesToConfigureStorage()
assertDownloadStart()
}
} }
} }

View File

@ -17,6 +17,7 @@
*/ */
package org.kiwix.kiwixmobile.intro package org.kiwix.kiwixmobile.intro
import android.os.Build
import androidx.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread import androidx.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.UiDevice
@ -29,8 +30,10 @@ class IntroFragmentTest : BaseActivityTest() {
@Test @Test
fun viewIsSwipeableAndNavigatesToMain() { fun viewIsSwipeableAndNavigatesToMain() {
runOnUiThread { activityRule.activity.navigate(R.id.introFragment) } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
intro(IntroRobot::swipeLeft) clickGetStarted {} runOnUiThread { activityRule.activity.navigate(R.id.introFragment) }
intro(IntroRobot::swipeLeft) clickGetStarted {}
}
} }
@Before @Before

View File

@ -19,6 +19,7 @@ package org.kiwix.kiwixmobile.language
import android.Manifest import android.Manifest
import android.app.Instrumentation import android.app.Instrumentation
import android.os.Build
import androidx.core.content.edit import androidx.core.content.edit
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.rules.ActivityScenarioRule
@ -67,18 +68,20 @@ class LanguageFragmentTest {
@Test @Test
fun testLanguageFragment() { fun testLanguageFragment() {
UiThreadStatement.runOnUiThread { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
activityScenarioRule.scenario.onActivity { UiThreadStatement.runOnUiThread {
it.navigate(R.id.downloadsFragment) activityScenarioRule.scenario.onActivity {
it.navigate(R.id.downloadsFragment)
}
} }
}
language { language {
waitForDataToLoad() waitForDataToLoad()
clickOnLanguageIcon() clickOnLanguageIcon()
searchAndSaveLanguage("german", "German") searchAndSaveLanguage("german", "German")
clickOnLanguageIcon() clickOnLanguageIcon()
searchAndSaveLanguage("italiano", "Italian") searchAndSaveLanguage("italiano", "Italian")
}
} }
} }
} }

View File

@ -17,6 +17,7 @@
*/ */
package org.kiwix.kiwixmobile.main package org.kiwix.kiwixmobile.main
import android.os.Build
import androidx.core.content.edit import androidx.core.content.edit
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import androidx.test.core.app.ActivityScenario import androidx.test.core.app.ActivityScenario
@ -49,32 +50,34 @@ class TopLevelDestinationTest : BaseActivityTest() {
@Test @Test
fun testTopLevelDestination() { fun testTopLevelDestination() {
ActivityScenario.launch(KiwixMainActivity::class.java) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
topLevel { ActivityScenario.launch(KiwixMainActivity::class.java)
clickReaderOnBottomNav { topLevel {
} clickReaderOnBottomNav {
clickLibraryOnBottomNav {
assertGetZimNearbyDeviceDisplayed()
clickFileTransferIcon {
} }
clickLibraryOnBottomNav {
assertGetZimNearbyDeviceDisplayed()
clickFileTransferIcon {
}
}
clickDownloadOnBottomNav(OnlineLibraryRobot::assertLibraryListDisplayed)
clickBookmarksOnNavDrawer {
assertBookMarksDisplayed()
clickOnTrashIcon()
assertDeleteBookmarksDialogDisplayed()
}
clickHistoryOnSideNav {
assertHistoryDisplayed()
clickOnTrashIcon()
assertDeleteHistoryDialogDisplayed()
}
clickHostBooksOnSideNav(ZimHostRobot::assertMenuWifiHotspotDiplayed)
clickSettingsOnSideNav(SettingsRobot::assertMenuSettingsDisplayed)
clickHelpOnSideNav(HelpRobot::assertToolbarDisplayed)
clickSupportKiwixOnSideNav()
assertExternalLinkDialogDisplayed()
pressBack()
} }
clickDownloadOnBottomNav(OnlineLibraryRobot::assertLibraryListDisplayed)
clickBookmarksOnNavDrawer {
assertBookMarksDisplayed()
clickOnTrashIcon()
assertDeleteBookmarksDialogDisplayed()
}
clickHistoryOnSideNav {
assertHistoryDisplayed()
clickOnTrashIcon()
assertDeleteHistoryDialogDisplayed()
}
clickHostBooksOnSideNav(ZimHostRobot::assertMenuWifiHotspotDiplayed)
clickSettingsOnSideNav(SettingsRobot::assertMenuSettingsDisplayed)
clickHelpOnSideNav(HelpRobot::assertToolbarDisplayed)
clickSupportKiwixOnSideNav()
assertExternalLinkDialogDisplayed()
pressBack()
} }
} }

View File

@ -18,6 +18,7 @@
package org.kiwix.kiwixmobile.note package org.kiwix.kiwixmobile.note
import android.os.Build
import androidx.test.internal.runner.junit4.statement.UiThreadStatement import androidx.test.internal.runner.junit4.statement.UiThreadStatement
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.UiDevice
@ -35,11 +36,13 @@ class NoteFragmentTest : BaseActivityTest() {
@Test @Test
fun verifyNoteFragment() { fun verifyNoteFragment() {
UiThreadStatement.runOnUiThread { activityRule.activity.navigate(R.id.notesFragment) } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
note { UiThreadStatement.runOnUiThread { activityRule.activity.navigate(R.id.notesFragment) }
assertToolbarExist() note {
assertNoteRecyclerViewExist() assertToolbarExist()
assertSwitchWidgetExist() assertNoteRecyclerViewExist()
assertSwitchWidgetExist()
}
} }
} }
} }

View File

@ -17,6 +17,7 @@
*/ */
package org.kiwix.kiwixmobile.search package org.kiwix.kiwixmobile.search
import android.os.Build
import androidx.core.content.edit import androidx.core.content.edit
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
@ -52,43 +53,45 @@ class SearchFragmentTest : BaseActivityTest() {
@Test @Test
fun searchFragmentSimple() { fun searchFragmentSimple() {
UiThreadStatement.runOnUiThread { activityRule.activity.navigate(R.id.libraryFragment) } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
val loadFileStream = UiThreadStatement.runOnUiThread { activityRule.activity.navigate(R.id.libraryFragment) }
SearchFragmentTest::class.java.classLoader.getResourceAsStream("testzim.zim") val loadFileStream =
val zimFile = File(context.cacheDir, "testzim.zim") SearchFragmentTest::class.java.classLoader.getResourceAsStream("testzim.zim")
if (zimFile.exists()) zimFile.delete() val zimFile = File(context.cacheDir, "testzim.zim")
zimFile.createNewFile() if (zimFile.exists()) zimFile.delete()
loadFileStream.use { inputStream -> zimFile.createNewFile()
val outputStream: OutputStream = FileOutputStream(zimFile) loadFileStream.use { inputStream ->
outputStream.use { it -> val outputStream: OutputStream = FileOutputStream(zimFile)
val buffer = ByteArray(inputStream.available()) outputStream.use { it ->
var length: Int val buffer = ByteArray(inputStream.available())
while (inputStream.read(buffer).also { length = it } > 0) { var length: Int
it.write(buffer, 0, length) while (inputStream.read(buffer).also { length = it } > 0) {
it.write(buffer, 0, length)
}
} }
} }
} UiThreadStatement.runOnUiThread {
UiThreadStatement.runOnUiThread { activityRule.activity.navigate(
activityRule.activity.navigate( actionNavigationLibraryToNavigationReader()
actionNavigationLibraryToNavigationReader() .apply { zimFileUri = zimFile.toUri().toString() }
.apply { zimFileUri = zimFile.toUri().toString() }
)
}
search { checkZimFileSearchSuccessful(R.id.readerFragment) }
UiThreadStatement.runOnUiThread {
if (zimFile.canRead()) {
activityRule.activity.openSearch(searchString = "Android")
} else {
throw RuntimeException(
"File $zimFile is not readable." +
" Original File $zimFile is readable = ${zimFile.canRead()}" +
" Size ${zimFile.length()}"
) )
} }
} search { checkZimFileSearchSuccessful(R.id.readerFragment) }
search { UiThreadStatement.runOnUiThread {
clickOnSearchItemInSearchList() if (zimFile.canRead()) {
checkZimFileSearchSuccessful(R.id.readerFragment) activityRule.activity.openSearch(searchString = "Android")
} else {
throw RuntimeException(
"File $zimFile is not readable." +
" Original File $zimFile is readable = ${zimFile.canRead()}" +
" Size ${zimFile.length()}"
)
}
}
search {
clickOnSearchItemInSearchList()
checkZimFileSearchSuccessful(R.id.readerFragment)
}
} }
} }

View File

@ -18,6 +18,7 @@
package org.kiwix.kiwixmobile.settings package org.kiwix.kiwixmobile.settings
import android.Manifest import android.Manifest
import android.os.Build
import androidx.test.internal.runner.junit4.statement.UiThreadStatement import androidx.test.internal.runner.junit4.statement.UiThreadStatement
import androidx.test.rule.ActivityTestRule import androidx.test.rule.ActivityTestRule
import androidx.test.rule.GrantPermissionRule import androidx.test.rule.GrantPermissionRule
@ -47,38 +48,42 @@ class KiwixSettingsFragmentTest {
@Before @Before
fun setup() { fun setup() {
// Go to IntroFragment // Go to IntroFragment
UiThreadStatement.runOnUiThread { activityTestRule.activity.navigate(R.id.introFragment) } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
intro(IntroRobot::swipeLeft) clickGetStarted { } UiThreadStatement.runOnUiThread { activityTestRule.activity.navigate(R.id.introFragment) }
StandardActions.openDrawer() intro(IntroRobot::swipeLeft) clickGetStarted { }
StandardActions.enterSettings() StandardActions.openDrawer()
StandardActions.enterSettings()
}
} }
@Test @Test
fun testSettingsActivity() { fun testSettingsActivity() {
settingsRobo { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
assertZoomTextViewPresent() settingsRobo {
assertVersionTextViewPresent() assertZoomTextViewPresent()
clickLanguagePreference() assertVersionTextViewPresent()
assertLanguagePrefDialogDisplayed() clickLanguagePreference()
dismissDialog() assertLanguagePrefDialogDisplayed()
toggleBackToTopPref() dismissDialog()
toggleOpenNewTabInBackground() toggleBackToTopPref()
toggleExternalLinkWarningPref() toggleOpenNewTabInBackground()
toggleWifiDownloadsOnlyPref() toggleExternalLinkWarningPref()
clickStoragePreference() toggleWifiDownloadsOnlyPref()
// Let's pause here for a moment because calculating storage takes some time clickStoragePreference()
BaristaSleepInteractions.sleep(TEST_PAUSE_MS.toLong()) // Let's pause here for a moment because calculating storage takes some time
assertStorageDialogDisplayed() BaristaSleepInteractions.sleep(TEST_PAUSE_MS.toLong())
dismissDialog() assertStorageDialogDisplayed()
clickClearHistoryPreference() dismissDialog()
assertHistoryDialogDisplayed() clickClearHistoryPreference()
dismissDialog() assertHistoryDialogDisplayed()
clickNightModePreference() dismissDialog()
assertNightModeDialogDisplayed() clickNightModePreference()
dismissDialog() assertNightModeDialogDisplayed()
clickCredits() dismissDialog()
assertContributorsDialogDisplayed() clickCredits()
dismissDialog() assertContributorsDialogDisplayed()
dismissDialog()
}
} }
} }
} }

View File

@ -19,6 +19,7 @@ package org.kiwix.kiwixmobile.splash
import android.Manifest import android.Manifest
import android.content.Context import android.content.Context
import android.os.Build
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import androidx.test.core.app.ActivityScenario import androidx.test.core.app.ActivityScenario
import androidx.test.espresso.Espresso import androidx.test.espresso.Espresso
@ -66,38 +67,42 @@ class KiwixSplashActivityTest {
@Test @Test
fun testFirstRun() { fun testFirstRun() {
shouldShowIntro(true) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
activityScenario.recreate() shouldShowIntro(true)
activityScenario.onActivity { activityScenario.recreate()
BaristaSleepInteractions.sleep(TestUtils.TEST_PAUSE_MS.toLong()) activityScenario.onActivity {
Espresso.onView(ViewMatchers.withId(R.id.get_started)) BaristaSleepInteractions.sleep(TestUtils.TEST_PAUSE_MS.toLong())
.check(ViewAssertions.matches(ViewMatchers.isDisplayed())) Espresso.onView(ViewMatchers.withId(R.id.get_started))
.check(ViewAssertions.matches(ViewMatchers.isDisplayed()))
// Verify that the value of the "intro shown" boolean inside // Verify that the value of the "intro shown" boolean inside
// the SharedPreferences Database is not changed until // the SharedPreferences Database is not changed until
// the "Get started" button is pressed // the "Get started" button is pressed
val preferences = PreferenceManager.getDefaultSharedPreferences(context) val preferences = PreferenceManager.getDefaultSharedPreferences(context)
Assert.assertEquals( Assert.assertEquals(
true, true,
preferences.getBoolean( preferences.getBoolean(
SharedPreferenceUtil.PREF_SHOW_INTRO, SharedPreferenceUtil.PREF_SHOW_INTRO,
true true
)
) )
) }
} }
} }
@Test @Test
fun testNormalRun() { fun testNormalRun() {
shouldShowIntro(false) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
activityScenario.recreate() shouldShowIntro(false)
activityScenario.onActivity { activityScenario.recreate()
BaristaSleepInteractions.sleep(TestUtils.TEST_PAUSE_MS.toLong()) activityScenario.onActivity {
Intents.intended( BaristaSleepInteractions.sleep(TestUtils.TEST_PAUSE_MS.toLong())
IntentMatchers.hasComponent( Intents.intended(
KiwixMainActivity::class.java.canonicalName IntentMatchers.hasComponent(
KiwixMainActivity::class.java.canonicalName
)
) )
) }
} }
} }