detox 20.14.0-smoke.0 → 20.14.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. package/.eslintignore +1 -0
  2. package/Detox-android/com/wix/detox/{20.14.0-smoke.0/detox-20.14.0-smoke.0-javadoc.jar → 20.14.1/detox-20.14.1-javadoc.jar} +0 -0
  3. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1-javadoc.jar.md5 +1 -0
  4. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1-javadoc.jar.sha1 +1 -0
  5. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1-javadoc.jar.sha256 +1 -0
  6. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1-javadoc.jar.sha512 +1 -0
  7. package/Detox-android/com/wix/detox/{20.14.0-smoke.0/detox-20.14.0-smoke.0-sources.jar → 20.14.1/detox-20.14.1-sources.jar} +0 -0
  8. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1-sources.jar.md5 +1 -0
  9. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1-sources.jar.sha1 +1 -0
  10. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1-sources.jar.sha256 +1 -0
  11. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1-sources.jar.sha512 +1 -0
  12. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1.aar +0 -0
  13. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1.aar.md5 +1 -0
  14. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1.aar.sha1 +1 -0
  15. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1.aar.sha256 +1 -0
  16. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1.aar.sha512 +1 -0
  17. package/Detox-android/com/wix/detox/{20.14.0-smoke.0/detox-20.14.0-smoke.0.pom → 20.14.1/detox-20.14.1.pom} +1 -1
  18. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1.pom.md5 +1 -0
  19. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1.pom.sha1 +1 -0
  20. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1.pom.sha256 +1 -0
  21. package/Detox-android/com/wix/detox/20.14.1/detox-20.14.1.pom.sha512 +1 -0
  22. package/Detox-android/com/wix/detox/maven-metadata.xml +4 -4
  23. package/Detox-android/com/wix/detox/maven-metadata.xml.md5 +1 -1
  24. package/Detox-android/com/wix/detox/maven-metadata.xml.sha1 +1 -1
  25. package/Detox-android/com/wix/detox/maven-metadata.xml.sha256 +1 -1
  26. package/Detox-android/com/wix/detox/maven-metadata.xml.sha512 +1 -1
  27. package/Detox-ios-src.tbz +0 -0
  28. package/Detox-ios.tbz +0 -0
  29. package/android/detox/build.gradle +8 -4
  30. package/android/detox/src/full/java/com/wix/detox/Detox.java +1 -7
  31. package/android/detox/src/full/java/com/wix/detox/DetoxMain.kt +55 -72
  32. package/android/detox/src/full/java/com/wix/detox/adapters/server/DetoxActionHandlers.kt +0 -15
  33. package/android/detox/src/full/java/com/wix/detox/adapters/server/DetoxActionsDispatcher.kt +16 -6
  34. package/android/detox/src/full/java/com/wix/detox/adapters/server/DetoxServerAdapter.kt +0 -2
  35. package/android/detox/src/full/java/com/wix/detox/espresso/web/WebElement.java +4 -4
  36. package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeExtension.kt +0 -14
  37. package/android/detox/src/full/java/com/wix/invoke/types/Invocation.java +2 -2
  38. package/android/detox/src/main/java/com/wix/detox/espresso/action/common/MotionEvents.kt +60 -4
  39. package/android/detox/src/testFull/java/com/wix/invoke/JsonParserTest.java +23 -7
  40. package/android/detox/src/testFull/resources/targetInvocationEspressoWebDetoxScript.json +47 -0
  41. package/detox.d.ts +1830 -0
  42. package/globals.d.ts +23 -0
  43. package/index.d.ts +2 -1838
  44. package/internals.d.ts +2 -1
  45. package/jest.config.js +108 -0
  46. package/local-cli/testCommand/TestRunnerCommand.js +26 -3
  47. package/local-cli/utils/interruptListeners.js +15 -0
  48. package/package.json +3 -99
  49. package/runners/jest/reporter.js +21 -1
  50. package/runners/jest/reporters/DetoxIPCReporter.js +34 -0
  51. package/runners/jest/reporters/DetoxReporterDispatcher.js +144 -0
  52. package/runners/jest/reporters/DetoxSummaryReporter.js +16 -0
  53. package/runners/jest/reporters/DetoxVerboseReporter.js +16 -0
  54. package/runners/jest/reporters/index.js +6 -0
  55. package/runners/jest/testEnvironment/index.js +7 -1
  56. package/src/android/core/WebElement.js +24 -6
  57. package/src/android/espressoapi/web/WebElement.js +1 -4
  58. package/src/configuration/composeRunnerConfig.js +3 -1
  59. package/src/devices/allocation/drivers/ios/SimulatorAllocDriver.js +3 -5
  60. package/src/devices/allocation/factories/ios.js +1 -4
  61. package/src/devices/common/drivers/android/tools/instrumentationArgs.js +7 -1
  62. package/src/devices/runtime/drivers/ios/SimulatorDriver.js +5 -4
  63. package/src/devices/runtime/factories/ios.js +0 -2
  64. package/src/ipc/IPCClient.js +2 -2
  65. package/src/ipc/IPCServer.js +5 -3
  66. package/src/realms/DetoxContext.js +1 -1
  67. package/src/realms/DetoxPrimaryContext.js +2 -2
  68. package/src/realms/DetoxSecondaryContext.js +2 -2
  69. package/src/utils/assertIsFunction.js +35 -0
  70. package/src/utils/childProcess/spawn.js +1 -1
  71. package/src/utils/isArrowFunction.js +24 -0
  72. package/tsconfig.json +3 -0
  73. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0-javadoc.jar.md5 +0 -1
  74. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0-javadoc.jar.sha1 +0 -1
  75. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0-javadoc.jar.sha256 +0 -1
  76. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0-javadoc.jar.sha512 +0 -1
  77. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0-sources.jar.md5 +0 -1
  78. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0-sources.jar.sha1 +0 -1
  79. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0-sources.jar.sha256 +0 -1
  80. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0-sources.jar.sha512 +0 -1
  81. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0.aar +0 -0
  82. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0.aar.md5 +0 -1
  83. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0.aar.sha1 +0 -1
  84. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0.aar.sha256 +0 -1
  85. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0.aar.sha512 +0 -1
  86. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0.pom.md5 +0 -1
  87. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0.pom.sha1 +0 -1
  88. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0.pom.sha256 +0 -1
  89. package/Detox-android/com/wix/detox/20.14.0-smoke.0/detox-20.14.0-smoke.0.pom.sha512 +0 -1
  90. package/runners/jest/reporters/DetoxReporter.js +0 -154
  91. package/src/devices/allocation/drivers/ios/SimulatorLauncher.js +0 -25
