calabash-cucumber 0.9.169.pre2 → 0.9.169.pre5

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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +14 -1
  3. data/bin/calabash-ios-setup.rb +2 -4
  4. data/bin/calabash-ios-sim.rb +10 -40
  5. data/calabash-cucumber.gemspec +25 -22
  6. data/features-skeleton/support/01_launch.rb +1 -1
  7. data/lib/calabash-cucumber.rb +13 -1
  8. data/lib/calabash-cucumber/actions/instruments_actions.rb +0 -4
  9. data/lib/calabash-cucumber/actions/playback_actions.rb +0 -4
  10. data/lib/calabash-cucumber/core.rb +9 -16
  11. data/lib/calabash-cucumber/device.rb +11 -2
  12. data/lib/calabash-cucumber/environment_helpers.rb +4 -56
  13. data/lib/calabash-cucumber/ios7_operations.rb +4 -2
  14. data/lib/calabash-cucumber/keyboard_helpers.rb +6 -3
  15. data/lib/calabash-cucumber/launch/simulator_helper.rb +40 -386
  16. data/lib/calabash-cucumber/launch/simulator_launcher.rb +534 -0
  17. data/lib/calabash-cucumber/launcher.rb +172 -36
  18. data/lib/calabash-cucumber/operations.rb +3 -4
  19. data/lib/calabash-cucumber/playback_helpers.rb +15 -29
  20. data/lib/calabash-cucumber/rotation_helpers.rb +14 -10
  21. data/lib/calabash-cucumber/status_bar_helpers.rb +5 -1
  22. data/lib/calabash-cucumber/uia.rb +6 -12
  23. data/lib/calabash-cucumber/utils/logging.rb +97 -0
  24. data/lib/calabash-cucumber/utils/plist_buddy.rb +178 -0
  25. data/lib/calabash-cucumber/utils/simulator_accessibility.rb +250 -0
  26. data/lib/calabash-cucumber/utils/xctools.rb +95 -0
  27. data/lib/calabash-cucumber/version.rb +197 -2
  28. data/lib/calabash-cucumber/wait_helpers.rb +16 -20
  29. data/scripts/.irbrc +11 -6
  30. data/scripts/com.example.plist +0 -0
  31. data/scripts/launch.rb +1 -1
  32. data/spec/bin/calabash_ios_sim_spec.rb +24 -0
  33. data/spec/launcher_spec.rb +76 -0
  34. data/spec/logging_spec.rb +38 -0
  35. data/spec/plist_buddy_spec.rb +99 -0
  36. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/Default-568h@2x.png +0 -0
  37. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/Info.plist +0 -0
  38. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/LPSimpleExample-cal +0 -0
  39. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/PkgInfo +1 -0
  40. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/InfoPlist.strings +0 -0
  41. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPFirstViewController.nib +0 -0
  42. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPFirstViewController~ipad.nib +0 -0
  43. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPFourthViewController.nib +0 -0
  44. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPFourthViewController~ipad.nib +0 -0
  45. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPSecondViewController.nib +0 -0
  46. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPSecondViewController~ipad.nib +0 -0
  47. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPThirdViewController.nib +0 -0
  48. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/en.lproj/LPThirdViewController~ipad.nib +0 -0
  49. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/first.png +0 -0
  50. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/first@2x.png +0 -0
  51. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/second.png +0 -0
  52. data/spec/resources/enable-accessibility/LPSimpleExample-cal.app/second@2x.png +0 -0
  53. data/spec/resources/plist_buddy/com.example.plist +0 -0
  54. data/spec/resources/plist_buddy/com.testing.plist +18 -0
  55. data/spec/simulator_accessibility_spec.rb +144 -0
  56. data/spec/spec_helper.rb +31 -0
  57. data/spec/xctools_spec.rb +58 -0
  58. metadata +120 -34
