run_loop 1.5.1 → 1.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1ea1e4ca2af5aa1d018ecd229a5c864ab3b34533
4
- data.tar.gz: 06ef7af54d9d9d7bac1d2070c1398d3f4723feac
3
+ metadata.gz: 2277694b8f2dd62516bcc3107dc59e8d227e952b
4
+ data.tar.gz: 77b5fa24065db03d3379d9e997251ca564ad9017
5
5
  SHA512:
6
- metadata.gz: 1a71ada83c5a6558e1d423b4138e8235fc82220dfe3c1bcd7283b16978dd6219331754518387102b8c47e4572c0863aceb90f70f5039d2580cd603a5245a9b8d
7
- data.tar.gz: 3c44d8bd2a89a1cda2fdae997ab9a70bcd6f975e2d4e9f97f56d12462f05dde000d54379a83a932b58547b9f5c91b42bd282721897f8b32d8f44373542558131
6
+ metadata.gz: 28529f12e82152e1b618a3ff6011db975d2ac84fb91668c64f95de840d69c8bddc09b94c4fe9e770b7cecd3b3cdaea418a154f6f8f13548231f3635b6f9346be
7
+ data.tar.gz: 6ccce42c7d166a850ecb10e2c558cc1930c73f9da097f03f78d2a32e718e3c70b440761d847233de17a1ded3d1a314414789c6fc98408482d01027afd4e0709f
data/lib/run_loop.rb CHANGED
@@ -2,6 +2,7 @@ require 'run_loop/regex'
2
2
  require 'run_loop/directory'
3
3
  require 'run_loop/environment'
4
4
  require 'run_loop/logging'
5
+ require 'run_loop/xcrun'
5
6
  require 'run_loop/xcode'
6
7
  require 'run_loop/l10n'
7
8
  require 'run_loop/process_terminator'
@@ -23,6 +24,7 @@ require 'run_loop/cache/cache'
23
24
  require 'run_loop/host_cache'
24
25
  require 'run_loop/patches/awesome_print'
25
26
  require 'run_loop/patches/retriable'
27
+ require 'run_loop/life_cycle/core_simulator'
26
28
  require 'run_loop/simctl/bridge'
27
29
  require 'run_loop/simctl/plists'
28
30
 
data/lib/run_loop/app.rb CHANGED
@@ -67,6 +67,11 @@ module RunLoop
67
67
  identifier
68
68
  end
69
69
 
70
+ # Returns the sha1 of the application.
71
+ def sha1
72
+ RunLoop::Directory.directory_digest(path)
73
+ end
74
+
70
75
  private
71
76
 
72
77
  def plist_buddy
@@ -100,7 +100,6 @@ module RunLoop
100
100
 
101
101
  ENV['DEBUG'] = '1' if debug
102
102
 
103
-
104
103
  begin