package/.eslintignore CHANGED
@@ -1,3 +1,4 @@
1
+ *.d.ts
1
2
  /src/android/espressoapi/**/*.js
2
3
  /coverage
3
4
  /ios
@@ -0,0 +1 @@
1
+ df336477c5bb07869456e1a65d69d5c7
@@ -0,0 +1 @@
1
+ aaa63a4199f17a89c7e884202ca33554cf0c4410
@@ -0,0 +1 @@
1
+ fe1c75ae0cbabeeb848ffb9e80b591b6f6f2d37c899e05717a58d967748f4860
@@ -0,0 +1 @@
1
+ 4e2f5bc2efecc31716ae9e70a2e87da45ebcda42a0f4d8d192ae7f2c68ad1f801e3758590be3d2bb3f8bd4a44dbed255e2a4f95abc2f9c44bd9d4879520ac51d
@@ -0,0 +1 @@
1
+ 3ee1d9a4a119b7c6627434ad73e41638
@@ -0,0 +1 @@
1
+ 4a270aaa691aa23b7b14ae32e77cb56de9cfdc95
@@ -0,0 +1 @@
1
+ 47099e074808fb5626c109b5b09c464cabd9cad5c2844cdc98a1868e2b10238a
@@ -0,0 +1 @@
1
+ c4c1f64a63da6e106ca90cfcab4e8d095d0f97c4341e6f3a54203116438264e1e2e262f3e2278b064b3283d4bbbddad88afc48c8d9a5f8bf410e0cc653c307f0
@@ -0,0 +1 @@
1
+ 5802af204da6a4e44339eb5b544e816d
@@ -0,0 +1 @@
1
+ 530bd1ee5be0479b9d48b33722b521ef408d82b7
@@ -0,0 +1 @@
1
+ 4efd5d50625590c576c69a3a722d8df776fa213cff6e1fa254ec429d4db6fb58
@@ -0,0 +1 @@
1
+ 19b779508bf7d9059f23fd638114bb817eee061bf018fcf793b451f63b3c5d8519e20f85fceffa61863d59244f168692d1e4e8d861be979200a2130c4486b9e8
@@ -3,7 +3,7 @@
3
3
  <modelVersion>4.0.0</modelVersion>
