calabash 1.9.9.pre2 → 1.9.9.pre3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -0
- data/lib/calabash.rb +4 -2
- data/lib/calabash/android/build/java_keystore.rb +1 -0
- data/lib/calabash/android/console_helpers.rb +1 -0
- data/lib/calabash/android/defaults.rb +23 -13
- data/lib/calabash/android/device.rb +84 -19
- data/lib/calabash/android/environment.rb +2 -0
- data/lib/calabash/android/gestures.rb +4 -3
- data/lib/calabash/android/interactions.rb +1 -0
- data/lib/calabash/android/lib/.irbrc +61 -48
- data/lib/calabash/android/lib/TestServer.apk +0 -0
- data/lib/calabash/android/life_cycle.rb +3 -2
- data/lib/calabash/android/orientation.rb +1 -0
- data/lib/calabash/android/physical_buttons.rb +3 -1
- data/lib/calabash/android/screenshot.rb +0 -1
- data/lib/calabash/android/text.rb +1 -0
- data/lib/calabash/application.rb +20 -1
- data/lib/calabash/cli/generate.rb +10 -2
- data/lib/calabash/console_helpers.rb +101 -13
- data/lib/calabash/defaults.rb +36 -3
- data/lib/calabash/device.rb +28 -3
- data/lib/calabash/gestures.rb +12 -12
- data/lib/calabash/http/request.rb +1 -0
- data/lib/calabash/http/retriable_client.rb +1 -0
- data/lib/calabash/interactions.rb +2 -1
- data/lib/calabash/ios.rb +2 -0
- data/lib/calabash/ios/conditions.rb +1 -0
- data/lib/calabash/ios/console_helpers.rb +1 -0
- data/lib/calabash/ios/defaults.rb +32 -17
- data/lib/calabash/ios/device/device_implementation.rb +5 -1
- data/lib/calabash/ios/device/gestures_mixin.rb +27 -7
- data/lib/calabash/ios/device/rotation_mixin.rb +2 -2
- data/lib/calabash/ios/device/routes/error.rb +1 -0
- data/lib/calabash/ios/device/routes/playback_route_mixin.rb +1 -1
- data/lib/calabash/ios/device/routes/uia_route_mixin.rb +1 -1
- data/lib/calabash/ios/device/uia_mixin.rb +1 -1
- data/lib/calabash/ios/gestures.rb +107 -0
- data/lib/calabash/ios/interactions.rb +1 -0
- data/lib/calabash/ios/lib/.irbrc +61 -47
- data/lib/calabash/ios/orientation.rb +1 -0
- data/lib/calabash/ios/runtime.rb +1 -0
- data/lib/calabash/ios/scroll.rb +7 -7
- data/lib/calabash/ios/text.rb +3 -0
- data/lib/calabash/ios/uia.rb +1 -0
- data/lib/calabash/lib/skeleton/.gitignore +19 -0
- data/lib/calabash/lib/skeleton/Gemfile +5 -0
- data/lib/calabash/life_cycle.rb +3 -2
- data/lib/calabash/location.rb +5 -6
- data/lib/calabash/logger.rb +1 -0
- data/lib/calabash/orientation.rb +1 -0
- data/lib/calabash/page.rb +1 -0
- data/lib/calabash/screenshot.rb +1 -0
- data/lib/calabash/server.rb +1 -0
- data/lib/calabash/text.rb +3 -2
- data/lib/calabash/utility.rb +2 -1
- data/lib/calabash/version.rb +1 -1
- data/lib/calabash/wait.rb +1 -0
- metadata +114 -114
- data/lib/calabash/android/cucumber.rb +0 -3
- data/lib/calabash/android/scroll.rb +0 -5
- data/lib/calabash/patch/run_loop.rb +0 -90
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c93bdf73649617b8de5fe8e2e34fcf03a2f31f2e
|
4
|
+
data.tar.gz: 187f1e60ca6bf8005efa47ee03a9f6896c169599
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de02fd0467b70c2836fcca4859b803537365bf69ef6ae9c7f70f7f153ee877ecbaa1ec69a5941de2ba816874e9b9ad131af9b79642aef88c17a505d73df15af0
|
7
|
+
data.tar.gz: cd2a3b11e0ce8dcbc31236346f483440cfd61cdb00b12124ccf9c8922ee0373f5f940d2ea3e902308fca6f47c4bb8405816d5b9c238a2ac3c5ab6ad67e38c438
|
data/README.md
CHANGED
@@ -18,6 +18,25 @@ $ ./changing_old_files.sh
|
|
18
18
|
|
19
19
|
Before Calabash is ready to be released, the old gems will exist outside version control. To make a change run the script `copy_repos.sh`. This will copy the Android and iOS repositories and extract them as files in the directory `old`. Then execute `changing_old_files.sh`. This script will move old files into their new directories. To make changes to "old files" e.g. move them, add your steps to `changing_old_files.sh` and execute it. To make code changes to old files, change them locally first to ensure they work. Then copy the change to the branch `united` on either iOS or Android. Commit the changes and push them upstream. `copy_repos.sh` will always download the newest files.
|
20
20
|
|
21
|
+
## Rake
|
22
|
+
|
23
|
+
**TODO** Release instructions for Android and iOS.
|
24
|
+
|
25
|
+
```
|
26
|
+
$ rake -T
|
27
|
+
rake android:build # Build the Android test server
|
28
|
+
rake build # Build calabash-1.9.9.pre2.gem into the pkg directory
|
29
|
+
rake ctags # Generate ctags in ./git/tags
|
30
|
+
rake cucumber:android # Run Android cucumber tests
|
31
|
+
rake cucumber:ios # Run iOS cucumber tests
|
32
|
+
rake install # Build and install calabash-1.9.9.pre2.gem into system gems
|
33
|
+
rake release # Create tag v1.9.9.pre2 and build and push calabash-1.9.9.pre2.gem to Rubygems
|
34
|
+
rake spec # Run RSpec code examples
|
35
|
+
rake unit # Run RSpec code examples
|
36
|
+
rake yard # Generate YARD Documentation
|
37
|
+
rake yard:publish # Generate and publish docs
|
38
|
+
```
|
39
|
+
|
21
40
|
## Testing
|
22
41
|
|
23
42
|
### rspec
|
data/lib/calabash.rb
CHANGED
@@ -4,7 +4,6 @@
|
|
4
4
|
# It is developed and maintained by Xamarin and is released under the Eclipse
|
5
5
|
# Public License.
|
6
6
|
module Calabash
|
7
|
-
require 'calabash/patch/run_loop'
|
8
7
|
require 'calabash/version'
|
9
8
|
require 'calabash/environment'
|
10
9
|
require 'calabash/logger'
|
@@ -62,7 +61,7 @@ module Calabash
|
|
62
61
|
# page(LoginPage).method
|
63
62
|
# end
|
64
63
|
#
|
65
|
-
# @param [Class] The page to instantiate
|
64
|
+
# @param [Class] page_class The page to instantiate
|
66
65
|
# @return [Calabash::Page] An instance of the page class
|
67
66
|
def page(page_class)
|
68
67
|
if android?
|
@@ -98,14 +97,17 @@ module Calabash
|
|
98
97
|
end
|
99
98
|
end
|
100
99
|
|
100
|
+
# Is the app under test running on Android?
|
101
101
|
def android?
|
102
102
|
Android.const_defined?(:Device) && Device.default.is_a?(Android::Device)
|
103
103
|
end
|
104
104
|
|
105
|
+
# Is the app under test running on iOS?
|
105
106
|
def ios?
|
106
107
|
IOS.const_defined?(:Device) && Device.default.is_a?(IOS::Device)
|
107
108
|
end
|
108
109
|
|
110
|
+
# @!visibility private
|
109
111
|
def self.new_embed_method!(method)
|
110
112
|
EmbeddingContext.new_embed_method(method)
|
111
113
|
end
|
@@ -1,21 +1,31 @@
|
|
1
1
|
module Calabash
|
2
2
|
module Android
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module Defaults
|
4
|
+
# Sets up the default device and the default application based on the
|
5
|
+
# environment.
|
6
|
+
#
|
7
|
+
# @see Calabash::Android::Defaults#setup_default_application!
|
8
|
+
# @see Calabash::Android::Defaults#setup_default_device!
|
9
|
+
# @see Calabash::Environment
|
10
|
+
def setup_defaults!
|
11
|
+
setup_default_application!
|
12
|
+
setup_default_device!
|
13
|
+
end
|
7
14
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
15
|
+
# Sets up the default application based on the environment.
|
16
|
+
def setup_default_application!
|
17
|
+
# Setup the default application
|
18
|
+
Calabash.default_application = Application.default_from_environment
|
19
|
+
end
|
12
20
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
21
|
+
# Sets up the default device based on the environment.
|
22
|
+
def setup_default_device!
|
23
|
+
# Setup the default device
|
24
|
+
identifier = Device.default_serial
|
25
|
+
server = Server.default
|
17
26
|
|
18
|
-
|
27
|
+
Calabash.default_device = Device.new(identifier, server)
|
28
|
+
end
|
19
29
|
end
|
20
30
|
end
|
21
31
|
end
|
@@ -3,6 +3,7 @@ require 'json'
|
|
3
3
|
module Calabash
|
4
4
|
module Android
|
5
5
|
# A representation of a Calabash Android device.
|
6
|
+
# @!visibility private
|
6
7
|
class Device < ::Calabash::Device
|
7
8
|
attr_reader :adb
|
8
9
|
|
@@ -15,6 +16,12 @@ module Calabash
|
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
19
|
+
# @!visibility private
|
20
|
+
def change_server(new_server)
|
21
|
+
super(new_server)
|
22
|
+
port_forward(new_server.endpoint.port, new_server.test_server_port)
|
23
|
+
end
|
24
|
+
|
18
25
|
def self.default_serial
|
19
26
|
serials = list_serials
|
20
27
|
|
@@ -156,7 +163,7 @@ module Calabash
|
|
156
163
|
raise "mapping \"#{query}\" with \"#{method_name}\" failed because: #{result['reason']}\n#{result['details']}"
|
157
164
|
end
|
158
165
|
|
159
|
-
result['results']
|
166
|
+
Calabash::QueryResult.create(result['results'], query)
|
160
167
|
end
|
161
168
|
|
162
169
|
def perform_action(action, *arguments)
|
@@ -350,18 +357,17 @@ module Calabash
|
|
350
357
|
"/data/data/#{application.test_server.identifier}/files/calabash_finished.out"
|
351
358
|
end
|
352
359
|
|
353
|
-
def
|
354
|
-
cmd = "ls #{
|
360
|
+
def adb_file_exists?(file)
|
361
|
+
cmd = "ls #{file}"
|
362
|
+
adb.shell(cmd, no_exit_code_check: true).chomp == file
|
363
|
+
end
|
355
364
|
|
356
|
-
|
357
|
-
|
365
|
+
def calabash_server_failure_exists?(application)
|
366
|
+
adb_file_exists?(calabash_server_failure_file_path(application))
|
358
367
|
end
|
359
368
|
|
360
369
|
def calabash_server_finished_exists?(application)
|
361
|
-
|
362
|
-
|
363
|
-
adb.shell(cmd, no_exit_code_check: true).chomp ==
|
364
|
-
calabash_server_finished_file_path(application)
|
370
|
+
adb_file_exists?(calabash_server_finished_file_path(application))
|
365
371
|
end
|
366
372
|
|
367
373
|
def read_calabash_sever_failure(application)
|
@@ -406,6 +412,20 @@ module Calabash
|
|
406
412
|
raise "The test-server '#{application.test_server.identifier}' is not installed"
|
407
413
|
end
|
408
414
|
|
415
|
+
installed_app = installed_apps.find{|app| app[:package] == application.identifier}
|
416
|
+
installed_app_md5_checksum = md5_checksum(installed_app[:path])
|
417
|
+
|
418
|
+
if application.md5_checksum != installed_app_md5_checksum
|
419
|
+
raise "The specified app is not the same as the installed app (#{application.md5_checksum} != #{installed_app_md5_checksum})."
|
420
|
+
end
|
421
|
+
|
422
|
+
installed_test_server = installed_apps.find{|app| app[:package] == application.test_server.identifier}
|
423
|
+
installed_test_server_md5_checksum = md5_checksum(installed_test_server[:path])
|
424
|
+
|
425
|
+
if application.test_server.md5_checksum != installed_test_server_md5_checksum
|
426
|
+
raise "The specified test-server is not the same as the installed test-server (#{application.test_server.md5_checksum} != #{installed_test_server_md5_checksum})."
|
427
|
+
end
|
428
|
+
|
409
429
|
ensure_screen_on
|
410
430
|
|
411
431
|
# Clear any old error reports
|
@@ -536,6 +556,10 @@ module Calabash
|
|
536
556
|
raise ArgumentError, "No test server set for '#{application}'"
|
537
557
|
end
|
538
558
|
|
559
|
+
unless app_installed?(application.identifier)
|
560
|
+
raise "The application #{application.identifier}' is not installed"
|
561
|
+
end
|
562
|
+
|
539
563
|
unless app_installed?(application.test_server.identifier)
|
540
564
|
raise "The test-server '#{application.test_server.identifier}' is not installed"
|
541
565
|
end
|
@@ -746,7 +770,7 @@ module Calabash
|
|
746
770
|
gesture = Gestures::Gesture.double_tap(gesture_options)
|
747
771
|
|
748
772
|
execute_gesture(Gestures::Gesture.with_parameters(gesture,
|
749
|
-
|
773
|
+
query: query,
|
750
774
|
timeout: options[:timeout]))
|
751
775
|
end
|
752
776
|
|
@@ -785,7 +809,7 @@ module Calabash
|
|
785
809
|
gesture = Gestures::Gesture.generate_swipe(from, to, time: duration)
|
786
810
|
|
787
811
|
execute_gesture(Gestures::Gesture.with_parameters(gesture,
|
788
|
-
|
812
|
+
query: query,
|
789
813
|
timeout: options[:timeout]))
|
790
814
|
end
|
791
815
|
|
@@ -796,7 +820,7 @@ module Calabash
|
|
796
820
|
gesture.gestures.first.touches[1].query = query_to
|
797
821
|
|
798
822
|
execute_gesture(Gestures::Gesture.with_parameters(gesture,
|
799
|
-
|
823
|
+
query: query_to,
|
800
824
|
timeout: options[:timeout]))
|
801
825
|
end
|
802
826
|
|
@@ -813,7 +837,7 @@ module Calabash
|
|
813
837
|
gesture = Gestures::Gesture.generate_swipe(from, to, time: duration, flick: true)
|
814
838
|
|
815
839
|
execute_gesture(Gestures::Gesture.with_parameters(gesture,
|
816
|
-
|
840
|
+
query: query,
|
817
841
|
timeout: options[:timeout]))
|
818
842
|
end
|
819
843
|
|
@@ -822,7 +846,7 @@ module Calabash
|
|
822
846
|
gesture = Gestures::Gesture.pinch(direction)
|
823
847
|
|
824
848
|
execute_gesture(Gestures::Gesture.with_parameters(gesture,
|
825
|
-
|
849
|
+
query: query,
|
826
850
|
timeout: options[:timeout]))
|
827
851
|
end
|
828
852
|
|
@@ -842,15 +866,56 @@ module Calabash
|
|
842
866
|
|
843
867
|
# @!visibility private
|
844
868
|
def adb_install_app(application)
|
869
|
+
# Because of a bug in the latest version of ADB
|
870
|
+
# https://github.com/android/platform_system_core/blob/0f91887868e51de67bdf9aedc97fbcb044dc1969/adb/commandline.cpp#L1466
|
871
|
+
# ADB now uses rm -f ... to remove the temporary application on the
|
872
|
+
# device, but not all devices (below a certain OS) supports this flag.
|
873
|
+
# The user will be unable to install the app and instead receive:
|
874
|
+
# RuntimeError: Could not install app 'com.xamarin.xtcandroidsample.test': rm failed for -f, No such file or directory
|
875
|
+
# We have rewritten the way adb handles app installation. It's a 3-step
|
876
|
+
# procedure:
|
877
|
+
# - Push the app binary to /data/local/tmp
|
878
|
+
# - Install the app binary using pm
|
879
|
+
# - Remove the temporary apk.
|
845
880
|
@logger.log "Installing #{application.path}"
|
846
|
-
result = adb.command('install' , '-r', application.path, timeout: 60).lines.last
|
847
881
|
|
848
|
-
|
849
|
-
|
882
|
+
tmp_path = "/data/local/tmp/#{File.basename(application.path)}"
|
883
|
+
|
884
|
+
begin
|
885
|
+
adb.command('push', application.path, tmp_path, timeout: 60)
|
886
|
+
rescue ADB::ADBCallError => e
|
887
|
+
raise "Failed to push the application to the device storage: '#{e.message}'"
|
888
|
+
end
|
889
|
+
|
890
|
+
begin
|
891
|
+
result = nil
|
892
|
+
|
893
|
+
begin
|
894
|
+
result = adb.shell("pm install -r #{tmp_path}", timeout: 60)
|
895
|
+
rescue ADB::ADBCallError => e
|
896
|
+
raise "Failed to install the application on device: '#{e.message}'"
|
897
|
+
end
|
898
|
+
|
899
|
+
if result.lines.last.downcase.chomp != 'success'
|
900
|
+
raise "Could not install app '#{application.identifier}': #{result.chomp}"
|
901
|
+
end
|
902
|
+
|
903
|
+
unless installed_packages.include?(application.identifier)
|
904
|
+
raise "App '#{application.identifier}' was not installed"
|
905
|
+
end
|
906
|
+
rescue => e
|
907
|
+
begin
|
908
|
+
adb.shell("rm #{tmp_path}")
|
909
|
+
rescue ADB::ADBCallError => _
|
910
|
+
end
|
911
|
+
|
912
|
+
raise e
|
850
913
|
end
|
851
914
|
|
852
|
-
|
853
|
-
|
915
|
+
begin
|
916
|
+
adb.shell("rm #{tmp_path}")
|
917
|
+
rescue ADB::ADBCallError => e
|
918
|
+
raise "Failed to remove the tmp apk from device: #{e.message}"
|
854
919
|
end
|
855
920
|
end
|
856
921
|
|
@@ -2,6 +2,7 @@ require 'json'
|
|
2
2
|
|
3
3
|
module Calabash
|
4
4
|
module Android
|
5
|
+
# @!visibility private
|
5
6
|
module Gestures
|
6
7
|
class MultiTouchGesture
|
7
8
|
attr_reader :gestures
|
@@ -344,12 +345,12 @@ module Calabash
|
|
344
345
|
flick("* id:'content'", from, to, options)
|
345
346
|
end
|
346
347
|
|
347
|
-
#
|
348
|
+
# @!visibility private
|
348
349
|
def _pinch_screen(direction, options={})
|
349
350
|
Device.default.pinch(direction, "* id:'content'", options)
|
350
351
|
end
|
351
352
|
|
352
|
-
#
|
353
|
+
# @!visibility private
|
353
354
|
def _pinch_to_zoom(direction, query, options={})
|
354
355
|
if direction == :out
|
355
356
|
Device.default.pinch(:in, query, options)
|
@@ -360,7 +361,7 @@ module Calabash
|
|
360
361
|
end
|
361
362
|
end
|
362
363
|
|
363
|
-
#
|
364
|
+
# @!visibility private
|
364
365
|
def _pinch_screen_to_zoom(direction, options={})
|
365
366
|
_pinch_to_zoom(direction, "* id:'content'", options)
|
366
367
|
end
|
@@ -1,50 +1,63 @@
|
|
1
|
+
require 'irb/completion'
|
2
|
+
require 'irb/ext/save-history'
|
3
|
+
|
4
|
+
IRB.conf[:SAVE_HISTORY] = 100
|
5
|
+
IRB.conf[:HISTORY_FILE] = '.irb-history'
|
6
|
+
|
7
|
+
ARGV.concat [ '--readline',
|
8
|
+
'--prompt-mode',
|
9
|
+
'simple']
|
10
|
+
|
11
|
+
begin
|
12
|
+
require 'pry'
|
13
|
+
Pry.config.history.file = '.pry-history'
|
14
|
+
require 'pry-nav'
|
15
|
+
rescue LoadError => _
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
begin
|
20
|
+
require 'awesome_print'
|
21
|
+
AwesomePrint.irb!
|
22
|
+
rescue LoadError => e
|
23
|
+
msg = ["Caught a LoadError: could not load 'awesome_print'",
|
24
|
+
"#{e}",
|
25
|
+
'',
|
26
|
+
'Use bundler (recommended) or uninstall awesome_print.',
|
27
|
+
'',
|
28
|
+
'# Use bundler (recommended)',
|
29
|
+
'$ bundle update',
|
30
|
+
'$ bundle exec calabash console [path to apk]',
|
31
|
+
'',
|
32
|
+
'# Uninstall',
|
33
|
+
'$ gem update --system',
|
34
|
+
'$ gem uninstall -Vax --force --no-abort-on-dependent awesome_print']
|
35
|
+
puts msg
|
36
|
+
exit(1)
|
37
|
+
end
|
38
|
+
|
1
39
|
begin
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
puts msg
|
21
|
-
exit(1)
|
22
|
-
end
|
23
|
-
|
24
|
-
AwesomePrint.irb!
|
25
|
-
|
26
|
-
ARGV.concat [ '--readline',
|
27
|
-
'--prompt-mode',
|
28
|
-
'simple']
|
29
|
-
|
30
|
-
# 50 entries in the list
|
31
|
-
IRB.conf[:SAVE_HISTORY] = 50
|
32
|
-
|
33
|
-
# Store results in home directory with specified file name
|
34
|
-
IRB.conf[:HISTORY_FILE] = '.irb-history'
|
35
|
-
|
36
|
-
require 'calabash/android'
|
37
|
-
|
38
|
-
extend Calabash::Android
|
39
|
-
extend Calabash::ConsoleHelpers
|
40
|
-
|
41
|
-
Calabash::Android.setup_defaults!
|
42
|
-
|
43
|
-
Calabash.new_embed_method!(lambda {|*_| Calabash::Logger.info 'Embed is not available in the console.'})
|
44
|
-
Calabash::Screenshot.screenshot_directory_prefix = 'console_'
|
40
|
+
require 'calabash/android'
|
41
|
+
|
42
|
+
extend Calabash::Android
|
43
|
+
extend Calabash::ConsoleHelpers
|
44
|
+
|
45
|
+
Calabash::Android.setup_defaults!
|
46
|
+
|
47
|
+
embed_lambda = lambda do |*_|
|
48
|
+
Calabash::Logger.info 'Embed is not available in the console.'
|
49
|
+
true
|
50
|
+
end
|
51
|
+
|
52
|
+
Calabash.new_embed_method!(embed_lambda)
|
53
|
+
|
54
|
+
Calabash::Screenshot.screenshot_directory_prefix = 'console_'
|
55
|
+
|
56
|
+
puts_console_details
|
57
|
+
message_of_the_day
|
45
58
|
rescue Exception => e
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
end
|
59
|
+
puts 'Unable to start console:'
|
60
|
+
puts "#{e.class}: #{e.message}"
|
61
|
+
puts "#{e.backtrace.join("\n")}"
|
62
|
+
exit(1)
|
63
|
+
end
|