run_loop 2.7.1 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|