4
4
  <groupId>com.wix</groupId>
5
5
  <artifactId>detox</artifactId>
6
- <version>20.14.0-smoke.0</version>
6
+ <version>20.14.1</version>
7
7
  <packaging>aar</packaging>
8
8
  <name>Detox</name>
9
9
  <description>Gray box end-to-end testing and automation library for mobile apps</description>
@@ -0,0 +1 @@
1
+ fdbbf729d55d7657238f4ffdfdf21b18
@@ -0,0 +1 @@
1
+ 2ee22e6f82bbbd550d383530de9ac1403e716dbc
@@ -0,0 +1 @@
1
+ 9522ff285942a4332b1602849b17fa910d603dd019c4cbcc454e8c2a64b0859d
@@ -0,0 +1 @@
1
+ 1ff01de68f6d101e206f63bab0e67e93492a2c3661d3f763f08d4acbf647c207e095f74a9bfbb7b55a7faacf6545ed130037085258c7869fee01f80a45ecf7f1
@@ -3,11 +3,11 @@
3
3
  <groupId>com.wix</groupId>
4
4
  <artifactId>detox</artifactId>
5
5
  <versioning>
6
- <latest>20.14.0-smoke.0</latest>
7
- <release>20.14.0-smoke.0</release>
6
+ <latest>20.14.1</latest>
7
+ <release>20.14.1</release>
8
8
  <versions>
9
- <version>20.14.0-smoke.0</version>
9
+ <version>20.14.1</version>
10
10
  </versions>
11
- <lastUpdated>20231004101112</lastUpdated>
11
+ <lastUpdated>20231212155320</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- db9bf329cefd7a3174b46ce70f497a99
1
+ 3e4214cc64c1e5edc2a3032be61a5545
@@ -1 +1 @@
1
- 2166ac54d8a199afca7309e193e586480014f074
1
+ 0196bb30f6b15f7ca321049999448d9242cc34fb
@@ -1 +1 @@
1
- d872213b54196e083fdfac1b0f921ba338e96aa4d21e1971ac9f8e70cd20003c
1
+ 00f7fa47240f24b4188f773b9652d64f1e08a0dd32fdf918ab48b7e56215909b
@@ -1 +1 @@
1
- 1ca24fd031e6a4bd8ac6197a4ff263b33a25a60b075291dac8ea33c8127623a8dbf65462f9e65d77ce493f1a2f07e09fbb5e9219e52e8ed457a3c293a86b118b
1
+ ac2fac1e5878e4d303daa66ed9174cb6bbb4304fcc1ddbc30dad48e47a9ac87106e849fb1d85bdcbb32a6d5955cff4b7a47a341a0203ca040d40bb852019e312
package/Detox-ios-src.tbz CHANGED
Binary file
package/Detox-ios.tbz CHANGED
Binary file
@@ -21,8 +21,12 @@ def _rnNativeArtifact = rnInfo.isRN71OrHigher
21
21
  : 'com.facebook.react:react-native:+'
22
22
 
