run_loop 2.7.1 → 3.0.0
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.rb +0 -38
- data/lib/run_loop/app.rb +37 -1
- data/lib/run_loop/cli/idm.rb +71 -0
- data/lib/run_loop/cli/simctl.rb +2 -2
- data/lib/run_loop/core.rb +12 -156
- data/lib/run_loop/core_simulator.rb +17 -9
- data/lib/run_loop/device.rb +39 -18
- 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/ipa/DeviceAgent-Runner.app.zip +0 -0
- data/lib/run_loop/language.rb +3 -0
- data/lib/run_loop/locale.rb +3 -0
- data/lib/run_loop/simctl.rb +95 -37
- data/lib/run_loop/strings.rb +15 -0
- data/lib/run_loop/version.rb +1 -1
- data/lib/run_loop/xcode.rb +34 -167
- metadata +4 -4
- data/lib/run_loop/sim_control.rb +0 -1268
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a3873b92b4c8568a495fcc27d0941944c51c970c9bad153a633b7968ea21434
|
4
|
+
data.tar.gz: 7cb0715ea157c79ab0f134611eb119d0fa1bedfa271d8fbbf7a09ac35a1810ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29d727bad338610ce8d3e3cb28e6a3c5f0fbfd75a537768b016463970b934b987d977e6f707366d6a76797a0887db3c5a5c0567c6f20944874657915d5b77ec7
|
7
|
+
data.tar.gz: 824e82af5b89ba3b00f4aba551e63cd7e576576c282ee10119196e3d744efde52376fba4f8fb2705be5cce06ada5d1299734243baee873cc63dcca1b6d075ff9
|
data/lib/run_loop.rb
CHANGED
@@ -34,7 +34,6 @@ require "run_loop/detect_aut/errors"
|
|
34
34
|
require "run_loop/detect_aut/xamarin_studio"
|
35
35
|
require "run_loop/detect_aut/xcode"
|
36
36
|
require "run_loop/detect_aut/detect"
|
37
|
-
require 'run_loop/sim_control'
|
38
37
|
require 'run_loop/device'
|
39
38
|
require 'run_loop/instruments'
|
40
39
|
require 'run_loop/lipo'
|
@@ -202,43 +201,6 @@ Please quit the Instruments.app and try again.)
|
|
202
201
|
FileUtils.cp(pngs, dest) if pngs and pngs.length > 0
|
203
202
|
end
|
204
203
|
|
205
|
-
# @!visibility private
|
206
|
-
#
|
207
|
-
# @deprecated since 2.1.2
|
208
|
-
def self.default_script_for_uia_strategy(uia_strategy)
|
209
|
-
self.deprecated("2.1.2", "Replaced by methods in RunLoop::Core")
|
210
|
-
case uia_strategy
|
211
|
-
when :preferences
|
212
|
-
Core.script_for_key(:run_loop_fast_uia)
|
213
|
-
when :host
|
214
|
-
Core.script_for_key(:run_loop_host)
|
215
|
-
when :shared_element
|
216
|
-
Core.script_for_key(:run_loop_shared_element)
|
217
|
-
else
|
218
|
-
Core.script_for_key(:run_loop_basic)
|
219
|
-
end
|
220
|
-
end
|
221
|
-
|
222
|
-
# @!visibility private
|
223
|
-
#
|
224
|
-
# @deprecated since 2.1.2
|
225
|
-
def self.validate_script(script)
|
226
|
-
self.deprecated("2.1.2", "Replaced by methods in RunLoop::Core")
|
227
|
-
if script.is_a?(String)
|
228
|
-
unless File.exist?(script)
|
229
|
-
raise "Unable to find file: #{script}"
|
230
|
-
end
|
231
|
-
elsif script.is_a?(Symbol)
|
232
|
-
script = Core.script_for_key(script)
|
233
|
-
unless script
|
234
|
-
raise "Unknown script for symbol: #{script}. Options: #{Core::SCRIPTS.keys.join(', ')}"
|
235
|
-
end
|
236
|
-
else
|
237
|
-
raise "Script must be a symbol or path: #{script}"
|
238
|
-
end
|
239
|
-
script
|
240
|
-
end
|
241
|
-
|
242
204
|
def self.log_info(*args)
|
243
205
|
RunLoop::Logging.log_info(*args)
|
244
206
|
end
|
data/lib/run_loop/app.rb
CHANGED
@@ -16,7 +16,21 @@ module RunLoop
|
|
16
16
|
@path = File.expand_path(app_bundle_path)
|
17
17
|
|
18
18
|
if !App.valid?(app_bundle_path)
|
19
|
-
|
19
|
+
if App.cached_app_on_simulator?(app_bundle_path)
|
20
|
+
raise RuntimeError, %Q{
|
21
|
+
App is "cached" on the simulator.
|
22
|
+
|
23
|
+
#{app_bundle_path}
|
24
|
+
|
25
|
+
This can happen if there was an incomplete install or uninstall.
|
26
|
+
|
27
|
+
Try manually deleting the application data container and relaunching the simulator.
|
28
|
+
|
29
|
+
$ rm -r #{File.dirname(app_bundle_path)}
|
30
|
+
$ run-loop simctl manage-processes
|
31
|
+
}
|
32
|
+
else
|
33
|
+
raise ArgumentError,
|
20
34
|
%Q{App does not exist at path or is not an app bundle.
|
21
35
|
|
22
36
|
#{app_bundle_path}
|
@@ -28,6 +42,7 @@ Bundle must:
|
|
28
42
|
3. contain an Info.plist,
|
29
43
|
4. and the app binary (CFBundleExecutable) must exist
|
30
44
|
}
|
45
|
+
end
|
31
46
|
end
|
32
47
|
end
|
33
48
|
|
@@ -71,6 +86,19 @@ Bundle must:
|
|
71
86
|
true
|
72
87
|
end
|
73
88
|
|
89
|
+
# @!visibility private
|
90
|
+
#
|
91
|
+
# Starting in Xcode 10 betas, this can happen if there was an incomplete
|
92
|
+
# install or uninstall.
|
93
|
+
def self.cached_app_on_simulator?(app_bundle_path)
|
94
|
+
return false if Dir[File.join(app_bundle_path, "**/*")].length != 2
|
95
|
+
return false if !app_bundle_path[RunLoop::Regex::CORE_SIMULATOR_UDID_REGEX]
|
96
|
+
[File.join(app_bundle_path, "Info.plist"),
|
97
|
+
File.join(app_bundle_path, "Icon.png")].all? do |file|
|
98
|
+
File.exist?(file)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
74
102
|
# Returns the Info.plist path.
|
75
103
|
# @raise [RuntimeError] If there is no Info.plist.
|
76
104
|
def info_plist_path
|
@@ -128,6 +156,14 @@ Bundle must:
|
|
128
156
|
version
|
129
157
|
end
|
130
158
|
|
159
|
+
# @!visibility private
|
160
|
+
# Return the fingerprint of the linked server
|
161
|
+
def calabash_server_id
|
162
|
+
name = plist_buddy.plist_read("CFBundleExecutable", info_plist_path)
|
163
|
+
app_executable = File.join(self.path, name)
|
164
|
+
strings(app_executable).server_id
|
165
|
+
end
|
166
|
+
|
131
167
|
# @!visibility private
|
132
168
|
def codesign_info
|
133
169
|
RunLoop::Codesign.info(path)
|
@@ -0,0 +1,71 @@
|
|
1
|
+
|
2
|
+
module RunLoop
|
3
|
+
module CLI
|
4
|
+
|
5
|
+
require 'thor'
|
6
|
+
class IDM < Thor
|
7
|
+
|
8
|
+
require "run_loop"
|
9
|
+
require "run_loop/cli/errors"
|
10
|
+
require "run_loop/shell"
|
11
|
+
include RunLoop::Shell
|
12
|
+
|
13
|
+
require "run_loop/regex"
|
14
|
+
|
15
|
+
desc "install app [OPTIONS]", "Installs an app on a device."
|
16
|
+
|
17
|
+
method_option "device",
|
18
|
+
:desc => 'The simulator UDID or name.',
|
19
|
+
:aliases => "-d",
|
20
|
+
:required => false,
|
21
|
+
:type => :string
|
22
|
+
|
23
|
+
method_option "debug",
|
24
|
+
:desc => "Enable debug logging.",
|
25
|
+
:aliases => "-v",
|
26
|
+
:required => false,
|
27
|
+
:default => false,
|
28
|
+
:type => :boolean
|
29
|
+
|
30
|
+
method_option "force",
|
31
|
+
:desc => "Force a re-install the existing app",
|
32
|
+
:aliases => "-f",
|
33
|
+
:required => false,
|
34
|
+
:default => false,
|
35
|
+
:type => :boolean
|
36
|
+
|
37
|
+
def install(app)
|
38
|
+
extension = File.extname(app)
|
39
|
+
if extension == ".app"
|
40
|
+
app_instance = RunLoop::App.new(app)
|
41
|
+
else
|
42
|
+
app_instance = RunLoop::Ipa.new(app)
|
43
|
+
end
|
44
|
+
|
45
|
+
xcode = RunLoop::Xcode.new
|
46
|
+
simctl = RunLoop::Simctl.new
|
47
|
+
instruments = RunLoop::Instruments.new
|
48
|
+
|
49
|
+
detect_options = {}
|
50
|
+
|
51
|
+
device = options[:device]
|
52
|
+
if !device
|
53
|
+
detect_options[:device] = "device"
|
54
|
+
else
|
55
|
+
detect_options[:device] = device
|
56
|
+
end
|
57
|
+
|
58
|
+
device = RunLoop::Device.detect_device(detect_options, xcode,
|
59
|
+
simctl, instruments)
|
60
|
+
|
61
|
+
idm = RunLoop::PhysicalDevice::IOSDeviceManager.new(device)
|
62
|
+
|
63
|
+
if options[:force]
|
64
|
+
idm.install_app(app_instance)
|
65
|
+
else
|
66
|
+
idm.ensure_newest_installed(app_instance)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/run_loop/cli/simctl.rb
CHANGED
@@ -250,7 +250,7 @@ module RunLoop
|
|
250
250
|
if device_from_options.nil?
|
251
251
|
default_name = RunLoop::Core.default_simulator
|
252
252
|
device = simulators.find do |sim|
|
253
|
-
sim.instruments_identifier
|
253
|
+
sim.instruments_identifier == default_name
|
254
254
|
end
|
255
255
|
|
256
256
|
if device.nil?
|
@@ -260,7 +260,7 @@ module RunLoop
|
|
260
260
|
else
|
261
261
|
device = simulators.find do |sim|
|
262
262
|
sim.udid == device_from_options ||
|
263
|
-
sim.instruments_identifier
|
263
|
+
sim.instruments_identifier == device_from_options
|
264
264
|
end
|
265
265
|
|
266
266
|
if device.nil?
|
data/lib/run_loop/core.rb
CHANGED
@@ -319,44 +319,20 @@ Logfile: #{log_file}
|
|
319
319
|
# @param [RunLoop::Xcode] xcode Used to detect the current xcode
|
320
320
|
# version.
|
321
321
|
def self.default_simulator(xcode=RunLoop::Xcode.new)
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
elsif xcode.version_gte_90?
|
332
|
-
"iPhone 8 (11.0)"
|
333
|
-
elsif xcode.version_gte_83?
|
334
|
-
"iPhone 7 (10.3)"
|
335
|
-
elsif xcode.version_gte_82?
|
336
|
-
"iPhone 7 (10.2)"
|
337
|
-
elsif xcode.version_gte_81?
|
338
|
-
"iPhone 7 (10.1)"
|
339
|
-
elsif xcode.version_gte_8?
|
340
|
-
"iPhone 7 (10.0)"
|
341
|
-
elsif xcode.version_gte_73?
|
342
|
-
"iPhone 6s (9.3)"
|
343
|
-
elsif xcode.version_gte_72?
|
344
|
-
"iPhone 6s (9.2)"
|
345
|
-
elsif xcode.version_gte_71?
|
346
|
-
"iPhone 6s (9.1)"
|
347
|
-
elsif xcode.version_gte_7?
|
348
|
-
"iPhone 5s (9.0)"
|
349
|
-
elsif xcode.version_gte_64?
|
350
|
-
"iPhone 5s (8.4 Simulator)"
|
351
|
-
elsif xcode.version_gte_63?
|
352
|
-
"iPhone 5s (8.3 Simulator)"
|
353
|
-
elsif xcode.version_gte_62?
|
354
|
-
"iPhone 5s (8.2 Simulator)"
|
355
|
-
elsif xcode.version_gte_61?
|
356
|
-
"iPhone 5s (8.1 Simulator)"
|
322
|
+
version = xcode.version
|
323
|
+
xcode_major = version.major
|
324
|
+
xcode_minor = version.minor
|
325
|
+
major = xcode_major + 2
|
326
|
+
minor = xcode_minor
|
327
|
+
|
328
|
+
# Early major Xcode beta releases do not have new hardware model numbers
|
329
|
+
if xcode.beta? && xcode_major == 10
|
330
|
+
model = xcode_major - 2
|
357
331
|
else
|
358
|
-
|
332
|
+
model = xcode_major - 1
|
359
333
|
end
|
334
|
+
|
335
|
+
"iPhone #{model} (#{major}.#{minor})"
|
360
336
|
end
|
361
337
|
|
362
338
|
def self.create_uia_pipe(repl_path)
|
@@ -574,125 +550,10 @@ $ xcrun instruments -s templates
|
|
574
550
|
])
|
575
551
|
end
|
576
552
|
|
577
|
-
# @deprecated 2.1.0
|
578
|
-
# Replaced with Device.detect_physical_device_on_usb
|
579
|
-
def self.detect_connected_device
|
580
|
-
begin
|
581
|
-
Timeout::timeout(1, RunLoop::TimeoutError) do
|
582
|
-
return `#{File.join(SCRIPTS_PATH, 'udidetect')}`.chomp
|
583
|
-
end
|
584
|
-
rescue RunLoop::TimeoutError => _
|
585
|
-
`killall udidetect &> /dev/null`
|
586
|
-
end
|
587
|
-
nil
|
588
|
-
end
|
589
|
-
|
590
|
-
# @deprecated 2.1.0
|
591
|
-
# @!visibility private
|
592
|
-
# Are we targeting a simulator?
|
593
|
-
#
|
594
|
-
# @note The behavior of this method is different than the corresponding
|
595
|
-
# method in Calabash::Cucumber::Launcher method. If
|
596
|
-
# `:device_target => {nil | ''}`, then the calabash-ios method returns
|
597
|
-
# _false_. I am basing run-loop's behavior off the behavior in
|
598
|
-
# `self.udid_and_bundle_for_launcher`
|
599
|
-
#
|
600
|
-
# @see {Core::RunLoop.udid_and_bundle_for_launcher}
|
601
|
-
#
|
602
|
-
# @todo sim_control argument is no longer necessary and can be removed.
|
603
|
-
def self.simulator_target?(run_options, sim_control=nil)
|
604
|
-
# TODO Enable deprecation warning
|
605
|
-
# RunLoop.deprecated("2.1.0", "No replacement")
|
606
|
-
value = run_options[:device_target]
|
607
|
-
|
608
|
-
# Match the behavior of udid_and_bundle_for_launcher.
|
609
|
-
return true if value.nil? or value == ''
|
610
|
-
|
611
|
-
# 5.1 <= Xcode < 7.0
|
612
|
-
return true if value.downcase.include?('simulator')
|
613
|
-
|
614
|
-
# Not a physical device.
|
615
|
-
return false if value[DEVICE_UDID_REGEX, 0] != nil
|
616
|
-
|
617
|
-
# Check for named simulators and Xcode >= 7.0 simulators.
|
618
|
-
simctl = run_options[:sim_control] || run_options[:simctl] || RunLoop::Simctl.new
|
619
|
-
xcode = run_options[:xcode] || RunLoop::Xcode.new
|
620
|
-
simulator = simctl.simulators.find do |sim|
|
621
|
-
[
|
622
|
-
sim.instruments_identifier(xcode) == value,
|
623
|
-
sim.udid == value,
|
624
|
-
sim.name == value
|
625
|
-
].any?
|
626
|
-
end
|
627
|
-
!simulator.nil?
|
628
|
-
end
|
629
|
-
|
630
|
-
# @!visibility private
|
631
|
-
# @deprecated 2.1.0
|
632
|
-
#
|
633
|
-
# Do not call this method.
|
634
|
-
def self.udid_and_bundle_for_launcher(device_target, options, simctl=RunLoop::Simctl.new)
|
635
|
-
RunLoop.deprecated("2.1.0", "No replacement")
|
636
|
-
xcode = RunLoop::Xcode.new
|
637
|
-
|
638
|
-
bundle_dir_or_bundle_id = options[:app] || RunLoop::Environment.bundle_id || RunLoop::Environment.path_to_app_bundle
|
639
|
-
|
640
|
-
unless bundle_dir_or_bundle_id
|
641
|
-
raise 'key :app or environment variable APP_BUNDLE_PATH, BUNDLE_ID or APP must be specified as path to app bundle (simulator) or bundle id (device)'
|
642
|
-
end
|
643
|
-
|
644
|
-
if device_target.nil? || device_target.empty? || device_target == 'simulator'
|
645
|
-
device_target = self.default_simulator(xcode)
|
646
|
-
end
|
647
|
-
udid = device_target
|
648
|
-
|
649
|
-
unless self.simulator_target?(options)
|
650
|
-
bundle_dir_or_bundle_id = options[:bundle_id] if options[:bundle_id]
|
651
|
-
end
|
652
|
-
return udid, bundle_dir_or_bundle_id
|
653
|
-
end
|
654
|
-
|
655
|
-
# @deprecated 1.0.5
|
656
|
-
def self.ensure_instruments_not_running!
|
657
|
-
RunLoop::Instruments.new.kill_instruments
|
658
|
-
end
|
659
|
-
|
660
553
|
def self.instruments_running?
|
661
554
|
RunLoop::Instruments.new.instruments_running?
|
662
555
|
end
|
663
556
|
|
664
|
-
# @deprecated 1.0.5
|
665
|
-
def self.instruments_pids
|
666
|
-
RunLoop::Instruments.new.instruments_pids
|
667
|
-
end
|
668
|
-
|
669
|
-
# @deprecated 1.0.0 replaced with Xctools#version
|
670
|
-
def self.xcode_version(xcode=RunLoop::Xcode.new)
|
671
|
-
xcode.version
|
672
|
-
end
|
673
|
-
|
674
|
-
# @deprecated since 1.0.0
|
675
|
-
# still used extensively in calabash-ios launcher
|
676
|
-
def self.above_or_eql_version?(target_version, xcode_version)
|
677
|
-
if target_version.is_a?(RunLoop::Version)
|
678
|
-
target = target_version
|
679
|
-
else
|
680
|
-
target = RunLoop::Version.new(target_version)
|
681
|
-
end
|
682
|
-
|
683
|
-
if xcode_version.is_a?(RunLoop::Version)
|
684
|
-
xcode = xcode_version
|
685
|
-
else
|
686
|
-
xcode = RunLoop::Version.new(xcode_version)
|
687
|
-
end
|
688
|
-
target >= xcode
|
689
|
-
end
|
690
|
-
|
691
|
-
# @deprecated 1.0.5
|
692
|
-
def self.pids_for_run_loop(run_loop, &block)
|
693
|
-
RunLoop::Instruments.new.instruments_pids(&block)
|
694
|
-
end
|
695
|
-
|
696
557
|
private
|
697
558
|
|
698
559
|
# @!visibility private
|
@@ -828,11 +689,6 @@ $ xcrun instruments -s templates
|
|
828
689
|
core_sim.reset_app_sandbox
|
829
690
|
end
|
830
691
|
|
831
|
-
# @todo fix accessibility_enabled? so we don't have to quit the sim
|
832
|
-
# SimControl#accessibility_enabled? is always false during Core#prepare_simulator
|
833
|
-
# https://github.com/calabash/run_loop/issues/167
|
834
|
-
simctl.ensure_accessibility(device)
|
835
|
-
|
836
692
|
# Launches the simulator if the app is not installed.
|
837
693
|
core_sim.install
|
838
694
|
|
@@ -122,7 +122,13 @@ class RunLoop::CoreSimulator
|
|
122
122
|
["pkd", false],
|
123
123
|
["KeychainSyncingOverIDSProxy", false],
|
124
124
|
["CloudKeychainProxy", false],
|
125
|
-
["aslmanager", false]
|
125
|
+
["aslmanager", false],
|
126
|
+
|
127
|
+
# Processes from Xcode 10
|
128
|
+
["diagnosticd", false],
|
129
|
+
["syslogd", false],
|
130
|
+
["mobiletimerd", false],
|
131
|
+
["carkitd", false]
|
126
132
|
]
|
127
133
|
|
128
134
|
# @!visibility private
|
@@ -424,6 +430,9 @@ class RunLoop::CoreSimulator
|
|
424
430
|
'-CurrentDeviceUDID', device.udid,
|
425
431
|
"-ConnectHardwareKeyboard", "0",
|
426
432
|
"-DeviceBootTimeout", "120",
|
433
|
+
# Yes, this is the argument even though it is not spelled correctly
|
434
|
+
"-DetatchOnAppQuit", "0",
|
435
|
+
"-DetachOnWindowClose", "0",
|
427
436
|
"LAUNCHED_BY_RUN_LOOP"]
|
428
437
|
|
429
438
|
RunLoop.log_debug("Launching #{device} with:")
|
@@ -518,7 +527,12 @@ Could not launch #{app.bundle_identifier} on #{device} after trying #{tries} tim
|
|
518
527
|
|
519
528
|
# Is this app installed?
|
520
529
|
def app_is_installed?
|
521
|
-
|
530
|
+
if installed_app_bundle_dir ||
|
531
|
+
simctl.app_container(device, app.bundle_identifier)
|
532
|
+
true
|
533
|
+
else
|
534
|
+
false
|
535
|
+
end
|
522
536
|
end
|
523
537
|
|
524
538
|
# Resets the app sandbox.
|
@@ -600,13 +614,7 @@ Could not launch #{app.bundle_identifier} on #{device} after trying #{tries} tim
|
|
600
614
|
# @return [String] A String suitable for searching for a pid, quitting, or
|
601
615
|
# launching the current simulator.
|
602
616
|
def sim_name
|
603
|
-
@sim_name ||=
|
604
|
-
if xcode.version_gte_7?
|
605
|
-
"Simulator"
|
606
|
-
else
|
607
|
-
"iOS Simulator"
|
608
|
-
end
|
609
|
-
end
|
617
|
+
@sim_name ||= "Simulator"
|
610
618
|
end
|
611
619
|
|
612
620
|
# @!visibility private
|