detox 20.0.7-prerelease.0 → 20.0.8-prerelease.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. package/Detox-android/com/wix/detox/{20.0.7-prerelease.0/detox-20.0.7-prerelease.0-javadoc.jar → 20.0.8-prerelease.0/detox-20.0.8-prerelease.0-javadoc.jar} +0 -0
  2. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0-javadoc.jar.md5 +1 -0
  3. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0-javadoc.jar.sha1 +1 -0
  4. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0-javadoc.jar.sha256 +1 -0
  5. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0-javadoc.jar.sha512 +1 -0
  6. package/Detox-android/com/wix/detox/{20.0.7-prerelease.0/detox-20.0.7-prerelease.0-sources.jar → 20.0.8-prerelease.0/detox-20.0.8-prerelease.0-sources.jar} +0 -0
  7. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0-sources.jar.md5 +1 -0
  8. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0-sources.jar.sha1 +1 -0
  9. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0-sources.jar.sha256 +1 -0
  10. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0-sources.jar.sha512 +1 -0
  11. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0.aar +0 -0
  12. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0.aar.md5 +1 -0
  13. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0.aar.sha1 +1 -0
  14. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0.aar.sha256 +1 -0
  15. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0.aar.sha512 +1 -0
  16. package/Detox-android/com/wix/detox/{20.0.7-prerelease.0/detox-20.0.7-prerelease.0.pom → 20.0.8-prerelease.0/detox-20.0.8-prerelease.0.pom} +1 -7
  17. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0.pom.md5 +1 -0
  18. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0.pom.sha1 +1 -0
  19. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.0.pom.sha256 +1 -0
  20. package/Detox-android/com/wix/detox/20.0.8-prerelease.0/detox-20.0.8-prerelease.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/reactnative/idlingresources/timers/DelegatedIdleInterrogationStrategy.kt +7 -27
  32. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/IdleInterrogationStrategy.kt +1 -11
  33. package/android/detox/src/testFull/java/com/wix/detox/espresso/action/DetoxMultiTapSpec.kt +4 -3
  34. package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/DelegatedIdleInterrogationStrategySpec.kt +3 -11
  35. package/index.d.ts +11 -0
  36. package/local-cli/test.js +9 -4
  37. package/local-cli/testCommand/TestRunnerCommand.js +2 -3
  38. package/package.json +3 -3
  39. package/src/configuration/composeRunnerConfig.js +1 -0
  40. package/src/realms/DetoxPrimaryContext.js +7 -5
  41. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-javadoc.jar.md5 +0 -1
  42. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-javadoc.jar.sha1 +0 -1
  43. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-javadoc.jar.sha256 +0 -1
  44. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-javadoc.jar.sha512 +0 -1
  45. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-sources.jar.md5 +0 -1
  46. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-sources.jar.sha1 +0 -1
  47. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-sources.jar.sha256 +0 -1
  48. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0-sources.jar.sha512 +0 -1
  49. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.aar +0 -0
  50. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.aar.md5 +0 -1
  51. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.aar.sha1 +0 -1
  52. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.aar.sha256 +0 -1
  53. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.aar.sha512 +0 -1
  54. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.pom.md5 +0 -1
  55. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.pom.sha1 +0 -1
  56. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.pom.sha256 +0 -1
  57. package/Detox-android/com/wix/detox/20.0.7-prerelease.0/detox-20.0.7-prerelease.0.pom.sha512 +0 -1
  58. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/DefaultIdleInterrogationStrategy.kt +0 -84
  59. package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/DefaultIdleInterrogationStrategySpec.kt +0 -115