@@ -0,0 +1,95 @@
1
+ require 'open3'
2
+
3
+ module Calabash
4
+ module Cucumber
5
+
6
+ # methods for interacting with the xcode tools
7
+ module XcodeTools
8
+
9
+ # returns the path to the current developer directory
10
+ #
11
+ # $ man xcode-select
12
+ # DEVELOPER_DIR
13
+ # Overrides the active developer directory. When DEVELOPER_DIR is set, its value
14
+ # will be used instead of the system-wide active developer directory.
15
+ #
16
+ # @return [String] path to current developer directory
17
+ def xcode_developer_dir
18
+ # respect DEVELOPER_DIR
19
+ return ENV['DEVELOPER_DIR'] if ENV['DEVELOPER_DIR']
20
+ # fall back to xcode-select
21
+ `xcode-select --print-path`.chomp
22
+ end
23
+
24
+ # returns the path to the current developer usr/bin directory
25
+ # @return [String] path to the current xcode binaries
26
+ def xcode_bin_dir
27
+ "#{xcode_developer_dir}/usr/bin"
28
+ end
29
+
30
+ # method for interacting with instruments
31
+ #
32
+ # instruments #=> /Applications/Xcode.app/Contents/Developer/usr/bin/instruments
33
+ # instruments(:version) #=> 5.1.1
34
+ # instruments(:sims) #=> < list of known simulators >
35
+ #
36
+ # @param [String] cmd controls the return value. currently accepts nil,
37
+ # :sims, and :version as valid parameters
38
+ # @return [String] based on the value of +cmd+ version, a list known
39
+ # simulators, or the path to the instruments binary
40
+ # @raise [ArgumentError] if invalid +cmd+ is passed
41
+ def instruments(cmd=nil)
42
+ instruments = "#{xcode_bin_dir}/instruments"
43
+ return instruments if cmd == nil
44
+
45
+ case cmd
46
+ when :version
47
+ # instruments, version 5.1.1 (55045)
48
+ # noinspection RubyUnusedLocalVariable
49
+ Open3.popen3("#{instruments}") do |stdin, stdout, stderr, wait_thr|
50
+ stderr.read.chomp.split(' ')[2]
51
+ end
52
+ when :sims
53
+ devices = `#{instruments} -s devices`.chomp.split("\n")
54
+ devices.select { |device| device.downcase.include?('simulator') }
55
+ else
56
+ candidates = [:version, :sims]
57
+ raise(ArgumentError, "expected '#{cmd}' to be one of '#{candidates}'")
58
+ end
59
+ end
60
+
61
+ # does the instruments +version+ accept the -s (devices) flag?
62
+ #
63
+ # instruments_supports_hyphen_s?('4.6.3') #=> false
64
+ # instruments_supports_hyphen_s?('5.0.2') #=> true
65
+ # instruments_supports_hyphen_s?('5.1') #=> true
66
+ #
67
+ # @param [String] version a major.minor.{patch} version string - defaults
68
+ # to the currently active instruments binary
69
+ # @return [Boolean] true iff the version is >= 5.*
70
+ def instruments_supports_hyphen_s?(version=instruments(:version))
71
+ tokens = version.split('.')
72
+ return false if tokens[0].to_i < 5
73
+ return false if tokens[1].to_i < 1
74
+ true
75
+ end
76
+
77
+ # returns a list of installed simulators by calling:
78
+ #
79
+ # $ instruments -s devices
80
+ #
81
+ # and parsing the output
82
+ # @return [Array<String>] an array of simulator names suitable for passing
83
+ # to instruments or xcodebuild
84
+ # @raise [RuntimeError] if the currently active instruments version does
85
+ # not support the -s flag
86
+ def installed_simulators
87
+ unless instruments_supports_hyphen_s?
88
+ raise(RuntimeError, "instruments '#{instruments(:version)}' does not support '-s devices' arguments")
89
+ end
90
+ instruments(:sims)
91
+ end
92
+
93
+ end
94
+ end
95
+ end
@@ -1,6 +1,201 @@
1
1
  module Calabash
2
2
  module Cucumber
