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.
Files changed (72) hide show
  1. 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
  2. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-javadoc.jar.md5 +1 -0
  3. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-javadoc.jar.sha1 +1 -0
  4. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-javadoc.jar.sha256 +1 -0
  5. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-javadoc.jar.sha512 +1 -0
  6. 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
  7. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-sources.jar.md5 +1 -0
  8. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-sources.jar.sha1 +1 -0
  9. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-sources.jar.sha256 +1 -0
  10. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0-sources.jar.sha512 +1 -0
  11. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.aar +0 -0
  12. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.aar.md5 +1 -0
  13. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.aar.sha1 +1 -0
  14. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.aar.sha256 +1 -0
  15. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.aar.sha512 +1 -0
  16. 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
  17. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.pom.md5 +1 -0
  18. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.pom.sha1 +1 -0
  19. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-prerelease.0.pom.sha256 +1 -0
  20. package/Detox-android/com/wix/detox/19.12.1-prerelease.0/detox-19.12.1-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/LaunchArgs.java +9 -0
  32. package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeExtension.kt +15 -2
  33. package/android/detox/src/full/java/com/wix/detox/reactnative/ReactNativeIdlingResources.kt +43 -38
  34. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/DelegatedIdleInterrogationStrategy.kt +7 -27
  35. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/IdleInterrogationStrategy.kt +1 -11
  36. package/android/detox/src/main/java/com/wix/detox/common/TextFileReader.kt +1 -1
  37. package/android/detox/src/testFull/java/com/wix/detox/espresso/action/DetoxMultiTapSpec.kt +4 -3
  38. package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/DelegatedIdleInterrogationStrategySpec.kt +3 -11
  39. package/package.json +3 -3
  40. package/runners/jest-circus/listeners/DetoxCoreListener.js +24 -16
  41. package/src/DetoxExportWrapper.js +1 -1
  42. package/src/android/core/NativeElement.js +56 -20
  43. package/src/android/core/NativeExpect.js +28 -9
  44. package/src/android/interactions/native.js +24 -18
  45. package/src/artifacts/timeline/TimelineArtifactPlugin.js +6 -9
  46. package/src/artifacts/timeline/TimelineContextTypes.js +7 -0
  47. package/src/devices/allocation/DeviceAllocator.js +1 -2
  48. package/src/devices/allocation/drivers/android/emulator/EmulatorAllocDriver.js +1 -1
  49. package/src/devices/allocation/drivers/android/emulator/EmulatorLauncher.js +1 -2
  50. package/src/devices/runtime/RuntimeDevice.js +7 -11
  51. package/src/ios/expectTwo.js +152 -67
  52. package/src/utils/invocationTraceDescriptions.js +43 -0
  53. package/src/utils/trace.js +52 -10
  54. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-javadoc.jar.md5 +0 -1
  55. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-javadoc.jar.sha1 +0 -1
  56. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-javadoc.jar.sha256 +0 -1
  57. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-javadoc.jar.sha512 +0 -1
  58. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-sources.jar.md5 +0 -1
  59. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-sources.jar.sha1 +0 -1
  60. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-sources.jar.sha256 +0 -1
  61. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0-sources.jar.sha512 +0 -1
  62. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.aar +0 -0
  63. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.aar.md5 +0 -1
  64. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.aar.sha1 +0 -1
  65. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.aar.sha256 +0 -1
  66. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.aar.sha512 +0 -1
  67. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.pom.md5 +0 -1
  68. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.pom.sha1 +0 -1
  69. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.pom.sha256 +0 -1
  70. package/Detox-android/com/wix/detox/19.10.0/detox-19.10.0.pom.sha512 +0 -1
  71. package/android/detox/src/full/java/com/wix/detox/reactnative/idlingresources/timers/DefaultIdleInterrogationStrategy.kt +0 -84
  72. package/android/detox/src/testFull/java/com/wix/detox/reactnative/idlingresources/timers/DefaultIdleInterrogationStrategySpec.kt +0 -115