@@ -0,0 +1 @@
1
+ c822315686adf622857908c74ac136e1a053bf8f
@@ -0,0 +1 @@
1
+ 05c829e58cafe9ae9c7f186ecc23f105eb795180020e98cb9fcc6519e6a4c1c3
@@ -0,0 +1 @@
1
+ ec9749320550216fc8e85faf96c3cae741b6c0db3a0d65053e8837131e2545a060c8aa836f212b2be53b1b6fd588cef55b4c4a51ca10eb5dbc5cc43f9752ab48
@@ -0,0 +1 @@
1
+ 1d05d4bdb8a07e3dc2f4b8350f673d5cca5ea9fe
@@ -0,0 +1 @@
1
+ b9d8c4f11d73bd0dd4e7536d4d160b2a71cd6464848a4079a656c9a1af4a5514
@@ -0,0 +1 @@
1
+ 6f78b1dd5b0ac9ee3e64744fda135e4fc637187fddbd85f625e2cf36d0c5ac7c8fd01f31155536f49fae1cfce75fe9ed2abb8c2e0522fbf278a433ee4292e1f1
@@ -0,0 +1 @@
1
+ fdd88ee21e7da1b14bda4b49205eceec
@@ -0,0 +1 @@
1
+ c03bccd8a1a300d6859c75672e06c0aa49fb4965
@@ -0,0 +1 @@
1
+ 251e1ca4bd82c503575e86cc6506d957e7fee327ecd19280a35f4761d11cf422
@@ -0,0 +1 @@
1
+ d51f289616a8d801d977b4ef996ec23139c65084e8f3f2a0d62603b712706caa6e6e7ee40949abb4d36c77064c3af6966851d2bd7601525c4d17092dbf4f55cc
@@ -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.0.7-prerelease.0</version>
6
+ <version>20.0.8-prerelease.0</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>
@@ -60,12 +60,6 @@
60
60
  <version>2.2.0</version>
61
61
  <scope>compile</scope>
62
62
  </dependency>
63
- <dependency>
64
- <groupId>org.jetbrains.kotlin</groupId>
65
- <artifactId>kotlin-android-extensions-runtime</artifactId>
66
- <version>1.3.72</version>
67
- <scope>runtime</scope>
68
- </dependency>
69
63
  <dependency>
70
64
  <groupId>org.jetbrains.kotlin</groupId>
71
65
  <artifactId>kotlin-stdlib-jdk8</artifactId>
@@ -0,0 +1 @@
1
+ 9511a52e99b74eba29e508b05a893e99
@@ -0,0 +1 @@
1
+ 27eace42fa75812951d39c03e36ed07797946718
@@ -0,0 +1 @@
1
+ 93da305e085d1ab09802a1983f1f706b7171f701082f5a5161f2bd606b0fdc36
@@ -0,0 +1 @@
1
+ 6a2bce2993c09e8c261339e10b6f2c9af48910789dc7b76233cf7b6090226746571edfae4b6c90e451fbc2d26a871720732c507ad1892f467be9db8a693267d3
@@ -3,11 +3,11 @@
3
3
  <groupId>com.wix</groupId>
4
4
  <artifactId>detox</artifactId>
5
5
  <versioning>
6
- <latest>20.0.7-prerelease.0</latest>
7
- <release>20.0.7-prerelease.0</release>
6
+ <latest>20.0.8-prerelease.0</latest>
7
+ <release>20.0.8-prerelease.0</release>
8
8
  <versions>
9
- <version>20.0.7-prerelease.0</version>
9
+ <version>20.0.8-prerelease.0</version>
10
10
  </versions>
