Try test butler

This commit is contained in:
Matthieu 2022-07-26 21:52:38 +02:00
parent d1a34abf85
commit 9d2e77da8f
7 changed files with 100 additions and 17 deletions

View File

@ -1,5 +1,13 @@
image: registry.gitlab.com/fdroid/ci-images-client image: registry.gitlab.com/fdroid/ci-images-client
before_script:
- export GRADLE_USER_HOME=`pwd`/.gradle
cache:
paths:
- .gradle/wrapper
- .gradle/caches
# Basic android and gradle stuff # Basic android and gradle stuff
# Check linting # Check linting
lintDebug: lintDebug:
@ -48,12 +56,12 @@ debugTests:
- apt-get update || apt-get update - apt-get update || apt-get update
- apt-get install -y openjdk-11-jdk-headless - apt-get install -y openjdk-11-jdk-headless
- update-alternatives --auto java - update-alternatives --auto java
- ./gradlew connectedStagingAndroidTest || (adb -e logcat -d > logcat.txt; exit 1) - ./gradlew connectedStagingAndroidTest --info || (adb -e logcat -d > logcat.txt; exit 1)
artifacts: artifacts:
paths: paths:
- logcat.txt - logcat.txt
connected 23 default x86_64: connected 27 default x86_64:
<<: *connected-template <<: *connected-template
fdroid build: fdroid build:

View File

