Skip to content

Commit

Permalink
Use UiDevice to sleep/wakeup
Browse files Browse the repository at this point in the history
  • Loading branch information
hannesa2 committed May 22, 2024
1 parent c336d1d commit 0eebbad
Show file tree
Hide file tree
Showing 8 changed files with 37 additions and 83 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package info.mqtt.android.extsample.activity

import android.app.UiAutomation
import android.os.Build
import android.view.Gravity
import androidx.test.core.graphics.writeToTestStorage
import androidx.test.espresso.Espresso.onView
Expand All @@ -18,24 +16,24 @@ import androidx.test.espresso.screenshot.captureToBitmap
import androidx.test.ext.junit.rules.activityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import com.moka.lib.assertions.WaitingAssertion
import info.mqtt.android.extsample.MainActivity
import info.mqtt.android.extsample.R
import org.junit.Assert
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestName
import org.junit.runner.RunWith
import timber.log.Timber
import java.io.FileInputStream
import java.io.IOException
import java.io.InputStream
import java.lang.Thread.sleep
import java.util.Locale


@RunWith(AndroidJUnit4::class)
class LongRunningSleepMode {
class ExtendedPublishSleepTest {

private lateinit var device: UiDevice

// a handy JUnit rule that stores the method name, so it can be used to generate unique screenshot files per test method
@get:Rule
Expand All @@ -46,6 +44,7 @@ class LongRunningSleepMode {

@Before
fun setUp() {
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
}

@Test
Expand All @@ -56,106 +55,68 @@ class LongRunningSleepMode {
onView(withId(R.id.action_add_connection)).perform(click())
onView(withId(R.id.action_save_connection)).perform(click())

sleep(200)
onView(ViewMatchers.isRoot())
.captureToBitmap()
.writeToTestStorage("${javaClass.simpleName}_${nameRule.methodName}-AddConnect")
.writeToTestStorage("${javaClass.simpleName}_${nameRule.methodName}-1AddConnect")

onView(withId(R.id.disConnectSwitch)).perform(click())
onView(withId(3)).perform(click())
// onView(withTagValue(`is`("Subscribe" as Any))).perform(click())

onView(withId(R.id.subscribe_button)).perform(click())
onView(withId(R.id.subscription_topic_edit_text)).perform(typeText(TOPIC))
sleep(200)
onView(ViewMatchers.isRoot())
.captureToBitmap()
.writeToTestStorage("${javaClass.simpleName}_${nameRule.methodName}-Subscribe")
.writeToTestStorage("${javaClass.simpleName}_${nameRule.methodName}-2Subscribe")
onView(withText("OK")).perform(click())

Assert.assertTrue("Device is in sleep mode", device.isScreenOn)

// Now send device to sleep
Timber.i("Send device to sleep")
sendKeyEvent(KeyEvent.SLEEP)
Timber.i("wait ${WAIT_SECONDS}")
device.sleep()
sleep(1000)
Assert.assertFalse("Device is not in sleep mode", device.isScreenOn)

// onView(ViewMatchers.isRoot())
// .captureToBitmap()
// .writeToTestStorage("${javaClass.simpleName}_${nameRule.methodName}-sleep")
Timber.i("wait $WAIT_SECONDS seconds")
sleep(1000 * WAIT_SECONDS)
sendKeyEvent(KeyEvent.AWAKE)
Timber.i("Awake device")
device.wakeUp()
sleep(1000)

Timber.i("Wakeup device")
onView(ViewMatchers.isRoot())
.captureToBitmap()
.writeToTestStorage("${javaClass.simpleName}_${nameRule.methodName}-3afterWakeUp")

onView(withId(2)).perform(click())
onView(withId(R.id.topic)).perform(replaceText(TOPIC))
onView(withId(R.id.message)).perform(replaceText("msg"))
onView(withId(R.id.message)).perform(replaceText("Typed message"))
sleep(200)
onView(ViewMatchers.isRoot())
.captureToBitmap()
.writeToTestStorage("${javaClass.simpleName}_${nameRule.methodName}-publish")
.writeToTestStorage("${javaClass.simpleName}_${nameRule.methodName}-4publish")
onView(withId(R.id.publish_button)).perform(click())

onView(withId(1)).perform(click())

WaitingAssertion.checkAssertion(R.id.history_list_view, Matchers.withListSizeBigger(0), 2500)
sleep(200)
onView(ViewMatchers.isRoot())
.captureToBitmap()
.writeToTestStorage("${javaClass.simpleName}_${nameRule.methodName}-End")
}
.writeToTestStorage("${javaClass.simpleName}_${nameRule.methodName}-5publish")

// Source:
// https://github.com/facebook/screenshot-tests-for-android/blob/main/core/src/main/java/com/facebook/testing/screenshot/internal/Registry.java
private fun sendKeyEvent(event: KeyEvent) {
if (Build.VERSION.SDK_INT < 23) {
return
}
val command = String.format(Locale.ENGLISH, "adb shell input keyevent %s", event.eventKey)

// Timber.d("event=${event.name} cmd='$command'")
// try {
// val proc = Runtime.getRuntime().exec(arrayOf(command))
// var line: String?
//
// val stderr = proc.errorStream
// val esr = InputStreamReader(stderr)
// val ebr = BufferedReader(esr)
// while ((ebr.readLine().also { line = it }) != null) Timber.e("FXN-BOOTCLASSPATH", line!!)
//
// val stdout = proc.inputStream
// val osr = InputStreamReader(stdout)
// val obr = BufferedReader(osr)
// while ((obr.readLine().also { line = it }) != null) Timber.i("FXN-BOOTCLASSPATH", line!!)
//
// val exitVal = proc.waitFor()
// Timber.d("FXN-BOOTCLASSPATH", "getprop exitValue: $exitVal")
// } catch (e: Exception) {
// Timber.e(e)
// }

Timber.d("event=${event.name} cmd='$command'")
val automation: UiAutomation = InstrumentationRegistry.getInstrumentation().uiAutomation
val fileDescriptor = automation.executeShellCommand(command)
val stream: InputStream = FileInputStream(fileDescriptor.fileDescriptor)
try {
val buffer = ByteArray(1024)
Timber.d("start")
while (stream.read(buffer) != -1) {
Timber.d("while")
// Consume stdout to ensure the command completes
Timber.v(buffer.toString())
}
Timber.d("done")
} catch (e: IOException) {
Timber.e(e)
} finally {
try {
stream.close()
} catch (e: IOException) {
Timber.e(e)
}
try {
fileDescriptor.close()
} catch (e: IOException) {
Timber.e(e)
}
Timber.d("finished")
}
WaitingAssertion.checkAssertion(R.id.history_list_view, Matchers.withListSizeBigger(0), 2500)
onView(ViewMatchers.isRoot())
.captureToBitmap()
.writeToTestStorage("${javaClass.simpleName}_${nameRule.methodName}-6End")
}

companion object {
private const val TOPIC = "AnotherTest"
private const val WAIT_SECONDS = 60L
private const val WAIT_SECONDS = 310L
}
}

This file was deleted.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 0eebbad

Please sign in to comment.