11
- <lastUpdated>20220906143110</lastUpdated>
11
+ <lastUpdated>20220907153612</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- 443209a3d276fc780cececc129d8e70b
1
+ e922bb0e5ca1b5b017338c3185a6ef89
@@ -1 +1 @@
1
- 283f03aa8235477f8b3070d4cfa36018d5a7fe7f
1
+ e4c6e03fcf50237cac24bda1c7a5d1bd5476b0fa
@@ -1 +1 @@
1
- 40762b77b08b8369c14f0f11ecf0832d7fd56ecaa618b1a0a62c3c5d16938ed9
1
+ 282b526b0da3c6dd360a2379d3c2d6e176cf67f32564fdb11d64295582d29ac9
@@ -1 +1 @@
1
- 5b3fceef49c72fa0bd12736858bf0e6f16cefc317c648ff83525d2fdc4b7831cce101c206d3640ba7a79edc432b90d481f279cba5285f7c36ce1f613caf163f6
1
+ 012dafdd2fbae8b112f7a8baccd7214cc3f716af5a54878f580d3ea40a4a571c268462b579a1f8033e1af185450bd696a626fb99143ae4c356f27593e7c89a32
package/Detox-ios-src.tbz CHANGED
Binary file
package/Detox-ios.tbz CHANGED
Binary file
@@ -1,12 +1,20 @@
1
1
  buildscript {
2
2
  ext {
3
3
  isOfficialDetoxLib = true
4
- kotlinVersion = '1.2.0'
4
+ kotlinVersion = '1.6.10' // Aligned with RN .69's version bump
5
5
  dokkaVersion = '1.6.0'
6
6
  buildToolsVersion = '31.0.0'
7
7
  compileSdkVersion = 31
8
8
  targetSdkVersion = 31
9
9
  minSdkVersion = 21
10
+
11
+ if (System.properties['os.arch'] == "aarch64") {
12
+ // For M1 Users we need to use the NDK 24 which added support for aarch64
13
+ ndkVersion = "24.0.8215888"
14
+ } else {
15
+ // Otherwise we default to the side-by-side NDK version from AGP.
16
+ ndkVersion = "21.4.7075529"
17
+ }
10
18
  }
11
19
  ext.detoxKotlinVersion = ext.kotlinVersion
12
20
 
@@ -15,14 +23,12 @@ buildscript {
15
23
  google()
16
24
  }
17
25
  dependencies {
18
- classpath 'com.android.tools.build:gradle:7.0.4'
26
+ classpath 'com.android.tools.build:gradle:7.1.1'
19
27
  classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
20
28
  classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokkaVersion"
21
29
 
22
- if (!rootProject.hasProperty('suppressUnitTests')) {
23
- // Needed by Spek (https://spekframework.org/setup-android)
24
- classpath 'de.mannodermaus.gradle.plugins:android-junit5:1.7.1.1'
25
- }
30
+ // Needed by Spek (https://spekframework.org/setup-android)
31
+ classpath 'de.mannodermaus.gradle.plugins:android-junit5:1.7.1.1'
26
32
  }
27
33
  }
28
34
 
@@ -1,13 +1,15 @@
1
1
  apply plugin: 'com.android.library'
2
2
  apply plugin: 'kotlin-android'
3
- apply plugin: 'kotlin-android-extensions'
3
+
4
+ def _kotlinMinVersion = '1.2.0'
5
+ def _materialMinVersion = '1.2.1'
4
6
 
5
7
  def _ext = rootProject.ext
6
8
  def _compileSdkVersion = _ext.has('compileSdkVersion') ? _ext.compileSdkVersion : 31
7
9
  def _targetSdkVersion = _ext.has('targetSdkVersion') ? _ext.targetSdkVersion : 31
8
- def _buildToolsVersion = _ext.has('buildToolsVersion') ? _ext.buildToolsVersion : "31.0.0"
10
+ def _buildToolsVersion = _ext.has('buildToolsVersion') ? _ext.buildToolsVersion : '31.0.0'
9
11
  def _minSdkVersion = _ext.has('minSdkVersion') ? _ext.minSdkVersion : 21
10
- def _kotlinVersion = _ext.has('detoxKotlinVersion') ? _ext.detoxKotlinVersion : '1.2.0'
12
+ def _kotlinVersion = _ext.has('detoxKotlinVersion') ? _ext.detoxKotlinVersion : _kotlinMinVersion
11
13
  def _kotlinStdlib = _ext.has('detoxKotlinStdlib') ? _ext.detoxKotlinStdlib : 'kotlin-stdlib-jdk8'
12
14
 