105
104
  launch_options = {
106
105
  :args => parse_app_launch_args(options),
@@ -37,7 +37,7 @@ module RunLoop
37
37
  end
38
38
  end
39
39
 
40
- desc 'refresh', 'EXPERIMENTAL: Terminate CoreSimulatorService daemons'
40
+ desc 'doctor', 'EXPERIMENTAL: Prepare the CoreSimulator environment for testing'
41
41
 
42
42
  method_option 'debug',
43
43
  :desc => 'Enable debug logging.',
@@ -46,23 +46,70 @@ module RunLoop
46
46
  :default => false,
47
47
  :type => :boolean
48
48
 
49
- def refresh
49
+ method_option 'device',
50
+ :desc => 'The simulator UDID or name.',
51
+ :aliases => '-d',
52
+ :required => false,
53
+ :type => :string
54
+
55
+ def doctor
56
+ debug = options[:debug]
57
+ device = options[:device]
58
+
59
+ if device
60
+ device = expect_device(options)
61
+ if debug
62
+ RunLoop::Environment.with_debugging do
63
+ launch_simulator(device)
64
+ end
65
+ else
66
+ launch_simulator(device)
67
+ end
68
+ else
69
+ if debug
70
+ RunLoop::Environment.with_debugging do
71
+ launch_each_simulator
72
+ end
73
+ else
74
+ launch_each_simulator
75
+ end
76
+ end
77
+ end
78
+
79
+ no_commands do
80
+ def launch_each_simulator
81
+ sim_control = RunLoop::SimControl.new
82
+ sim_control.simulators.each do |simulator|
83
+ launch_simulator(simulator, sim_control)
84
+ end
85
+ end
86
+
87
+ def launch_simulator(simulator, sim_control=RunLoop::SimControl.new)
88
+ core_sim = RunLoop::LifeCycle::CoreSimulator.new(nil,
89
+ simulator,
90
+ sim_control)
91
+ core_sim.launch_simulator
92
+ end
93
+ end
94
+
95
+ desc 'manage-processes', 'Manage CoreSimulator processes by quiting stale processes'
96
+
97
+ method_option 'debug',
98
+ :desc => 'Enable debug logging.',
99
+ :aliases => '-v',
100
+ :required => false,
101
+ :default => false,
102
+ :type => :boolean
103
+
104
+ def manage_processes
50
105
  debug = options[:debug]
51
106
  original_value = ENV['DEBUG']
52
107
 
53
108
  ENV['DEBUG'] = '1' if debug
54
109
 
55
- RunLoop::SimControl.terminate_all_sims
56
-
57
110
  begin
58
- process_name = 'com.apple.CoreSimulator.CoreSimulatorService'
59
- pids = RunLoop::ProcessWaiter.new(process_name, {:timeout => 0.2}).pids
60
- if debug && pids.empty?
61
- puts 'There are no CoreSimulatorServices processes running'
62
- end
63
- pids.each do |pid|
64
- RunLoop::ProcessTerminator.new(pid, 'KILL', process_name).kill_process
65
- end
111
+ RunLoop::SimControl.terminate_all_sims
112
+ terminate_core_simulator_processes
66
113
  ensure
67
114
  ENV['DEBUG'] = original_value if debug
68
115
  end
@@ -78,6 +125,33 @@ module RunLoop
78
125
  device.state == 'Booted'
79
126
  end
80
127
  end
128
+
129
+ # TODO this is duplicated code; extract!
130
+ # https://github.com/calabash/run_loop/issues/225
131
+ def terminate_core_simulator_processes
132
+ to_manage = RunLoop::LifeCycle::CoreSimulator::MANAGED_PROCESSES
133
+ to_manage << ['com.apple.CoreSimulator.CoreSimulatorService', false]
134
+
135
+ to_manage.each do |pair|
136
+ name = pair[0]
137
+ send_term = pair[1]
138
+ pids = RunLoop::ProcessWaiter.new(name).pids
139
+ pids.each do |pid|
140
+
141
+ if send_term
142
+ term = RunLoop::ProcessTerminator.new(pid, 'TERM', name)
143
+ killed = term.kill_process
144
+ else
145
+ killed = false
146
+ end
147
+
148
+ unless killed
149
+ term = RunLoop::ProcessTerminator.new(pid, 'KILL', name)
150
+ term.kill_process
151
+ end
152
+ end
153
+ end
154
+ end
81
155
  end
82
156
 
83
157
  desc 'install --app [OPTIONS]', 'Installs an app on a device'
@@ -89,7 +163,7 @@ module RunLoop
89
163
  :type => :string
90
164
 
91
165
  method_option 'device',
92
- :desc => 'The device UDID or simulator identifier.',
166
+ :desc => 'The simulator UDID or name.',
93
167
  :aliases => '-d',
94
168
  :required => false,
95
169
  :type => :string
@@ -122,6 +196,17 @@ module RunLoop
122
196
 
123
197
  bridge = RunLoop::Simctl::Bridge.new(device, app.path)
124
198
 
199
+ xcode = bridge.sim_control.xcode
200
+ if xcode.version >= RunLoop::Version.new('7.0')
201
+ puts "ERROR: Xcode #{xcode.version.to_s} detected."
202
+ puts "ERROR: Apple's simctl install/uninstall is broken for this version of Xcode."
203
+ puts "ERROR: See the following links for details:"
204
+ puts "ERROR: https://forums.developer.apple.com/message/51922"
205
+ puts "ERROR: https://github.com/calabash/run_loop/issues/235"
206
+ puts "ERROR: exiting 1"
207
+ exit 1
208
+ end
209
+
125
210
  force_reinstall = options[:force]
126
211
 
127
212
  before = Time.now
data/lib/run_loop/core.rb CHANGED
@@ -68,6 +68,8 @@ module RunLoop
68
68
  nil
69
69
  end
70
70
 
71
+ # @deprecated 1.5.2 No public replacement.
72
+ #
71
73
  # Raise an error if the application binary is not compatible with the
72
74
  # target simulator.
73
75
  #
@@ -85,6 +87,7 @@ module RunLoop
85
87
  # @raise [RunLoop::IncompatibleArchitecture] Raises an error if the
86
88
  # application binary is not compatible with the target simulator.
87
89
  def self.expect_compatible_simulator_architecture(launch_options, sim_control)
90
+ RunLoop.deprecated('1.5.2', 'No public replacement.')
88
91
  logger = launch_options[:logger]
89
92
  if sim_control.xcode_version_gte_6?
90
93
  sim_identifier = launch_options[:udid]
@@ -107,6 +110,30 @@ module RunLoop
107
110
  end
108
111
  end
109
112
 
113
+ # Raise an error if the application binary is not compatible with the
114
+ # target simulator.
115
+ #
116
+ # @note This method is implemented for CoreSimulator environments only;
117
+ # for Xcode < 6.0 this method does nothing.
118
+ #
119
+ # @param [RunLoop::Device] device The device to install on.
120
+ # @param [RunLoop::App] app The app to install.
121
+ # @param [RunLoop::Xcode] xcode The active Xcode.
122
+ #
123
+ # @raise [RunLoop::IncompatibleArchitecture] Raises an error if the
124
+ # application binary is not compatible with the target simulator.
125
+ def self.expect_simulator_compatible_arch(device, app, xcode)
126
+ if !xcode.version_gte_6?
127
+ RunLoop.log_warn("Checking for compatible arches is only available in CoreSimulator environments")
128
+ return
129
+ end
130
+
131
+ lipo = RunLoop::Lipo.new(app.path)
132
+ lipo.expect_compatible_arch(device)
133
+
134
+ RunLoop.log_debug("Simulator instruction set '#{device.instruction_set}' is compatible with '#{lipo.info}'")
135
+ end
136
+
110
137
  # Prepares the simulator for running.
111
138
  #
112
139
  # 1. enabling accessibility and software keyboard
@@ -135,17 +162,37 @@ module RunLoop
135
162
 
136
163
  # CoreSimulator
137
164
 
165
+ app_bundle_path = launch_options[:bundle_dir_or_bundle_id]
166
+ app = RunLoop::App.new(app_bundle_path)
167
+
168
+ unless app.valid?
169
+ if !File.exist?(app.path)
170
+ message = "App '#{app_bundle_path}' does not exist."
171
+ else
172
+ message = "App '#{app_bundle_path}' is not a valid .app bundle"
173
+ end
174
+ raise RuntimeError, message
175
+ end
176
+
138
177
  udid = launch_options[:udid]
139
178
  xcode = sim_control.xcode
140
179
 
141
- device = sim_control.simulators.detect do |sim|
180
+ device = sim_control.simulators.find do |sim|
142
181
  sim.udid == udid || sim.instruments_identifier(xcode) == udid
143
182
  end
144
183
 
145
184
  if device.nil?
146
- raise "Could not find simulator with name or UDID that matches: '#{udid}'"
185
+ raise RuntimeError,
186
+ "Could not find simulator with name or UDID that matches: '#{udid}'"
147
187
  end
148
188
 
189
+ # Validate the architecture.
190
+ self.expect_simulator_compatible_arch(device, app, xcode)
191
+
192
+ bridge = RunLoop::LifeCycle::CoreSimulator.new(app, device, sim_control)
193
+
194
+ bridge.ensure_app_same
195
+
149
196
  # Will quit the simulator if it is running.
150
197
  # @todo fix accessibility_enabled? so we don't have to quit the sim
151
198
  # SimControl#accessibility_enabled? is always false during Core#prepare_simulator
@@ -158,11 +205,10 @@ module RunLoop
158
205
  # https://github.com/calabash/run_loop/issues/167
159
206
  sim_control.ensure_software_keyboard(device)
160
207
 
208
+
161
209
  # Xcode 6.3 instruments cannot launch an app that is already installed on
162
210
  # iOS 8.3 Simulators. See: https://github.com/calabash/calabash-ios/issues/744
163
211
  if sim_control.xcode.version_gte_63?
164
- app_bundle_path = launch_options[:bundle_dir_or_bundle_id]
165
- bridge = RunLoop::Simctl::Bridge.new(device, app_bundle_path)
166
212
 
167
213
  if bridge.app_is_installed? && !sim_control.sim_is_running?
168
214
  bridge.launch_simulator
@@ -259,7 +305,6 @@ Please update your sources to pass an instance of RunLoop::Xcode))
259
305
  merged_options = options.merge(discovered_options)