3
- VERSION = '0.9.169.pre2'
4
- FRAMEWORK_VERSION = '0.9.169.pre2'
3
+ VERSION = '0.9.169.pre5'
4
+ MIN_SERVER_VERSION = '0.9.169.pre2'
5
+
6
+ class Version
7
+
8
+ attr_accessor :major
9
+ attr_accessor :minor
10
+ attr_accessor :patch
11
+ attr_accessor :pre
12
+ attr_accessor :pre_version
13
+
14
+ def initialize(version)
15
+ tokens = version.split('.')
16
+ count = tokens.count
17
+ if count == 4
18
+ @pre = tokens[3]
19
+ pre_tokens = @pre.scan(/\D+|\d+/)
20
+ @pre_version = pre_tokens[1].to_i if pre_tokens.count == 2
21
+ end
22
+
23
+ @major, @minor, @patch = version.split('.').map(&:to_i)
24
+ end
25
+
26
+ def to_s
27
+ str = [@major, @minor, @patch].join('.')
28
+ str = "#{str}.#{@pre}" if @pre
29
+ str
30
+ end
31
+
32
+ def == (other)
33
+ compare(self, other) == 0
34
+ end
35
+
36
+ def != (other)
37
+ compare(self, other) != 0
38
+ end
39
+
40
+ def < (other)
41
+ compare(self, other) < 0
42
+ end
43
+
44
+ def > (other)
45
+ compare(self, other) > 0
46
+ end
47
+
48
+ def <= (other)
49
+ compare(self, other) <= 0
50
+ end
51
+
52
+ def >= (other)
53
+ compare(self, other) >= 0
54
+ end
55
+
56
+ def compare(a, b)
57
+
58
+ if a.major != b.major
59
+ return a.major > b.major ? 1 : -1
60
+ end
61
+
62
+ if a.minor != b.minor
63
+ return a.minor > b.minor ? 1 : -1
64
+ end
65
+
66
+ if a.patch != b.patch
67
+ return a.patch > b.patch ? 1 : -1
68
+ end
69
+
70
+ return 1 if a.pre and (not b.pre)
71
+ return -1 if (not a.pre) and b.pre
72
+
73
+ return 1 if a.pre_version and (not b.pre_version)
74
+ return -1 if (not a.pre_version) and b.pre_version
75
+
76
+ if a.pre_version != b.pre_version
77
+ return a.pre_version > b.pre_version ? 1 : -1
78
+ end
79
+
80
+ 0
81
+
82
+ end
83
+ end
5
84
  end
6
85
  end
