detox 19.9.3 → 19.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. package/Detox-android/com/wix/detox/{19.9.3-prerelease.0/detox-19.9.3-prerelease.0-javadoc.jar → 19.12.0/detox-19.12.0-javadoc.jar} +0 -0
  2. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0-javadoc.jar.md5 +1 -0
  3. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0-javadoc.jar.sha1 +1 -0
  4. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0-javadoc.jar.sha256 +1 -0
  5. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0-javadoc.jar.sha512 +1 -0
  6. package/Detox-android/com/wix/detox/{19.9.3-prerelease.0/detox-19.9.3-prerelease.0-sources.jar → 19.12.0/detox-19.12.0-sources.jar} +0 -0
  7. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0-sources.jar.md5 +1 -0
  8. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0-sources.jar.sha1 +1 -0
  9. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0-sources.jar.sha256 +1 -0
  10. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0-sources.jar.sha512 +1 -0
  11. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0.aar +0 -0
  12. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0.aar.md5 +1 -0
  13. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0.aar.sha1 +1 -0
  14. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0.aar.sha256 +1 -0
  15. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0.aar.sha512 +1 -0
  16. package/Detox-android/com/wix/detox/{19.9.3-prerelease.0/detox-19.9.3-prerelease.0.pom → 19.12.0/detox-19.12.0.pom} +1 -7
  17. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0.pom.md5 +1 -0
  18. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0.pom.sha1 +1 -0
  19. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0.pom.sha256 +1 -0
  20. package/Detox-android/com/wix/detox/19.12.0/detox-19.12.0.pom.sha512 +1 -0
  21. package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
  22. package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
  23. package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
  24. package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
  25. package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
  26. package/Detox-ios-src.tbz +0 -0
  27. package/Detox-ios.tbz +0 -0
  28. package/android/build.gradle +12 -6
  29. package/android/detox/build.gradle +13 -9
  30. package/android/detox/publishing.gradle +27 -27
  31. package/android/detox/src/full/java/com/wix/detox/DetoxCrashHandler.kt +1 -1
  32. package/android/detox/src/full/java/com/wix/detox/LaunchArgs.java +9 -0
  33. package/android/detox/src/full/java/com/wix/detox/TestEngineFacade.kt +1 -1
  34. package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeExtension.kt +15 -2
  35. package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeIdlingResources.kt +43 -38
  36. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/DelegatedIdleInterrogationStrategy.kt +7 -27
  37. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/IdleInterrogationStrategy.kt +1 -11
  38. package/android/detox/src/testFull/java/com/wix/detox/espresso/action/DetoxMultiTapSpec.kt +4 -3
  39. package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/DelegatedIdleInterrogationStrategySpec.kt +3 -11
  40. package/package.json +3 -3
  41. package/runners/jest-circus/listeners/DetoxCoreListener.js +24 -15
  42. package/src/DetoxExportWrapper.js +1 -1
  43. package/src/android/core/NativeElement.js +56 -20
  44. package/src/android/core/NativeExpect.js +28 -9
  45. package/src/android/interactions/native.js +24 -18
  46. package/src/artifacts/timeline/TimelineArtifactPlugin.js +6 -9
  47. package/src/artifacts/timeline/TimelineContextTypes.js +7 -0
  48. package/src/client/Client.js +18 -1
  49. package/src/devices/allocation/DeviceAllocator.js +1 -2
  50. package/src/devices/allocation/drivers/android/emulator/EmulatorAllocDriver.js +1 -1
  51. package/src/devices/allocation/drivers/android/emulator/EmulatorLauncher.js +1 -2
  52. package/src/devices/runtime/RuntimeDevice.js +7 -11
  53. package/src/devices/runtime/drivers/android/AndroidDriver.js +9 -1
  54. package/src/ios/expectTwo.js +152 -67
  55. package/src/utils/invocationTraceDescriptions.js +43 -0
  56. package/src/utils/trace.js +52 -10
  57. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-javadoc.jar.md5 +0 -1
  58. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-javadoc.jar.sha1 +0 -1
  59. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-javadoc.jar.sha256 +0 -1
  60. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-javadoc.jar.sha512 +0 -1
  61. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-sources.jar.md5 +0 -1
  62. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-sources.jar.sha1 +0 -1
  63. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-sources.jar.sha256 +0 -1
  64. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0-sources.jar.sha512 +0 -1
  65. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.aar +0 -0
  66. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.aar.md5 +0 -1
  67. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.aar.sha1 +0 -1
  68. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.aar.sha256 +0 -1
  69. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.aar.sha512 +0 -1
  70. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.pom.md5 +0 -1
  71. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.pom.sha1 +0 -1
  72. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.pom.sha256 +0 -1
  73. package/Detox-android/com/wix/detox/19.9.3-prerelease.0/detox-19.9.3-prerelease.0.pom.sha512 +0 -1
  74. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/DefaultIdleInterrogationStrategy.kt +0 -84
  75. package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/DefaultIdleInterrogationStrategySpec.kt +0 -115