260
306
 
261
307
  if self.simulator_target?(merged_options)
262
- self.expect_compatible_simulator_architecture(merged_options, sim_control)
263
308
  self.prepare_simulator(merged_options, sim_control)
264
309
  end
265
310
 
@@ -286,34 +331,55 @@ Please update your sources to pass an instance of RunLoop::Xcode))
286
331
 
287
332
  uia_timeout = options[:uia_timeout] || RunLoop::Environment.uia_timeout || 10
288
333
 
289
- after = Time.now
290
- RunLoop::Logging.log_debug(logger, "Preparation took #{after-before} seconds")
334
+ RunLoop::Logging.log_debug(logger, "Preparation took #{Time.now-before} seconds")
335
+
336
+ before_instruments_launch = Time.now
337
+
338
+ fifo_retry_on = [RunLoop::Fifo::NoReaderConfiguredError,
339
+ RunLoop::Fifo::WriteTimedOut]
291
340
 
292
- before = Time.now
293
341
  begin
294
342
 
295
343
  if options[:validate_channel]
296
344
  options[:validate_channel].call(run_loop, 0, uia_timeout)
297
345
  else
346
+
298
347
  cmd = "UIALogger.logMessage('Listening for run loop commands')"
348
+
299
349
  begin
350
+
300
351
  fifo_timeout = options[:fifo_timeout] || 30