86
+
87
+ if __FILE__ == $0
88
+ require 'test/unit'
89
+
90
+ class LocalTest < Test::Unit::TestCase
91
+ include Calabash::Cucumber
92
+
93
+ def test_version
94
+ a = Version.new('0.9.169')
95
+ assert_equal(0, a.major)
96
+ assert_equal(9, a.minor)
97
+ assert_equal(169, a.patch)
98
+ assert_nil(a.pre)
99
+ assert_nil(a.pre_version)
100
+ end
101
+
102
+ def test_unnumbered_prerelease
103
+ a = Version.new('0.9.169.pre')
104
+ assert_equal('pre', a.pre)
105
+ assert_nil(a.pre_version)
106
+ end
107
+
108
+ def test_numbered_prerelease
109
+ a = Version.new('0.9.169.pre1')
110
+ assert_equal('pre1', a.pre)
111
+ assert_equal(1, a.pre_version)
112
+ end
113
+
114
+ def test_compare_equal
115
+ a = Version.new('0.9.169')
116
+ b = Version.new('0.9.169')
117
+ assert(a == b)
118
+
119
+ a = Version.new('0.9.169.pre')
120
+ b = Version.new('0.9.169.pre')
121
+ assert(a == b)
122
+
123
+ a = Version.new('0.9.169.pre2')
124
+ b = Version.new('0.9.169.pre2')
125
+ assert(a == b)
126
+
127
+ end
128
+
129
+ def test_compare_not_equal
130
+ a = Version.new('0.9.168')
131
+ b = Version.new('0.9.169')
132
+ assert(a != b)
133
+
134
+
135
+ a = Version.new('0.9.169')
136
+ b = Version.new('0.9.169.pre1')
137
+ assert(a != b)
138
+
139
+ a = Version.new('0.9.169.pre')
140
+ b = Version.new('0.9.169.pre1')
141
+ assert(a != b)
142
+
143
+ a = Version.new('0.9.169.pre1')
144
+ b = Version.new('0.9.169.pre2')
145
+ assert(a != b)
146
+ end
147
+
148
+ def test_compare_lt
149
+ a = Version.new('0.9.168')
150
+ b = Version.new('0.9.169')
151
+ assert(a < b)
152
+
153
+ a = Version.new('0.9.169')
154
+ b = Version.new('0.9.169.pre')
155
+ assert(a < b)
156
+
157
+ a = Version.new('0.9.169.pre')
158
+ b = Version.new('0.9.169.pre1')
159
+ assert(a < b)
160
+
161
+ a = Version.new('0.9.169.pre1')
162
+ b = Version.new('0.9.169.pre2')
163
+ assert(a < b)
164
+ end
165
+
166
+ def test_compare_gt
167
+ a = Version.new('0.9.169')
168
+ b = Version.new('0.9.168')
169
+ assert(a > b)
170
+
171
+ a = Version.new('0.9.169.pre')
172
+ b = Version.new('0.9.169')
173
+ assert(a > b)
174
+
175
+ a = Version.new('0.9.169.pre1')
176
+ b = Version.new('0.9.169.pre')
177
+ assert(a > b)
178
+
179
+ a = Version.new('0.9.169.pre2')
180
+ b = Version.new('0.9.169.pre1')
181
+ assert(a > b)
182
+ end
183
+
184
+ def test_compare_lte
185
+ a = Version.new('0.9.168')
186
+ b = Version.new('0.9.169')
187
+ assert(a <= b)
188
+ a = Version.new('0.9.169')
189
+ assert(a <= b)
190
+ end
191
+
192
+ def test_compare_gte
193
+ a = Version.new('0.9.169')
194
+ b = Version.new('0.9.168')
195
+ assert(a >= b)
196
+ b = Version.new('0.9.169')
197
+ assert(a >= b)
198
+ end
199
+
200
+ end
201
+ end
@@ -1,15 +1,15 @@
1
1
  require 'calabash-cucumber/core'
2
2
  require 'calabash-cucumber/tests_helpers'
3
3
  require 'fileutils'
4
+ require 'calabash-cucumber/utils/logging'
4
5
 
5
6
  module Calabash
6
7
  module Cucumber
7
8
  module WaitHelpers
9
+ include Calabash::Cucumber::Logging
8
10
  include Calabash::Cucumber::Core
9
11
  include Calabash::Cucumber::TestsHelpers
10
12
 
11
- CLIENT_TIMEOUT_ADDITION = 5
12
-
13
13
  class WaitError < RuntimeError
14
14
  end
15
15
 
@@ -114,11 +114,8 @@ module Calabash
114
114
  end
115
115
 
116
116
  def wait_for_condition(options = {})
117
- timeout = options[:timeout]
118
- unless timeout && timeout > 0
119
- timeout = 30
120
- end
121
- options[:query] = options[:query] || '*'
117
+ options[:timeout] = options[:timeout] || 30
118
+ options[:query] = options[:query] || "view"
122
119
  if options.has_key?(:condition)
123
120
  opt_condition = options[:condition]
124
121
  if opt_condition.is_a?(Symbol)
@@ -130,23 +127,22 @@ module Calabash
130
127
  end
131
128
  options[:condition] = options[:condition] || CALABASH_CONDITIONS[:none_animating]
132
129
  options[:post_timeout] = options[:post_timeout] || 0