@@ -0,0 +1 @@
1
+ 24b2cd827242bf12b1def4870cdea16c4a9c9fe6
@@ -0,0 +1 @@
1
+ 62812508a57224b0ac193187da84744a68cc528e637730fea389674c2196e549
@@ -0,0 +1 @@
1
+ 92a0ca42006e3eded406cba55c44b7ef4a86ef0f089b20c5f910f82c306efe9a6c62d2c35109f4570debc730fe69c123e44e068fdd172a813f32a90a1a405583
@@ -0,0 +1 @@
1
+ 49128930997febbf16568e682acd2499f2a3a74c
@@ -0,0 +1 @@
1
+ 97ce22532316e231d175328ca39fc9a91e47a3971d940ff678623f0d4484e746
@@ -0,0 +1 @@
1
+ d1a856b8d95531c57683b9f3120875a873caf5f14f1c373ceae0d0e683753d52f41b6328f9eb334fd3326cc83f94eb35fc223c9f8bad51f84de66e4ea49cc88e
@@ -0,0 +1 @@
1
+ 2880dad223aa8eb4656fa2eb7f7b11d4
@@ -0,0 +1 @@
1
+ 0d1996a26206fea48387f32e06bed48097e23442
@@ -0,0 +1 @@
1
+ 00c9b8094189ba4f122899781ec77e372172d42bc6c66fcafa4cf3689591fd1f
@@ -0,0 +1 @@
1
+ 237c7b2f001531e1d3d779bf63e4892b6d478a5cecc35b1055490911865222bcbe7df58b1ba6876d09372cc881b5a4aa34bb0875f710e82fbe29210e7428166d
@@ -3,7 +3,7 @@
3
3
  <modelVersion>4.0.0</modelVersion>
4
4
  <groupId>com.wix</groupId>
5
5
  <artifactId>detox</artifactId>
6
- <version>19.10.0</version>
6
+ <version>19.12.1-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
+ b8d18c9eea24ca929b6241e98fd7e141
@@ -0,0 +1 @@
1
+ 5845c5b4a1040b9ffdd25e84cda718edb81db94e
@@ -0,0 +1 @@
1
+ b25852c88b6be313daf9ae68265f1a7343b05c5c9bcd2a7cafcf39e2163dbb3b
@@ -0,0 +1 @@
1
+ 35e3934e388e0769116c010427b5b811acc4f650a43f138e8bcbfaf95f75f8c2db4bda62879c581684efbfe6618c08c8389efafb55d659f118a108980c43bd5f
@@ -3,11 +3,11 @@
3
3
  <groupId>com.wix</groupId>
4
4
  <artifactId>detox</artifactId>
5
5
  <versioning>
6
- <latest>19.10.0</latest>
7
- <release>19.10.0</release>
6
+ <latest>19.12.1-prerelease.0</latest>
7
+ <release>19.12.1-prerelease.0</release>
8
8
  <versions>
9
- <version>19.10.0</version>
9
+ <version>19.12.1-prerelease.0</version>
10
10
  </versions>
11
- <lastUpdated>20220818130424</lastUpdated>
11
+ <lastUpdated>20220908082111</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- 38d31df24edd01e6923c2e3670359d6e
1
+ 6a5ecfa37e4b69a918232641ad215161
@@ -1 +1 @@
1
- b4a03bfc096cae92a22fabe9ae811709c09c4b92
1
+ 0c63c287b76520643e2c034cf9b442e1aed62638
@@ -1 +1 @@
1
- 504204669f5f3377f1c42725d55e8dcf742dc0c38318209978991dfe96abf831
1
+ 72b0777f2b94ed2205d10ec43c7ffd6c62b1e33722ed11620db84ac611b2976b
@@ -1 +1 @@
1
- a36b581589d46796551b3fccad8a460b3ef5e5ee40ba374a45b7b7801520d28d2fd14308233cd33ba93943cf1600f7f7f81d032166b1ada5bdd0b4450a139ec1
1
+ 5073ac05b439f4251b9ed244d5b214f259c31e5dca443db87a091bb2f26127bbe165aa89c1403e628e8676cf57ea7bba91cb2e921a6f9eb537c56f0a71758a71
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
  }