301
352
  RunLoop::Fifo.write(repl_path, "0:#{cmd}", timeout: fifo_timeout)
302
- rescue RunLoop::Fifo::NoReaderConfiguredError,
303
- RunLoop::Fifo::WriteTimedOut => e
304
- RunLoop::Logging.log_debug(logger, "Error while writing to fifo. #{e}")
305
- raise RunLoop::TimeoutError.new("Error while writing to fifo. #{e}")
353
+
354
+ rescue *fifo_retry_on => e
355
+
356
+ message = "Error while writing to fifo. #{e}"
357
+ RunLoop::Logging.log_debug(logger, message)
358
+ raise RunLoop::TimeoutError.new(message)
359
+
306
360
  end
361
+
307
362
  Timeout::timeout(timeout, RunLoop::TimeoutError) do
308
363
  read_response(run_loop, 0, uia_timeout)
309
364
  end
365
+
310
366
  end
311
367
  rescue RunLoop::TimeoutError => e
312
368
  RunLoop::Logging.log_debug(logger, "Failed to launch. #{e}: #{e && e.message}")
313
- raise RunLoop::TimeoutError, "Time out waiting for UIAutomation run-loop #{e}. \n Logfile #{log_file} \n\n #{File.read(log_file)}\n"
369
+
370
+ message = %Q(
371
+
372
+ "Timed out waiting for UIAutomation run-loop #{e}.
373
+
374
+ Logfile: #{log_file}
375
+
376
+ #{File.read(log_file)}
377
+
378
+ )
379
+ raise RunLoop::TimeoutError, message
314
380
  end
315
381
 