133
-
134
- retry_frequency = options[:frequency] = options[:frequency] || 0.2
135
- timeout_message = options[:timeout_message] = options[:timeout_message] || "Timeout waiting (#{options[:timeout]}) for condition (#{options[:condition]})"
136
- screenshot_on_error = true
137
- if options.key?(:screenshot_on_error)
138
- screenshot_on_error = options[:screenshot_on_error]
139
- end
130
+ options[:frequency] = options[:frequency] || 0.3
131
+ retry_frequency = options[:retry_frequency] = options[:retry_frequency] || 0.3
132
+ options[:count] = options[:count] || 2
133
+ timeout_message = options[:timeout_message] = options[:timeout_message] || "Timeout waiting for condition (#{options[:condition]})"
134
+ screenshot_on_error = options[:screenshot_on_error] = options[:screenshot_on_error] || true
140
135
 
141
136
  begin
142
- Timeout::timeout(timeout+CLIENT_TIMEOUT_ADDITION, WaitError) do
137
+ Timeout::timeout(options[:timeout],WaitError) do
138
+ loop do
143
139
  res = http({:method => :post, :path => 'condition'},
144
140
  options)
145
141
  res = JSON.parse(res)
146
- unless res['outcome'] == 'SUCCESS'
147
- raise WaitError.new(res['reason'])
148
- end
149
- sleep(options[:post_timeout]) if options[:post_timeout] > 0
142
+ break if res['outcome'] == 'SUCCESS'
143
+ sleep(options[:retry_frequency]) if options[:retry_frequency] > 0
144
+ end
145
+ sleep(options[:post_timeout]) if options[:post_timeout] > 0
150
146
  end
151
147
  rescue WaitError => e
152
148
  msg = timeout_message || e
@@ -162,7 +158,7 @@ module Calabash
162
158
  raise wait_error(msg)
163
159
  end
164
160
  rescue Exception => e
165
- handle_error_with_options(e,nil, screenshot_on_error)
161
+ handle_error_with_options(e,nil, options[:screenshot_on_error])
166
162
  end
167
163
  end
168
164
 
data/scripts/.irbrc CHANGED
@@ -4,22 +4,27 @@ require 'irb/ext/save-history'
4
4
  require 'awesome_print'
5
5
  AwesomePrint.irb!
6
6
 
7
- ARGV.concat [ "--readline",
8
- "--prompt-mode",
9
- "simple" ]
7
+ ARGV.concat [ '--readline',
8
+ '--prompt-mode',
9
+ 'simple']
10
10
 
11
11
  # 25 entries in the list
12
12
  IRB.conf[:SAVE_HISTORY] = 50
13
13
 
14
14
  # Store results in home directory with specified file name
15
- IRB.conf[:HISTORY_FILE] = ".irb-history"
15
+ IRB.conf[:HISTORY_FILE] = '.irb-history'
16
16
 
17
17
  require 'calabash-cucumber/operations'
18
+
19
+ # legacy support - module was deprecated 0.9.169
20
+ # and replaced with simulator_launcher
18
21
  require 'calabash-cucumber/launch/simulator_helper'
19
- SIM=Calabash::Cucumber::SimulatorHelper
22
+
23
+ require 'calabash-cucumber/launch/simulator_launcher'
24
+ SIM=Calabash::Cucumber::SimulatorLauncher.new()
20
25
 
21
26
  extend Calabash::Cucumber::Operations
22
27
 
23
28
  def embed(x,y=nil,z=nil)
24
- puts "Screenshot at #{x}"
29
+ puts "Screenshot at #{x}"
25
30
  end
Binary file
data/scripts/launch.rb CHANGED
@@ -43,6 +43,6 @@ end
43
43
  at_exit do
44
44
  launcher = Calabash::Cucumber::Launcher.new
45
45
  if launcher.simulator_target?
46
- Calabash::Cucumber::SimulatorHelper.stop unless launcher.calabash_no_stop?
46
+ launcher.simulator_launcher.stop unless launcher.calabash_no_stop?
47
47
  end
48
48
  end