23
23
  android {
24
- compileSdkVersion _compileSdkVersion
25
- buildToolsVersion _buildToolsVersion
24
+ def agpVersion = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')[0].toInteger()
25
+ if (agpVersion >= 7) {
26
+ namespace "com.wix.detox"
27
+ }
28
+ compileSdk _compileSdkVersion
29
+ buildToolsVersion = _buildToolsVersion
26
30
 
27
31
  defaultConfig {
28
32
  minSdkVersion _minSdkVersion
@@ -33,7 +37,7 @@ android {
33
37
  consumerProguardFiles 'proguard-rules.pro'
34
38
  }
35
39
 
36
- flavorDimensions 'detox'
40
+ flavorDimensions = ['detox']
37
41
  productFlavors {
38
42
  full {
39
43
  dimension 'detox'
@@ -48,7 +52,7 @@ android {
48
52
  unitTests.returnDefaultValues = true
49
53
  unitTests.all { t ->
50
54
  reports {
51
- html.enabled true
55
+ html.required = true
52
56
  }
53
57
  testLogging {
54
58
  events "passed", "skipped", "failed", "standardOut", "standardError"
@@ -123,13 +123,7 @@ public final class Detox {
123
123
  DetoxConfig.CONFIG.apply();
124
124
 
125
125
  sActivityLaunchHelper = new ActivityLaunchHelper(activityTestRule);
126
-
127
- try {
128
- DetoxMain.run(context, sActivityLaunchHelper);
129
- } catch (Exception e) {
130
- Thread.currentThread().interrupt();
131
- throw new RuntimeException("Detox got interrupted prematurely", e);
132
- }
126
+ DetoxMain.run(context, sActivityLaunchHelper);
133
127
  }
134
128
 
135
129
  public static void launchMainActivity() {
@@ -2,53 +2,63 @@ package com.wix.detox
2
2
 
3
3
  import android.content.Context
4
4
  import android.util.Log
5
- import com.wix.detox.adapters.server.CleanupActionHandler
6
- import com.wix.detox.adapters.server.DetoxActionHandler
7
- import com.wix.detox.adapters.server.DetoxActionsDispatcher
8
- import com.wix.detox.adapters.server.DetoxServerAdapter
9
- import com.wix.detox.adapters.server.DetoxServerInfo
10
- import com.wix.detox.adapters.server.InstrumentsEventsActionsHandler
11
- import com.wix.detox.adapters.server.InstrumentsRecordingStateActionHandler
12
- import com.wix.detox.adapters.server.InvokeActionHandler
13
- import com.wix.detox.adapters.server.OutboundServerAdapter
14
- import com.wix.detox.adapters.server.PrematureReadyHandler
15
- import com.wix.detox.adapters.server.QueryStatusActionHandler
16
- import com.wix.detox.adapters.server.ReactNativeReloadActionHandler
17
- import com.wix.detox.adapters.server.ReadyActionHandler
5
+ import com.wix.detox.adapters.server.*
18
6
  import com.wix.detox.common.DetoxLog
19
7
  import com.wix.detox.espresso.UiControllerSpy
20
8
  import com.wix.detox.instruments.DetoxInstrumentsManager
21
9
  import com.wix.detox.reactnative.ReactNativeExtension
22
10
  import com.wix.invoke.MethodInvocation
11
+ import java.util.concurrent.CountDownLatch
23
12
 
24
- private const val INIT_ACTION = "_init"
25
- private const val IS_READY_ACTION = "isReady"
26
13
  private const val TERMINATION_ACTION = "_terminate"
27
14
 
28
15
  object DetoxMain {
16
+ private val handshakeLock = CountDownLatch(1)
17
+
29
18
  @JvmStatic
30
19
  fun run(rnHostHolder: Context, activityLaunchHelper: ActivityLaunchHelper) {
31
20
  val detoxServerInfo = DetoxServerInfo()
32
21
  val testEngineFacade = TestEngineFacade()
33
22
  val actionsDispatcher = DetoxActionsDispatcher()
34
- val externalAdapter = DetoxServerAdapter(actionsDispatcher, detoxServerInfo, IS_READY_ACTION, TERMINATION_ACTION)
23
+ val serverAdapter = DetoxServerAdapter(actionsDispatcher, detoxServerInfo, TERMINATION_ACTION)
24
+
25
+ initCrashHandler(serverAdapter)
26
+ initANRListener(serverAdapter)
27
+ initEspresso()
28
+ initReactNative()
29
+
30
+ setupActionHandlers(actionsDispatcher, serverAdapter, testEngineFacade, rnHostHolder)
31
+ serverAdapter.connect()
35
32
 
36
- initActionHandlers(activityLaunchHelper, actionsDispatcher, externalAdapter, testEngineFacade, rnHostHolder)
37
- actionsDispatcher.dispatchAction(INIT_ACTION, "", 0)
33
+ launchActivityOnCue(rnHostHolder, activityLaunchHelper)
38
34
  actionsDispatcher.join()
39
35
  }
40
36
 
41
- private fun doInit(externalAdapter: DetoxServerAdapter) {
42
- initCrashHandler(externalAdapter)
43
- initANRListener(externalAdapter)
44
- initEspresso()
45
- initReactNative()
37
+ /**
38
+ * Launch the tested activity "on cue", namely, right after a connection is established and the handshake
39
+ * completes successfully.
40
+ *
41
+ * This has to be synchronized so that an `isReady` isn't handled *before* the activity is launched (albeit not fully
42
+ * initialized - all native modules and everything) and a react context is available.
43
+ *
44
+ * As a better alternative, it would make sense to execute this as a simple action from within the actions
45
+ * dispatcher (i.e. handler of `loginSuccess`), in which case, no inter-thread locking would be required
46
+ * thanks to the usage of Handlers. However, in this type of a solution, errors / crashes would be reported
47
+ * not by instrumentation itself, but based on the `AppWillTerminateWithError` message; In it's own, it is a good
48
+ * thing, but for a reason we're not sure of yet, it is ignored by the test runner at this point in the flow.
49
+ */
50
+ @Synchronized
51
+ private fun launchActivityOnCue(rnHostHolder: Context, activityLaunchHelper: ActivityLaunchHelper) {
52
+ awaitHandshake()
53
+ launchActivity(rnHostHolder, activityLaunchHelper)
54
+ }
46
55
 
47
- externalAdapter.connect()
56
+ private fun awaitHandshake() {
57
+ handshakeLock.await()
48
58
  }
49
59
 
50
- private fun onConnected(activityLaunchHelper: ActivityLaunchHelper, rnHostHolder: Context) {
51
- launchApp(rnHostHolder, activityLaunchHelper)
60
+ private fun onLoginSuccess() {
61
+ handshakeLock.countDown()
52
62
  }
53
63
 
54
64
  private fun doTeardown(serverAdapter: DetoxServerAdapter, actionsDispatcher: DetoxActionsDispatcher, testEngineFacade: TestEngineFacade) {
@@ -58,50 +68,28 @@ object DetoxMain {
58
68
  actionsDispatcher.teardown()
59
69
  }
60
70
 
61
- private fun initActionHandlers(activityLaunchHelper: ActivityLaunchHelper, actionsDispatcher: DetoxActionsDispatcher, serverAdapter: DetoxServerAdapter, testEngineFacade: TestEngineFacade, rnHostHolder: Context) {
71
+ private fun setupActionHandlers(actionsDispatcher: DetoxActionsDispatcher, serverAdapter: DetoxServerAdapter, testEngineFacade: TestEngineFacade, rnHostHolder: Context) {
72
+ class SynchronizedActionHandler(private val actionHandler: DetoxActionHandler): DetoxActionHandler {
73
+ override fun handle(params: String, messageId: Long) {
74
+ synchronized(this@DetoxMain) {
75
+ actionHandler.handle(params, messageId)
76
+ }
77
+ }
78
+ }
79
+
62
80
  // Primary actions
63
81
  with(actionsDispatcher) {
64
- var prematureIsReadyHandler: PrematureReadyHandler? = PrematureReadyHandler()
65
- val rnReloadHandler = ReactNativeReloadActionHandler(rnHostHolder, serverAdapter, testEngineFacade)
66
-
67
- associateActionHandler(INIT_ACTION, object: DetoxActionHandler {
68
- override fun handle(params: String, messageId: Long) =
69
- synchronized(this@DetoxMain) {
70
- this@DetoxMain.doInit(serverAdapter)
71
- }
72
- })
73
- associateActionHandler(IS_READY_ACTION, prematureIsReadyHandler!!)
74
-
75
- associateActionHandler("loginSuccess", object: DetoxActionHandler {
76
- override fun handle(params: String, messageId: Long) {
77
- synchronized(this@DetoxMain) {
78
- this@DetoxMain.onConnected(activityLaunchHelper, rnHostHolder)
79
- associateActionHandler(IS_READY_ACTION, ReadyActionHandler(serverAdapter, testEngineFacade))
80
-
81
- prematureIsReadyHandler?.let {
82
- if (it.isActionPending) {
83
- actionsDispatcher.dispatchAction(IS_READY_ACTION, it.params!!, it.messageId!!)
84
- }
85
- prematureIsReadyHandler = null
86
- }
87
- }
88
- }
89
- })
90
- associateActionHandler("reactNativeReload", object: DetoxActionHandler {
91
- override fun handle(params: String, messageId: Long) =
92
- synchronized(this@DetoxMain) {
93
- rnReloadHandler.handle(params, messageId)
94
- }
95
- })
82
+ val readyHandler = SynchronizedActionHandler( ReadyActionHandler(serverAdapter, testEngineFacade) )
83
+ val rnReloadHandler = SynchronizedActionHandler( ReactNativeReloadActionHandler(rnHostHolder, serverAdapter, testEngineFacade) )
84
+
85
+ associateActionHandler("loginSuccess", ::onLoginSuccess)
86
+ associateActionHandler("isReady", readyHandler)
87
+ associateActionHandler("reactNativeReload", rnReloadHandler)
96
88
  associateActionHandler("invoke", InvokeActionHandler(MethodInvocation(), serverAdapter))
97
89
  associateActionHandler("cleanup", CleanupActionHandler(serverAdapter, testEngineFacade) {
98
90
  dispatchAction(TERMINATION_ACTION, "", 0)
99
91
  })
100
- associateActionHandler(TERMINATION_ACTION, object: DetoxActionHandler {
101
- override fun handle(params: String, messageId: Long) {
102
- this@DetoxMain.doTeardown(serverAdapter, actionsDispatcher, testEngineFacade)
103
- }
104
- })
92
+ associateActionHandler(TERMINATION_ACTION) { -> doTeardown(serverAdapter, actionsDispatcher, testEngineFacade) }
105
93
 
106
94
  if (DetoxInstrumentsManager.supports()) {
107
95
  val instrumentsManager = DetoxInstrumentsManager(rnHostHolder)
@@ -112,13 +100,8 @@ object DetoxMain {
112
100
 
113
101
  // Secondary actions
114
102
  with(actionsDispatcher) {
115
- val queryStatusHandler = QueryStatusActionHandler(serverAdapter, testEngineFacade)
116
- associateActionHandler("currentStatus", object: DetoxActionHandler {
117
- override fun handle(params: String, messageId: Long) =
118
- synchronized(this@DetoxMain) {
119
- queryStatusHandler.handle(params, messageId)
120
- }
121
- }, false)
103
+ val queryStatusHandler = SynchronizedActionHandler( QueryStatusActionHandler(serverAdapter, testEngineFacade) )
104
+ associateSecondaryActionHandler("currentStatus", queryStatusHandler)
122
105
  }
123
106
  }
124
107
 
@@ -138,7 +121,7 @@ object DetoxMain {
138
121
  ReactNativeExtension.initIfNeeded()
139
122
  }
140
123
 
141
- private fun launchApp(rnHostHolder: Context, activityLaunchHelper: ActivityLaunchHelper) {
124
+ private fun launchActivity(rnHostHolder: Context, activityLaunchHelper: ActivityLaunchHelper) {
142
125
  Log.i(DetoxLog.LOG_TAG, "Launching the tested activity!")
143
126
  activityLaunchHelper.launchActivityUnderTest()
144
127
  ReactNativeExtension.waitForRNBootstrap(rnHostHolder)
@@ -3,7 +3,6 @@ package com.wix.detox.adapters.server
3
3
  import android.content.Context
4
4
  import android.util.Log
5
5
  import com.wix.detox.TestEngineFacade
6
- import com.wix.detox.common.DetoxLog
7
6
  import com.wix.detox.common.extractRootCause
8
7
  import com.wix.detox.instruments.DetoxInstrumentsException
9
8
  import com.wix.detox.instruments.DetoxInstrumentsManager
@@ -28,20 +27,6 @@ class ReadyActionHandler(
28
27
  }
29
28
  }
30
29
 
31
- class PrematureReadyHandler(): DetoxActionHandler {
32
- var isActionPending = false
33
- var params: String? = null
34
- var messageId: Long? = null
35
-
36
- override fun handle(params: String, messageId: Long) {
37
- Log.i(DetoxLog.LOG_TAG, "Got a premature ready action, saving for later...")
38
-
39
- this.isActionPending = true
40
- this.params = params
41
- this.messageId = messageId
42
- }
43
- }
44
-
45
30
  open class ReactNativeReloadActionHandler(
46
31
  private val appContext: Context,
47
32
  private val outboundServerAdapter: OutboundServerAdapter,
@@ -11,11 +11,18 @@ class DetoxActionsDispatcher {
11
11
  private val primaryExec = ActionsExecutor("detox.primary")
12
12
  private val secondaryExec = ActionsExecutor("detox.secondary")
13
13
 
14
- fun associateActionHandler(type: String, actionHandler: DetoxActionHandler, isPrimary: Boolean = true) {
15
- val actionsExecutor = (if (isPrimary) primaryExec else secondaryExec)
16
- actionsExecutor.associateHandler(type, actionHandler)
14
+ fun associateActionHandler(type: String, actionHandler: DetoxActionHandler) =
15
+ associateActionHandler(type, actionHandler, true)
16
+
17
+ fun associateActionHandler(type: String, handlerFunc: () -> Unit) {
18
+ associateActionHandler(type, object: DetoxActionHandler {
19
+ override fun handle(params: String, messageId: Long) = handlerFunc()
20
+ })
17
21
  }
18
22
 
23
+ fun associateSecondaryActionHandler(type: String, actionHandler: DetoxActionHandler) =
24
+ associateActionHandler(type, actionHandler, false)
25
+
19
26
  fun dispatchAction(type: String, params: String, messageId: Long) {
20
27
  (primaryExec.executeAction(type, params, messageId) ||
21
28
  secondaryExec.executeAction(type, params, messageId))
@@ -33,6 +40,11 @@ class DetoxActionsDispatcher {
33
40
  primaryExec.join()
34
41
  secondaryExec.join()
35
42
  }
43
+
44
+ private fun associateActionHandler(type: String, actionHandler: DetoxActionHandler, isPrimary: Boolean = true) {
45
+ val actionsExecutor = (if (isPrimary) primaryExec else secondaryExec)
46
+ actionsExecutor.associateHandler(type, actionHandler)
47
+ }
36
48
  }
37
49
 
38
50
  private class ActionsExecutor(name: String) {
@@ -74,7 +86,5 @@ private class ActionsExecutor(name: String) {
74
86
  handler.looper.quit()
75
87
  }
76
88
 
77
- fun join() {
78
- thread.join()
79
- }
89
+ fun join() = thread.join()
80
90
  }
@@ -10,7 +10,6 @@ interface OutboundServerAdapter {
10
10
  class DetoxServerAdapter(
11
11
  private val actionsDispatcher: DetoxActionsDispatcher,
12
12
  private val detoxServerInfo: DetoxServerInfo,
13
- private val readyActionType: String,
14
13
  private val terminationActionType: String)
15
14
  : WebSocketClient.WSEventsHandler, OutboundServerAdapter {
16
15
 
@@ -27,7 +26,6 @@ class DetoxServerAdapter(
27
26
 
28
27
  override fun onConnect() {
29
28
  Log.i(DetoxLog.LOG_TAG, "Connected to server!")
30
- actionsDispatcher.dispatchAction(readyActionType, "", -1000L)
31
29
  }
32
30
 
33
31
  override fun onClosed() {
@@ -62,12 +62,12 @@ public class WebElement {
62
62
  return getWebViewInteraction().withElement(get()).perform(DriverAtoms.getText()).get();
63
63
  }
64
64
 
65
- public Evaluation runScript(String script) {
66
- return getWebViewInteraction().withElement(get()).perform(new SimpleAtom(script)).get();
65
+ public Object runScript(String script) {
66
+ return getWebViewInteraction().withElement(get()).perform(new SimpleAtom(script)).get().getValue();
67
67
  }
68
68
 
69
- public Evaluation runScriptWithArgs(String script, final ArrayList<Object> args) {
70
- return getWebViewInteraction().withElement(get()).perform(Atoms.scriptWithArgs(script, args)).get();
69
+ public Object runScriptWithArgs(String script, final ArrayList<Object> args) {
70
+ return getWebViewInteraction().withElement(get()).perform(Atoms.scriptWithArgs(script, args)).get().getValue();
71
71
  }
72
72
 
73
73
  public String getCurrentUrl() {
@@ -36,7 +36,6 @@ object ReactNativeExtension {
36
36
  val reactContext = awaitNewReactNativeContext(it, null)
37
37
 
38
38
  enableOrDisableSynchronization(reactContext)
39
- hackRN50WaitForReady()
40
39
  }
41
40
  }
42
41
 
@@ -66,7 +65,6 @@ object ReactNativeExtension {
66
65
  val reactContext = awaitNewReactNativeContext(it, previousReactContext)
67
66
 
68
67
  enableOrDisableSynchronization(reactContext, networkSyncEnabled)
69
- hackRN50WaitForReady()
70
68
  }
71
69
  }
72
70
 
@@ -152,18 +150,6 @@ object ReactNativeExtension {
152
150
  }
153
151
  }
154
152
 
155
- private fun hackRN50WaitForReady() {
156
- if (ReactNativeInfo.rnVersion().minor in 50..62) {
157
- try {
158
- //TODO- Temp hack to make Detox usable for RN>=50 till we find a better sync solution.
159
- Thread.sleep(1000)
160
- } catch (e: InterruptedException) {
161
- e.printStackTrace()
162
- }
163
-
164
- }
165
- }
166
-
167
153
  private fun clearIdlingResources() {
168
154
  rnIdlingResources?.unregisterAll()
169
155
  rnIdlingResources = null
@@ -68,9 +68,9 @@ public class Invocation {
68
68
  argument = args.get(i);
69
69
  } else if(args.get(i).getClass() == JSONArray.class) {
70
70
  JSONArray jsonArray = (JSONArray) args.get(i);
71
- List<String> list = new ArrayList<>();
71
+ List<Object> list = new ArrayList<>();
72
72
  for (int j = 0; j < jsonArray.length(); j++) {
73
- list.add(jsonArray.getString(j));
73
+ list.add(jsonArray.get(j));
74
74
  }
75
75
  argument = list;
76
76
  } else {
@@ -9,8 +9,37 @@ import androidx.test.espresso.action.MotionEvents
9
9
  private val PRECISION = floatArrayOf(16f, 16f)
10
10
 
11
11
  class MotionEvents {
12
- fun obtainMoveEvent(downEvent: MotionEvent, eventTime: Long, x: Float, y: Float): MotionEvent
13
- = MotionEvents.obtainMovement(downEvent.downTime, eventTime, floatArrayOf(x, y))!!
12
+ fun obtainMoveEvent(downEvent: MotionEvent, eventTime: Long, x: Float, y: Float): MotionEvent {
13
+ val pointerProperties = MotionEvent.PointerProperties().apply {
14
+ clear()
15
+ id = 0
16
+ toolType = MotionEvent.TOOL_TYPE_UNKNOWN
17
+ }
18
+ val pointerCoords = MotionEvent.PointerCoords().apply {
19
+ clear()
20
+ this.x = x
21
+ this.y = y
22
+ this.pressure = 0f
23
+ this.size = 1f
24
+ }
25
+
26
+ return MotionEvent.obtain(
27
+ downEvent.downTime,
28
+ eventTime,
29
+ MotionEvent.ACTION_MOVE,
30
+ 1, // pointerCounts
31
+ arrayOf(pointerProperties),
32
+ arrayOf(pointerCoords),
33
+ 0, // metaState
34
+ downEvent.buttonState,
35
+ downEvent.xPrecision,
36
+ downEvent.yPrecision,
37
+ 0, // deviceId
38
+ 0, // edgeFlags
39
+ downEvent.source,
40
+ 0
41
+ )
42
+ }
14
43
 
15
44
  fun obtainDownEvent(x: Float, y: Float, precision: FloatArray = PRECISION)
16
45
  = obtainDownEvent(x, y, precision, null)
@@ -46,8 +75,35 @@ class MotionEvents {
46
75
  0)
47
76
  }
48
77
 
49
- fun obtainUpEvent(downEvent: MotionEvent, eventTime: Long, x: Float, y: Float): MotionEvent
50
- = MotionEvent.obtain(downEvent.downTime, eventTime, MotionEvent.ACTION_UP, x, y, 0)!!
78
+ fun obtainUpEvent(downEvent: MotionEvent, eventTime: Long, x: Float, y: Float): MotionEvent {
79
+ val pointerProperties = MotionEvent.PointerProperties().apply {
80
+ id = 0
81
+ toolType = MotionEvent.TOOL_TYPE_UNKNOWN
82
+ }
83
+ val pointerCoords = MotionEvent.PointerCoords().apply {
84
+ clear()
85
+ this.x = x
86
+ this.y = y
87
+ this.pressure = 0f
88
+ this.size = 1f
89
+ }
90
+ return MotionEvent.obtain(
91
+ downEvent.downTime,
92
+ eventTime,
93
+ MotionEvent.ACTION_UP,
94
+ 1, // pointerCounts
95
+ arrayOf(pointerProperties),
96
+ arrayOf(pointerCoords),
97
+ 0, // metaState
98
+ downEvent.buttonState,
99
+ downEvent.xPrecision,
100
+ downEvent.yPrecision,
101
+ 0, // deviceId
102
+ 0, // edgeFlags
103
+ downEvent.source,
104
+ 0
105
+ )
106
+ }
51
107
 
52
108
  fun sendDownAsync(uiController: UiController, x: Float, y: Float, precision: FloatArray = PRECISION): MotionEvent {
53
109
  val downEvent = obtainDownEvent(x, y, precision, null)