calabash-cucumber 0.9.139 → 0.9.140.pre1
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.
- data/bin/calabash-ios +3 -0
- data/bin/calabash-ios-helpers.rb +3 -0
- data/bin/calabash-ios-setup.rb +46 -0
- data/doc/calabash-ios-help.txt +3 -0
- data/lib/calabash-cucumber/core.rb +23 -14
- data/lib/calabash-cucumber/launcher.rb +155 -0
- data/lib/calabash-cucumber/operations.rb +1 -1
- data/lib/calabash-cucumber/version.rb +1 -1
- data/scripts/launch.rb +49 -0
- metadata +6 -4
data/bin/calabash-ios
CHANGED
data/bin/calabash-ios-helpers.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'tempfile'
|
2
2
|
require 'json'
|
3
3
|
|
4
|
+
UPDATE_TARGETS = ['hooks']
|
4
5
|
|
5
6
|
def msg(title, &block)
|
6
7
|
puts "\n" + "-"*10 + title + "-"*10
|
@@ -21,6 +22,8 @@ def print_usage
|
|
21
22
|
starts an interactive console to interact with your app via Calabash
|
22
23
|
setup [<path>]
|
23
24
|
setup your XCode project for calabash-ios (EXPERIMENTAL)
|
25
|
+
update [target]
|
26
|
+
updates one of the following targets: hooks
|
24
27
|
download
|
25
28
|
install latest compatible version of calabash.framework
|
26
29
|
check [{<path to .ipa>|<path to .app>}]
|
data/bin/calabash-ios-setup.rb
CHANGED
@@ -290,4 +290,50 @@ def validate_app(app)
|
|
290
290
|
end
|
291
291
|
end
|
292
292
|
|
293
|
+
end
|
294
|
+
|
295
|
+
|
296
|
+
def update(args)
|
297
|
+
if args.length > 0
|
298
|
+
target = args[0]
|
299
|
+
unless UPDATE_TARGETS.include?(target)
|
300
|
+
msg("Error") do
|
301
|
+
puts "Invalid target #{target}. Must be one of: #{UPDATE_TARGETS.join(' ')}"
|
302
|
+
end
|
303
|
+
exit 1
|
304
|
+
end
|
305
|
+
|
306
|
+
|
307
|
+
|
308
|
+
target_file = "features/support/launch.rb"
|
309
|
+
msg("Question") do
|
310
|
+
puts "I'm about to update the #{target_file} file."
|
311
|
+
puts "Please hit return to confirm that's what you want."
|
312
|
+
end
|
313
|
+
exit 2 unless STDIN.gets.chomp == ''
|
314
|
+
|
315
|
+
|
316
|
+
unless File.exist?(target_file)
|
317
|
+
msg("Error") do
|
318
|
+
puts "Unable to find file #{target_file}"
|
319
|
+
puts "Please change directory so that #{target_file} exists."
|
320
|
+
end
|
321
|
+
exit 1
|
322
|
+
end
|
323
|
+
new_launch_script = File.join(@script_dir,"launch.rb")
|
324
|
+
|
325
|
+
FileUtils.cp(new_launch_script, target_file, :verbose => true)
|
326
|
+
|
327
|
+
msg("Info") do
|
328
|
+
puts "File copied.\n"
|
329
|
+
puts "Launch on device using environment variable DEVICE_TARGET=device."
|
330
|
+
end
|
331
|
+
else
|
332
|
+
msg("Error") do
|
333
|
+
puts "update must take one of the following targets: #{UPDATE_TARGETS.join(' ')}"
|
334
|
+
end
|
335
|
+
exit 1
|
336
|
+
|
337
|
+
end
|
338
|
+
|
293
339
|
end
|
data/doc/calabash-ios-help.txt
CHANGED
@@ -44,6 +44,9 @@ Usage: calabash-ios <command-name> [parameters]
|
|
44
44
|
If something goes wrong. Close Xcode and copy project.pbxproj.bak
|
45
45
|
to project.pbxproj inside your .xcodeproj folder.
|
46
46
|
|
47
|
+
update [target]
|
48
|
+
updates one of the following targets: hooks
|
49
|
+
|
47
50
|
download [opt_path]?
|
48
51
|
copies current compatible version of calabash.framework to your project.
|
49
52
|
It should be run from a directory containing an Xcode project,
|
@@ -325,7 +325,12 @@ module Calabash
|
|
325
325
|
device = options["DEVICE"] || ENV["DEVICE"] || "iphone"
|
326
326
|
|
327
327
|
unless os
|
328
|
-
|
328
|
+
if @calabash_launcher && @calabash_launcher.active?
|
329
|
+
major = @calabash_launcher.ios_major_version
|
330
|
+
else
|
331
|
+
major = Calabash::Cucumber::SimulatorHelper.ios_major_version
|
332
|
+
end
|
333
|
+
|
329
334
|
unless major
|
330
335
|
raise <<EOF
|
331
336
|
Unable to determine iOS major version
|
@@ -471,24 +476,28 @@ EOF
|
|
471
476
|
end
|
472
477
|
|
473
478
|
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
479
|
+
## args :app for device bundle id, for sim path to app
|
480
|
+
##
|
481
|
+
def start_test_server_in_background(args={})
|
482
|
+
target = args[:device_target] || :simulator
|
483
|
+
stop_test_server
|
484
|
+
@calabash_launcher = Calabash::Cucumber::Launcher.new(target)
|
485
|
+
@calabash_launcher.relaunch(args)
|
480
486
|
|
481
|
-
@ios_device = RunLoop.run(:app => app_bundle_path)
|
482
487
|
end
|
483
488
|
|
484
|
-
def
|
485
|
-
|
489
|
+
def stop_test_server
|
490
|
+
if @calabash_launcher
|
491
|
+
@calabash_launcher.stop
|
492
|
+
end
|
486
493
|
end
|
487
494
|
|
488
|
-
def
|
489
|
-
|
490
|
-
|
491
|
-
|
495
|
+
def send_uia_command(opts ={})
|
496
|
+
run_loop = opts[:run_loop] || (@calabash_launcher && @calabash_launcher.active? && @calabash_launcher.run_loop)
|
497
|
+
command = opts[:command]
|
498
|
+
raise ArgumentError, 'please supply :run_loop or instance var @calabash_launcher' unless run_loop
|
499
|
+
raise ArgumentError, 'please supply :command' unless command
|
500
|
+
RunLoop.send_command(run_loop, opts[:command])
|
492
501
|
end
|
493
502
|
|
494
503
|
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'calabash-cucumber/launch/simulator_helper'
|
2
|
+
require 'sim_launcher'
|
3
|
+
require 'run_loop'
|
4
|
+
|
5
|
+
|
6
|
+
class Calabash::Cucumber::Launcher
|
7
|
+
attr_accessor :run_loop
|
8
|
+
attr_accessor :device_target
|
9
|
+
attr_accessor :ios_version
|
10
|
+
|
11
|
+
def initialize(device_target=:simulator)
|
12
|
+
self.device_target = device_target
|
13
|
+
end
|
14
|
+
|
15
|
+
class CalabashLauncherTimeoutErr < Timeout::Error
|
16
|
+
end
|
17
|
+
|
18
|
+
def calabash_no_stop?
|
19
|
+
ENV['NO_LAUNCH']=="1" or ENV['NO_STOP']=="1"
|
20
|
+
end
|
21
|
+
|
22
|
+
def device_target?
|
23
|
+
ENV['DEVICE_TARGET'] == 'device'
|
24
|
+
end
|
25
|
+
|
26
|
+
def simulator_target?
|
27
|
+
ENV['DEVICE_TARGET'] == 'simulator'
|
28
|
+
end
|
29
|
+
|
30
|
+
def active?
|
31
|
+
(simulator_target? || device_target?) && (not run_loop.nil?)
|
32
|
+
end
|
33
|
+
|
34
|
+
def ios_major_version
|
35
|
+
v = ios_version
|
36
|
+
(v && v.split('.')[0])
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
def reset_app_jail(sdk, app_path)
|
41
|
+
return if device_target?
|
42
|
+
|
43
|
+
app = File.basename(app_path)
|
44
|
+
bundle = `find "#{ENV['HOME']}/Library/Application Support/iPhone Simulator/#{sdk}/Applications/" -type d -depth 2 -name "#{app}" | head -n 1`
|
45
|
+
return if bundle.empty? # Assuming we're already clean
|
46
|
+
|
47
|
+
sandbox = File.dirname(bundle)
|
48
|
+
['Library', 'Documents', 'tmp'].each do |dir|
|
49
|
+
FileUtils.rm_rf(File.join(sandbox, dir))
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def relaunch(args={})
|
54
|
+
RunLoop.stop(run_loop) if run_loop
|
55
|
+
|
56
|
+
if device_target?
|
57
|
+
default_args = {:app => ENV['BUNDLE_ID']}
|
58
|
+
self.run_loop = RunLoop.run(default_args.merge(args))
|
59
|
+
else
|
60
|
+
|
61
|
+
sdk = ENV['SDK_VERSION'] || SimLauncher::SdkDetector.new().latest_sdk_version
|
62
|
+
path = Calabash::Cucumber::SimulatorHelper.app_bundle_or_raise(app_path)
|
63
|
+
if ENV['RESET_BETWEEN_SCENARIOS']=="1"
|
64
|
+
reset_app_jail(sdk, path)
|
65
|
+
end
|
66
|
+
|
67
|
+
if simulator_target?
|
68
|
+
device = (ENV['DEVICE'] || 'iphone').to_sym
|
69
|
+
default_args = {:app => path, :device => device}
|
70
|
+
self.run_loop = RunLoop.run(default_args.merge(args))
|
71
|
+
else
|
72
|
+
## sim launcher
|
73
|
+
Calabash::Cucumber::SimulatorHelper.relaunch(path, sdk, ENV['DEVICE'] || 'iphone', args)
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
ensure_connectivity
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
def ensure_connectivity
|
82
|
+
begin
|
83
|
+
max_retry_count = (ENV['MAX_CONNECT_RETRY'] || 10).to_i
|
84
|
+
timeout = (ENV['CONNECT_TIMEOUT'] || 30).to_i
|
85
|
+
retry_count = 0
|
86
|
+
connected = false
|
87
|
+
puts "Waiting for App to be ready"
|
88
|
+
until connected do
|
89
|
+
raise "MAX_RETRIES" if retry_count == max_retry_count
|
90
|
+
retry_count += 1
|
91
|
+
begin
|
92
|
+
Timeout::timeout(timeout, CalabashLauncherTimeoutErr) do
|
93
|
+
until connected
|
94
|
+
begin
|
95
|
+
connected = (ping_app == '200')
|
96
|
+
break if connected
|
97
|
+
rescue Exception => e
|
98
|
+
#p e
|
99
|
+
#retry
|
100
|
+
ensure
|
101
|
+
sleep 1 unless connected
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
rescue CalabashLauncherTimeoutErr => e
|
106
|
+
puts "Timed out...Retry.."
|
107
|
+
end
|
108
|
+
end
|
109
|
+
rescue e
|
110
|
+
p e
|
111
|
+
msg = "Unable to make connection to Calabash Server at #{ENV['DEVICE_ENDPOINT']|| "http://localhost:37265/"}\n"
|
112
|
+
msg << "Make sure you don't have a firewall blocking traffic to #{ENV['DEVICE_ENDPOINT']|| "http://localhost:37265/"}.\n"
|
113
|
+
raise msg
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def ping_app
|
118
|
+
url = URI.parse(ENV['DEVICE_ENDPOINT']|| "http://localhost:37265/")
|
119
|
+
|
120
|
+
http = Net::HTTP.new(url.host, url.port)
|
121
|
+
res = http.start do |sess|
|
122
|
+
sess.request Net::HTTP::Get.new "version"
|
123
|
+
end
|
124
|
+
status = res.code
|
125
|
+
begin
|
126
|
+
http.finish if http and http.started?
|
127
|
+
rescue Exception => e
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
if status=='200'
|
132
|
+
version_body = JSON.parse(res.body)
|
133
|
+
if version_body['iOS_version']
|
134
|
+
self.ios_version = version_body['iOS_version']
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
status
|
139
|
+
end
|
140
|
+
|
141
|
+
def stop
|
142
|
+
RunLoop.stop(run_loop)
|
143
|
+
end
|
144
|
+
|
145
|
+
def app_path
|
146
|
+
ENV['APP_BUNDLE_PATH'] || (defined?(APP_BUNDLE_PATH) && APP_BUNDLE_PATH)
|
147
|
+
end
|
148
|
+
|
149
|
+
def calabash_notify(world)
|
150
|
+
if world.respond_to?(:on_launch)
|
151
|
+
world.on_launch
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
@@ -3,6 +3,7 @@ require 'calabash-cucumber/tests_helpers'
|
|
3
3
|
require 'calabash-cucumber/keyboard_helpers'
|
4
4
|
require 'calabash-cucumber/wait_helpers'
|
5
5
|
require 'calabash-cucumber/location'
|
6
|
+
require 'calabash-cucumber/launcher'
|
6
7
|
require 'net/http'
|
7
8
|
require 'test/unit/assertions'
|
8
9
|
require 'json'
|
@@ -99,7 +100,6 @@ module Calabash
|
|
99
100
|
end
|
100
101
|
|
101
102
|
|
102
|
-
|
103
103
|
#not officially supported yet
|
104
104
|
#def change_slider_value_to(q, value)
|
105
105
|
# target = value.to_f
|
data/scripts/launch.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
########################################
|
2
|
+
# #
|
3
|
+
# Important Note #
|
4
|
+
# #
|
5
|
+
# When running calabash-ios tests at #
|
6
|
+
# www.lesspainful.com #
|
7
|
+
# this file will be overwritten by #
|
8
|
+
# a file which automates #
|
9
|
+
# app launch on devices. #
|
10
|
+
# #
|
11
|
+
# Don't rely on this file being #
|
12
|
+
# present when running at #
|
13
|
+
# www.lesspainful.com. #
|
14
|
+
# #
|
15
|
+
# Only put stuff here to automate #
|
16
|
+
# iOS Simulator. #
|
17
|
+
# #
|
18
|
+
# You can put your app bundle path #
|
19
|
+
# for automating simulator app start: #
|
20
|
+
# Uncomment APP_BUNDLE_PATH =.. #
|
21
|
+
# #
|
22
|
+
########################################
|
23
|
+
|
24
|
+
require 'calabash-cucumber/launcher'
|
25
|
+
|
26
|
+
# Uncomment and replace ?? appropriately
|
27
|
+
# This should point to your Simulator build
|
28
|
+
# which includes calabash framework
|
29
|
+
# this is usually the Calabash build configuration
|
30
|
+
# of your production target.
|
31
|
+
#APP_BUNDLE_PATH = "~/Library/Developer/Xcode/DerivedData/??/Build/Products/Calabash-iphonesimulator/??.app"
|
32
|
+
#
|
33
|
+
|
34
|
+
|
35
|
+
Before do |scenario|
|
36
|
+
@calabash_launcher = Calabash::Cucumber::Launcher.new
|
37
|
+
@calabash_launcher.relaunch
|
38
|
+
@calabash_launcher.calabash_notify(self)
|
39
|
+
end
|
40
|
+
|
41
|
+
After do |scenario|
|
42
|
+
unless @calabash_launcher.calabash_no_stop?
|
43
|
+
if @calabash_launcher.active?
|
44
|
+
@calabash_launcher.stop
|
45
|
+
else
|
46
|
+
Calabash::Cucumber::SimulatorHelper.stop
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: calabash-cucumber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
5
|
-
prerelease:
|
4
|
+
version: 0.9.140.pre1
|
5
|
+
prerelease: 8
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Karl Krukow
|
@@ -211,6 +211,7 @@ files:
|
|
211
211
|
- lib/calabash-cucumber/ibase.rb
|
212
212
|
- lib/calabash-cucumber/keyboard_helpers.rb
|
213
213
|
- lib/calabash-cucumber/launch/simulator_helper.rb
|
214
|
+
- lib/calabash-cucumber/launcher.rb
|
214
215
|
- lib/calabash-cucumber/location.rb
|
215
216
|
- lib/calabash-cucumber/operations.rb
|
216
217
|
- lib/calabash-cucumber/resources/cell_swipe_ios4_ipad.base64
|
@@ -298,6 +299,7 @@ files:
|
|
298
299
|
- scripts/data/.GlobalPreferences.plist
|
299
300
|
- scripts/data/clients.plist
|
300
301
|
- scripts/data/com.apple.Accessibility.plist
|
302
|
+
- scripts/launch.rb
|
301
303
|
- scripts/reset_simulator.scpt
|
302
304
|
- staticlib/calabash.framework.zip
|
303
305
|
homepage: http://calaba.sh
|
@@ -315,9 +317,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
315
317
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
316
318
|
none: false
|
317
319
|
requirements:
|
318
|
-
- - ! '
|
320
|
+
- - ! '>'
|
319
321
|
- !ruby/object:Gem::Version
|
320
|
-
version:
|
322
|
+
version: 1.3.1
|
321
323
|
requirements: []
|
322
324
|
rubyforge_project:
|
323
325
|
rubygems_version: 1.8.23
|