calabash-cucumber 0.18.2 → 0.19.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/bin/calabash-ios +0 -16
  3. data/bin/calabash-ios-build.rb +0 -86
  4. data/bin/calabash-ios-helpers.rb +0 -65
  5. data/bin/calabash-ios-setup.rb +5 -119
  6. data/bin/calabash-ios-sim.rb +0 -37
  7. data/bin/frank-calabash +0 -1
  8. data/doc/calabash-ios-help.txt +0 -8
  9. data/dylibs/libCalabashDyn.dylib +0 -0
  10. data/dylibs/libCalabashDynSim.dylib +0 -0
  11. data/features-skeleton/support/01_launch.rb +3 -4
  12. data/features/step_definitions/calabash_steps.rb +1 -7
  13. data/lib/calabash-cucumber.rb +1 -2
  14. data/lib/calabash-cucumber/actions/instruments_actions.rb +2 -3
  15. data/lib/calabash-cucumber/core.rb +97 -101
  16. data/lib/calabash-cucumber/device.rb +5 -118
  17. data/lib/calabash-cucumber/environment.rb +109 -5
  18. data/lib/calabash-cucumber/environment_helpers.rb +4 -66
  19. data/lib/calabash-cucumber/http/http.rb +114 -0
  20. data/lib/calabash-cucumber/http_helpers.rb +3 -1
  21. data/lib/calabash-cucumber/ipad_1x_2x.rb +5 -7
  22. data/lib/calabash-cucumber/keyboard_helpers.rb +0 -44
  23. data/lib/calabash-cucumber/launcher.rb +425 -808
  24. data/lib/calabash-cucumber/logging.rb +2 -74
  25. data/lib/calabash-cucumber/operations.rb +0 -2
  26. data/lib/calabash-cucumber/rotation_helpers.rb +2 -82
  27. data/lib/calabash-cucumber/status_bar_helpers.rb +2 -8
  28. data/lib/calabash-cucumber/store/preferences.rb +2 -1
  29. data/lib/calabash-cucumber/uia.rb +4 -9
  30. data/lib/calabash-cucumber/version.rb +2 -2
  31. data/lib/calabash-cucumber/wait_helpers.rb +0 -2
  32. data/staticlib/calabash.framework.zip +0 -0
  33. data/staticlib/libFrankCalabash.a +0 -0
  34. metadata +13 -143
  35. data/lib/calabash-cucumber/actions/playback_actions.rb +0 -109
  36. data/lib/calabash-cucumber/deprecated.rb +0 -34
  37. data/lib/calabash-cucumber/launch/simulator_helper.rb +0 -62
  38. data/lib/calabash-cucumber/launch/simulator_launcher.rb +0 -617
  39. data/lib/calabash-cucumber/playback_helpers.rb +0 -225
  40. data/lib/calabash-cucumber/resources/cell_swipe_ios4_ipad.base64 +0 -51
  41. data/lib/calabash-cucumber/resources/cell_swipe_ios4_iphone.base64 +0 -51
  42. data/lib/calabash-cucumber/resources/cell_swipe_ios5_ipad.base64 +0 -74
  43. data/lib/calabash-cucumber/resources/cell_swipe_ios5_iphone.base64 +0 -74
  44. data/lib/calabash-cucumber/resources/double_tap_ios5_ipad.base64 +0 -15
  45. data/lib/calabash-cucumber/resources/double_tap_ios5_iphone.base64 +0 -15
  46. data/lib/calabash-cucumber/resources/double_tap_ios6_ipad.base64 +0 -22
  47. data/lib/calabash-cucumber/resources/double_tap_ios6_iphone.base64 +0 -22
  48. data/lib/calabash-cucumber/resources/pan_ios5_ipad.base64 +0 -199
  49. data/lib/calabash-cucumber/resources/pan_ios5_iphone.base64 +0 -199
  50. data/lib/calabash-cucumber/resources/pan_ios6_ipad.base64 +0 -206
  51. data/lib/calabash-cucumber/resources/pan_ios6_iphone.base64 +0 -206
  52. data/lib/calabash-cucumber/resources/pinch_in_ios4_ipad.base64 +0 -104
  53. data/lib/calabash-cucumber/resources/pinch_in_ios4_iphone.base64 +0 -104
  54. data/lib/calabash-cucumber/resources/pinch_in_ios5_ipad.base64 +0 -144
  55. data/lib/calabash-cucumber/resources/pinch_in_ios5_iphone.base64 +0 -144
  56. data/lib/calabash-cucumber/resources/pinch_in_ios6_ipad.base64 +0 -70
  57. data/lib/calabash-cucumber/resources/pinch_in_ios6_iphone.base64 +0 -70
  58. data/lib/calabash-cucumber/resources/pinch_out_ios5_ipad.base64 +0 -207
  59. data/lib/calabash-cucumber/resources/pinch_out_ios5_iphone.base64 +0 -207
  60. data/lib/calabash-cucumber/resources/pinch_out_ios6_ipad.base64 +0 -96
  61. data/lib/calabash-cucumber/resources/pinch_out_ios6_iphone.base64 +0 -96
  62. data/lib/calabash-cucumber/resources/rotate_left_home_down_ios4_ipad.base64 +0 -2
  63. data/lib/calabash-cucumber/resources/rotate_left_home_down_ios4_iphone.base64 +0 -2
  64. data/lib/calabash-cucumber/resources/rotate_left_home_down_ios5_ipad.base64 +0 -2
  65. data/lib/calabash-cucumber/resources/rotate_left_home_down_ios5_iphone.base64 +0 -2
  66. data/lib/calabash-cucumber/resources/rotate_left_home_left_ios4_ipad.base64 +0 -2
  67. data/lib/calabash-cucumber/resources/rotate_left_home_left_ios4_iphone.base64 +0 -2
  68. data/lib/calabash-cucumber/resources/rotate_left_home_left_ios5_ipad.base64 +0 -2
  69. data/lib/calabash-cucumber/resources/rotate_left_home_left_ios5_iphone.base64 +0 -2
  70. data/lib/calabash-cucumber/resources/rotate_left_home_right_ios4_ipad.base64 +0 -2
  71. data/lib/calabash-cucumber/resources/rotate_left_home_right_ios4_iphone.base64 +0 -2
  72. data/lib/calabash-cucumber/resources/rotate_left_home_right_ios5_ipad.base64 +0 -2
  73. data/lib/calabash-cucumber/resources/rotate_left_home_right_ios5_iphone.base64 +0 -2
  74. data/lib/calabash-cucumber/resources/rotate_left_home_up_ios4_ipad.base64 +0 -2
  75. data/lib/calabash-cucumber/resources/rotate_left_home_up_ios4_iphone.base64 +0 -2
  76. data/lib/calabash-cucumber/resources/rotate_left_home_up_ios5_ipad.base64 +0 -2
  77. data/lib/calabash-cucumber/resources/rotate_left_home_up_ios5_iphone.base64 +0 -2
  78. data/lib/calabash-cucumber/resources/rotate_right_home_down_ios4_ipad.base64 +0 -2
  79. data/lib/calabash-cucumber/resources/rotate_right_home_down_ios4_iphone.base64 +0 -2
  80. data/lib/calabash-cucumber/resources/rotate_right_home_down_ios5_ipad.base64 +0 -2
  81. data/lib/calabash-cucumber/resources/rotate_right_home_down_ios5_iphone.base64 +0 -2
  82. data/lib/calabash-cucumber/resources/rotate_right_home_left_ios4_ipad.base64 +0 -2
  83. data/lib/calabash-cucumber/resources/rotate_right_home_left_ios4_iphone.base64 +0 -2
  84. data/lib/calabash-cucumber/resources/rotate_right_home_left_ios5_ipad.base64 +0 -2
  85. data/lib/calabash-cucumber/resources/rotate_right_home_left_ios5_iphone.base64 +0 -2
  86. data/lib/calabash-cucumber/resources/rotate_right_home_right_ios4_ipad.base64 +0 -2
  87. data/lib/calabash-cucumber/resources/rotate_right_home_right_ios4_iphone.base64 +0 -2
  88. data/lib/calabash-cucumber/resources/rotate_right_home_right_ios5_ipad.base64 +0 -2
  89. data/lib/calabash-cucumber/resources/rotate_right_home_right_ios5_iphone.base64 +0 -2
  90. data/lib/calabash-cucumber/resources/rotate_right_home_up_ios4_ipad.base64 +0 -2
  91. data/lib/calabash-cucumber/resources/rotate_right_home_up_ios4_iphone.base64 +0 -2
  92. data/lib/calabash-cucumber/resources/rotate_right_home_up_ios5_ipad.base64 +0 -2
  93. data/lib/calabash-cucumber/resources/rotate_right_home_up_ios5_iphone.base64 +0 -2
  94. data/lib/calabash-cucumber/resources/swipe_down_ios5_ipad.base64 +0 -18
  95. data/lib/calabash-cucumber/resources/swipe_down_ios5_iphone.base64 +0 -31
  96. data/lib/calabash-cucumber/resources/swipe_down_ios6_ipad.base64 +0 -25
  97. data/lib/calabash-cucumber/resources/swipe_down_ios6_iphone.base64 +0 -25
  98. data/lib/calabash-cucumber/resources/swipe_left_hard_ios4_ipad.base64 +0 -15
  99. data/lib/calabash-cucumber/resources/swipe_left_hard_ios4_iphone.base64 +0 -15
  100. data/lib/calabash-cucumber/resources/swipe_left_ios4_ipad.base64 +0 -18
  101. data/lib/calabash-cucumber/resources/swipe_left_ios4_iphone.base64 +0 -18
  102. data/lib/calabash-cucumber/resources/swipe_left_ios5_ipad.base64 +0 -17
  103. data/lib/calabash-cucumber/resources/swipe_left_ios5_iphone.base64 +0 -34
  104. data/lib/calabash-cucumber/resources/swipe_left_ios6_ipad.base64 +0 -28
  105. data/lib/calabash-cucumber/resources/swipe_left_ios6_iphone.base64 +0 -28
  106. data/lib/calabash-cucumber/resources/swipe_right_hard_ios4_ipad.base64 +0 -17
  107. data/lib/calabash-cucumber/resources/swipe_right_hard_ios4_iphone.base64 +0 -17
  108. data/lib/calabash-cucumber/resources/swipe_right_ios4_ipad.base64 +0 -13
  109. data/lib/calabash-cucumber/resources/swipe_right_ios4_iphone.base64 +0 -13
  110. data/lib/calabash-cucumber/resources/swipe_right_ios5_ipad.base64 +0 -17
  111. data/lib/calabash-cucumber/resources/swipe_right_ios5_iphone.base64 +0 -17
  112. data/lib/calabash-cucumber/resources/swipe_right_ios6_ipad.base64 +0 -25
  113. data/lib/calabash-cucumber/resources/swipe_right_ios6_iphone.base64 +0 -25
  114. data/lib/calabash-cucumber/resources/swipe_up_ios5_ipad.base64 +0 -34
  115. data/lib/calabash-cucumber/resources/swipe_up_ios5_iphone.base64 +0 -28
  116. data/lib/calabash-cucumber/resources/swipe_up_ios6_ipad.base64 +0 -25
  117. data/lib/calabash-cucumber/resources/swipe_up_ios6_iphone.base64 +0 -25
  118. data/lib/calabash-cucumber/resources/touch_done_ios4_ipad.base64 +0 -7
  119. data/lib/calabash-cucumber/resources/touch_done_ios4_iphone.base64 +0 -9
  120. data/lib/calabash-cucumber/resources/touch_done_ios5_ipad.base64 +0 -7
  121. data/lib/calabash-cucumber/resources/touch_done_ios5_iphone.base64 +0 -9
  122. data/lib/calabash-cucumber/resources/touch_hold_ios5_ipad.base64 +0 -9
  123. data/lib/calabash-cucumber/resources/touch_hold_ios5_iphone.base64 +0 -9
  124. data/lib/calabash-cucumber/resources/touch_hold_ios6_ipad.base64 +0 -9
  125. data/lib/calabash-cucumber/resources/touch_hold_ios6_iphone.base64 +0 -9
  126. data/lib/calabash-cucumber/resources/touch_ios4_ipad.base64 +0 -9
  127. data/lib/calabash-cucumber/resources/touch_ios4_iphone.base64 +0 -9
  128. data/lib/calabash-cucumber/resources/touch_ios5_ipad.base64 +0 -9
  129. data/lib/calabash-cucumber/resources/touch_ios5_iphone.base64 +0 -9
  130. data/lib/calabash-cucumber/resources/touch_ios7_ipad.base64 +0 -9
  131. data/lib/calabash-cucumber/resources/touch_ios7_iphone.base64 +0 -9
  132. data/lib/calabash-cucumber/resources/wheel_down_ios4_ipad.base64 +0 -159
  133. data/lib/calabash-cucumber/resources/wheel_down_ios4_iphone.base64 +0 -159
  134. data/lib/calabash-cucumber/resources/wheel_down_ios5_ipad.base64 +0 -156
  135. data/lib/calabash-cucumber/resources/wheel_down_ios5_iphone.base64 +0 -156
  136. data/lib/calabash-cucumber/resources/wheel_up_ios4_ipad.base64 +0 -166
  137. data/lib/calabash-cucumber/resources/wheel_up_ios4_iphone.base64 +0 -166
  138. data/lib/calabash-cucumber/resources/wheel_up_ios5_ipad.base64 +0 -156
  139. data/lib/calabash-cucumber/resources/wheel_up_ios5_iphone.base64 +0 -156
  140. data/lib/calabash-cucumber/utils/logging.rb +0 -111
  141. data/lib/calabash-cucumber/utils/plist_buddy.rb +0 -45
  142. data/lib/calabash-cucumber/utils/simulator_accessibility.rb +0 -334
  143. data/lib/calabash-cucumber/utils/xctools.rb +0 -101
  144. data/scripts/.irbrc +0 -64
  145. data/scripts/launch.rb +0 -48
