calabash-cucumber 0.9.169.pre5 → 0.9.169.pre6

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  module Calabash
2
2
  module Cucumber
3
- VERSION = '0.9.169.pre5'
4
- MIN_SERVER_VERSION = '0.9.169.pre2'
3
+ VERSION = '0.9.169.pre6'
4
+ MIN_SERVER_VERSION = '0.9.169.pre6'
5
5
 
6
6
  class Version
7
7
 
@@ -10,6 +10,8 @@ module Calabash
10
10
  include Calabash::Cucumber::Core
11
11
  include Calabash::Cucumber::TestsHelpers
12
12
 
13
+ CLIENT_TIMEOUT_ADDITION = 5
14
+
13
15
  class WaitError < RuntimeError
14
16
  end
15
17
 
@@ -114,8 +116,11 @@ module Calabash
114
116
  end
115
117
 
116
118
  def wait_for_condition(options = {})
117
- options[:timeout] = options[:timeout] || 30
118
- options[:query] = options[:query] || "view"
119
+ timeout = options[:timeout]
120
+ unless timeout && timeout > 0
121
+ timeout = 30
122
+ end
123
+ options[:query] = options[:query] || '*'
119
124
  if options.has_key?(:condition)
120
125
  opt_condition = options[:condition]
121
126
  if opt_condition.is_a?(Symbol)
@@ -127,22 +132,23 @@ module Calabash
127
132
  end
128
133
  options[:condition] = options[:condition] || CALABASH_CONDITIONS[:none_animating]
129
134
  options[:post_timeout] = options[:post_timeout] || 0
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
135
+
136
+ retry_frequency = options[:frequency] = options[:frequency] || 0.2
137
+ timeout_message = options[:timeout_message] = options[:timeout_message] || "Timeout waiting (#{options[:timeout]}) for condition (#{options[:condition]})"
138
+ screenshot_on_error = true
139
+ if options.key?(:screenshot_on_error)
140
+ screenshot_on_error = options[:screenshot_on_error]
141
+ end
135
142
 
136
143
  begin
137
- Timeout::timeout(options[:timeout],WaitError) do
138
- loop do
144
+ Timeout::timeout(timeout+CLIENT_TIMEOUT_ADDITION, WaitError) do
139
145
  res = http({:method => :post, :path => 'condition'},
140
146
  options)
141
147
  res = JSON.parse(res)
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
148
+ unless res['outcome'] == 'SUCCESS'
149
+ raise WaitError.new(res['reason'])
150
+ end
151
+ sleep(options[:post_timeout]) if options[:post_timeout] > 0
146
152
  end
147
153
  rescue WaitError => e
148
154
  msg = timeout_message || e
@@ -158,7 +164,7 @@ module Calabash
158
164
  raise wait_error(msg)
159
165
  end
160
166
  rescue Exception => e
161
- handle_error_with_options(e,nil, options[:screenshot_on_error])
167
+ handle_error_with_options(e,nil, screenshot_on_error)
162
168
  end
163
169
  end
164
170
 
@@ -18,7 +18,7 @@ describe 'calabash ios sim cli' do
18
18
 
19
19
  it 'should be able to reset the content and settings of the simulator' do
20
20
  calabash_sim_reset
21
- expect(simulator_support_sdk_dirs.count).to be == 1
21
+ expect(existing_simulator_support_sdk_dirs.count).to be == 1
22
22
  end
23
23
 
24
24
  end
@@ -1,21 +1,25 @@
1
1
  require 'spec_helper'
2
2
  require 'calabash-cucumber/launcher'
3
+ require 'run_loop'
3
4
 
4
5
  describe 'Calabash Launcher' do
5
6
 
7
+ UDID = '66h3hfgc466836ehcg72738eh8f322842855d2fd'
8
+ IPHONE_4IN_R_64 = 'iPhone Retina (4-inch 64-bit) - Simulator - iOS 7.1'
6
9
  before(:each) do