316
- RunLoop::Logging.log_debug(logger, "Launching took #{Time.now-before} seconds")
382
+ RunLoop::Logging.log_debug(logger, "Launching took #{Time.now-before_instruments_launch} seconds")
317
383
 
318
384
  dylib_path = self.dylib_path_from_options(merged_options)
319
385
 
@@ -324,6 +390,7 @@ Please update your sources to pass an instance of RunLoop::Xcode))
324
390
  lldb.retriable_inject_dylib
325
391
  end
326
392
 
393
+ RunLoop.log_debug("It took #{Time.now - before} seconds to launch the app")
327
394
  run_loop
328
395
  end
329
396
 
@@ -360,131 +427,148 @@ Please update your sources to pass an instance of RunLoop::Xcode))
360
427
  def self.simulator_target?(run_options, sim_control=nil)
361
428
  value = run_options[:device_target]
362
429
 
363
- # match the behavior of udid_and_bundle_for_launcher
430
+ # Match the behavior of udid_and_bundle_for_launcher.
364
431
  return true if value.nil? or value == ''
365
432
 
366
- # support for 'simulator' and Xcode >= 5.1 device targets
433
+ # 5.1 <= Xcode < 7.0
367
434
  return true if value.downcase.include?('simulator')
368
435
 
369
- value[DEVICE_UDID_REGEX, 0] == nil
436
+ # Not a physical device.
437
+ return false if value[DEVICE_UDID_REGEX, 0] != nil
438
+
439
+ # Check for named simulators and Xcode >= 7.0 simulators.
440
+ sim_control = run_options[:sim_control] || RunLoop::SimControl.new
441
+ xcode = sim_control.xcode
442
+ if xcode.version_gte_6?
443
+ simulator = sim_control.simulators.find do |sim|
444
+ sim.instruments_identifier(xcode) == value ||
445
+ sim.udid == value
446
+ end
447
+ !simulator.nil?
448
+ else
449
+ false
450
+ end
370
451
  end
371
452
 
372
- # Extracts the value of :inject_dylib from options Hash.
373
- # @param options [Hash] arguments passed to {RunLoop.run}
374
- # @return [String, nil] If the options contains :inject_dylibs and it is a
375
- # path to a dylib that exists, return the path. Otherwise return nil or
376
- # raise an error.
377
- # @raise [RuntimeError] If :inject_dylib points to a path that does not exist.
378
- # @raise [ArgumentError] If :inject_dylib is not a String.
379
- def self.dylib_path_from_options(options)
380
- inject_dylib = options.fetch(:inject_dylib, nil)
381
- return nil if inject_dylib.nil?
382
- unless inject_dylib.is_a? String
383
- raise ArgumentError, "Expected :inject_dylib to be a path to a dylib, but found '#{inject_dylib}'"
384
- end
385
- dylib_path = File.expand_path(inject_dylib)
386
- unless File.exist?(dylib_path)
387
- raise "Cannot load dylib. The file '#{dylib_path}' does not exist."
388
- end
389
- dylib_path
453
+
454
+ # Extracts the value of :inject_dylib from options Hash.
455
+ # @param options [Hash] arguments passed to {RunLoop.run}
456
+ # @return [String, nil] If the options contains :inject_dylibs and it is a
457
+ # path to a dylib that exists, return the path. Otherwise return nil or
458
+ # raise an error.
459
+ # @raise [RuntimeError] If :inject_dylib points to a path that does not exist.
460
+ # @raise [ArgumentError] If :inject_dylib is not a String.
461
+ def self.dylib_path_from_options(options)
462
+ inject_dylib = options.fetch(:inject_dylib, nil)
463
+ return nil if inject_dylib.nil?
464
+ unless inject_dylib.is_a? String
465
+ raise ArgumentError, "Expected :inject_dylib to be a path to a dylib, but found '#{inject_dylib}'"
466
+ end
467
+ dylib_path = File.expand_path(inject_dylib)
468
+ unless File.exist?(dylib_path)
469
+ raise "Cannot load dylib. The file '#{dylib_path}' does not exist."
390
470
  end
471
+ dylib_path
472
+ end
391
473
 