@@ -1,109 +0,0 @@
1
- require 'calabash-cucumber/playback_helpers'
2
- require 'calabash-cucumber/connection_helpers'
3
- require 'calabash-cucumber/query_helpers'
4
-
5
- # @!visibility private
6
- class Calabash::Cucumber::PlaybackActions
7
- include Calabash::Cucumber::PlaybackHelpers
8
- include Calabash::Cucumber::ConnectionHelpers
9
- include Calabash::Cucumber::QueryHelpers
10
-
11
- # @!visibility private
12
- def touch(options)
13
- playback('touch', options)
14
- end
15
-
16
- # @!visibility private
17
- def double_tap(options)
18
- playback('double_tap', options)
19
- end
20
-
21
- # @!visibility private
22
- def two_finger_tap(*args)
23
- raise error_message('two_finger_tap')
24
- end
25
-
26
- # @!visibility private
27
- def flick(*args)
28
- raise error_message('flick')
29
- end
30
-
31
- # @!visibility private
32
- def touch_hold(options)
33
- playback('touch_hold', options)
34
- end
35
-
36
- # @!visibility private
37
- def swipe(dir, options={})
38
- current_orientation = options[:status_bar_orientation].to_sym
39
- if current_orientation == :left
40
- case dir
41
- when :left then
42
- dir = :down
43
- when :right then
44
- dir = :up
45
- when :up then
46
- dir = :left
47
- when :down then
48
- dir = :right
49
- else
50
- end
51
- end
52
-
53
- if current_orientation == :right
54
- case dir
55
- when :left then
56
- dir = :up
57
- when :right then
58
- dir = :down
59
- when :up then
60
- dir = :right
61
- when :down then
62
- dir = :left
63
- else
64
- end
65
- end
66
-
67
- if current_orientation == :up
68
- case dir
69
- when :left then
70
- dir = :right
71
- when :right then
72
- dir = :left
73
- when :up then
74
- dir = :down
75
- when :down then
76
- dir = :up
77
- else
78
- end
79
- end
80
-
81
- playback("swipe_#{dir}", options)
82
-
83
- end
84
-
85
- # @!visibility private
86
- def pan(from,to,options={})
87
- interpolate 'pan', options.merge(:start => from, :end => to)
88
- end
89
-
90
- # @!visibility private
91
- def pinch(in_out,options)
92
- file = "pinch_in"
93
- if in_out==:out
94
- file = "pinch_out"
95
- end
96
- playback(file, options)
97
- end
98
-
99
- # @!visibility private
100
- def send_app_to_background(secs)
101
- raise 'Not implemented when running without instruments / UIA'
102
- end
103
-
104
- private
105
- # @!visibility private
106
- def error_message(gesture)
107
- "Gesture: '#{gesture}' not supported unless running with instruments."
108
- end
109
- end
@@ -1,34 +0,0 @@
1
- require 'run_loop'
2
- require 'calabash-cucumber/utils/logging'
3
-
4
- module Calabash
5
- module Cucumber
6
-
7
- include Calabash::Cucumber::Logging
8
-
9
- # @!visibility private
10
- def self.const_missing(const_name)
11
- if const_name == :FRAMEWORK_VERSION
12
- _deprecated('0.9.169', 'FRAMEWORK_VERSION has been deprecated - there is no replacement', :warn)
13
- return nil
14
- end
15
- raise(NameError, "uninitialized constant Calabash::Cucumber::#{const_name}")
16
- end
17
-
18
- # A model of a release version that can be used to compare two version.
19
- #
20
- # Calabash tries very hard to comply with Semantic Versioning rules. However,
21
- # the semantic versioning spec is incompatible with RubyGem's patterns for
22
- # pre-release gems.
23
- #
24
- # > "But returning to the practical: No release version of SemVer is compatible with Rubygems." - _David Kellum_
25
- #
26
- # Calabash version numbers will be in the form `<major>.<minor>.<patch>[.pre<N>]`.
27
- #
28
- # @see http://semver.org/
29
- # @see http://gravitext.com/2012/07/22/versioning.html
30
- class Version < RunLoop::Version
31
-
32
- end
33
- end
34
- end
@@ -1,62 +0,0 @@
1
- require 'sim_launcher'
2
-
3
- module Calabash
4
- module Cucumber
5
-
6
- # This module has been replaced by Simulator Launcher
7
- #
8
- # @deprecated 0.9.169 Use the SimulatorLauncher class instead.
9
- module SimulatorHelper
10
-
11
- # Quits the simulator.
12
- #
13
- # This has been deprecated, but it appears in legacy launch hooks.
14
- #
15
- # Use this pattern instead:
16
- #
17
- # ```
18
- # at_exit do
19
- # launcher = Calabash::Cucumber::Launcher.new
20
- # if launcher.simulator_target?
21
- # launcher.simulator_launcher.stop unless launcher.calabash_no_stop?
22
- # end
23
- # end
24
- # ```
25
- #
26
- # @deprecated 0.9.169 replaced with SimulatorLauncher.new().stop
27
- def self.stop
28
- unless ENV['CALABASH_NO_DEPRECATION'] == '1'
29
- if RUBY_VERSION < '2.0'
30
- stack = Kernel.caller()[1..6].join("\n")
31
- else
32
- stack = Kernel.caller(0, 6)[1..-1].join("\n")
33
- end
34
-
35
- msgs = ['The Calabash::Cucumber::SimulatorHelper module has been replaced.',
36
- 'Please replace:',
37
- '',
38
- ' Calabash::Cucumber::SimulatorHelper.stop',
39
- '',
40
- 'with this:',
41
- '',
42
- ' launcher = Calabash::Cucumber::Launcher.new',
43
- ' launcher.simulator_launcher.stop',
44
- '',
45
- 'The stack trace below will show you the line number you need to change.']
46
-
47
- msg = "deprecated '0.9.169' - #{msgs.join("\n")}\n#{stack}"
48
-
49
- begin
50
- STDERR.puts "\033[34m\nWARN: #{msg}\033[0m"
51
- rescue
52
- STDERR.puts "\nWARN: #{msg}"
53
- end
54
- end
55
- simulator = SimLauncher::Simulator.new()
56
- simulator.quit_simulator
57
- simulator
58
- end
59
-
60
- end
61
- end
62
- end
@@ -1,617 +0,0 @@
1
- require 'sim_launcher'
2
- require 'json'
3
- require 'net/http'
4
- require 'cfpropertylist'
5
- require 'calabash-cucumber/utils/logging'
6
- require 'run_loop'
7
-
8
- module Calabash
9
- module Cucumber
10
-
11
- # Acts as a bridge to the sim_launcher SimLauncher and SdkDetector classes.
12
- #
13
- # Runtime Environmental Variables
14
- #
15
- # * `PROJECT_DIR` (ENV['PWD']) - the path to the .xcproject directory
16
- # * `DEVICE_ENDPOINT` (http://localhost:37265/) - the ip:port of the
17
- # device under test
18
- # * `CALABASH_VERSION_PATH` (version) - the path to server version route
19
- # * `MAX_CONNECT_RETRY` (2) the number of times retry
20
- # establishing a connection to the server.
21
- # * `CONNECT_TIMEOUT` (30) how long to wait for the server before timing
22
- # out
23
- #
24
- class SimulatorLauncher
25
- include Calabash::Cucumber::Logging
26
-
27
- # Custom error indicating a timeout in launching and connecting to the
28
- # embedded calabash server.
29
- # @todo This is duplicated in Launcher class - consider errors.rb module.
30
- class TimeoutErr < RuntimeError
31
- end
32
-
33
- # @!visibility private
34
- # The file path to the default Xcode DerivedData directory.
35
- DERIVED_DATA = File.expand_path('~/Library/Developer/Xcode/DerivedData')
36
-
37
- # @!visibility private]
38
- # The file path to the default Xcode preferences plist.
39
- XCODE_PREFS = File.expand_path('~/Library/Preferences/com.apple.dt.Xcode.plist')
40
-
41
- # @!visibility private
42
- # REGEX for finding application Info.plist.
43
- DEFAULT_DERIVED_DATA_INFO = File.expand_path("#{DERIVED_DATA}/*/info.plist")
44
-
45
- # @!visibility private
46
- # If `CONNECT_TIMEOUT` is not set, wait this long for the app to launch
47
- # in the simulator before retrying.
48
- DEFAULT_SIM_WAIT = 30
49
-
50
- # If `MAX_CONNECT_RETRY` is not set, try to launch the app this many times
51
- # in the simulator before giving up
52
- DEFAULT_SIM_RETRY = 2
53
-
54
- # @!visibility private
55
- # An instance of Calabash::Cucumber::Device.
56
- attr_accessor :device
57
-
58
- # @!visibility private
59
- # An instance of SimLauncher::Simulator.
60
- attr_accessor :simulator
61
-
62
- # @!visibility private
63
- # An instance of SimLauncher::SdkDetector.
64
- attr_accessor :sdk_detector
65
-
66
- # @!visibility private
67
- # The launch args passed from Calabash::Cucumber::Launcher to the launch
68
- # and relaunch methods.
69
- attr_accessor :launch_args
70
-
71
- # Creates a new instance an sets the :simulator and :sdk_detector attributes.
72
- def initialize
73
- @simulator = SimLauncher::Simulator.new
74
- @sdk_detector = SimLauncher::SdkDetector.new()
75
- end
76
-
77
- # Stops (quits) the simulator.
78
- def stop
79
- RunLoop::SimControl.new.quit_sim
80
- end
81
-
82
-
83
- # @!visibility private
84
- # Uses heuristics to deduce the derived data directory for the project
85
- # so the path to the app bundle (.app) can be detected.
86
- # @return [String] absolute path to derived data directory
87
- # @raise [RuntimeError] if the derived data directory cannot be found
88
- def derived_data_dir_for_project
89
- dir = project_dir
90
- xcode_workspace_name = ''
91
- info_plist = Dir.glob(DEFAULT_DERIVED_DATA_INFO).find { |plist_file|
92
- begin
93
- plist = CFPropertyList::List.new(:file => plist_file)
94
- hash = CFPropertyList.native_types(plist.value)
95
- ws_dir = File.dirname(hash['WorkspacePath']).downcase
96
- p_dir = dir.downcase
97
- if p_dir.include? ws_dir
98
- xcode_workspace_name = ws_dir.split('/').last
99
- end
100
- ws_dir == p_dir
101
- rescue
102
- false
103
- end
104
- }
105
-
106
- return File.dirname(info_plist) unless info_plist.nil?
107
-
108
- res = Dir.glob("#{dir}/*.xcodeproj")
109
- if res.empty?
110
- raise "Unable to find *.xcodeproj in #{dir}"
111
- elsif res.count > 1
112
- raise "Unable to found several *.xcodeproj in #{dir}: #{res}"
113
- end
114
-
115
- xcode_proj_name = res.first.split('.xcodeproj')[0]
116
-
117
- xcode_proj_name = File.basename(xcode_proj_name)
118
-
119
- build_dirs = Dir.glob("#{DERIVED_DATA}/*").find_all do |xc_proj|
120
- File.basename(xc_proj).start_with?(xcode_proj_name)
121
- end
122
-
123
- if build_dirs.count == 0 && !xcode_workspace_name.empty?
124
- # check for directory named "workspace-{deriveddirectoryrandomcharacters}"
125
- build_dirs = Dir.glob("#{DERIVED_DATA}/*").find_all do |xc_proj|
126
- File.basename(xc_proj).downcase.start_with?(xcode_workspace_name)
127
- end
128
- end
129
-
130
- # todo analyze `derived_data_dir_for_project` to see if it contains dead code
131
- # todo assuming this is not dead code, the documentation around derived data for project needs to be updated
132
-
133
- if build_dirs.count == 0
134
- msg = ['Unable to find your built app.']
135
- msg << "This means that Calabash can't automatically launch iOS simulator."
136
- msg << "Searched in Xcode 4.x default: #{DEFAULT_DERIVED_DATA_INFO}"
137
- msg << ''
138
- msg << "To fix there are a couple of options:\n"
139
- msg << 'Option 1) Make sure you are running this command from your project directory, '
140
- msg << 'i.e., the directory containing your .xcodeproj file.'
141
- msg << 'In Xcode, build your calabash target for simulator.'
142
- msg << "Check that your app can be found in\n #{DERIVED_DATA}"
143
- msg << "\n\nOption 2). In features/support/01_launch.rb set APP_BUNDLE_PATH to"
144
- msg << 'the path where Xcode has built your Calabash target.'
145
- msg << "Alternatively you can use the environment variable APP_BUNDLE_PATH.\n"
146
- raise msg.join("\n")
147
-
148
- elsif build_dirs.count > 1
149
- msg = ['Unable to auto detect APP_BUNDLE_PATH.']
150
- msg << "You have several projects with the same name: #{xcode_proj_name} in #{DERIVED_DATA}:\n"
151
- msg << build_dirs.join("\n")
152
-
153
- msg << "\nThis means that Calabash can't automatically launch iOS simulator."
154
- msg << "Searched in Xcode 4.x default: #{DEFAULT_DERIVED_DATA_INFO}"
155
- msg << "\nIn features/support/01_launch.rb set APP_BUNDLE_PATH to"
156
- msg << 'the path where Xcode has built your Calabash target.'
157
- msg << "Alternatively you can use the environment variable APP_BUNDLE_PATH.\n"
158
- raise msg.join("\n")
159
- else
160
- if full_console_logging?
161
- puts "Found potential build dir: #{build_dirs.first}"
162
- puts 'Checking...'
163
- end
164
- build_dirs.first
165
- end
166
- end
167
-
168
- # @!visibility private
169
- # Returns the absolute build path to the project directory.
170
- #
171
- # @return [String] absolute path to the projects build directory
172
- def build_output_dir_for_project
173
- xcode_temp_prefs = File.join(project_dir, '.cal_xcode_prefs')
174
- FileUtils.cp(XCODE_PREFS, xcode_temp_prefs)
175
- `plutil -convert xml1 "#{xcode_temp_prefs}"`
176
-
177
- plist = CFPropertyList::List.new(:file => xcode_temp_prefs)
178
- hash = CFPropertyList.native_types(plist.value)
179
-
180
- if hash.has_key?('IDESharedBuildFolderName')
181
- build_folder_name = hash['IDESharedBuildFolderName']
182
- output_dir = "#{DERIVED_DATA}/#{build_folder_name}/Products"
183
- elsif hash.has_key?('IDECustomBuildProductsPath')
184
- products_path = hash['IDECustomBuildProductsPath']
185
- File.join(project_dir, products_path)
186
- else
187
- output_dir = derived_data_dir_for_project
188
- end
189
-
190
- FileUtils.rm(xcode_temp_prefs)
191
-
192
- output_dir
193
- end
194
-
195
- # @!visibility private
196
- # Returns the absolute path to the project directory.
197
- #
198
- # Unless `PROJECT_DIR` is defined, returns the absolute path to the current
199
- # directory.
200
- #
201
- # @return [String] absolute path to the project directory
202
- # @todo migrate `PROJECT_DIR` to environment_helpers.rb
203
- def project_dir
204
- File.expand_path(ENV['PROJECT_DIR'] || Dir.pwd)
205
- end
206
-
207
- # @!visibility private
208
- # Attempts to deduce the app bundle path
209
- # @param [String] path NEEDS DOCUMENTATION
210
- # @param [String] device_build_dir NEEDS DOCUMENTATION
211
- # @return [String] absolute path to app bundle (.app) or `nil` if the
212
- # app bundle cannot be found.
213
- # @todo methods should not use 2 optional arguments
214
- def detect_app_bundle(path=nil,device_build_dir='iPhoneSimulator')
215
- begin
216
- app_bundle_or_raise(path,device_build_dir)
217
- rescue
218
- nil
219
- end
220
- end
221
-
222
- # @!visibility private
223
- # Attempts to deduce the path the to the app bundle (.app).
224
- # @param [String] path NEEDS DOCUMENTATION
225
- # @param [String] device_build_dir NEEDS DOCUMENTATION
226
- # @return [String] absolute path to app bundle (.app)
227
- # @raise [RuntimeError] if app bundle (.app) cannot be found
228
- # @todo methods should not use 2 optional arguments
229
- def app_bundle_or_raise(path=nil, device_build_dir='iPhoneSimulator')
230
- path = File.expand_path(path) if path
231
-
232
- if path and not File.directory?(path)
233
- raise "Unable to find .app bundle at #{path}. It should be an .app directory."
234
- elsif path
235
- bundle_path = path
236
- elsif xamarin_project?
237
- bundle_path = bundle_path_from_xamarin_project(device_build_dir)
238
- unless bundle_path
239
- msg = ['Detected Xamarin project, but did not detect built app linked with Calabash']
240
- msg << 'You should build your project from Xamarin Studio'
241
- msg << "Make sure you build for Simulator and that you're using the Calabash components"
242
- raise msg.join("\n")
243
- end
244
- else
245
- search_dir = build_output_dir_for_project || DERIVED_DATA
246
- bundle_path = select_most_recent_bundle(search_dir)
247
-
248
- if bundle_path.nil?
249
- raise RuntimeError,
250
- %Q{
251
- Unable to auto detect a .app that is linked Calabash.
252
-
253
- Searched: #{search_dir}
254
-
255
- Have you built your app for simulator?
256
-
257
- Please build your app from Xcode
258
-
259
- Alternatively, specify APP in features/support/01_launch.rb
260
- or as an environment variable:
261
-
262
- $ APP=/path/to/Your.app bundle exec cucumber
263
- }
264
- end
265
- end
266
-
267
- Calabash::Cucumber.log_debug("Auto detected app at path:")
268
- Calabash::Cucumber.log_debug(bundle_path)
269
- Calabash::Cucumber.log_debug("If this is incorrect, set the APP variable")
270
- bundle_path
271
- end
272
-
273
- # @!visibility private
274
- # Is this a Xamarin IDE project?
275
- # @return [Boolean] true if the project is a Xamarin IDE project
276
- def xamarin_project?
277
- xamarin_ios_csproj_path != nil
278
- end
279
-
280
- # @!visibility private
281
- # Path to the Xamarin IDE project.
282
- # @return [String] absolute path to the Xamarin IDE project
283
- def xamarin_ios_csproj_path
284
- solution_path = Dir['*.sln'].first
285
-
286
- project_dir = nil
287
- if solution_path
288
- project_dir = Dir.pwd
289
- else
290
- solution_path = Dir[File.join('..','*.sln')].first
291
- if solution_path
292
- project_dir = File.expand_path('..')
293
- end
294
- end
295
-
296
- return nil unless project_dir
297
-
298
- ios_project_dir = Dir[File.join(project_dir,'*.iOS')].first
299
- return ios_project_dir if ios_project_dir && File.directory?(ios_project_dir)
300
- # ios_project_dir does not exist
301
- # Detect case where there is no such sub directory
302
- # (i.e. iOS only Xamarin project)
303
- bin_dir = File.join(project_dir, 'bin')
304
- if xamarin_ios_bin_dir?(bin_dir)
305
- return project_dir ## Looks like iOS bin dir is here
306
- end
307
-
308
- sub_dirs = Dir[File.join(project_dir,'*')].select {|dir| File.directory?(dir)}
309
-
310
- sub_dirs.find do |sub_dir|
311
- contains_csproj = Dir[File.join(sub_dir,'*.csproj')].first
312
- contains_csproj && xamarin_ios_bin_dir?(File.join(sub_dir,'bin'))
313
- end
314
-
315
- end
316
-
317
- # @!visibility private
318
- # Is this the Xamarin iOS bin directory?
319
- # @return [Boolean] true if this is the Xamarin iOS bin directory
320
- def xamarin_ios_bin_dir?(bin_dir)
321
- File.directory?(bin_dir) &&
322
- (File.directory?(File.join(bin_dir,'iPhoneSimulator')) ||
323
- File.directory?(File.join(bin_dir,'iPhone')))
324
- end
325
-
326
- # @!visibility private
327
- # Attempts to deduce the path to the app bundle path (*.app) using
328
- # heuristics and checking for executables linked with the Calabash server.
329
- #
330
- # @param [String] device_build_dir NEEDS DOCUMENTATION
331
- # @return [String] absolute path the app bundle .app or `nil` if the
332
- # the app bundle cannot be found.
333
- def bundle_path_from_xamarin_project(device_build_dir='iPhoneSimulator')
334
- ios_project_path = xamarin_ios_csproj_path
335
- conf_glob = File.join(ios_project_path,'bin',device_build_dir,'*')
336
- built_confs = Dir[conf_glob]
337
-
338
- calabash_build = built_confs.find {|path| File.basename(path) == 'Calabash'}
339
- debug_build = built_confs.find {|path| File.basename(path) == 'Debug'}
340
-
341
- bundle_path = [calabash_build, debug_build, *built_confs].find do |path|
342
- next unless path && File.directory?(path)
343
- app_dir = Dir[File.join(path,'*.app')].first
344
- app_dir && linked_with_calabash?(app_dir)
345
- end
346
-
347
- Dir[File.join(bundle_path,'*.app')].first if bundle_path
348
- end
349
-
350
- # @!visibility private
351
- # Searches `d` for a file linked with Calabash server.
352
- # @param [String] d path to a directory
353
- # @return [Boolean] true if there is a file that is linked with the
354
- # Calabash server
355
- # @todo why are we not grep'ing for executable files? see server_version_from_bundle
356
- def linked_with_calabash?(d)
357
- skipped_formats = ['.png', '.jpg', '.jpeg', '.plist', '.nib', '.lproj']
358
- dir = File.expand_path(d)
359
-
360
- # For every file on that .app directory
361
- Dir.entries(d).each do |file|
362
- # If this is an asset or any of those skipped formats, skip it.
363
- next if skipped_formats.include? File.extname(file)
364
-
365
- # If its not, try to run otool against that file, check whether we are linked against calabash framework.
366
- out = `otool "#{dir}/#{file}" -o 2> /dev/null | grep CalabashServer`
367
- return true if /CalabashServer/.match(out)
368
- end
369
-
370
- # Defaulted to false
371
- false
372
- end
373
-
374
- # !@visibility private
375
- # Finds the preferred(?) directory.
376
- # @return [String] The first path in `sim_dirs` that contains a binary
377
- # linked with Calabash server. Returns `nil` if there is no path in
378
- # `sim_dirs` that contains a binary linked with Calabash server.
379
- # @param [Array<String>] sim_dirs eke! why sim_dirs? why not a list of any directories?
380
- # @todo find_preferred_dir is a bad name - preferred for what?
381
- # @todo sim_dirs arg is a bad name - we can be iterating over any directory
382
- def find_preferred_dir(sim_dirs)
383
- sim_dirs.find do |d|
384
- linked_with_calabash?(d)
385
- end
386
- end
387
-
388
- # !@visibility private
389
- # Ping the version route of the calabash server embedded in the app,
390
- #
391
- # @note
392
- # Has the side effect of setting self.device attribute if successful.
393
- #
394
- # @return [String] returns the server status - '200' is a success
395
- # @todo migrate DEVICE_ENDPOINT to environment_helpers
396
- # @todo migrate CALABASH_VERSION_PATH to environment_helpers
397
- # @todo this is an exact duplicate of Launcher ping method
398
- def ping_app
399
- url = URI.parse(ENV['DEVICE_ENDPOINT']|| 'http://localhost:37265/')
400
- if full_console_logging?
401
- puts "Ping #{url}..."
402
- end
403
-
404
- http = Net::HTTP.new(url.host, url.port)
405
- res = http.start do |sess|
406
- # noinspection RubyResolve
407
- sess.request Net::HTTP::Get.new(ENV['CALABASH_VERSION_PATH'] || 'version')
408
- end
409
-
410
- status = res.code
411
- begin
412
- http.finish if http and http.started?
413
- rescue
414
- # nop
415
- end
416
-
417
- if status == '200'
418
- version_body = JSON.parse(res.body)
419
- self.device = Calabash::Cucumber::Device.new(url, version_body)
420
- end
421
-
422
- if full_console_logging?
423
- puts "ping status = '#{status}'"
424
- end
425
- status
426
- end
427
-
428
- # @!visibility private
429
- # Attempts to connect to launch the app and connect to the embedded
430
- # calabash server.
431
- #
432
- # @note To change the number of times launching is attempted set
433
- # `MAX_CONNECT_RETRY`.
434
- #
435
- # @note To change the relaunch timeout set `CONNECT_TIMEOUT`.
436
- #
437
- # @param [String] app_bundle_path path to the .app that should be launched
438
- # @param [String] sdk 6.0.3, 6.1. if nil latest SDK will be used
439
- # @param [String] device_family `{iphone | ipad}`
440
- # @param [Hash] args eke! not used (see todo)
441
- #
442
- # @raise [TimeoutErr] if app cannot be launched in the simulator
443
- # @todo nearly a duplicate of Launcher ensure_connectivity
444
- # @todo args was originally intended to be the args passed to the application @ launch
445
- def ensure_connectivity(app_bundle_path, sdk, device_family, args = nil)
446
- begin
447
- # todo should get the retry could from the args
448
- # todo should migrate MAX_CONNECT_RETRY to environment_helpers
449
- max_retry_count = (ENV['MAX_CONNECT_RETRY'] || DEFAULT_SIM_RETRY).to_i
450
- # todo should get the timeout from the args
451
- # todo should migrate CONNECT_TIMEOUT to environment helpers
452
- timeout = (ENV['CONNECT_TIMEOUT'] || DEFAULT_SIM_WAIT).to_i
453
- retry_count = 0
454
- connected = false
455
-
456
- if full_console_logging?
457
- puts "Waiting at most #{timeout} seconds for simulator (CONNECT_TIMEOUT)"
458
- puts "Retrying at most #{max_retry_count} times (MAX_CONNECT_RETRY)"
459
- end
460
-
461
- until connected do
462
- raise 'MAX_RETRIES' if retry_count == max_retry_count
463
- retry_count += 1
464
- if full_console_logging?
465
- puts "(#{retry_count}.) Start Simulator #{sdk}, #{device_family}, for #{app_bundle_path}"
466
- end
467
- begin
468
- Timeout::timeout(timeout, TimeoutErr) do
469
- launch(app_bundle_path, sdk, device_family, args)
470
- until connected
471
- begin
472
- connected = (ping_app == '200')
473
- break if connected
474
- ensure
475
- sleep 1 unless connected
476
- end
477
- end
478
- end
479
- rescue TimeoutErr => e
480
- puts 'Timed out... Retrying'
481
- stop
482
- end
483
- end
484
- rescue RuntimeError => e
485
- p e
486
- msg = "Unable to make connection to Calabash Server at #{ENV['DEVICE_ENDPOINT']|| 'http://localhost:37265/'}\n"
487
- msg << "Make sure you've' linked correctly with calabash.framework and set Other Linker Flags.\n"
488
- msg << "Make sure you don't have a firewall blocking traffic to #{ENV['DEVICE_ENDPOINT']|| 'http://localhost:37265/'}.\n"
489
- raise msg
490
- end
491
- end
492
-
493
- # @!visibility private
494
- # Launches the app.
495
- #
496
- # @param [String] app_bundle_path path to the .app that should be launched
497
- # @param [String] sdk 6.0.3, 6.1. if nil latest SDK will be used
498
- # @param [String] device_family `{iphone | ipad}`
499
- # @param [Hash] args eke! not used
500
- # @todo args was originally intended to be the args passed to the application @ launch
501
- def launch(app_bundle_path, sdk, device_family, args = nil)
502
- # cached but not used
503
- self.launch_args = args
504
- # launch arguments (eg. -NSShowNonLocalizedStrings) are not being passed
505
- # to sim_launcher
506
- # https://github.com/calabash/calabash-ios/issues/363
507
- self.simulator.launch_ios_app(app_bundle_path, sdk, device_family)
508
- simulator
509
- end
510
-
511
- # @!visibility private
512
- # Relaunches the app in the simulator.
513
- #
514
- # @param [String] app_path the path to the .app
515
- # @param [String] sdk eg. 6.0.3, 6.1
516
- # @param [Hash] args the only option we are interested in is :device
517
- #
518
- # @todo args was originally intended to be the args passed to the application @ launch
519
- # @todo it is _very_ likely that args[:app] == app_path so we might be able
520
- # to eliminate an argument
521
- def relaunch(app_path, sdk, args)
522
- app_bundle_path = app_bundle_or_raise(app_path)
523
-
524
- if sdk.nil?
525
- # iOS 7 requires launching with instruments, so we _must_ launch with
526
- # the first SDK that is _not_ iOS 7
527
- _sdk = self.sdk_detector.available_sdk_versions.reverse.find { |x| !x.start_with?('7') }
528
- else
529
- # use SDK_VERSION to specify a different version
530
- # as of Xcode 5.0.2, the min supported simulator version is iOS 6
531
- _sdk = sdk
532
- end
533
-
534
- if args[:device]
535
- device_family = args[:device].to_s
536
- else
537
- device_family = 'iphone'
538
- end
539
-
540
- self.launch_args = args
541
-
542
- ensure_connectivity(app_bundle_path, _sdk, device_family, args)
543
- end
544
-
545
- # @deprecated 0.9.169 Calabash::Cucumber::Launcher.launcher.device instance methods
546
- # @raise [NotImplementedError] no longer implemented
547
- def get_version
548
- _deprecated('0.9.169', 'use an instance Device class instead', :warn)
549
- raise(NotImplementedError, 'this method has been deprecated')
550
- end
551
-
552
- # @deprecated 0.9.169 Calabash::Cucumber::Launcher.launcher.device instance methods
553
- # @raise [NotImplementedError] no longer implemented
554
- def ios_version
555
- _deprecated('0.9.169', 'use an instance Device class instead', :warn)
556
- raise(NotImplementedError, 'this method has been deprecated')
557
- end
558
-
559
- # @deprecated 0.9.169 use Calabash::Cucumber::Launcher.launcher.ios_major_version
560
- # @raise [NotImplementedError] no longer implemented
561
- def ios_major_version
562
- _deprecated('0.9.169', 'use an instance Device class instead', :warn)
563
- raise(NotImplementedError, 'this method has been deprecated')
564
- end
565
-
566
-
567
- # noinspection RubyUnusedLocalVariable
568
-
569
- # @deprecated 0.9.169 version checking is done in Launcher
570
- # @raise [NotImplementedError] no longer implemented
571
- def version_check(version)
572
- _deprecated('0.9.169', 'check is now done in Launcher', :warn)
573
- raise(NotImplementedError, 'this method has been deprecated and will be removed')
574
- end
575
-
576
- private
577
-
578
- # @!visibility private
579
- def app(bundle_path)
580
- RunLoop::App.new(bundle_path)
581
- end
582
-
583
- # @!visibility private
584
- def lipo(bundle_path)
585
- RunLoop::Lipo.new(bundle_path)
586
- end
587
-
588
- # @!visibility private
589
- def collect_app_bundles(base_dir)
590
- bundles = []
591
-
592
- Dir.glob("#{base_dir}/**/*.app") do |bundle|
593
- next if !RunLoop::App.valid?(bundle)
594
-
595
- lipo = lipo(bundle)
596
- arches = lipo.info
597
- if arches.include?("x86_64") || arches.include?("i386")
598
- app = app(bundle)
599
- if app.calabash_server_version
600
- bundles << bundle
601
- end
602
- end
603
- end
604
-
605
- bundles
606
- end
607
-
608
- # @!visibility private
609
- def select_most_recent_bundle(base_dir)
610
- bundles = collect_app_bundles(base_dir)
611
- bundles.max do |a, b|
612
- File.mtime(a) <=> File.mtime(b)
613
- end
614
- end
615
- end
616
- end
617
- end