calabash 2.0.0.pre9 → 2.0.0.pre10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/calabash/android.rb +4 -0
- data/lib/calabash/android/device.rb +216 -24
- data/lib/calabash/android/lib/HelperApplication.apk +0 -0
- data/lib/calabash/android/lib/HelperApplicationTestServer.apk +0 -0
- data/lib/calabash/android/lib/TestServer.apk +0 -0
- data/lib/calabash/android/server.rb +5 -0
- data/lib/calabash/http.rb +1 -0
- data/lib/calabash/http/forwarding_client.rb +23 -0
- data/lib/calabash/http/retriable_client.rb +4 -1
- data/lib/calabash/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1788f3f3e1bfd128768042749d0b7d5dbdebb8ab
|
4
|
+
data.tar.gz: 68d92c0989f89f7b4d4cf55a23a0daed83fa25e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f46b1426f57a039bebe2ac8e59c015f6ad2720217cb37b0e8df118614fa958a4d2cb2ec62890dee52dbb41980c5111c435567c7756ae746487bf69797ceae898
|
7
|
+
data.tar.gz: 5ed96dfbd5603d13ba3dbbc4a976bb7839641b74d514c178c71f0c2fe6f26f9f8e1cae7bd11b5acc6b5f1bbbf7ffd58037c95180ba0fcb3d99b5a384565061a9
|
data/lib/calabash/android.rb
CHANGED
@@ -7,6 +7,10 @@ module Calabash
|
|
7
7
|
UNSIGNED_TEST_SERVER_APK = File.join(File.dirname(__FILE__), 'android', 'lib', 'TestServer.apk')
|
8
8
|
# @!visibility private
|
9
9
|
ANDROID_MANIFEST_PATH = File.join(File.dirname(__FILE__), 'android', 'lib', 'AndroidManifest.xml')
|
10
|
+
# @!visibility private
|
11
|
+
HELPER_APPLICATION = File.join(File.dirname(__FILE__), 'android', 'lib', 'HelperApplication.apk')
|
12
|
+
# @!visibility private
|
13
|
+
HELPER_APPLICATION_TEST_SERVER = File.join(File.dirname(__FILE__), 'android', 'lib', 'HelperApplicationTestServer.apk')
|
10
14
|
|
11
15
|
require 'calabash'
|
12
16
|
include Calabash
|
@@ -66,22 +66,22 @@ module Calabash
|
|
66
66
|
|
67
67
|
# @!visibility private
|
68
68
|
def installed_packages
|
69
|
-
|
70
|
-
line.sub('package:', '').chomp
|
71
|
-
end
|
69
|
+
installed_apps.map{|e| e[:package]}
|
72
70
|
end
|
73
71
|
|
74
72
|
# @!visibility private
|
75
73
|
def installed_apps
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
74
|
+
@installed_apps_cache ||= lambda do
|
75
|
+
adb.shell('pm list packages -f').lines.map do |line|
|
76
|
+
# line will be package:<path>=<package>
|
77
|
+
# e.g. "package:/system/app/GoogleEars.apk=com.google.android.ears"
|
78
|
+
info = line.sub("package:", "")
|
80
79
|
|
81
|
-
|
80
|
+
app_path, app_id = info.split('=').map(&:chomp)
|
82
81
|
|
83
|
-
|
84
|
-
|
82
|
+
{package: app_id, path: app_path}
|
83
|
+
end
|
84
|
+
end.call
|
85
85
|
end
|
86
86
|
|
87
87
|
# @!visibility private
|
@@ -420,25 +420,71 @@ module Calabash
|
|
420
420
|
adb.shell(cmd, no_exit_code_check: true).chomp == file
|
421
421
|
end
|
422
422
|
|
423
|
+
def file_exists?(file)
|
424
|
+
ensure_helper_application_started
|
425
|
+
|
426
|
+
request = HTTP::Request.new('file-exists', params_for_request(fileName: file))
|
427
|
+
response = helper_application_http_client.post(request)
|
428
|
+
|
429
|
+
if response.status != 200
|
430
|
+
result = JSON.parse(response.body)
|
431
|
+
raise "Failed to find out if file exists #{result['reason']}"
|
432
|
+
end
|
433
|
+
|
434
|
+
case response.body
|
435
|
+
when 'true'
|
436
|
+
return true
|
437
|
+
when 'false'
|
438
|
+
return false
|
439
|
+
else
|
440
|
+
raise "Invalid resposne '#{response.body}'"
|
441
|
+
end
|
442
|
+
end
|
443
|
+
|
444
|
+
def read_file(file)
|
445
|
+
ensure_helper_application_started
|
446
|
+
|
447
|
+
request = HTTP::Request.new('read-file', params_for_request(fileName: file))
|
448
|
+
response = helper_application_http_client.post(request)
|
449
|
+
|
450
|
+
if response.status != 200
|
451
|
+
result = JSON.parse(response.body)
|
452
|
+
raise "Failed to read file. Reason: #{result['reason']}"
|
453
|
+
end
|
454
|
+
|
455
|
+
response.body
|
456
|
+
end
|
457
|
+
|
423
458
|
def calabash_server_failure_exists?(application)
|
424
|
-
|
459
|
+
file_exists?(calabash_server_failure_file_path(application))
|
425
460
|
end
|
426
461
|
|
427
462
|
def calabash_server_finished_exists?(application)
|
428
|
-
|
463
|
+
file_exists?(calabash_server_finished_file_path(application))
|
429
464
|
end
|
430
465
|
|
431
466
|
def read_calabash_sever_failure(application)
|
432
|
-
|
467
|
+
read_file(calabash_server_failure_file_path(application))
|
433
468
|
end
|
434
469
|
|
435
470
|
def read_calabash_sever_finished(application)
|
436
|
-
|
471
|
+
read_file(calabash_server_finished_file_path(application))
|
437
472
|
end
|
438
473
|
|
439
474
|
def clear_calabash_server_report(application)
|
440
475
|
if installed_packages.include?(application.test_server.identifier)
|
441
|
-
|
476
|
+
parameters =
|
477
|
+
{
|
478
|
+
packageName: application.test_server.identifier,
|
479
|
+
className: 'sh.calaba.instrumentationbackend.StatusReporterActivity',
|
480
|
+
extras:
|
481
|
+
{
|
482
|
+
method: 'clear'
|
483
|
+
}
|
484
|
+
}
|
485
|
+
|
486
|
+
ensure_helper_application_started
|
487
|
+
start_activity(parameters)
|
442
488
|
end
|
443
489
|
end
|
444
490
|
|
@@ -450,7 +496,6 @@ module Calabash
|
|
450
496
|
end
|
451
497
|
|
452
498
|
env_options[:test_server_port] = server.test_server_port
|
453
|
-
env_options[:target_package] = application.identifier
|
454
499
|
|
455
500
|
env_options[:class] = options.fetch(:class, 'sh.calaba.instrumentationbackend.InstrumentationBackend')
|
456
501
|
|
@@ -486,9 +531,6 @@ module Calabash
|
|
486
531
|
|
487
532
|
ensure_screen_on
|
488
533
|
|
489
|
-
# Clear any old error reports
|
490
|
-
clear_calabash_server_report(application)
|
491
|
-
|
492
534
|
# We have to forward the port ourselves, as an old test-server could be
|
493
535
|
# running on the old port. If the retriable client was able to
|
494
536
|
# determine if the port had been forwarded, we would not need this.
|
@@ -508,6 +550,9 @@ module Calabash
|
|
508
550
|
end
|
509
551
|
end
|
510
552
|
|
553
|
+
# Clear any old error reports
|
554
|
+
clear_calabash_server_report(application)
|
555
|
+
|
511
556
|
extras = ''
|
512
557
|
|
513
558
|
env_options.each_pair do |key, val|
|
@@ -515,7 +560,7 @@ module Calabash
|
|
515
560
|
end
|
516
561
|
|
517
562
|
begin
|
518
|
-
|
563
|
+
adb_instrument(application,
|
519
564
|
'sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner',
|
520
565
|
extras)
|
521
566
|
rescue ADB::ADBCallError => e
|
@@ -553,10 +598,26 @@ module Calabash
|
|
553
598
|
raise 'Test-server was never ready'
|
554
599
|
end
|
555
600
|
|
601
|
+
start_application(options[:intent])
|
602
|
+
|
556
603
|
# Return true to avoid cluttering the console
|
557
604
|
true
|
558
605
|
end
|
559
606
|
|
607
|
+
# @!visibility private
|
608
|
+
def start_application(intent)
|
609
|
+
request = HTTP::Request.new('start-application', params_for_request(intent: intent))
|
610
|
+
body = http_client.post(request).body
|
611
|
+
|
612
|
+
result = JSON.parse(body)
|
613
|
+
|
614
|
+
if result['outcome'] != 'SUCCESS'
|
615
|
+
raise "Failed to start application. Reason: #{result['reason']}"
|
616
|
+
end
|
617
|
+
|
618
|
+
result['result']
|
619
|
+
end
|
620
|
+
|
560
621
|
# @!visibility private
|
561
622
|
def _stop_app
|
562
623
|
Retriable.retriable(tries: 5, interval: 1) do
|
@@ -605,7 +666,7 @@ module Calabash
|
|
605
666
|
end
|
606
667
|
|
607
668
|
# @!visibility private
|
608
|
-
def
|
669
|
+
def adb_instrument(application, test_server_activity, extras = '')
|
609
670
|
unless application.is_a?(Android::Application)
|
610
671
|
raise ArgumentError, "Invalid application type '#{application.class}'"
|
611
672
|
end
|
@@ -633,11 +694,45 @@ module Calabash
|
|
633
694
|
class EnsureInstrumentActionError < RuntimeError; end
|
634
695
|
|
635
696
|
# @!visibility private
|
636
|
-
def
|
697
|
+
def ensure_adb_instrument_action(application, test_server_activity, extras = '')
|
698
|
+
clear_calabash_server_report(application)
|
699
|
+
|
700
|
+
begin
|
701
|
+
adb_instrument(application, test_server_activity, extras)
|
702
|
+
rescue ADB::ADBCallError => e
|
703
|
+
raise EnsureInstrumentActionError, e
|
704
|
+
end
|
705
|
+
|
706
|
+
begin
|
707
|
+
Timeout.timeout(10) do
|
708
|
+
loop do
|
709
|
+
if calabash_server_failure_exists?(application)
|
710
|
+
failure_message = read_calabash_sever_failure(application)
|
711
|
+
|
712
|
+
raise EnsureInstrumentActionError, parse_failure_message(failure_message)
|
713
|
+
end
|
714
|
+
|
715
|
+
if calabash_server_finished_exists?(application)
|
716
|
+
output = read_calabash_sever_finished(application)
|
717
|
+
|
718
|
+
if output == 'SUCCESSFUL'
|
719
|
+
break
|
720
|
+
end
|
721
|
+
end
|
722
|
+
end
|
723
|
+
end
|
724
|
+
rescue Timeout::Error => _
|
725
|
+
raise EnsureInstrumentActionError, 'Timed out waiting for status'
|
726
|
+
end
|
727
|
+
end
|
728
|
+
|
729
|
+
# @!visibility private
|
730
|
+
def ensure_instrument_action(application, parameters)
|
731
|
+
ensure_helper_application_started
|
637
732
|
clear_calabash_server_report(application)
|
638
733
|
|
639
734
|
begin
|
640
|
-
instrument(
|
735
|
+
instrument(parameters)
|
641
736
|
rescue ADB::ADBCallError => e
|
642
737
|
raise EnsureInstrumentActionError, e
|
643
738
|
end
|
@@ -667,8 +762,14 @@ module Calabash
|
|
667
762
|
|
668
763
|
# @!visibility private
|
669
764
|
def ts_clear_app_data(application)
|
765
|
+
parameters =
|
766
|
+
{
|
767
|
+
className: 'sh.calaba.instrumentationbackend.ClearAppData2',
|
768
|
+
packageName: application.test_server.identifier,
|
769
|
+
}
|
770
|
+
|
670
771
|
begin
|
671
|
-
ensure_instrument_action(application,
|
772
|
+
ensure_instrument_action(application, parameters)
|
672
773
|
rescue EnsureInstrumentActionError => e
|
673
774
|
raise "Failed to clear app data: #{e.message}"
|
674
775
|
end
|
@@ -914,6 +1015,7 @@ module Calabash
|
|
914
1015
|
|
915
1016
|
# @!visibility private
|
916
1017
|
def adb_uninstall_app(package)
|
1018
|
+
@installed_apps_cache = nil
|
917
1019
|
@logger.log "Uninstalling #{package}"
|
918
1020
|
result = adb.command('uninstall', package, timeout: 60).lines.last
|
919
1021
|
|
@@ -928,6 +1030,7 @@ module Calabash
|
|
928
1030
|
|
929
1031
|
# @!visibility private
|
930
1032
|
def adb_install_app(application)
|
1033
|
+
@installed_apps_cache = nil
|
931
1034
|
# Because of a bug in the latest version of ADB
|
932
1035
|
# https://github.com/android/platform_system_core/blob/0f91887868e51de67bdf9aedc97fbcb044dc1969/adb/commandline.cpp#L1466
|
933
1036
|
# ADB now uses rm -f ... to remove the temporary application on the
|
@@ -1024,6 +1127,92 @@ module Calabash
|
|
1024
1127
|
end
|
1025
1128
|
end
|
1026
1129
|
|
1130
|
+
class InstrumentationError < RuntimeError; end
|
1131
|
+
|
1132
|
+
def instrument(parameters, http_client = helper_application_http_client)
|
1133
|
+
request = HTTP::Request.new('instrument', params_for_request(parameters))
|
1134
|
+
|
1135
|
+
body = http_client.post(request).body
|
1136
|
+
result = JSON.parse(body)
|
1137
|
+
|
1138
|
+
if result['outcome'] != 'SUCCESS'
|
1139
|
+
raise InstrumentationError, "Failed to instrument. Reason: #{result['reason']}"
|
1140
|
+
end
|
1141
|
+
|
1142
|
+
true
|
1143
|
+
end
|
1144
|
+
|
1145
|
+
class StartActivityError < RuntimeError; end
|
1146
|
+
|
1147
|
+
def start_activity(parameters, http_client = helper_application_http_client)
|
1148
|
+
request = HTTP::Request.new('start-activity', params_for_request(parameters))
|
1149
|
+
|
1150
|
+
body = http_client.post(request).body
|
1151
|
+
result = JSON.parse(body)
|
1152
|
+
|
1153
|
+
if result['outcome'] != 'SUCCESS'
|
1154
|
+
raise StartActivityError, "Failed to start activity. Reason: #{result['reason']}"
|
1155
|
+
end
|
1156
|
+
|
1157
|
+
true
|
1158
|
+
end
|
1159
|
+
|
1160
|
+
def ensure_helper_application_started
|
1161
|
+
unless $_calabash_helper_application_started
|
1162
|
+
install_helper_application
|
1163
|
+
start_helper_application
|
1164
|
+
$_calabash_helper_application_started = true
|
1165
|
+
end
|
1166
|
+
end
|
1167
|
+
|
1168
|
+
def helper_application
|
1169
|
+
Calabash::Android::Application.new(Calabash::Android::HELPER_APPLICATION,
|
1170
|
+
Calabash::Android::HELPER_APPLICATION_TEST_SERVER)
|
1171
|
+
end
|
1172
|
+
|
1173
|
+
def helper_application_http_client
|
1174
|
+
@helper_application_http_client ||= Calabash::HTTP::ForwardingClient.new(http_client, 8451)
|
1175
|
+
end
|
1176
|
+
|
1177
|
+
# @!visibility private
|
1178
|
+
def install_helper_application
|
1179
|
+
begin
|
1180
|
+
@logger.log "Ensuring helper application is installed"
|
1181
|
+
ensure_app_installed(helper_application)
|
1182
|
+
rescue => e
|
1183
|
+
@logger.log("Unable to install helper application!", :error)
|
1184
|
+
raise e
|
1185
|
+
end
|
1186
|
+
|
1187
|
+
$_calabash_helper_application_installed = true
|
1188
|
+
end
|
1189
|
+
|
1190
|
+
# @!visibility private
|
1191
|
+
def has_installed_helper_application?
|
1192
|
+
$_calabash_helper_application_installed
|
1193
|
+
end
|
1194
|
+
|
1195
|
+
# @!visibility private
|
1196
|
+
def helper_application_responding?
|
1197
|
+
begin
|
1198
|
+
helper_application_http_client.post(HTTP::Request.new('ping'), retries: 1).body == 'pong'
|
1199
|
+
rescue HTTP::Error => _
|
1200
|
+
false
|
1201
|
+
end
|
1202
|
+
end
|
1203
|
+
|
1204
|
+
def start_helper_application
|
1205
|
+
extras = "-e test_server_port 8451"
|
1206
|
+
name = "#{helper_application.test_server.identifier}/sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner"
|
1207
|
+
cmd = "am instrument #{extras} #{name}"
|
1208
|
+
Logger.debug("Starting global helper application using #{cmd}")
|
1209
|
+
adb.shell(cmd)
|
1210
|
+
|
1211
|
+
cmd = "am start -e port #{server.test_server_port} -e testServerPort 0 -n #{helper_application.identifier}/.MainActivity"
|
1212
|
+
Logger.debug("Starting helper application using #{cmd}")
|
1213
|
+
adb.shell(cmd)
|
1214
|
+
end
|
1215
|
+
|
1027
1216
|
# @!visibility private
|
1028
1217
|
def params_for_request(parameters)
|
1029
1218
|
{json: parameters.to_json}
|
@@ -1036,6 +1225,9 @@ module Calabash
|
|
1036
1225
|
else
|
1037
1226
|
if adb.shell('md5', no_exit_code_check: true).chomp == 'md5 file ...'
|
1038
1227
|
@md5_binary = 'md5'
|
1228
|
+
elsif (r = adb.shell('md5sum _cal_no_such_file', no_exit_code_check: true)) && r.chomp.start_with?('md5sum:') &&
|
1229
|
+
!r.include?('permission denied')
|
1230
|
+
@md5_binary = 'md5sum'
|
1039
1231
|
else
|
1040
1232
|
# The device does not have 'md5'
|
1041
1233
|
calmd5 = Calabash::Android.binary_location('calmd5', info[:cpu_architecture], can_handle_pie_binaries?)
|
Binary file
|
Binary file
|
Binary file
|
data/lib/calabash/http.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
module Calabash
|
2
|
+
module HTTP
|
3
|
+
class ForwardingClient
|
4
|
+
HEADER_FORWARD = 'X-FORWARD-PORT'
|
5
|
+
ROUTES = [:get, :post, :put, :delete]
|
6
|
+
|
7
|
+
def initialize(client, forward_to_port)
|
8
|
+
@client = client
|
9
|
+
@forward_to_port = forward_to_port
|
10
|
+
end
|
11
|
+
|
12
|
+
ROUTES.each do |route|
|
13
|
+
define_method(route) do |request, options = {}|
|
14
|
+
new_options = options.clone
|
15
|
+
new_options[:header] ||= {}
|
16
|
+
new_options[:header][HEADER_FORWARD] = @forward_to_port.to_s
|
17
|
+
|
18
|
+
@client.send(route, request, new_options)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -33,6 +33,9 @@ module Calabash
|
|
33
33
|
'Content-Type' => 'application/json;charset=utf-8'
|
34
34
|
}
|
35
35
|
|
36
|
+
# @!visibility private
|
37
|
+
attr_accessor :port_forward
|
38
|
+
|
36
39
|
# Creates a new retriable client.
|
37
40
|
#
|
38
41
|
# This initializer takes multiple options. If the option is not
|
@@ -107,7 +110,7 @@ module Calabash
|
|
107
110
|
retries = options.fetch(:retries, @retries)
|
108
111
|
timeout = options.fetch(:timeout, @timeout)
|
109
112
|
interval = options.fetch(:interval, @interval)
|
110
|
-
header = options.fetch(:header,
|
113
|
+
header = HEADER.merge(options.fetch(:header, {}))
|
111
114
|
|
112
115
|
@logger.log "Getting: #{@server.endpoint + request.route} #{options}"
|
113
116
|
|
data/lib/calabash/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: calabash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.pre10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonas Maturana Larsen
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2016-
|
14
|
+
date: 2016-04-07 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: edn
|
@@ -392,6 +392,8 @@ files:
|
|
392
392
|
- lib/calabash/android/legacy.rb
|
393
393
|
- lib/calabash/android/lib/.irbrc
|
394
394
|
- lib/calabash/android/lib/AndroidManifest.xml
|
395
|
+
- lib/calabash/android/lib/HelperApplication.apk
|
396
|
+
- lib/calabash/android/lib/HelperApplicationTestServer.apk
|
395
397
|
- lib/calabash/android/lib/TestServer.apk
|
396
398
|
- lib/calabash/android/lib/calmd5/arm64-v8a/calmd5
|
397
399
|
- lib/calabash/android/lib/calmd5/arm64-v8a/calmd5-pie
|
@@ -432,6 +434,7 @@ files:
|
|
432
434
|
- lib/calabash/gestures.rb
|
433
435
|
- lib/calabash/http.rb
|
434
436
|
- lib/calabash/http/error.rb
|
437
|
+
- lib/calabash/http/forwarding_client.rb
|
435
438
|
- lib/calabash/http/request.rb
|
436
439
|
- lib/calabash/http/retriable_client.rb
|
437
440
|
- lib/calabash/interactions.rb
|