392
- # Returns the a default simulator to target. This default needs to be one
393
- # that installed by default in the current Xcode version.
394
- #
395
- # For historical reasons, the most recent non-64b SDK should be used.
396
- #
397
- # @param [RunLoop::XCTools, RunLoop::XCode] xcode Used to detect the current xcode
398
- # version.
399
- def self.default_simulator(xcode=RunLoop::Xcode.new)
400
- if xcode.is_a?(RunLoop::XCTools)
401
- RunLoop.deprecated('1.5.0',
402
- %q(
474
+ # Returns the a default simulator to target. This default needs to be one
475
+ # that installed by default in the current Xcode version.
476
+ #
477
+ # For historical reasons, the most recent non-64b SDK should be used.
478
+ #
479
+ # @param [RunLoop::XCTools, RunLoop::XCode] xcode Used to detect the current xcode
480
+ # version.
481
+ def self.default_simulator(xcode=RunLoop::Xcode.new)
482
+ if xcode.is_a?(RunLoop::XCTools)
483
+ RunLoop.deprecated('1.5.0',
484
+ %q(
403
485
  RunLoop::XCTools has been replaced with RunLoop::Xcode.
404
486
  Please update your sources to pass an instance of RunLoop::Xcode))
405
- end
487
+ end
406
488
 
407
- if xcode.version_gte_7?
408
- 'iPhone 5s (9.0)'
409
- elsif xcode.version_gte_64?
410
- 'iPhone 5s (8.4 Simulator)'
411
- elsif xcode.version_gte_63?
412
- 'iPhone 5s (8.3 Simulator)'
413
- elsif xcode.version_gte_62?
414
- 'iPhone 5s (8.2 Simulator)'
415
- elsif xcode.version_gte_61?
416
- 'iPhone 5s (8.1 Simulator)'
417
- elsif xcode.version_gte_6?
418
- 'iPhone 5s (8.0 Simulator)'
419
- else
420
- 'iPhone Retina (4-inch) - Simulator - iOS 7.1'
421
- end
489
+ if xcode.version_gte_71?
490
+ 'iPhone 6s (9.1)'
491
+ elsif xcode.version_gte_7?
492
+ 'iPhone 5s (9.0)'
493
+ elsif xcode.version_gte_64?
494
+ 'iPhone 5s (8.4 Simulator)'
495
+ elsif xcode.version_gte_63?
496
+ 'iPhone 5s (8.3 Simulator)'
497
+ elsif xcode.version_gte_62?
498
+ 'iPhone 5s (8.2 Simulator)'
499
+ elsif xcode.version_gte_61?
500
+ 'iPhone 5s (8.1 Simulator)'
501
+ elsif xcode.version_gte_6?
502
+ 'iPhone 5s (8.0 Simulator)'
503
+ else
504
+ 'iPhone Retina (4-inch) - Simulator - iOS 7.1'
422
505
  end
506
+ end
423
507
 
424
- def self.udid_and_bundle_for_launcher(device_target, options, sim_control=RunLoop::SimControl.new)
425
- xcode = sim_control.xcode
508
+ def self.udid_and_bundle_for_launcher(device_target, options, sim_control=RunLoop::SimControl.new)
509
+ xcode = sim_control.xcode
426
510
 
427
- bundle_dir_or_bundle_id = options[:app] || RunLoop::Environment.bundle_id || RunLoop::Environment.path_to_app_bundle
511
+ bundle_dir_or_bundle_id = options[:app] || RunLoop::Environment.bundle_id || RunLoop::Environment.path_to_app_bundle
428
512
 
429
- unless bundle_dir_or_bundle_id
430
- 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)'
431
- end
513
+ unless bundle_dir_or_bundle_id
514
+ 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)'
515
+ end
432
516
 
433
- udid = nil
517
+ udid = nil
434
518
 
435
- if xcode.version_gte_51?
436
- if device_target.nil? || device_target.empty? || device_target == 'simulator'
437
- device_target = self.default_simulator(xcode)
438
- end
439
- udid = device_target
519
+ if xcode.version_gte_51?
520
+ if device_target.nil? || device_target.empty? || device_target == 'simulator'
521
+ device_target = self.default_simulator(xcode)
522
+ end
523
+ udid = device_target
440
524
 