13
15
  android {
@@ -75,7 +77,8 @@ android {
75
77
 
76
78
  // Fundamental deps.
77
79
  dependencies {
78
- implementation "org.jetbrains.kotlin:$_kotlinStdlib:$_kotlinVersion"
80
+ implementation "org.jetbrains.kotlin:$_kotlinStdlib:$_kotlinMinVersion"
81
+ //noinspection GradleDynamicVersion
79
82
  compileOnly 'com.facebook.react:react-native:+'
80
83
  }
81
84
 
@@ -108,7 +111,7 @@ dependencies {
108
111
 
109
112
  // Third-party/extension deps.
110
113
  dependencies {
111
- implementation('com.google.android.material:material:1.2.1') {
114
+ implementation("com.google.android.material:material:$_materialMinVersion") {
112
115
  because 'Material components are mentioned explicitly (e.g. Slider in get-attributes handler)'
113
116
  }
114
117
  implementation('org.apache.commons:commons-lang3:3.7') {
@@ -121,11 +124,11 @@ dependencies {
121
124
 
122
125
  // Unit-testing deps.
123
126
  dependencies {
127
+ //noinspection GradleDynamicVersion
124
128
  testImplementation 'com.facebook.react:react-native:+'
125
129
  testImplementation 'org.json:json:20140107'
126
130
 
127
131
  // https://github.com/spekframework/spek/issues/232#issuecomment-610732158
128
- // testImplementation 'junit:junit:4.13.2'
129
132
  testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.6.0'
130
133
 
131
134
  testImplementation 'org.assertj:assertj-core:3.16.1'
@@ -136,9 +139,9 @@ dependencies {
136
139
  }
137
140
 
138
141
  // Spek (https://spekframework.org/setup-android)
139
- if (!rootProject.hasProperty('suppressUnitTests') &&
140
- (rootProject.hasProperty('isOfficialDetoxLib') ||
141
- rootProject.hasProperty('isOfficialDetoxApp'))) {
142
+ if (rootProject.hasProperty('isOfficialDetoxLib') ||
143
+ rootProject.hasProperty('isOfficialDetoxApp')) {
144
+
142
145
  apply plugin: 'de.mannodermaus.android-junit5'
143
146
 
144
147
  android {
@@ -164,3 +167,4 @@ if (!rootProject.hasProperty('suppressUnitTests') &&
164
167
  if (rootProject.hasProperty('isOfficialDetoxLib')) {
165
168
  apply from: './publishing.gradle'
166
169
  }
170
+
@@ -18,6 +18,7 @@ def DEVELOPERS = [
18
18
  String _versionName = System.getProperty('version')
19
19
  String _flavour = System.getProperty('buildFlavour', PUB_FLAVOUR_FULL_DETOX)
20
20
  Boolean _forceLocal = System.getProperty('forceLocal', 'false').toBoolean()
21
+ Boolean _forceSign = System.getProperty('forceSign', 'false').toBoolean()
21
22
 
22
23
  String _mavenRepoUrl
23
24
  Map _mavenCredentials
@@ -28,7 +29,7 @@ def _selectedVariant
28
29
  def initLocalPublishing = {
29
30
  _mavenRepoUrl = TARGET_LOCAL_DIR
30
31
  _mavenCredentials = null
31
- _shouldSignArtifacts = false
32
+ _shouldSignArtifacts = _forceSign
32
33
  }
33
34
 
34
35
  def initMavenPublishing = {
@@ -71,10 +72,8 @@ def shouldPublishVariant = {
71
72
  }
72
73
 
73
74
  def declareArchive = { target ->
74
- if (_shouldSignArtifacts) {
75
- project.artifacts {
76
- archives target
77
- }
75
+ project.artifacts {
76
+ archives target
78
77
  }
79
78
  }
80
79
 
@@ -103,12 +102,12 @@ tasks.named("dokkaJavadoc") {
103
102
  }
104
103
  }
105
104
  }
106
- // Side note / TODO:
107
- // Dokka outputs R and BuildConfig; currently, there's nothing to do about it, as issues such as
108
- // this on - https://github.com/Kotlin/dokka/issues/419 are still open :-/
109
- // We might want to revisit this in the future -- see if they've decided to export a custom classes
110
- // suppression config var or something.
111
105
 
106
+ // Side note / TODO (revisit because dokka's 419 issue has been resolved, since):
107
+ // Dokka outputs R and BuildConfig; currently, there's nothing to do about it, as issues such as
108
+ // this on - https://github.com/Kotlin/dokka/issues/419 are still open :-/
109
+ // We might want to revisit this in the future -- see if they've decided to export a custom classes
110
+ // suppression config var or something.
112
111
  task dokkaDocJar(type: Jar, dependsOn: dokkaJavadoc) {
113
112
  from "$buildDir/dokkaDoc"
114
113
  classifier = 'javadoc'
@@ -143,7 +142,7 @@ project.afterEvaluate {
143
142
  android {
144
143
  libraryVariants.all { variant ->
145
144
  String variantName = variant.name.capitalize()
146
- if (task.name == "publishMaven${variantName}AarPublicationToMavenRepository") {
145
+ if (task.name == "publishMaven${variantName}AarPublicationToMavenRepository".toString()) {
147
146
  task.dependsOn "assemble${variantName}"
148
147
  task.dependsOn project.tasks.signArchives
149
148
  task.doFirst {
@@ -245,22 +244,23 @@ publishing {
245
244
  }
246
245
  }
247
246
 
248
- // Register all artifacts we've previously registered as archives (i.e. .jar.asc's, .aar.asc's) as published artifacts.
249
- // Note: this relies on preregistering the equivalent generator-tasks as archive artifacts
250
- // inside a project.artifacts { ... } clause.
251
- project.tasks.signArchives.signatureFiles.each {
252
- artifact(it) {
253
- def matcherSrcDocs = (it.file =~ /-(sources|javadoc)\.jar\.asc$/)
254
- def matcherAAR = (it.file =~ /\.aar\.asc$/)
255
- if (matcherSrcDocs.find()) {
256
- classifier = matcherSrcDocs.group(1)
257
- extension = 'jar.asc'
258
- } else if (matcherAAR.find()) {
259
- classifier = null
260
- extension = 'aar.asc'
261
- } else {
262
- classifier = null
263
- extension = null
247
+ // Register all artifacts we've previously registered as signed archives (i.e. .jar.asc's, .aar.asc's) as publish-artifacts.
248
+ // Note: this relies on preregistering the equivalent generator-tasks as archive artifacts inside a project.artifacts { ... } clause.
249
+ if (_shouldSignArtifacts) {
250
+ project.tasks.signArchives.signatureFiles.each {
251
+ artifact(it) {
252
+ def matcherSrcDocs = (it.file =~ /-(sources|javadoc)\.jar\.asc$/)
253
+ def matcherAAR = (it.file =~ /\.aar\.asc$/)
254
+ if (matcherSrcDocs.find()) {
255
+ classifier = matcherSrcDocs.group(1)
256
+ extension = 'jar.asc'
257
+ } else if (matcherAAR.find()) {
258
+ classifier = null
259
+ extension = 'aar.asc'
260
+ } else {
261
+ classifier = null
262
+ extension = null
263
+ }
264
264
  }
265
265
  }
266
266
  }
@@ -1,43 +1,23 @@
1
+
1
2
  package com.wix.detox.reactnative.idlingresources.timers
2
3
 
3
- import com.facebook.react.bridge.NativeModule
4
4
  import com.facebook.react.bridge.ReactContext
5
- import com.wix.detox.common.RNDropSupportTodo
6
- import com.wix.detox.reactnative.helpers.RNHelpers
7
- import org.joor.Reflect
5
+ import com.facebook.react.modules.core.TimingModule
8
6
 
9
7
  private const val BUSY_WINDOW_THRESHOLD = 1500L
10
8
 
11
- private class RN62TimingModuleReflected(private val timingModule: NativeModule) {
12
- fun hasActiveTimers(): Boolean = Reflect.on(timingModule).call("hasActiveTimersInRange", BUSY_WINDOW_THRESHOLD).get()
13
- }
14
-
15
9
  /**
16
10
  * Delegates the interrogation to the native module itself, added
17
11
  * [here](https://github.com/facebook/react-native/pull/27539) in the context
18
12
  * of RN v0.62 (followed by a previous refactor and rename of the class).
19
13
  */
20
- @RNDropSupportTodo(62, """
21
- When min RN version supported by Detox is 0.62.x (or higher), can (and
22
- should) remove any usage of reflection here.
23
- That includes the unit test's stub being used for that reason in particular.
24
- """)
25
- class DelegatedIdleInterrogationStrategy(timingModule: NativeModule): IdleInterrogationStrategy {
26
- private val timingModuleReflected = RN62TimingModuleReflected(timingModule)
27
-
28
- override fun isIdleNow(): Boolean = !timingModuleReflected.hasActiveTimers()
14
+ class DelegatedIdleInterrogationStrategy(private val timingModule: TimingModule): IdleInterrogationStrategy {
15
+ override fun isIdleNow(): Boolean = !timingModule.hasActiveTimersInRange(BUSY_WINDOW_THRESHOLD)
29
16
 
30
17
  companion object {
31
- fun createIfSupported(reactContext: ReactContext): DelegatedIdleInterrogationStrategy? {
32
- val module = RNHelpers.getNativeModule(reactContext, "com.facebook.react.modules.core.TimingModule")
33
- ?: return null
34
-
35
- return try {
36
- module.javaClass.getDeclaredMethod("hasActiveTimersInRange", Long::class.java)
37
- DelegatedIdleInterrogationStrategy(module)
38
- } catch (ex: Exception) {
39
- null
40
- }
18
+ fun create(reactContext: ReactContext): DelegatedIdleInterrogationStrategy {
19
+ val timingModule = reactContext.getNativeModule(TimingModule::class.java)!!
20
+ return DelegatedIdleInterrogationStrategy(timingModule)
41
21
  }
42
22
  }
43
23
  }
@@ -1,6 +1,5 @@
1
1
  package com.wix.detox.reactnative.idlingresources.timers
2
2
 
3
- import android.util.Log
4
3
  import com.facebook.react.bridge.ReactContext
5
4
  import com.wix.detox.common.UIThread
6
5
  import java.util.concurrent.Callable
@@ -13,14 +12,5 @@ fun getInterrogationStrategy(reactContext: ReactContext): IdleInterrogationStrat
13
12
  // Getting a native-module (inside) also initializes it if needed. That has to run on a
14
13
  // looper thread, and the easiest to make sure that happens is to use the main thread.
15
14
  UIThread.runSync(Callable {
16
- DelegatedIdleInterrogationStrategy.createIfSupported(reactContext)?.let {
17
- return@Callable it
18
- }
19
-
20
- DefaultIdleInterrogationStrategy.createIfSupported(reactContext)?.let {
21
- return@Callable it
22
- }
23
-
24
- Log.e(TimersIdlingResource.LOG_TAG, "Failed to determine proper implementation-strategy for timers idling resource")
25
- null
15
+ return@Callable DelegatedIdleInterrogationStrategy.create(reactContext)
26
16
  })
@@ -11,6 +11,7 @@ import org.assertj.core.api.Assertions.assertThat
11
11
  import org.mockito.kotlin.*
12
12
  import org.spekframework.spek2.Spek
13
13
  import org.spekframework.spek2.style.specification.describe
14
+ import java.lang.NullPointerException
14
15
  import kotlin.test.assertFailsWith
15
16
 
16
17
  object DetoxMultiTapSpec: Spek({
@@ -136,17 +137,17 @@ object DetoxMultiTapSpec: Spek({
136
137
  }
137
138
 
138
139
  it("should throw if no UI-controller provided") {
139
- assertFailsWith(KotlinNullPointerException::class) {
140
+ assertFailsWith(NullPointerException::class) {
140
141
  uut(1).sendTap(null, coordinates, precision, -1, -1)
141
142
  }
142
143
  }
143
144
 
144
145
  it("should throw if no coordinates / precision are provided") {
145
- assertFailsWith(KotlinNullPointerException::class) {
146
+ assertFailsWith(NullPointerException::class) {
146
147
  uut(1).sendTap(uiController, null, precision, -1, -1)
147
148
  }
148
149
 
149
- assertFailsWith(KotlinNullPointerException::class) {
150
+ assertFailsWith(NullPointerException::class) {
150
151
  uut(1).sendTap(uiController, coordinates, null, -1, -1)
151
152
  }
152
153
  }
@@ -5,22 +5,14 @@ import org.assertj.core.api.Assertions.assertThat
5
5
  import org.mockito.kotlin.*
6
6
  import org.spekframework.spek2.Spek
7
7
  import org.spekframework.spek2.style.specification.describe
8
+ import com.facebook.react.modules.core.TimingModule
8
9
 
9
10
  private const val BUSY_INTERVAL_MS = 1500L
10
11
 
11
- abstract class TimingModuleStub: NativeModule {
12
- abstract fun hasActiveTimersInRange(rangeMs: Long): Boolean
13
-
14
- override fun onCatalystInstanceDestroy() {}
15
- override fun getName(): String = "TimersNativeModuleStub"
16
- override fun canOverrideExistingModule() = false
17
- override fun initialize() {}
18
- }
19
-
20
12
  object DelegatedIdleInterrogationStrategySpec : Spek({
21
- describe("RN62+ timers idle-interrogation strategy") {
13
+ describe("Timers idle-interrogation strategy") {
22
14
 
23
- lateinit var timingModule: TimingModuleStub
15
+ lateinit var timingModule: TimingModule
24
16
 
25
17
  beforeEachTest {
26
18
  timingModule = mock()
package/index.d.ts CHANGED
@@ -157,6 +157,17 @@ declare global {
157
157
  * Use it when you rely on another test runner than Jest.
158
158
  */
159
159
  inspectBrk?: boolean | ((config: DetoxTestRunnerConfig) => void);
160
+ /**
161
+ * Forward environment variables to the spawned test runner
162
+ * accordingly to the given CLI argument overrides.
163
+ *
164
+ * If false, Detox CLI will be only printing a hint message on
165
+ * how to start the test runner using environment variables,
166
+ * in case when a user wants to avoid using Detox CLI.
167
+ *
168
+ * @default false
169
+ */
170
+ forwardEnv?: boolean;
160
171
  }
161
172
 
162
173
  type DetoxAppConfig = (DetoxBuiltInAppConfig | DetoxCustomAppConfig) & {
package/local-cli/test.js CHANGED
@@ -9,16 +9,21 @@ module.exports.middlewares = require('./testCommand/middlewares').default;
9
9
 
10
10
  module.exports.handler = async function test({ detoxArgs, runnerArgs }) {
11
11
  try {
12
- await detox.init({
12
+ const opts = {
13
13
  argv: detoxArgs,
14
14
  testRunnerArgv: runnerArgs,
15
15
  workerId: null,
16
- });
16
+ };
17
+
18
+ const config = await detox.resolveConfig(opts);
19
+ if (!config.testRunner.inspectBrk) {
20
+ await detox.init(opts);
21
+ }
17
22
 
18
23
  const runnerCommand = new TestRunnerCommand()
19
- .setRunnerConfig(detox.config.testRunner)
20
24
  .setDeviceConfig(detox.config.device)
21
- .replicateCLIConfig(detox.config.cli);
25
+ .replicateCLIConfig(detox.config.cli)
26
+ .setRunnerConfig(detox.config.testRunner);
22
27
 
23
28
  await runnerCommand.execute();
24
29
  } finally {
@@ -36,9 +36,8 @@ class TestRunnerCommand {
36
36
  */
37
37
  setRunnerConfig(config) {
38
38
  this._argv = config.args;
39
- this._retries = config.retries;
40
-
41
- if (config.inspectBrk === true) {
39
+ this._retries = config.inspectBrk ? 0 : config.retries;
40
+ if (config.inspectBrk || config.forwardEnv) {
42
41
  this._env = this._envHint;
43
42
  }
44
43
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "detox",
3
3
  "description": "E2E tests and automation for mobile",
4
- "version": "20.0.7-prerelease.0",
4
+ "version": "20.0.8-prerelease.0",
5
5
  "bin": {
6
6
  "detox": "local-cli/cli.js"
7
7
  },
@@ -49,7 +49,7 @@
49
49
  "jest": "^28.0.0",
50
50
  "mockdate": "^2.0.1",
51
51
  "prettier": "1.7.0",
52
- "react-native": "0.68.2",
52
+ "react-native": "0.69.5",
53
53
  "react-native-codegen": "^0.0.8",
54
54
  "typescript": "^4.5.2",
55
55
  "wtfnode": "^0.9.1"
@@ -184,5 +184,5 @@
184
184
  }
185
185
  }
186
186
  },
187
- "gitHead": "4b75f39310b93707f01e2bb38a4fba4d385e8acd"
187
+ "gitHead": "205099aa94b9c7c5e0fa47985e24255f8aee3b1b"
188
188
  }
@@ -31,6 +31,7 @@ function composeRunnerConfig(opts) {
31
31
  {
32
32
  retries: 0,
33
33
  inspectBrk: inspectBrkHookDefault,
34
+ forwardEnv: false,
34
35
  jest: {
35
36
  initTimeout: 300000,
36
37
  retryAfterCircusRetries: false,
@@ -170,11 +170,13 @@ class DetoxPrimaryContext extends DetoxContext {
170
170
 
171
171
  await fs.remove(this[$sessionState].detoxConfigSnapshotPath);
172
172
 
173
- try {
174
- this[_lifecycleLogger].trace.end();
175
- await this[_finalizeLogs]();
176
- } catch (err) {
177
- this[_lifecycleLogger].error({ err }, 'Encountered an error while merging the process logs:');
173
+ if (this[_dirty]) {
174
+ try {
175
+ this[_lifecycleLogger].trace.end();
176
+ await this[_finalizeLogs]();
177
+ } catch (err) {
178
+ this[_lifecycleLogger].error({ err }, 'Encountered an error while merging the process logs:');
179
+ }
178
180
  }
179
181
  }
180
182
  }
@@ -1 +0,0 @@
1
- 6ee9bcfa6e27561a20785f38d6978a16091d3da2
@@ -1 +0,0 @@
1
- 06ad5ed2c2c02a65f50c2913c88d9d83361b43decd36f3094ebbe088bbb5f784
@@ -1 +0,0 @@
1
- 4eaa276ed4517115f488a2fd76b24df233eb630eacf10544a90d7ef57ab0bf827d7495c9b0f39fd79edf7568bbde0b693d8bec308257bc1f0804a7dc6a32161f
@@ -1 +0,0 @@
1
- f4fe7c3a998cef8964ff7f5af05eb529b38e09ee
@@ -1 +0,0 @@
1
- 114b949bbbf5f8fe5f6f355f5f629edb38e08e2221b6303e34a638c7bb824765
@@ -1 +0,0 @@
1
- c77832e978a4e102716c7fd6fa70d04645e02c8a377bdf09cfa482a8f70a514c5d35d7dd4f0c10b5dcd690817a3fb740f2a7914fc905a22489522e7363f9f44d
@@ -1 +0,0 @@
1
- 90f9a8b95a3f10adc93442d4f4684092
@@ -1 +0,0 @@
1
- f03ce7143af53f09f8734c8ee3eb5a532f8143fa
@@ -1 +0,0 @@
1
- 742ad662c67c18780e0844567205b1d02772f160b1876154cbe485bf8048c461
@@ -1 +0,0 @@
1
- dfd697ec8d6f5ee8296379bbbf3f5b487ad70a729a658c6118b2e4923c10959bdd56a30959eb48afa1cf0bfe210ba8a500423d6b9f3993c2570505d59288c0de
@@ -1 +0,0 @@
1
- 7bf66c5ea2c958c30ac7565193ba4bc8
@@ -1 +0,0 @@
1
- 2485b54c1a62e1557d76ebc51a1741ccc4f10304
@@ -1 +0,0 @@
1
- d133d5b090110c223f578f117b344a1bb1e86c3df2d55f50dfd00f1b17498254
@@ -1 +0,0 @@
1
- 11a29cc20eb22ce2133475e187c0941b7d32bff186857ddceb2ee88f3f3b1d46e32eb0cbed032598f57933cca7b9ed8d36008d9c8b882dc202afdd20d9fe5def
@@ -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
- })