diff --git a/.gitea/workflows/common_build.yml b/.gitea/workflows/common_build.yml index 89cc0b5..18edfa5 100644 --- a/.gitea/workflows/common_build.yml +++ b/.gitea/workflows/common_build.yml @@ -16,6 +16,9 @@ jobs: with: files: | androidApp/src/** + shared/src/commonMain/** + shared/src/androidMain/** + shared/src/commonTest/** - name: Fetch tags if: steps.check-android-changes.outputs.any_modified == 'true' run: git fetch --tags -p @@ -34,14 +37,7 @@ jobs: run: mkdir -p ~/.gradle && echo "org.gradle.daemon=false\nignoreGitVersion=true" >> ~/.gradle/gradle.properties - name: Build and test if: steps.check-android-changes.outputs.any_modified == 'true' - run: ./gradlew build -x testReleaseUnitTest -x testDebugUnitTest -x testGithubConfigReleaseUnitTest -x testGithubConfigDebugUnitTest # These tests will be done - # TESTS ARE RUN LOCALLY - # - uses: KengoTODA/actions-setup-docker-compose@v1 - # with: - # version: "2.23.3" - # - name: run selfoss - # run: | - # docker compose -f .gitea/workflows/assets/docker-compose.yml up -d + run: ./gradlew build -x testReleaseUnitTest -x testDebugUnitTest -x testGithubConfigReleaseUnitTest -x testGithubConfigDebugUnitTest - name: coverage if: steps.check-android-changes.outputs.any_modified == 'true' run: | @@ -54,8 +50,3 @@ jobs: retention-days: 1 overwrite: true include-hidden-files: true -# TESTS ARE RUN LOCALLY -# - name: Clean -# if: always() -# run: | -# docker compose -f .gitea/workflows/assets/docker-compose.yml stop diff --git a/.gitea/workflows/common_coverage.yml b/.gitea/workflows/common_coverage.yml index c74481c..3f5c459 100644 --- a/.gitea/workflows/common_coverage.yml +++ b/.gitea/workflows/common_coverage.yml @@ -3,63 +3,84 @@ on: workflow_call: jobs: - BuildAndTestAndCoverage: + RunIntegrationTests: runs-on: ubuntu-latest steps: - name: Check out repository code uses: actions/checkout@v4 with: fetch-depth: 0 + - name: "Check android app changes" + id: check-android-changes + uses: tj-actions/changed-files@v45 + with: + files: | + androidApp/src/** + shared/src/commonMain/** + shared/src/androidMain/** + shared/src/commonTest/** - name: Fetch tags + if: steps.check-android-changes.outputs.any_modified == 'true' run: git fetch --tags -p - uses: actions/setup-java@v4 + if: steps.check-android-changes.outputs.any_modified == 'true' with: distribution: 'temurin' java-version: '17' - cache: gradle - uses: gradle/actions/setup-gradle@v3 + if: steps.check-android-changes.outputs.any_modified == 'true' - uses: android-actions/setup-android@v3 + if: steps.check-android-changes.outputs.any_modified == 'true' - name: Configure gradle... + if: steps.check-android-changes.outputs.any_modified == 'true' run: mkdir -p ~/.gradle && echo "ignoreGitVersion=true" >> ~/.gradle/gradle.properties - uses: KengoTODA/actions-setup-docker-compose@v1 + if: steps.check-android-changes.outputs.any_modified == 'true' with: version: "2.23.3" - name: run selfoss + if: steps.check-android-changes.outputs.any_modified == 'true' run: | docker compose -f .gitea/workflows/assets/docker-compose.yml up -d - - name: Set env url + - name: Change url until I find a better way to do it + if: steps.check-android-changes.outputs.any_modified == 'true' run: | - export SELFOSS_URL=172.17.0.1:8888 - # https://github.com/ReactiveCircus/android-emulator-runner/issues/385 - - name: Kill crashpad_handler processes - if: always() - run: | - pkill -SIGTERM crashpad_handler || true - sleep 5 - pkill -SIGKILL crashpad_handler || true + sed -i "s/const DEFAULT_URL = \"http:\/\/10\.0\.2\.2\:8888\"/const DEFAULT_URL = \"http:\/\/172\.17\.0\.1\:8888\"/g" ./androidApp/src/androidTest/kotlin/bou/amine/apps/readerforselfossv2/android/CommonTests.kt - name: Tests + if: steps.check-android-changes.outputs.any_modified == 'true' uses: reactivecircus/android-emulator-runner@v2 with: api-level: 29 + profile: pixel_2 script: | - ./gradlew androidApp:connectedAndroidTest - killall -INT crashpad_handler || true + ./gradlew androidApp:clearScreenshotsTask || true + ./gradlew androidApp:createScreenshotDirectory + adb logcat -G 16M + ./gradlew JacocoDebugCodeCoverage || (./gradlew androidApp:fetchScreenshots && adb logcat 'InputReader:S' 'chatty:S' 'audio_hw_generic:S' 'LogApiCalls:D' '*:I' -d > ./androidApp/build/reports/androidTests/connected/screenshots/logs.txt) - uses: actions/upload-artifact@v3 - if: failure() + if: steps.check-android-changes.outputs.any_modified == 'true' with: - name: failure-espresso - path: build/reports/androidTests/connected/screenshots + name: screenshot-espresso + path: androidApp/build/reports/androidTests/connected/screenshots retention-days: 2 overwrite: true include-hidden-files: true - uses: actions/upload-artifact@v3 + if: steps.check-android-changes.outputs.any_modified == 'true' + with: + path: androidApp/build/reports/androidTests/connected/debug/flavors/githubConfig + retention-days: 1 + overwrite: true + include-hidden-files: true + - uses: actions/upload-artifact@v3 + if: steps.check-android-changes.outputs.any_modified == 'true' with: name: coverage-espresso - path: build/reports/coverage/androidTest/githubConfig/debug/connected + path: androidApp/build/reports/jacoco/JacocoDebugCodeCoverage retention-days: 1 overwrite: true include-hidden-files: true - name: Clean - if: always() + if: steps.check-android-changes.outputs.any_modified == 'true' || failure() run: | docker compose -f .gitea/workflows/assets/docker-compose.yml stop diff --git a/.gitea/workflows/on_pr.yml b/.gitea/workflows/on_pr.yml index df46445..464413b 100644 --- a/.gitea/workflows/on_pr.yml +++ b/.gitea/workflows/on_pr.yml @@ -5,152 +5,89 @@ on: - master jobs: - BuildAndTestAndCoverage: + Lint: + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + cache: gradle + - name: Install klint + run: curl -sSLO https://github.com/pinterest/ktlint/releases/download/1.5.0/ktlint && chmod a+x ktlint && mv ktlint /usr/local/bin/ + - name: Install detekt + run: curl -sSLO https://github.com/detekt/detekt/releases/download/v1.23.7/detekt-cli-1.23.7.zip && unzip detekt-cli-1.23.7.zip + - name: Linting... + run: ktlint 'shared/**/*.kt' 'androidApp/**/*.kt' '!shared/build' + - name: Detecting... + run: ./detekt-cli-1.23.7/bin/detekt-cli -c detekt.yml --excludes '**/shared/build/**/*.kt' + translations: runs-on: ubuntu-latest steps: - name: Check out repository code uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Fetch tags - run: git fetch --tags -p - - uses: actions/setup-java@v4 + - name: "Check translations changes" + id: check-translations-changes + uses: tj-actions/changed-files@v45 with: - distribution: 'temurin' - java-version: '17' - - uses: gradle/actions/setup-gradle@v3 - - uses: android-actions/setup-android@v3 - - name: Configure gradle... - run: mkdir -p ~/.gradle && echo "ignoreGitVersion=true" >> ~/.gradle/gradle.properties - - uses: KengoTODA/actions-setup-docker-compose@v1 + files: | + androidApp/src/main/res/values/strings.xml + - name: upload translation sources + if: steps.check-api-changes.outputs.any_modified == 'true' + uses: crowdin/github-action@v2 with: - version: "2.23.3" - - name: run selfoss + config: './.gitea/workflows/assets/crowdin.yml' + upload_sources: true + upload_translations: false + download_translations: false + create_pull_request: false + push_translations: false + env: + CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} + - name: wait + if: steps.check-api-changes.outputs.any_modified == 'true' + run: sleep 10s + - name: download translations + if: steps.check-api-changes.outputs.any_modified == 'true' + uses: crowdin/github-action@v2 + with: + config: './.gitea/workflows/assets/crowdin.yml' + upload_sources: false + upload_translations: false + download_translations: true + create_pull_request: false + push_translations: false + env: + CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} + - name: Check for uncommitted changes + if: steps.check-api-changes.outputs.any_modified == 'true' + id: check-changes + uses: mskri/check-uncommitted-changes-action@v1.0.1 + - name: Commit Changes + if: steps.check-api-changes.outputs.any_modified == 'true' && steps.check-changes.outputs.changes != '' run: | - docker compose -f .gitea/workflows/assets/docker-compose.yml up -d - - name: Change url until I find a better way to do it - run: | - sed -i "s/val defaultUrl = \"http:\/\/10\.0\.2\.2\:8888\"/val defaultUrl = \"http:\/\/172\.17\.0\.1\:8888\"/g" ./androidApp/src/androidTest/kotlin/bou/amine/apps/readerforselfossv2/android/CommonTests.kt - - name: Tests - uses: reactivecircus/android-emulator-runner@v2 + git config --global user.email aminecmi+giteadrone@pm.me + git config --global user.name giteadrone + git add ./androidApp/src/main/res/* + git commit -m "translation: translation files" + - name: Push changes + if: steps.check-api-changes.outputs.any_modified == 'true' && steps.check-changes.outputs.changes != '' + uses: appleboy/git-push-action@v1.0.0 with: - api-level: 29 - profile: pixel_2 - script: | - ./gradlew androidApp:clearScreenshotsTask || true - ./gradlew androidApp:createScreenshotDirectory - adb logcat -G 16M - ./gradlew JacocoDebugCodeCoverage || true - ./gradlew androidApp:fetchScreenshots - adb logcat 'InputReader:S' 'chatty:S' 'audio_hw_generic:S' 'LogApiCalls:D' '*:I' -d > ./androidApp/build/reports/androidTests/connected/screenshots/logs.txt - - uses: actions/upload-artifact@v3 - if: always() - with: - name: screenshot-espresso - path: androidApp/build/reports/androidTests/connected/screenshots - retention-days: 2 - overwrite: true - include-hidden-files: true - - uses: actions/upload-artifact@v3 - if: always() - with: - name: result-espresso - path: androidApp/build/reports/androidTests/connected/debug/flavors/githubConfig - retention-days: 1 - overwrite: true - include-hidden-files: true - - uses: actions/upload-artifact@v3 - with: - name: coverage-espresso - path: androidApp/build/reports/jacoco/JacocoDebugCodeCoverage - retention-days: 1 - overwrite: true - include-hidden-files: true - - name: Clean - if: always() - run: | - docker compose -f .gitea/workflows/assets/docker-compose.yml stop - -# Lint: -# runs-on: ubuntu-latest -# steps: -# - name: Check out repository code -# uses: actions/checkout@v4 -# - uses: actions/setup-java@v4 -# with: -# distribution: 'temurin' -# java-version: '17' -# cache: gradle -# - name: Install klint -# run: curl -sSLO https://github.com/pinterest/ktlint/releases/download/1.5.0/ktlint && chmod a+x ktlint && mv ktlint /usr/local/bin/ -# - name: Install detekt -# run: curl -sSLO https://github.com/detekt/detekt/releases/download/v1.23.7/detekt-cli-1.23.7.zip && unzip detekt-cli-1.23.7.zip -# - name: Linting... -# run: ktlint 'shared/**/*.kt' 'androidApp/**/*.kt' '!shared/build' -# - name: Detecting... -# run: ./detekt-cli-1.23.7/bin/detekt-cli -c detekt.yml --excludes '**/shared/build/**/*.kt' -# translations: -# runs-on: ubuntu-latest -# steps: -# - name: Check out repository code -# uses: actions/checkout@v4 -# with: -# fetch-depth: 0 -# - name: "Check translations changes" -# id: check-translations-changes -# uses: tj-actions/changed-files@v45 -# with: -# files: | -# androidApp/src/main/res/values/strings.xml -# - name: upload translation sources -# if: steps.check-api-changes.outputs.any_modified == 'true' -# uses: crowdin/github-action@v2 -# with: -# config: './.gitea/workflows/assets/crowdin.yml' -# upload_sources: true -# upload_translations: false -# download_translations: false -# create_pull_request: false -# push_translations: false -# env: -# CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} -# CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} -# - name: wait -# if: steps.check-api-changes.outputs.any_modified == 'true' -# run: sleep 10s -# - name: download translations -# if: steps.check-api-changes.outputs.any_modified == 'true' -# uses: crowdin/github-action@v2 -# with: -# config: './.gitea/workflows/assets/crowdin.yml' -# upload_sources: false -# upload_translations: false -# download_translations: true -# create_pull_request: false -# push_translations: false -# env: -# CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} -# CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} -# - name: Check for uncommitted changes -# if: steps.check-api-changes.outputs.any_modified == 'true' -# id: check-changes -# uses: mskri/check-uncommitted-changes-action@v1.0.1 -# - name: Commit Changes -# if: steps.check-api-changes.outputs.any_modified == 'true' && steps.check-changes.outputs.changes != '' -# run: | -# git config --global user.email aminecmi+giteadrone@pm.me -# git config --global user.name giteadrone -# git add ./androidApp/src/main/res/* -# git commit -m "translation: translation files" -# - name: Push changes -# if: steps.check-api-changes.outputs.any_modified == 'true' && steps.check-changes.outputs.changes != '' -# uses: appleboy/git-push-action@v1.0.0 -# with: -# author_name: giteadrone -# author_email: aminecmi+giteadrone@pm.me -# remote: ${{ secrets.REMOTE_URL }} -# ssh_key: ${{ secrets.PRIVATE_KEY }} -# branch: ${{ github.head_ref || github.ref_name }} -# build: -# needs: Lint -# uses: ./.gitea/workflows/common_build.yml + author_name: giteadrone + author_email: aminecmi+giteadrone@pm.me + remote: ${{ secrets.REMOTE_URL }} + ssh_key: ${{ secrets.PRIVATE_KEY }} + branch: ${{ github.head_ref || github.ref_name }} + build: + needs: Lint + uses: ./.gitea/workflows/common_build.yml + integrationTests: + needs: Lint + uses: ./.gitea/workflows/common_coverage.yml diff --git a/androidApp/src/androidTest/kotlin/bou/amine/apps/readerforselfossv2/android/CommonTests.kt b/androidApp/src/androidTest/kotlin/bou/amine/apps/readerforselfossv2/android/CommonTests.kt index bd2a635..a1c9af9 100644 --- a/androidApp/src/androidTest/kotlin/bou/amine/apps/readerforselfossv2/android/CommonTests.kt +++ b/androidApp/src/androidTest/kotlin/bou/amine/apps/readerforselfossv2/android/CommonTests.kt @@ -35,13 +35,13 @@ import java.io.IOException import java.util.Locale // For now, do not move this as it is modified by the integration tests -val defaultUrl = "http://10.0.2.2:8888" +const val DEFAULT_URL = "http://10.0.2.2:8888" fun performLogin(someUrl: String? = null) { - Log.i("AUTOMATION", "The url used will be ${if (!someUrl.isNullOrEmpty()) someUrl else defaultUrl}") + Log.i("AUTOMATION", "The url used will be ${if (!someUrl.isNullOrEmpty()) someUrl else DEFAULT_URL}") onView(withId(R.id.urlView)).perform(click()).perform( typeTextIntoFocusedView( - if (!someUrl.isNullOrEmpty()) someUrl else defaultUrl, + if (!someUrl.isNullOrEmpty()) someUrl else DEFAULT_URL, ), ) onView(withId(R.id.signInButton)).perform(click()) @@ -160,7 +160,7 @@ open class WithANRException { "default root matcher, it may be picking a root that never takes focus. " + "Root:", ) - private val otherException = "System Ul isn't responding" + private const val OTHER_EXCEPTION = "System Ul isn't responding" private fun handleAnrDialogue() { val device = UiDevice.getInstance(getInstrumentation()) @@ -175,7 +175,7 @@ open class WithANRException { Espresso.setFailureHandler { error, viewMatcher -> takeScreenshot() - if (error.message!!.contains(otherException)) { + if (error.message!!.contains(OTHER_EXCEPTION)) { handleAnrDialogue() } else if (error.message!!.contains(rootViewWithoutFocusExceptionMsg) && anrCount < 20 @@ -192,6 +192,7 @@ open class WithANRException { } } +@Suppress("detekt:NestedBlockDepth") fun takeScreenshot() { try { val bitmap = getInstrumentation().uiAutomation.takeScreenshot() diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/LoginActivity.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/LoginActivity.kt index 72fb695..c3c9127 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/LoginActivity.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/LoginActivity.kt @@ -132,6 +132,7 @@ class LoginActivity : showProgress(false) } + @Suppress("detekt:LongMethod") private fun attemptLogin() { // Reset errors. binding.urlView.error = null