detox 19.10.0 → 19.12.1-prerelease.0
Sign up to get free protection for your applications and to get access to all the features.
- package/Detox-android/com/wix/detox/{19.10.0/detox-19.10.0-javadoc.jar → 19.12.1-prerelease.0/detox-19.12.1-prerelease.0-javadoc.jar} +0 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-javadoc.jar.md5 +1 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-javadoc.jar.sha1 +1 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-javadoc.jar.sha256 +1 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-javadoc.jar.sha512 +1 -0
- package/Detox-android/com/wix/detox/{19.10.0/detox-19.10.0-sources.jar → 19.12.1-prerelease.0/detox-19.12.1-prerelease.0-sources.jar} +0 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-sources.jar.md5 +1 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-sources.jar.sha1 +1 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-sources.jar.sha256 +1 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-sources.jar.sha512 +1 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.aar +0 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.aar.md5 +1 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.aar.sha1 +1 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.aar.sha256 +1 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.aar.sha512 +1 -0
- package/Detox-android/com/wix/detox/{19.10.0/detox-19.10.0.pom → 19.12.1-prerelease.0/detox-19.12.1-prerelease.0.pom} +1 -7
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.pom.md5 +1 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.pom.sha1 +1 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.pom.sha256 +1 -0
- package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.pom.sha512 +1 -0
- package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
- package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
- package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
- package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
- package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
- package/Detox-ios-src.tbz +0 -0
- package/Detox-ios.tbz +0 -0
- package/android/build.gradle +12 -6
- package/android/detox/build.gradle +13 -9
- package/android/detox/publishing.gradle +27 -27
- package/android/detox/src/full/java/com/wix/detox/LaunchArgs.java +9 -0
- package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeExtension.kt +15 -2
- package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeIdlingResources.kt +43 -38
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/DelegatedIdleInterrogationStrategy.kt +7 -27
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/IdleInterrogationStrategy.kt +1 -11
- package/android/detox/src/main/java/com/wix/detox/common/TextFileReader.kt +1 -1
- package/android/detox/src/testFull/java/com/wix/detox/espresso/action/DetoxMultiTapSpec.kt +4 -3
- package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/DelegatedIdleInterrogationStrategySpec.kt +3 -11
- package/package.json +3 -3
- package/runners/jest-circus/listeners/DetoxCoreListener.js +24 -16
- package/src/DetoxExportWrapper.js +1 -1
- package/src/android/core/NativeElement.js +56 -20
- package/src/android/core/NativeExpect.js +28 -9
- package/src/android/interactions/native.js +24 -18
- package/src/artifacts/timeline/TimelineArtifactPlugin.js +6 -9
- package/src/artifacts/timeline/TimelineContextTypes.js +7 -0
- package/src/devices/allocation/DeviceAllocator.js +1 -2
- package/src/devices/allocation/drivers/android/emulator/EmulatorAllocDriver.js +1 -1
- package/src/devices/allocation/drivers/android/emulator/EmulatorLauncher.js +1 -2
- package/src/devices/runtime/RuntimeDevice.js +7 -11
- package/src/ios/expectTwo.js +152 -67
- package/src/utils/invocationTraceDescriptions.js +43 -0
- package/src/utils/trace.js +52 -10
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-javadoc.jar.md5 +0 -1
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-javadoc.jar.sha1 +0 -1
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-javadoc.jar.sha256 +0 -1
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-javadoc.jar.sha512 +0 -1
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-sources.jar.md5 +0 -1
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-sources.jar.sha1 +0 -1
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-sources.jar.sha256 +0 -1
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-sources.jar.sha512 +0 -1
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.aar +0 -0
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.aar.md5 +0 -1
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.aar.sha1 +0 -1
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.aar.sha256 +0 -1
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.aar.sha512 +0 -1
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.pom.md5 +0 -1
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.pom.sha1 +0 -1
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.pom.sha256 +0 -1
- package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.pom.sha512 +0 -1
- package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/DefaultIdleInterrogationStrategy.kt +0 -84
- package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/DefaultIdleInterrogationStrategySpec.kt +0 -115
Binary file
|
@@ -1 +0,0 @@
|
|
1
|
-
af4e914eb67e1dd955cc5acd07d02340
|
@@ -1 +0,0 @@
|
|
1
|
-
e16c929ebd269ce9e0e9c4d0e06e46601ecfa6a1
|
@@ -1 +0,0 @@
|
|
1
|
-
1fede18c4a72541d428f69b6dab9c6a414f8b1a3b8a7f525b62b184cf75000ad
|
@@ -1 +0,0 @@
|
|
1
|
-
f8103e2667ffe0c25f91afb1d2c12fc95b608247922488688ab78326806c2b60c1d5c602419e9c1218730cb1f563f60eaee07eddb1492b02e47f0b73a18cd92c
|
@@ -1 +0,0 @@
|
|
1
|
-
f3c3be39af0c3904f8578ef066b1fa6b
|
@@ -1 +0,0 @@
|
|
1
|
-
75451bd4392a3307643bd3f92effb6c1ed1736de
|
@@ -1 +0,0 @@
|
|
1
|
-
e0a84ddf21ad608af9fd47b42b50e9e1c816e06bfe210225b4255ab365b6d202
|
@@ -1 +0,0 @@
|
|
1
|
-
1b14fb1d91dbe7b4c2be24285dc3840d8f7631f86d4c79056fd4cf74975c33ec8e19266da364dc7b57ca486cd6dd7eb472235801f1daa250ecf37421af3d79fd
|
@@ -1,84 +0,0 @@
|
|
1
|
-
@file:RNDropSupportTodo(62, "Remove all of this; Use DelegatedIdleInterrogationStrategy, instead.")
|
2
|
-
|
3
|
-
package com.wix.detox.reactnative.idlingresources.timers
|
4
|
-
|
5
|
-
import com.facebook.react.bridge.ReactContext
|
6
|
-
import com.wix.detox.common.RNDropSupportTodo
|
7
|
-
import com.wix.detox.reactnative.helpers.RNHelpers
|
8
|
-
import org.joor.Reflect
|
9
|
-
import java.util.*
|
10
|
-
|
11
|
-
private const val BUSY_WINDOW_THRESHOLD = 1500
|
12
|
-
|
13
|
-
private class TimerReflected(timer: Any) {
|
14
|
-
private var reflected = Reflect.on(timer)
|
15
|
-
|
16
|
-
val isRepeating: Boolean
|
17
|
-
get() = reflected.field("mRepeat").get()
|
18
|
-
val interval: Int
|
19
|
-
get() = reflected.field("mInterval").get()
|
20
|
-
val targetTime: Long
|
21
|
-
get() = reflected.field("mTargetTime").get()
|
22
|
-
}
|
23
|
-
|
24
|
-
private class TimingModuleReflected(private val timingModule: Any) {
|
25
|
-
val timersQueue: PriorityQueue<Any>
|
26
|
-
get() = Reflect.on(timingModule).field("mTimers").get()
|
27
|
-
val timersLock: Any
|
28
|
-
get() = Reflect.on(timingModule).field("mTimerGuard").get()
|
29
|
-
|
30
|
-
operator fun component1() = timersQueue
|
31
|
-
operator fun component2() = timersLock
|
32
|
-
}
|
33
|
-
|
34
|
-
class DefaultIdleInterrogationStrategy
|
35
|
-
internal constructor(private val timersModule: Any)
|
36
|
-
: IdleInterrogationStrategy {
|
37
|
-
|
38
|
-
override fun isIdleNow(): Boolean {
|
39
|
-
val (timersQueue, timersLock) = TimingModuleReflected(timersModule)
|
40
|
-
synchronized(timersLock) {
|
41
|
-
val nextTimer = timersQueue.peek()
|
42
|
-
nextTimer?.let {
|
43
|
-
return !isTimerInBusyWindow(it) && !hasBusyTimers(timersQueue)
|
44
|
-
}
|
45
|
-
return true
|
46
|
-
}
|
47
|
-
}
|
48
|
-
|
49
|
-
private fun isTimerInBusyWindow(timer: Any): Boolean {
|
50
|
-
val timerReflected = TimerReflected(timer)
|
51
|
-
return when {
|
52
|
-
timerReflected.isRepeating -> false
|
53
|
-
timerReflected.interval > BUSY_WINDOW_THRESHOLD -> false
|
54
|
-
else -> true
|
55
|
-
}
|
56
|
-
}
|
57
|
-
|
58
|
-
private fun hasBusyTimers(timersQueue: PriorityQueue<Any>): Boolean {
|
59
|
-
timersQueue.forEach {
|
60
|
-
if (isTimerInBusyWindow(it)) {
|
61
|
-
return true
|
62
|
-
}
|
63
|
-
}
|
64
|
-
return false
|
65
|
-
}
|
66
|
-
|
67
|
-
companion object {
|
68
|
-
fun createIfSupported(reactContext: ReactContext): DefaultIdleInterrogationStrategy? {
|
69
|
-
// RN = 0.62.0:
|
70
|
-
// Should have been handled by DelegatedIdleInterrogationStrategy.createIfSupported() but seems the new TimingModule class
|
71
|
-
// was released without the awaited-for "hasActiveTimersInRange()" method.
|
72
|
-
try {
|
73
|
-
val timingModule = RNHelpers.getNativeModule(reactContext, "com.facebook.react.modules.core.TimingModule")
|
74
|
-
val timersManager = Reflect.on(timingModule).get<Any>("mJavaTimerManager")
|
75
|
-
return DefaultIdleInterrogationStrategy(timersManager)
|
76
|
-
} catch (ex: Exception) {
|
77
|
-
}
|
78
|
-
|
79
|
-
// RN < 0.62
|
80
|
-
val timingModule = RNHelpers.getNativeModule(reactContext, "com.facebook.react.modules.core.Timing") ?: return null
|
81
|
-
return DefaultIdleInterrogationStrategy(timingModule)
|
82
|
-
}
|
83
|
-
}
|
84
|
-
}
|
@@ -1,115 +0,0 @@
|
|
1
|
-
package com.wix.detox.reactnative.idlingresources.timers
|
2
|
-
|
3
|
-
import com.facebook.react.bridge.NativeModule
|
4
|
-
import com.wix.detox.UTHelpers
|
5
|
-
import org.assertj.core.api.Assertions
|
6
|
-
import org.spekframework.spek2.Spek
|
7
|
-
import org.spekframework.spek2.style.specification.describe
|
8
|
-
import java.util.*
|
9
|
-
import java.util.concurrent.Executors
|
10
|
-
|
11
|
-
private const val BUSY_INTERVAL_MS = 1500
|
12
|
-
private const val MEANINGFUL_TIMER_INTERVAL = BUSY_INTERVAL_MS
|
13
|
-
|
14
|
-
data class TimerStub(
|
15
|
-
private var mCallbackID: Int,
|
16
|
-
private var mTargetTime: Long,
|
17
|
-
private var mInterval: Int,
|
18
|
-
private var mRepeat: Boolean)
|
19
|
-
|
20
|
-
class TimersNativeModuleStub : NativeModule {
|
21
|
-
val mTimers: PriorityQueue<Any> = PriorityQueue(2) { _, _ -> 0}
|
22
|
-
val mTimerGuard = "Lock-Mock"
|
23
|
-
|
24
|
-
override fun onCatalystInstanceDestroy() {}
|
25
|
-
override fun invalidate() {}
|
26
|
-
|
27
|
-
override fun getName(): String = "TimersNativeModuleStub"
|
28
|
-
override fun canOverrideExistingModule() = false
|
29
|
-
override fun initialize() {}
|
30
|
-
}
|
31
|
-
|
32
|
-
private fun now() = System.nanoTime() / 1000000L
|
33
|
-
private fun aTimer(targetTime: Long, interval: Int, isRepeating: Boolean): TimerStub {
|
34
|
-
return TimerStub(-1, targetTime, interval, isRepeating)
|
35
|
-
}
|
36
|
-
private fun aTimer(interval: Int, isRepeating: Boolean) = aTimer(now() + interval + 10, interval, isRepeating)
|
37
|
-
private fun aOneShotTimer(interval: Int) = aTimer(interval, false)
|
38
|
-
private fun aRepeatingTimer(interval: Int) = aTimer(interval, true)
|
39
|
-
private fun anOverdueTimer() = aTimer(now() - 100, 123, false)
|
40
|
-
|
41
|
-
object DefaultIdleInterrogationStrategySpec: Spek({
|
42
|
-
describe("Default timers idle-interrogation strategy") {
|
43
|
-
|
44
|
-
lateinit var timersNativeModule: TimersNativeModuleStub
|
45
|
-
|
46
|
-
beforeEachTest {
|
47
|
-
timersNativeModule = TimersNativeModuleStub()
|
48
|
-
}
|
49
|
-
|
50
|
-
fun givenTimer(timer: Any) {
|
51
|
-
timersNativeModule.mTimers.add(timer)
|
52
|
-
}
|
53
|
-
|
54
|
-
fun uut() = DefaultIdleInterrogationStrategy(timersNativeModule)
|
55
|
-
|
56
|
-
it("should be idle if there are no timers in queue") {
|
57
|
-
Assertions.assertThat(uut().isIdleNow()).isTrue()
|
58
|
-
}
|
59
|
-
|
60
|
-
it("should be busy if there's a meaningful pending timer") {
|
61
|
-
givenTimer(aOneShotTimer(MEANINGFUL_TIMER_INTERVAL))
|
62
|
-
Assertions.assertThat(uut().isIdleNow()).isFalse()
|
63
|
-
}
|
64
|
-
|
65
|
-
it("should be idle if pending timer is too far away (ie not meaningful)") {
|
66
|
-
givenTimer(aOneShotTimer(BUSY_INTERVAL_MS + 1))
|
67
|
-
Assertions.assertThat(uut().isIdleNow()).isTrue()
|
68
|
-
}
|
69
|
-
|
70
|
-
it("should be idle if the only timer is a repeating one") {
|
71
|
-
givenTimer(aRepeatingTimer(MEANINGFUL_TIMER_INTERVAL))
|
72
|
-
Assertions.assertThat(uut().isIdleNow()).isTrue()
|
73
|
-
}
|
74
|
-
|
75
|
-
it("should be busy if a meaningful pending timer lies beyond a repeating one") {
|
76
|
-
givenTimer(aRepeatingTimer(BUSY_INTERVAL_MS / 10))
|
77
|
-
givenTimer(aOneShotTimer(BUSY_INTERVAL_MS))
|
78
|
-
Assertions.assertThat(uut().isIdleNow()).isFalse()
|
79
|
-
}
|
80
|
-
|
81
|
-
/**
|
82
|
-
* Note: Reversed logic due to this issue: https://github.com/wix/Detox/issues/1171 !!!
|
83
|
-
*
|
84
|
-
* Apparently at times (rare) this caused Espresso to think we're idle too soon, rendering
|
85
|
-
* it never to query any idling resource again even after the timer effectively expires...
|
86
|
-
*/
|
87
|
-
it("should be *busy* even if all timers are overdue") {
|
88
|
-
givenTimer(anOverdueTimer())
|
89
|
-
givenTimer(anOverdueTimer())
|
90
|
-
Assertions.assertThat(uut().isIdleNow()).isFalse()
|
91
|
-
}
|
92
|
-
|
93
|
-
it("should be busy if has a meaningful pending timer set beyond an overdue timer") {
|
94
|
-
givenTimer(anOverdueTimer())
|
95
|
-
givenTimer(aOneShotTimer(MEANINGFUL_TIMER_INTERVAL))
|
96
|
-
Assertions.assertThat(uut().isIdleNow()).isFalse()
|
97
|
-
}
|
98
|
-
|
99
|
-
it("should yield to other threads using the timers module") {
|
100
|
-
val executor = Executors.newSingleThreadExecutor()
|
101
|
-
var isIdle: Boolean? = null
|
102
|
-
|
103
|
-
synchronized(timersNativeModule.mTimerGuard) {
|
104
|
-
executor.submit {
|
105
|
-
isIdle = uut().isIdleNow()
|
106
|
-
}
|
107
|
-
UTHelpers.yieldToOtherThreads(executor)
|
108
|
-
Assertions.assertThat(isIdle).isNull()
|
109
|
-
}
|
110
|
-
UTHelpers.yieldToOtherThreads(executor)
|
111
|
-
Assertions.assertThat(isIdle).isNotNull()
|
112
|
-
executor.shutdownNow()
|
113
|
-
}
|
114
|
-
}
|
115
|
-
})
|