441
- unless self.simulator_target?(options)
442
- bundle_dir_or_bundle_id = options[:bundle_id] if options[:bundle_id]
443
- end
444
- else
445
- #TODO: this can be removed - Xcode < 5.1.1 not supported.
446
- if device_target == 'simulator'
525
+ unless self.simulator_target?(options)
526
+ bundle_dir_or_bundle_id = options[:bundle_id] if options[:bundle_id]
527
+ end
528
+ else
529
+ #TODO: this can be removed - Xcode < 5.1.1 not supported.
530
+ if device_target == 'simulator'
447
531
 
448
- unless File.exist?(bundle_dir_or_bundle_id)
449
- raise "Unable to find app in directory #{bundle_dir_or_bundle_id} when trying to launch simulator"
450
- end
532
+ unless File.exist?(bundle_dir_or_bundle_id)
533
+ raise "Unable to find app in directory #{bundle_dir_or_bundle_id} when trying to launch simulator"
534
+ end
451
535
 
452
536
 
453
- device = options[:device] || :iphone
454
- device = device && device.to_sym
537
+ device = options[:device] || :iphone
538
+ device = device && device.to_sym
455
539
 
456
- plistbuddy='/usr/libexec/PlistBuddy'
457
- plistfile="#{bundle_dir_or_bundle_id}/Info.plist"
458
- if device == :iphone
459
- uidevicefamily=1
460
- else
461
- uidevicefamily=2
462
- end
463
- system("#{plistbuddy} -c 'Delete :UIDeviceFamily' '#{plistfile}'")
464
- system("#{plistbuddy} -c 'Add :UIDeviceFamily array' '#{plistfile}'")
465
- system("#{plistbuddy} -c 'Add :UIDeviceFamily:0 integer #{uidevicefamily}' '#{plistfile}'")
540
+ plistbuddy='/usr/libexec/PlistBuddy'
541
+ plistfile="#{bundle_dir_or_bundle_id}/Info.plist"
542
+ if device == :iphone
543
+ uidevicefamily=1
466
544
  else
467
- udid = device_target
468
- bundle_dir_or_bundle_id = options[:bundle_id] if options[:bundle_id]
545
+ uidevicefamily=2
469
546
  end
547
+ system("#{plistbuddy} -c 'Delete :UIDeviceFamily' '#{plistfile}'")
548
+ system("#{plistbuddy} -c 'Add :UIDeviceFamily array' '#{plistfile}'")
549
+ system("#{plistbuddy} -c 'Add :UIDeviceFamily:0 integer #{uidevicefamily}' '#{plistfile}'")
550
+ else
551
+ udid = device_target
552
+ bundle_dir_or_bundle_id = options[:bundle_id] if options[:bundle_id]
470
553
  end
471
- return udid, bundle_dir_or_bundle_id
472
554
  end
555
+ return udid, bundle_dir_or_bundle_id
556
+ end
473
557
 
474
- def self.create_uia_pipe(repl_path)
475
- begin
476
- Timeout::timeout(5, RunLoop::TimeoutError) do
477
- loop do
478
- begin
479
- FileUtils.rm_f(repl_path)
480
- return repl_path if system(%Q[mkfifo "#{repl_path}"])
481
- rescue Errno::EINTR => e
482
- #retry
483
- sleep(0.1)
484
- end
558
+ def self.create_uia_pipe(repl_path)
559
+ begin
560
+ Timeout::timeout(5, RunLoop::TimeoutError) do
561
+ loop do
562
+ begin
563
+ FileUtils.rm_f(repl_path)
564
+ return repl_path if system(%Q[mkfifo "#{repl_path}"])
565
+ rescue Errno::EINTR => e
566
+ #retry
567
+ sleep(0.1)
485
568
  end
486
569
  end
487
- rescue RunLoop::TimeoutError => _
570
+ end
571
+ rescue RunLoop::TimeoutError => _
488
572
  raise RunLoop::TimeoutError, 'Unable to create pipe (mkfifo failed)'
489
573
  end
490
574
  end