7
10
  @launcher = Calabash::Cucumber::Launcher.new
8
11
  end
9
12
 
10
- describe 'simulator_target? should respond correctly to DEVICE_TARGET' do
13
+ before(:each) do
14
+ ENV['DEVICE_TARGET'] = nil
15
+ ENV['DETECT_CONNECTED_DEVICE'] = nil
16
+ end
11
17
 
12
- before(:each) do
13
- ENV['DEVICE_TARGET'] = nil
14
- end
18
+ def set_device_target(val)
19
+ ENV['DEVICE_TARGET'] = val
20
+ end
15
21
 
16
- def set_device_target(val)
17
- ENV['DEVICE_TARGET'] = val
18
- end
22
+ describe 'simulator_target? should respond correctly to DEVICE_TARGET' do
19
23
 
20
24
  it 'should return true if DEVICE_TARGET is nil' do
21
25
  expect(@launcher.simulator_target?).to be == false
@@ -33,7 +37,7 @@ describe 'Calabash Launcher' do
33
37
 
34
38
  it 'should return false if DEVICE_TARGET is udid' do
35
39
  # noinspection SpellCheckingInspection
36
- set_device_target('66h3hfgc466836ehcg72738eh8f322842855d2fd')
40
+ set_device_target(UDID)
37
41
  expect(@launcher.simulator_target?).to be == false
38
42
  end
39
43
 
@@ -60,7 +64,7 @@ describe 'Calabash Launcher' do
60
64
  hash = {:device_target => 'device'}
61
65
  expect(@launcher.simulator_target?(hash)).to be == false
62
66
 
63
- hash = {:device_target => '66h3hfgc466836ehcg72738eh8f322842855d2fd'}
67
+ hash = {:device_target => UDID}
64
68
  expect(@launcher.simulator_target?(hash)).to be == false
65
69
 
66
70
  hash = {:device_target => 'foobar'}
@@ -73,4 +77,90 @@ describe 'Calabash Launcher' do
73
77
  end
74
78
 
75
79
  end
76
- end
80
+
81
+ describe 'default launch args should respect DEVICE_TARGET' do
82
+
83
+ it "it should return 'simulator' if DEVICE_TARGET nil" do
84
+ args = @launcher.default_launch_args
85
+ expect(args[:device_target]).to be == 'simulator'
86
+ end
87
+
88
+ describe 'running with instruments' do
89
+
90
+ it 'should be running against instruments' do
91
+ args = @launcher.default_launch_args
92
+ expect(args[:launch_method]).to be == :instruments
93
+ end
94
+
95
+ describe 'running against devices' do
96
+
97
+ describe 'when DEVICE_TARGET = < udid >' do
98
+ before(:each) do
99
+ ENV['DEVICE_TARGET'] = UDID
100
+ end
101
+
102
+ it 'it should return udid if DEVICE_TARGET is a udid' do
103
+ args = @launcher.default_launch_args
104
+ expect(args[:device_target]).to be == UDID
105
+ expect(args[:udid]).to be == UDID
106
+ end
107
+ end
108
+
109
+ describe 'when DEVICE_TARGET = device' do
110
+ before(:each) do
111
+ ENV['DEVICE_TARGET'] = 'device'
112
+ end
113
+
114
+ describe 'detecting connected devices' do
115
+ describe "when DETECT_CONNECTED_DEVICE == '1'" do
116
+ it 'should return a udid if DEVICE_TARGET=device if a device is connected and simulator otherwise' do
117
+ ENV['DETECT_CONNECTED_DEVICE'] = '1'
118
+ args = @launcher.default_launch_args
119
+ target = args[:device_target]
120
+ detected = RunLoop::Core.detect_connected_device
121
+
122
+ if detected
123
+ expect(target).to be == detected
124
+ expect(args[:udid]).to be == detected
125
+ else
126
+ pending('this behavior is needs verification')
127
+ expect(target).to be == 'simulator'
128
+ end
129
+ end
130
+
131
+ describe "when DETECT_CONNECTED_DEVICE != '1'" do
132
+ it 'should return a udid if DEVICE_TARGET=device if a device is connected and simulator otherwise' do
133
+ args = @launcher.default_launch_args
134
+ target = args[:device_target]
135
+ expect(target).to be == 'device'
136
+ expect(args[:udid]).to be == 'device'
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
143
+
144
+ describe 'running against simulators' do
145
+
146
+ describe 'DEVICE_TARGET is an iphone in Xcode 5.1 format' do
147
+ before(:each) do
148
+ ENV['DEVICE_TARGET'] = IPHONE_4IN_R_64
149
+ end
150
+
151
+ it 'should return the correct simulator' do
152
+ args = @launcher.default_launch_args
153
+ expect(args[:device_target]).to be == IPHONE_4IN_R_64
154
+ end
155
+
156
+ end
157
+
158
+ end
159
+ end
160
+
161
+ describe 'running without instruments' do
162
+
163
+
164
+ end
165
+ end
166
+ end
File without changes
File without changes
@@ -12,7 +12,7 @@ describe 'simulator accessibility tool' do
12
12
  expect(File.exist?(path)).to be == true