@ -33,7 +33,7 @@ android {
versionCode 16 versionCode 16
versionName "1.0.beta" + versionCode versionName "1.0.beta" + versionCode
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "org.pixeldroid.app.testUtility.TestRunner"
testInstrumentationRunnerArguments clearPackageData: 'true' testInstrumentationRunnerArguments clearPackageData: 'true'
} }
sourceSets { sourceSets {
@ -234,6 +234,10 @@ dependencies {
*/ */
//stagingImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' //stagingImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
androidTestImplementation 'com.android.support.test.espresso:espresso-idling-resource:3.0.2'
androidTestImplementation 'com.linkedin.testbutler:test-butler-library:2.2.1'
androidTestUtil 'com.linkedin.testbutler:test-butler-app:2.2.1'
androidTestImplementation 'androidx.work:work-testing:2.7.1' androidTestImplementation 'androidx.work:work-testing:2.7.1'
testImplementation 'com.github.tomakehurst:wiremock-jre8:2.33.2' testImplementation 'com.github.tomakehurst:wiremock-jre8:2.33.2'

View File

@ -4,37 +4,50 @@ import android.content.Context
import androidx.test.core.app.ActivityScenario import androidx.test.core.app.ActivityScenario
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
import androidx.test.espresso.Espresso.onView import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.IdlingRegistry
import androidx.test.espresso.IdlingResource
import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.* import com.linkedin.android.testbutler.TestButler
import org.pixeldroid.app.testUtility.clearData import org.junit.After
import org.pixeldroid.app.testUtility.initDB import org.junit.Before
import org.pixeldroid.app.utils.db.AppDatabase import org.junit.Rule
import org.junit.Test
import org.junit.rules.Timeout import org.junit.rules.Timeout
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.pixeldroid.app.testUtility.ConnectivityIdlingResource
import org.pixeldroid.app.testUtility.clearData
import org.pixeldroid.app.testUtility.initDB
import org.pixeldroid.app.testUtility.waitForView import org.pixeldroid.app.testUtility.waitForView
import org.pixeldroid.app.utils.db.AppDatabase
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
@Ignore("Ignore until we can get TestButler to work on CI")
class LoginActivityOfflineTest { class LoginActivityOfflineTest {
private lateinit var context: Context private lateinit var context: Context
private lateinit var waitForOffline: IdlingResource
private lateinit var db: AppDatabase private lateinit var db: AppDatabase
@get:Rule @get:Rule
var globalTimeout: Timeout = Timeout.seconds(100) var globalTimeout: Timeout = Timeout.seconds(100)
@Before @Before
fun before() { fun before() {
//TestButler.setWifiState(false) TestButler.setWifiState(false)
//TestButler.setGsmState(false) TestButler.setGsmState(false)
context = ApplicationProvider.getApplicationContext<Context>() context = ApplicationProvider.getApplicationContext()
waitForOffline = ConnectivityIdlingResource("resourceName",
context, ConnectivityIdlingResource.WAIT_FOR_DISCONNECTION)
db = initDB(context) db = initDB(context)
db.clearAllTables() db.clearAllTables()
IdlingRegistry.getInstance().register(waitForOffline)
ActivityScenario.launch(LoginActivity::class.java) ActivityScenario.launch(LoginActivity::class.java)
} }
@ -53,9 +66,10 @@ class LoginActivityOfflineTest {
@After @After
fun after() { fun after() {
//TestButler.setWifiState(true) TestButler.setWifiState(true)
//TestButler.setGsmState(true) TestButler.setGsmState(true)
db.close() db.close()
clearData() clearData()
IdlingRegistry.getInstance().unregister(waitForOffline)
} }
} }

View File

@ -33,7 +33,6 @@ class MockedServerTest {
db = initDB(context) db = initDB(context)
db.clearAllTables() db.clearAllTables()
db.instanceDao().insertInstance(testiTestoInstance) db.instanceDao().insertInstance(testiTestoInstance)
db.userDao().insertUser(testiTesto) db.userDao().insertUser(testiTesto)
db.close() db.close()
activityScenario = ActivityScenario.launch(MainActivity::class.java) activityScenario = ActivityScenario.launch(MainActivity::class.java)

View File

@ -58,13 +58,15 @@ class PostCreationFragmentTest {
IdlingRegistry.getInstance().unregister(viewPager2IdlingResource) IdlingRegistry.getInstance().unregister(viewPager2IdlingResource)
} }
private val expectedIntent: Matcher<Intent> = hasAction(Intent.ACTION_CHOOSER)
// image choosing intent // image choosing intent
@Test @Test
fun galleryButtonLaunchesGalleryIntent() { fun galleryButtonLaunchesGalleryIntent() {
waitForView(R.id.photo_view_button) waitForView(R.id.photo_view_button)
val expectedIntent: Matcher<Intent> = hasAction(Intent.ACTION_CHOOSER)
onView(withId(R.id.photo_view_button)).perform(click()) onView(withId(R.id.photo_view_button)).perform(click())
Thread.sleep(300)
intended(expectedIntent) intended(expectedIntent)
} }
} }

View File

@ -0,0 +1,57 @@
package org.pixeldroid.app.testUtility
import android.content.Context
import androidx.test.espresso.IdlingResource
import kotlin.jvm.Volatile
import android.net.ConnectivityManager
import android.net.NetworkInfo
import android.util.Log
import org.pixeldroid.app.testUtility.ConnectivityIdlingResource
/**
* Created by Kush Saini
* Later converted and adapted to Kotlin for PixelDroid
* Description:
* This [IdlingResource] halts Espresso Test depending on mode which is passed to the constructor
*/
class ConnectivityIdlingResource
/**
*
* @param resourceName name of the resource (used for logging and idempotency of registration
* @param context context
* @param mode if mode is WAIT_FOR_CONNECTION i.e. value is 1 then the [IdlingResource]
* halts test until internet is available and if mode is WAIT_FOR_DISCONNECTION
* i.e. value is 0 then [IdlingResource] waits for internet to disconnect
*/(private val resourceName: String, private val context: Context, private val mode: Int) :
IdlingResource {
@Volatile
private var resourceCallback: IdlingResource.ResourceCallback? = null
override fun getName(): String {
return resourceName
}
override fun isIdleNow(): Boolean {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val activeNetwork: NetworkInfo? = cm.activeNetworkInfo
var isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting
if (mode == WAIT_FOR_DISCONNECTION) isConnected = !isConnected
if (isConnected) {
Log.d(TAG, "Connected now!")
resourceCallback!!.onTransitionToIdle()
} else {
Log.d(TAG, "Not connected!")
}
return isConnected
}
override fun registerIdleTransitionCallback(resourceCallback: IdlingResource.ResourceCallback) {
this.resourceCallback = resourceCallback
}
companion object {
var WAIT_FOR_CONNECTION = 1
var WAIT_FOR_DISCONNECTION = 0
private const val TAG = "ConnectIdlingResource"
}
}

View File

@ -1,5 +1,5 @@
package org.pixeldroid.app.testUtility package org.pixeldroid.app.testUtility
/*
import android.os.Bundle import android.os.Bundle
import androidx.test.runner.AndroidJUnitRunner import androidx.test.runner.AndroidJUnitRunner
import com.linkedin.android.testbutler.TestButler import com.linkedin.android.testbutler.TestButler
@ -17,4 +17,3 @@ class TestRunner: AndroidJUnitRunner() {
} }
} }
*/