@@ -14,6 +14,7 @@ public class LaunchArgs {
14
14
  private static final String DETOX_NOTIFICATION_PATH_ARG = "detoxUserNotificationDataURL";
15
15
  private static final String DETOX_BLACKLIST_URLS_ARG = "detoxURLBlacklistRegex";
16
16
  private static final String DETOX_URL_OVERRIDE_ARG = "detoxURLOverride";
17
+ private static final String DETOX_ENABLE_SYNCHRONIZATION = "detoxEnableSynchronization";
17
18
  private static final List<String> RESERVED_INSTRUMENTATION_ARGS = Arrays.asList("class", "package", "func", "unit", "size", "perf", "debug", "log", "emma", "coverageFile");
18
19
 
19
20
  public boolean hasNotificationPath() {
@@ -36,6 +37,14 @@ public class LaunchArgs {
36
37
  return InstrumentationRegistry.getArguments().containsKey(DETOX_BLACKLIST_URLS_ARG);
37
38
  }
38
39
 
40
+ public String getEnableSynchronization() {
41
+ return InstrumentationRegistry.getArguments().getString(DETOX_ENABLE_SYNCHRONIZATION);
42
+ }
43
+
44
+ public boolean hasEnableSynchronization() {
45
+ return InstrumentationRegistry.getArguments().containsKey(DETOX_ENABLE_SYNCHRONIZATION);
46
+ }
47
+
39
48
  public String getUrlOverride() {
40
49
  return InstrumentationRegistry.getArguments().getString(DETOX_URL_OVERRIDE_ARG);
41
50
  }
@@ -39,7 +39,7 @@ object ReactNativeExtension {
39
39
  reloadReactNativeInBackground(it)
40
40
  val reactContext = awaitNewReactNativeContext(it, previousReactContext)
41
41
 
42
- setupIdlingResources(reactContext, networkSyncEnabled)
42
+ enableOrDisableSynchronization(reactContext, networkSyncEnabled)
43
43
  hackRN50OrHigherWaitForReady()
44
44
  }
45
45
  }
@@ -58,7 +58,7 @@ object ReactNativeExtension {
58
58
  (applicationContext as ReactApplication).let {
59
59
  val reactContext = awaitNewReactNativeContext(it, null)
60
60
 
61
- setupIdlingResources(reactContext)
61
+ enableOrDisableSynchronization(reactContext)
62
62
  hackRN50OrHigherWaitForReady()
63
63
  }
64
64
  }
@@ -124,6 +124,19 @@ object ReactNativeExtension {
124
124
  return rnLoadingMonitor.getNewContext()!!
125
125
  }
126
126
 
127
+ private fun enableOrDisableSynchronization(reactContext: ReactContext, networkSyncEnabled: Boolean = true) {
128
+ if (shouldDisableSynchronization()) {
129
+ clearAllSynchronization()
130
+ } else {
131
+ setupIdlingResources(reactContext, networkSyncEnabled)
132
+ }
133
+ }
134
+
135
+ private fun shouldDisableSynchronization(): Boolean {
136
+ val launchArgs = LaunchArgs()
137
+ return launchArgs.hasEnableSynchronization() && launchArgs.enableSynchronization.equals("0")
138
+ }
139
+
127
140
  private fun setupIdlingResources(reactContext: ReactContext, networkSyncEnabled: Boolean = true) {
128
141
  val launchArgs = LaunchArgs()
129
142
 
@@ -2,6 +2,7 @@ package com.wix.detox.reactnative
2
2
 
3
3
  import android.os.Looper
4
4
  import android.util.Log
5
+ import androidx.test.espresso.Espresso
5
6
  import androidx.test.espresso.IdlingRegistry
6
7
  import androidx.test.espresso.base.IdlingResourceRegistry
7
8
  import com.facebook.react.bridge.ReactContext
@@ -12,7 +13,6 @@ import com.wix.detox.reactnative.idlingresources.timers.getInterrogationStrategy
12
13
  import com.wix.detox.reactnative.idlingresources.uimodule.UIModuleIdlingResource
13
14
  import org.joor.Reflect
14
15
  import org.joor.ReflectException
15
- import java.util.Set
16
16
 
17
17
  private const val LOG_TAG = "DetoxRNIdleRes"
18
18
 
@@ -46,15 +46,11 @@ private class MQThreadReflected(private val queue: Any?, private val queueName:
46
46
  }
47
47
 
48
48
  class ReactNativeIdlingResources constructor(
49
- private val reactContext: ReactContext,
50
- private var launchArgs: LaunchArgs,
51
- internal var networkSyncEnabled: Boolean = true
52
- )
53
-
54
- {
55
-
49
+ private val reactContext: ReactContext,
50
+ private var launchArgs: LaunchArgs,
51
+ internal var networkSyncEnabled: Boolean = true
52
+ ) {
56
53
  companion object {
57
- private const val FIELD_UI_BG_MSG_QUEUE = "mUiBackgroundMessageQueueThread"
58
54
  private const val FIELD_NATIVE_MODULES_MSG_QUEUE = "mNativeModulesMessageQueueThread"
59
55
  private const val FIELD_JS_MSG_QUEUE = "mJSMessageQueueThread"
60
56
  }
@@ -69,17 +65,11 @@ class ReactNativeIdlingResources constructor(
69
65
 
70
66
  fun registerAll() {
71
67
  Log.i(LOG_TAG, "Setting up Espresso Idling Resources for React Native")
72
-
73
68
  unregisterAll()
74
69
 
75
- if (launchArgs.hasURLBlacklist()) {
76
- val blacklistUrls = launchArgs.getURLBlacklist()
77
- setBlacklistUrls(blacklistUrls)
78
- }
79
-
70
+ setupUrlBlacklist()
80
71
  setupMQThreadsInterrogators()
81
72
  syncIdlingResources()
82
-
83
73
  setupCustomRNIdlingResources()
84
74
  syncIdlingResources()
85
75
  }
@@ -108,28 +98,42 @@ class ReactNativeIdlingResources constructor(
108
98
  networkIdlingResource?.resume()
109
99
  }
110
100
  }
101
+
111
102
  fun pauseRNTimersIdlingResource() = timersIdlingResource?.pause()
112
103
  fun resumeRNTimersIdlingResource() = timersIdlingResource?.resume()
113
104
  fun pauseUIIdlingResource() = uiModuleIdlingResource?.pause()
114
105
  fun resumeUIIdlingResource() = uiModuleIdlingResource?.resume()
115
- fun pauseJSBridgeIdlingResource() = rnBridgeIdlingResource?.pause()
116
- fun resumeJSBridgeIdlingResource() = rnBridgeIdlingResource?.resume()
106
+
107
+ fun setBlacklistUrls(urlList: String) {
108
+ setIldingResourceBlacklist(urlList)
109
+ }
110
+
111
+ private fun setIldingResourceBlacklist(urlList: String) {
112
+ val urlArray = toFormattedUrlArray(urlList)
113
+ NetworkIdlingResource.setURLBlacklist(urlArray)
114
+ }
117
115
 
118
116
  private fun setupMQThreadsInterrogators() {
119
117
  if (IdlingRegistry.getInstance().loopers.isEmpty()) {
120
118
  val mqThreadsReflector = MQThreadsReflector(reactContext)
121
- // val mqUIBackground = mqThreadsReflector.getQueue(FIELD_UI_BG_MSG_QUEUE)?.getLooper() TODO
122
119
  val mqJS = mqThreadsReflector.getQueue(FIELD_JS_MSG_QUEUE)?.getLooper()
123
- val mqNativeModules = mqThreadsReflector.getQueue(FIELD_NATIVE_MODULES_MSG_QUEUE)?.getLooper()
120
+ val mqNativeModules =
121
+ mqThreadsReflector.getQueue(FIELD_NATIVE_MODULES_MSG_QUEUE)?.getLooper()
124
122
 
125
123
  IdlingRegistry.getInstance().apply {
126
- // registerLooperAsIdlingResource(mqUIBackground)
127
124
  registerLooperAsIdlingResource(mqJS)
128
125
  registerLooperAsIdlingResource(mqNativeModules)
129
126
  }
130
127
  }
131
128
  }
132
129
 
130
+ private fun setupUrlBlacklist() {
131
+ if (launchArgs.hasURLBlacklist()) {
132
+ val blacklistUrls = launchArgs.urlBlacklist
133
+ setIldingResourceBlacklist(blacklistUrls)
134
+ }
135
+ }
136
+
133
137
  private fun setupCustomRNIdlingResources() {
134
138
  rnBridgeIdlingResource = BridgeIdlingResource(reactContext)
135
139
  timersIdlingResource = TimersIdlingResource(getInterrogationStrategy(reactContext)!!)
@@ -151,13 +155,16 @@ class ReactNativeIdlingResources constructor(
151
155
 
152
156
  private fun syncIdlingResources() {
153
157
  IdlingRegistry.getInstance().apply {
154
- val irr: IdlingResourceRegistry = Reflect.on(androidx.test.espresso.Espresso::class.java).field("baseRegistry").get()
158
+ val irr: IdlingResourceRegistry =
159
+ Reflect.on(Espresso::class.java).field("baseRegistry").get()
155
160
  irr.sync(this.resources, this.loopers)
156
161
  }
157
162
  }
158
163
 
159
164
  private fun unregisterMQThreadsInterrogators() {
160
- Reflect.on(IdlingRegistry.getInstance()).field("loopers").get<Set<Any>>().clear()
165
+ val idlingResourceInstance = IdlingRegistry.getInstance()
166
+ val loopersField = Reflect.on(idlingResourceInstance).field("loopers")
167
+ loopersField.get<MutableSet<Any>>().clear()
161
168
  }
162
169
 
163
170
  private fun unregisterCustomRNIdlingResources() {
@@ -166,7 +173,8 @@ class ReactNativeIdlingResources constructor(
166
173
  timersIdlingResource,
167
174
  rnBridgeIdlingResource,
168
175
  uiModuleIdlingResource,
169
- animIdlingResource)
176
+ animIdlingResource
177
+ )
170
178
  rnBridgeIdlingResource?.onDetach()
171
179
 
172
180
  removeNetworkIdlingResource()
@@ -174,13 +182,15 @@ class ReactNativeIdlingResources constructor(
174
182
  }
175
183
 
176
184
  private fun setupAsyncStorageIdlingResource() {
177
- asyncStorageIdlingResource = AsyncStorageIdlingResource.createIfNeeded(reactContext, false)?.also {
178
- IdlingRegistry.getInstance().register(it)
179
- }
185
+ asyncStorageIdlingResource =
186
+ AsyncStorageIdlingResource.createIfNeeded(reactContext, false)?.also {
187
+ IdlingRegistry.getInstance().register(it)
188
+ }
180
189
 
181
- legacyAsyncStorageIdlingResource = AsyncStorageIdlingResource.createIfNeeded(reactContext, true)?.also {
182
- IdlingRegistry.getInstance().register(it)
183
- }
190
+ legacyAsyncStorageIdlingResource =
191
+ AsyncStorageIdlingResource.createIfNeeded(reactContext, true)?.also {
192
+ IdlingRegistry.getInstance().register(it)
193
+ }
184
194
  }
185
195
 
186
196
  private fun removeAsyncStorageIdlingResource() {
@@ -212,13 +222,8 @@ class ReactNativeIdlingResources constructor(
212
222
 
213
223
  private fun toFormattedUrlArray(urlList: String): List<String> {
214
224
  var formattedUrls = urlList
215
- formattedUrls = formattedUrls.replace(Regex("""[()"]"""), "");
216
- formattedUrls = formattedUrls.trim();
217
- return formattedUrls.split(',');
218
- }
219
-
220
- fun setBlacklistUrls(urlList: String) {
221
- val urlArray = toFormattedUrlArray(urlList)
222
- NetworkIdlingResource.setURLBlacklist(urlArray);
225
+ formattedUrls = formattedUrls.replace(Regex("""[()"]"""), "")
226
+ formattedUrls = formattedUrls.trim()
227
+ return formattedUrls.split(',')
223
228
  }
224
229
  }
@@ -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
  })
@@ -3,5 +3,5 @@ package com.wix.detox.common
3
3
  import java.io.File
4
4
 
5
5
  internal class TextFileReader(private val fileName: String) {
6
- fun read() = File(fileName).inputStream().readBytes().toString(Charsets.UTF_8)
6
+ fun read() = File(fileName).readText(Charsets.UTF_8)
7
7
  }