13
13
  end
14
14
 
15
- it 'should be able open and close the simulator' do
15
+ it 'should be able to open and close the simulator' do
16
16
  cmd = "ps auxw | grep \"iPhone Simulator.app/Contents/MacOS/iPhone Simulator\" | grep -v grep"
17
17
 
18
18
  quit_simulator
@@ -24,12 +24,73 @@ describe 'simulator accessibility tool' do
24
24
  expect(`#{cmd}`.split("\n").count).to be == 1
25
25
  end
26
26
 
27
+ it 'should be able to return a path a com.apple.Accessibility.plist for an SDK' do
28
+ sdk = "#{simulator_app_support_dir}/7.1"
29
+ expected = "#{sdk}/Library/Preferences/com.apple.Accessibility.plist"
30
+ actual = plist_path_with_sdk_dir(sdk)
31
+ expect(actual).to be == expected
32
+ end
33
+
34
+ # brittle because some users will not have installed 6.1 or 7.0, but hey, why
35
+ # are them gem dev'ing or gem testing?
36
+ it 'should be able to return possible SDKs' do
37
+ actual = possible_simulator_sdks
38
+ instruments_version = instruments(:version)
39
+
40
+ if instruments_version == '5.1' or instruments_version == '5.1.1'
41
+ expected = ['6.1', '7.0.3', '7.0.3-64', '7.1', '7.1-64']
42
+ expect(actual).to be == expected
43
+ else
44
+ pending("Xcode version '#{instruments_version}' is not supported by this test - gem needs update!")
45
+ end
46
+ end
47
+
48
+ # brittle because some users will not have installed 6.1 or 7.0, but hey, why
49
+ # are them gem dev'ing or gem testing?
50
+ it 'should be able to return Simulator Support SDK dirs' do
51
+ actual = possible_simulator_support_sdk_dirs
52
+ instruments_version = instruments(:version)
53
+ if instruments_version == '5.1' or instruments_version == '5.1.1'
54
+ expect(actual.count).to be == 5
55
+ else
56
+ pending("Xcode version '#{instruments_version}' is not supported by this test - gem needs update!")
57
+ end
58
+ end
59
+
60
+ it 'should be able to find existing simulator support sdk dirs' do
61
+ mocked_support_dir = File.expand_path(File.join(__FILE__, '..', 'resources/enable-accessibility/'))
62
+ self.should_receive(:simulator_app_support_dir).and_return(mocked_support_dir)
63
+ actual = existing_simulator_support_sdk_dirs
64
+ expect(actual.count).to be == 5
65
+ end
66
+
67
+
27
68
  describe 'enabling accessibility' do
28
69
 
29
70
  before(:each) do
30
71
  @sim_launcher = SimLauncher::Simulator.new