@@ -1,3 +1,7 @@
1
+ const assert = require('assert');
2
+
3
+ const TIMELINE_CONTEXT_TYPES = require('../artifacts/timeline/TimelineContextTypes');
4
+
1
5
  class Trace {
2
6
  constructor() {
3
7
  this.events = [];
@@ -35,20 +39,58 @@ class Trace {
35
39
  }
36
40
 
37
41
  let trace = new Trace();
38
- async function traceCall(sectionName, func) {
39
- trace.startSection(sectionName);
40
- try {
41
- const result = await func();
42
- trace.endSection(sectionName, { success: true });
43
- return result;
44
- } catch (error) {
45
- trace.endSection(sectionName, { success: false, error: error.toString() });
46
- throw error;
47
- }
42
+
43
+ /**
44
+ * Trace a single call, with a given name and arguments.
45
+ * @param sectionName The name of the section to trace.
46
+ * @param promiseOrFunction {Promise|Function} Promise or a function that provides a promise.
47
+ * @param args {Object} Optional arguments to pass to the trace.
48
+ * @returns {any} The returned value of the traced call.
49
+ *
50
+ * @see https://wix.github.io/Detox/docs/next/api/detox-object-api/#detoxtracecall.
51
+ */
52
+ function traceCall(sectionName, promiseOrFunction, args = {}) {
53
+ assert(sectionName,
54
+ `must provide section name when calling \`traceCall\` with args: \n ${JSON.stringify(args)}`);
55
+
56
+ const promise = typeof promiseOrFunction === 'function' ? promiseOrFunction() : promiseOrFunction;
57
+
58
+ trace.startSection(sectionName, args);
59
+ return promise
60
+ .then((result) => {
61
+ trace.endSection(sectionName, { ...args, success: true });
62
+ return result;
63
+ })
64
+ .catch((error) => {
65
+ trace.endSection(sectionName, { ...args, success: false, error: error.toString() });
66
+ throw error;
67
+ });
68
+ }
69
+
70
+ function traceInvocationCall(sectionName, invocation, promise) {
71
+ return traceCall(
72
+ sectionName, promise, {
73
+ context: TIMELINE_CONTEXT_TYPES.INVOCATION,
74
+ stackTrace: _getCallStackTrace(),
75
+ invocation: JSON.stringify(invocation),
76
+ });
77
+ }
78
+
79
+ function _getCallStackTrace() {
80
+ return new Error().stack
81
+ .split('\n')
82
+ .slice(1) // Ignore Error message
83
+ .map(line => line
84
+ .replace(/^\s*at\s+/, '')
85
+ .replace(process.cwd(), '')
86
+ )
87
+ .filter(line => !line.includes('/detox/src')) // Ignore detox internal calls
88
+ .join('\n');
48
89
  }
49
90
 
50
91
  module.exports = {
51
92
  Trace,
52
93
  trace,
53
94
  traceCall,
95
+ traceInvocationCall
54
96
  };
@@ -1 +0,0 @@
1
- e15ea02b4e45bc609564419df0e4f41637066243
@@ -1 +0,0 @@
1
- 2bb9db3a4f4e8559730726edc7916b2a7f9862a8513b1b63adccb9ecc47945a8
@@ -1 +0,0 @@
1
- 85f09e8ce6a8d918f4642011aa128ab7e9cc15775dee64c1aa68415338fd8885742654824f5f827102db2e3e0a14e0cbbd7c2840f5245f3782d484ef2c38e0e6
@@ -1 +0,0 @@
1
- a19e3a9ee01e68181523ca45c5042f3ba969058b
@@ -1 +0,0 @@
1
- 2bae62ac910e2b85a65732d408a57ee8a67086f09b34fff3f36cddcc53770e1d
@@ -1 +0,0 @@
1
- f914567f3fa7f0aa444ca447fe0216bb5e8bf13039f273de27005c4fcb0581ef2cc647e762df524249c1cb1177b09ba6c956edabb34531bb14054b38f53f503b
@@ -1 +0,0 @@
1
- f00a26db2932c0f5dd9e4ea695c5f55c
@@ -1 +0,0 @@
1
- 39dba13a0e694adb108fc6bb4d15b58b21a4eed5
@@ -1 +0,0 @@
1
- c9897fd212cfefb379527e059f6f29a94f29c4681b3659e26f8f08b22e20d1ea
@@ -1 +0,0 @@
1
- f12faacdbbcf214aba48971b1054310eca06c2a69d403404376b087d86beb76345e383bc6d452f6af8ec25b050895700bd930f8a33c9439153a972a179b3c763
@@ -1 +0,0 @@
1
- a765d464fcaef42e8caff137de8d635c
@@ -1 +0,0 @@
1
- 00a980a61b3b2cea782cc10be620ad08f83ce69f
@@ -1 +0,0 @@
1
- 246f80766f6b9c4d4a4255fdec9b09540a0fab9e56d7d2ad71a363935de5bcbf
@@ -1 +0,0 @@
1
- a18048b41a07e0dc793b8340714cc3fe86c72269683b4302a41bc5b1100c3750e9a28874cc01b474818ead5c83ee8bb56475865167ddcb96ba9bb10566368697
@@ -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
- })