run_loop 2.1.10 → 2.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/run_loop/core.rb +1 -22
- data/lib/run_loop/device_agent/Frameworks.zip +0 -0
- data/lib/run_loop/device_agent/app/DeviceAgent-Runner.app.zip +0 -0
- data/lib/run_loop/device_agent/bin/iOSDeviceManager +0 -0
- data/lib/run_loop/device_agent/client.rb +81 -10
- data/lib/run_loop/device_agent/ipa/DeviceAgent-Runner.app.zip +0 -0
- data/lib/run_loop/dylib_injector.rb +24 -0
- data/lib/run_loop/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9ebbfcb0e62aedb6823bf0d20769d04a655e231
|
4
|
+
data.tar.gz: 5e155942b7249c597f43aaa0eea71d571d325778
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e26d30623d4fd37530c2413032e27b8d23c497b1ff58564a338d2c764d927aff5b43fadfc3f0f09c8f6aa5bd82a4964508fbc9a582f30ef9fd6652aeea21670d
|
7
|
+
data.tar.gz: 4cad181f7d717ec8842b4bd0f64c6906597eefa2bd91a214625021eee0b2b6ed120e24e32efcf50095073ff08a16fea432e298959db7e9e825e0610fc3a0e7ba
|
data/lib/run_loop/core.rb
CHANGED
@@ -279,7 +279,7 @@ Logfile: #{log_file}
|
|
279
279
|
|
280
280
|
RunLoop::Logging.log_debug(logger, "Launching took #{Time.now-before_instruments_launch} seconds")
|
281
281
|
|
282
|
-
dylib_path =
|
282
|
+
dylib_path = RunLoop::DylibInjector.dylib_path_from_options(merged_options)
|
283
283
|
|
284
284
|
if dylib_path
|
285
285
|
if device.physical_device?
|
@@ -313,26 +313,6 @@ Logfile: #{log_file}
|
|
313
313
|
true
|
314
314
|
end
|
315
315
|
|
316
|
-
# Extracts the value of :inject_dylib from options Hash.
|
317
|
-
# @param options [Hash] arguments passed to {RunLoop.run}
|
318
|
-
# @return [String, nil] If the options contains :inject_dylibs and it is a
|
319
|
-
# path to a dylib that exists, return the path. Otherwise return nil or
|
320
|
-
# raise an error.
|
321
|
-
# @raise [RuntimeError] If :inject_dylib points to a path that does not exist.
|
322
|
-
# @raise [ArgumentError] If :inject_dylib is not a String.
|
323
|
-
def self.dylib_path_from_options(options)
|
324
|
-
inject_dylib = options.fetch(:inject_dylib, nil)
|
325
|
-
return nil if inject_dylib.nil?
|
326
|
-
unless inject_dylib.is_a? String
|
327
|
-
raise ArgumentError, "Expected :inject_dylib to be a path to a dylib, but found '#{inject_dylib}'"
|
328
|
-
end
|
329
|
-
dylib_path = File.expand_path(inject_dylib)
|
330
|
-
unless File.exist?(dylib_path)
|
331
|
-
raise "Cannot load dylib. The file '#{dylib_path}' does not exist."
|
332
|
-
end
|
333
|
-
dylib_path
|
334
|
-
end
|
335
|
-
|
336
316
|
# Returns the a default simulator to target. This default needs to be one
|
337
317
|
# that installed by default in the current Xcode version.
|
338
318
|
#
|
@@ -365,7 +345,6 @@ Logfile: #{log_file}
|
|
365
345
|
end
|
366
346
|
end
|
367
347
|
|
368
|
-
|
369
348
|
def self.create_uia_pipe(repl_path)
|
370
349
|
begin
|
371
350
|
Timeout::timeout(5, RunLoop::TimeoutError) do
|
Binary file
|
Binary file
|
Binary file
|
@@ -13,6 +13,7 @@ module RunLoop
|
|
13
13
|
include RunLoop::Encoding
|
14
14
|
|
15
15
|
require "run_loop/cache"
|
16
|
+
require "run_loop/dylib_injector"
|
16
17
|
|
17
18
|
class HTTPError < RuntimeError; end
|
18
19
|
|
@@ -78,6 +79,11 @@ module RunLoop
|
|
78
79
|
app = app_details[:app]
|
79
80
|
bundle_id = app_details[:bundle_id]
|
80
81
|
|
82
|
+
# process name and dylib path
|
83
|
+
dylib_injection_details = Client.details_for_dylib_injection(device,
|
84
|
+
options,
|
85
|
+
app_details)
|
86
|
+
|
81
87
|
if device.simulator? && app
|
82
88
|
core_sim = RunLoop::CoreSimulator.new(device, app, :xcode => xcode)
|
83
89
|
if reset_options
|
@@ -120,7 +126,8 @@ $ xcrun security find-identity -v -p codesigning
|
|
120
126
|
launcher_options = {
|
121
127
|
code_sign_identity: code_sign_identity,
|
122
128
|
device_agent_install_timeout: install_timeout,
|
123
|
-
shutdown_device_agent_before_launch: shutdown_before_launch
|
129
|
+
shutdown_device_agent_before_launch: shutdown_before_launch,
|
130
|
+
dylib_injection_details: dylib_injection_details
|
124
131
|
}
|
125
132
|
|
126
133
|
xcuitest = RunLoop::DeviceAgent::Client.new(bundle_id, device,
|
@@ -135,7 +142,7 @@ $ xcrun security find-identity -v -p codesigning
|
|
135
142
|
:code_sign_identity => code_sign_identity,
|
136
143
|
:launcher => cbx_launcher.name,
|
137
144
|
:launcher_pid => xcuitest.launcher_pid,
|
138
|
-
:launcher_options => launcher_options
|
145
|
+
:launcher_options => xcuitest.launcher_options
|
139
146
|
}
|
140
147
|
RunLoop::Cache.default.write(cache)
|
141
148
|
end
|
@@ -168,6 +175,52 @@ $ xcrun security find-identity -v -p codesigning
|
|
168
175
|
end
|
169
176
|
end
|
170
177
|
|
178
|
+
def self.details_for_dylib_injection(device, options, app_details)
|
179
|
+
dylib_path = RunLoop::DylibInjector.dylib_path_from_options(options)
|
180
|
+
|
181
|
+
return nil if !dylib_path
|
182
|
+
|
183
|
+
if device.physical_device?
|
184
|
+
raise ArgumentError, %Q[
|
185
|
+
|
186
|
+
Detected :inject_dylib option when targeting a physical device:
|
187
|
+
|
188
|
+
#{device}
|
189
|
+
|
190
|
+
Injecting the Calabash iOS Server is not supported on physical devices.
|
191
|
+
|
192
|
+
]
|
193
|
+
end
|
194
|
+
|
195
|
+
app = app_details[:app]
|
196
|
+
bundle_id = app_details[:bundle_id]
|
197
|
+
|
198
|
+
details = { dylib_path: dylib_path }
|
199
|
+
|
200
|
+
if !app
|
201
|
+
# Special case handling of the Settings.app
|
202
|
+
if bundle_id == "com.apple.Preferences"
|
203
|
+
details[:process_name] = "Preferences"
|
204
|
+
else
|
205
|
+
raise ArgumentError, %Q[
|
206
|
+
|
207
|
+
Detected :inject_dylib option, but the target application is a bundle identifier:
|
208
|
+
|
209
|
+
app: #{bundle_id}
|
210
|
+
|
211
|
+
To use dylib injection, you must provide a path to an .app bundle.
|
212
|
+
|
213
|
+
]
|
214
|
+
end
|
215
|
+
else
|
216
|
+
details[:process_name] = app.executable_name
|
217
|
+
end
|
218
|
+
details
|
219
|
+
end
|
220
|
+
|
221
|
+
=begin
|
222
|
+
INSTANCE METHODS
|
223
|
+
=end
|
171
224
|
attr_reader :bundle_id, :device, :cbx_launcher, :launcher_options, :launcher_pid
|
172
225
|
|
173
226
|
# @!visibility private
|
@@ -461,8 +514,8 @@ Query must contain at least one of these keys:
|
|
461
514
|
end
|
462
515
|
|
463
516
|
# @!visibility private
|
464
|
-
def
|
465
|
-
request = request("
|
517
|
+
def springboard_alert
|
518
|
+
request = request("springboard-alert")
|
466
519
|
client = http_client(http_options)
|
467
520
|
response = client.get(request)
|
468
521
|
hash = expect_300_response(response)
|
@@ -470,8 +523,8 @@ Query must contain at least one of these keys:
|
|
470
523
|
end
|
471
524
|
|
472
525
|
# @!visibility private
|
473
|
-
def
|
474
|
-
!
|
526
|
+
def springboard_alert_visible?
|
527
|
+
!springboard_alert.empty?
|
475
528
|
end
|
476
529
|
|
477
530
|
# @!visibility private
|
@@ -1146,9 +1199,6 @@ $ tail -1000 -F #{cbx_launcher.class.log_file}
|
|
1146
1199
|
|
1147
1200
|
# @!visibility private
|
1148
1201
|
def launch_aut(bundle_id = @bundle_id)
|
1149
|
-
client = http_client(http_options)
|
1150
|
-
request = request("session", {:bundleID => bundle_id})
|
1151
|
-
|
1152
1202
|
# This check needs to be done _before_ the DeviceAgent is launched.
|
1153
1203
|
if device.simulator?
|
1154
1204
|
# Yes, we could use iOSDeviceManager to check, I dont understand the
|
@@ -1181,6 +1231,8 @@ Please install it.
|
|
1181
1231
|
end
|
1182
1232
|
|
1183
1233
|
retries = 5
|
1234
|
+
client = http_client(http_options)
|
1235
|
+
request = request("session", {:bundleID => bundle_id})
|
1184
1236
|
|
1185
1237
|
begin
|
1186
1238
|
response = client.post(request)
|
@@ -1188,6 +1240,15 @@ Please install it.
|
|
1188
1240
|
RunLoop.log_debug("#{response.body}")
|
1189
1241
|
|
1190
1242
|
expect_300_response(response)
|
1243
|
+
|
1244
|
+
# Dylib injection. DeviceAgent.run checks the arguments.
|
1245
|
+
dylib_injection_details = launcher_options[:dylib_injection_details]
|
1246
|
+
if dylib_injection_details
|
1247
|
+
process_name = dylib_injection_details[:process_name]
|
1248
|
+
dylib_path = dylib_injection_details[:dylib_path]
|
1249
|
+
injector = RunLoop::DylibInjector.new(process_name, dylib_path)
|
1250
|
+
injector.retriable_inject_dylib
|
1251
|
+
end
|
1191
1252
|
rescue => e
|
1192
1253
|
retries = retries - 1
|
1193
1254
|
if !RunLoop::Environment.xtc?
|
@@ -1271,7 +1332,7 @@ Expected JSON response with no error, but found
|
|
1271
1332
|
raise ArgumentError, %Q[
|
1272
1333
|
Expected #{position} to be a Symbol or Fixnum but found #{position.class}
|
1273
1334
|
|
1274
|
-
|
1335
|
+
]
|
1275
1336
|
end
|
1276
1337
|
end
|
1277
1338
|
|
@@ -1293,9 +1354,19 @@ Expected #{position} to be a Symbol or Fixnum but found #{position.class}
|
|
1293
1354
|
Could not coerce '#{position}' into a valid orientation.
|
1294
1355
|
|
1295
1356
|
Valid values are: :down, :up, :right, :left, :bottom, :top
|
1357
|
+
|
1296
1358
|
]
|
1297
1359
|
end
|
1298
1360
|
end
|
1361
|
+
|
1362
|
+
# @!visibility private
|
1363
|
+
# Private method. Do not call.
|
1364
|
+
def _dismiss_springboard_alerts
|
1365
|
+
request = request("dismiss-springboard-alerts")
|
1366
|
+
client = http_client(http_options)
|
1367
|
+
response = client.post(request)
|
1368
|
+
expect_300_response(response)
|
1369
|
+
end
|
1299
1370
|
end
|
1300
1371
|
end
|
1301
1372
|
end
|
Binary file
|
@@ -26,6 +26,30 @@ module RunLoop
|
|
26
26
|
:timeout => RunLoop::Environment.ci? ? 40 : 20
|
27
27
|
}
|
28
28
|
|
29
|
+
# Extracts the value of :inject_dylib from options Hash.
|
30
|
+
# @param options [Hash] arguments passed to {RunLoop.run}
|
31
|
+
# @return [String, nil] If the options contains :inject_dylibs and it is a
|
32
|
+
# path to a dylib that exists, return the path. Otherwise return nil or
|
33
|
+
# raise an error.
|
34
|
+
# @raise [RuntimeError] If :inject_dylib points to a path that does not exist.
|
35
|
+
# @raise [ArgumentError] If :inject_dylib is not a String.
|
36
|
+
def self.dylib_path_from_options(options)
|
37
|
+
inject_dylib = options.fetch(:inject_dylib, nil)
|
38
|
+
return nil if inject_dylib.nil?
|
39
|
+
if !inject_dylib.is_a? String
|
40
|
+
raise ArgumentError, %Q[
|
41
|
+
|
42
|
+
Expected :inject_dylib to be a path to a dylib, but found '#{inject_dylib}'
|
43
|
+
|
44
|
+
]
|
45
|
+
end
|
46
|
+
dylib_path = File.expand_path(inject_dylib)
|
47
|
+
unless File.exist?(dylib_path)
|
48
|
+
raise "Cannot load dylib. The file '#{dylib_path}' does not exist."
|
49
|
+
end
|
50
|
+
dylib_path
|
51
|
+
end
|
52
|
+
|
29
53
|
# @!attribute [r] process_name
|
30
54
|
# The name of the process to inject the dylib into. This should be obtained
|
31
55
|
# by inspecting the Info.plist in the app bundle.
|
data/lib/run_loop/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: run_loop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karl Krukow
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-09-
|
12
|
+
date: 2016-09-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|