31
72
  @sdk_detector = SimLauncher::SdkDetector.new(@sim_launcher)
32
73
  quit_simulator
74
+
75
+ @latest_sdk = @sdk_detector.latest_sdk_version
76
+ @device_target = "iPhone Retina (4-inch) - Simulator - iOS #{@latest_sdk}"
77
+ @launch_args =
78
+ {
79
+ :launch_method => :instruments,
80
+ :reset => false,
81
+ :bundle_id => nil,
82
+ :device => 'iphone',
83
+ :no_stop => false,
84
+ :no_launch => false,
85
+ :sdk_version => @latest_sdk,
86
+ :app => lp_simple_example,
87
+ :timeout => 30,
88
+ :device_target => @device_target,
89
+ :launch_retries => 1
90
+ }
91
+
92
+ @launcher = Calabash::Cucumber::Launcher.new
93
+
33
94
  end
34
95
 
35
96
  def lp_simple_example
@@ -47,59 +108,12 @@ describe 'simulator accessibility tool' do
47
108
  end
48
109
  end
49
110
 
50
- def repopulate_sim_app_support_all
51
- @sdk_detector.available_sdk_versions.each do |sdk|
52
- repopulate_sim_app_support_for_sdk(sdk)
53
- end
54
- end
55
-
56
- describe 'interacting with simulator app support sdk directories' do
57
- it 'should be able to find all the sdk directories' do
58
- repopulate_sim_app_support_all
59
-
60
- expected = @sdk_detector.available_sdk_versions
61
- actual = simulator_support_sdk_dirs
62
-
63
- calabash_info("sdks = '#{expected}'")
64
- actual.each { |path|
65
- calabash_info("sdk path = '#{path}'")
66
- }
67
-
68
- expect(actual.count).to be == expected.count
69
- end
70
- end
71
-
72
- describe 'enable accessibility with no AXInspector' do
111
+ describe 'on existing SDK directories' do
73
112
 
74
113
  before(:each) do
75
114
  reset_simulator_content_and_settings
76
-
77
- @latest_sdk = @sdk_detector.latest_sdk_version
78
- @device_target = "iPhone Retina (4-inch) - Simulator - iOS #{@latest_sdk}"
79
- @launch_args =
80
- {
81
- :launch_method => :instruments,
82
- :reset => false,
83
- :bundle_id => nil,
84
- :device => 'iphone',
85
- :no_stop => false,
86
- :no_launch => false,
87
- :sdk_version => @latest_sdk,
88
- :app => lp_simple_example,
89
- :timeout => 10,
90
- :device_target => @device_target,
91
- :launch_retries => 1
92
- }
93
-
94
- @launcher = Calabash::Cucumber::Launcher.new
95
- end
96
-
97
- it 'should not fail if the com.apple.Accessibility.plist does not exist' do
98
- dir = File.join(simulator_app_support_dir, "#{@latest_sdk}")
99
- expect(enable_accessibility_in_sdk_dir(dir, {:verbose => true})).to be == false
100
115
  end
101
116
 
102
-
103
117
  it 'should not be able to launch LPSimpleExample-app b/c accessibility is not enabled' do
104
118
  msgs =
105
119
  [
@@ -111,34 +125,82 @@ describe 'simulator accessibility tool' do
111
125
  '',
112
126
  'AFAICT there is nothing to be done about this.']
113
127
  calabash_warn(msgs.join("\n"))
114
- expect { @launcher.new_run_loop(@launch_args) }.to raise_error(Calabash::Cucumber::Launcher::StartError)
128
+ begin
129
+ expect { @launcher.new_run_loop(@launch_args) }.to raise_error(Calabash::Cucumber::Launcher::StartError)
130
+ ensure
131
+ @launcher.stop
132
+ end
115
133
  end
116
134
 
117
135
  it 'should be able to enable accessibility for the latest sdk' do
118
136
  repopulate_sim_app_support_for_sdk(@latest_sdk)