@@ -0,0 +1,24 @@
1
+ require File.expand_path(File.join(__FILE__, '..', '..', 'spec_helper'))
2
+ require File.expand_path(File.join(__FILE__, '..', '..', '..', 'bin', 'calabash-ios-sim'))
3
+ require 'calabash-cucumber/utils/simulator_accessibility'
4
+ require 'calabash-cucumber/wait_helpers'
5
+
6
+ include Calabash::Cucumber::WaitHelpers
7
+
8
+ describe 'calabash ios sim cli' do
9
+
10
+ it 'should deprecate the sim_quit method' do
11
+ out = capture_stderr do
12
+ quit_sim
13
+ end
14
+ tokens = out.string.split("\n")
15
+ puts tokens
16
+ expect(tokens[1]).to be == "WARN: deprecated '0.9.169' - 'use Calabash::Cucumber::SimulatorAccessibility.quit_simulator'"
17
+ end
18
+
19
+ it 'should be able to reset the content and settings of the simulator' do
20
+ calabash_sim_reset
21
+ expect(simulator_support_sdk_dirs.count).to be == 1
22
+ end
23
+
24
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+ require 'calabash-cucumber/launcher'
3
+
4
+ describe 'Calabash Launcher' do
5
+
6
+ before(:each) do
7
+ @launcher = Calabash::Cucumber::Launcher.new
8
+ end
9
+
10
+ describe 'simulator_target? should respond correctly to DEVICE_TARGET' do
11
+
12
+ before(:each) do
13
+ ENV['DEVICE_TARGET'] = nil
14
+ end
15
+
16
+ def set_device_target(val)
17
+ ENV['DEVICE_TARGET'] = val
18
+ end
19
+
20
+ it 'should return true if DEVICE_TARGET is nil' do
21
+ expect(@launcher.simulator_target?).to be == false
22
+ end
23
+
24
+ it 'should return true if DEVICE_TARGET is simulator' do
25
+ set_device_target('simulator')
26
+ expect(@launcher.simulator_target?).to be == true
27
+ end
28
+
29
+ it 'should return false if DEVICE_TARGET is device' do
30
+ set_device_target('device')
31
+ expect(@launcher.simulator_target?).to be == false
32
+ end
33
+
34
+ it 'should return false if DEVICE_TARGET is udid' do
35
+ # noinspection SpellCheckingInspection
36
+ set_device_target('66h3hfgc466836ehcg72738eh8f322842855d2fd')
37
+ expect(@launcher.simulator_target?).to be == false
38
+ end
39
+
40
+ it 'should return true for Xcode 5.1 style simulator names' do
41
+ set_device_target('iPhone Retina (4-inch) - Simulator - iOS 7.1')
42
+ expect(@launcher.simulator_target?).to be == true
43
+
44
+ set_device_target('iPhone - Simulator - iOS 6.1')
45
+ expect(@launcher.simulator_target?).to be == true
46
+
47
+ set_device_target('iPad Retina (64-bit) - Simulator - iOS 7.0')
48
+ expect(@launcher.simulator_target?).to be == true
49
+ end
50
+
51
+ it 'should return true when passed a hash with :device_target => a simulator' do
52
+ hash = {:device_target => 'simulator'}
53
+ expect(@launcher.simulator_target?(hash)).to be == true
54
+
55
+ hash = {:device_target => 'iPhone Retina (4-inch) - Simulator - iOS 7.1'}
56
+ expect(@launcher.simulator_target?(hash)).to be == true
57
+ end
58
+
59
+ it 'should return false when passed a hash with :device_target != a simulator' do
60
+ hash = {:device_target => 'device'}
61
+ expect(@launcher.simulator_target?(hash)).to be == false
62
+
63
+ hash = {:device_target => '66h3hfgc466836ehcg72738eh8f322842855d2fd'}
64
+ expect(@launcher.simulator_target?(hash)).to be == false
65
+
66
+ hash = {:device_target => 'foobar'}
67
+ expect(@launcher.simulator_target?(hash)).to be == false
68
+ end
69
+
70
+ it 'should return false when passed a hash with no :device_target key' do
71
+ hash = {:foobar => 'foobar'}
72
+ expect(@launcher.simulator_target?(hash)).to be == false
73
+ end
74
+
75
+ end
76
+ end