119
137
 
120
- # i am not sure we need these tests
121
- # the are checking the state of the 'clean' accessibility plist
122
- # which is subject to change
123
- # plist = File.join(simulator_app_support_dir, "#{@latest_sdk}", 'Library/Preferences/com.apple.Accessibility.plist')
124
- # hash = accessibility_properties_hash()
138
+ dir = File.join(simulator_app_support_dir, "#{@latest_sdk}")
139
+ enable_accessibility_in_sdk_dir(dir)
140
+
141
+ begin
142
+ expect(@launcher.new_run_loop(@launch_args)).to be_a(Hash)
143
+ ensure
144
+ @launcher.stop
145
+ end
125
146
 
126
- # expect(plist_read(hash[:access_enabled], plist)).to be == 'true'
127
- # expect(plist_read(hash[:app_access_enabled], plist)).to be == 'true'
147
+ end
148
+ end
128
149
 
129
- # flickers depending on the state - not a crucial test
130
- # expect(plist_read(hash[:automation_enabled], plist)).to be == 'true'
131
- # expect(plist_read(hash[:inspector_showing], plist)).to be == 'false'
132
- # expect(plist_key_exists?(hash[:inspector_full_size], plist)).to be == false
150
+ describe 'on non-existing SDK directories' do
151
+ before(:each) do
152
+ quit_simulator
153
+ sleep(2)
154
+ existing_simulator_support_sdk_dirs.each do |dir|
155
+ FileUtils.rm_rf(dir)
156
+ end
133
157
 
134
- # flickers depending on the state - not a crucial test
135
- # expect(plist_key_exists?(hash[:inspector_frame], plist)).to be == false
158
+ reset_simulator_content_and_settings
136
159
 
137
- dir = File.join(simulator_app_support_dir, "#{@latest_sdk}")
138
- enable_accessibility_in_sdk_dir(dir)
160
+ quit_simulator
161
+ # let the iOS Simulator do what it needs to do at shut-down
162
+ sleep(2)
163
+ end
139
164
 
140
- expect(@launcher.new_run_loop(@launch_args)).to be_a(Hash)
165
+ it 'should be able to enable accessibility on all possible simulators' do
166
+ enable_accessibility_on_simulators
167
+ @launch_args[:sdk_version] = nil
168
+ @launch_args[:timeout] = 20
169
+ @launch_args[:launch_retries] = 3
170
+
171
+ # these configurations correspond to iOS/Hardware configurations that
172
+ # do not exist. As an example, there is no iOS 6.1 64-bit implementation,
173
+ # so a simulator like:
174
+ #
175
+ # 'iPhone Retina (4-inch 64-bit) - Simulator - iOS 6.1'
176
+ #
177
+ # does not even make sense.
178
+ #
179
+ # ditto for 'iPhone - Simulator - iOS 7.0' - there is no non-retina
180
+ # iOS 7 hardware
181
+ # -1 Apple
182
+ excluded = [
183
+ 'iPhone - Simulator - iOS 7.0',
184
+ 'iPhone - Simulator - iOS 7.1',
185
+ 'iPhone Retina (4-inch 64-bit) - Simulator - iOS 6.1',
186
+ 'iPad Retina (64-bit) - Simulator - iOS 6.1'
187
+ ]
188
+ instruments(:sims).each do |simulator|
189
+ if excluded.include?(simulator)
190
+ calabash_warn("skipping simulator '#{simulator}' - instruments passed us an invalid configuration!")
191
+ else
192
+ @launch_args[:device_target] = simulator
193
+ calabash_info("starting simulator '#{simulator}'")
194
+ begin
195
+ expect(@launcher.new_run_loop(@launch_args)).to be_a(Hash)
196
+ ensure
197
+ @launcher.stop
198
+ sleep(2)
199
+ end
200
+ end
201
+ end
141
202
  end
203
+
142
204
  end
143
205
  end
144
- end
206
+ end