testautoa 0.4.0.pre19 → 0.4.0
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/Rakefile +7 -7
- data/bin/calabash-android +1 -8
- data/bin/calabash-android-build.rb +1 -1
- data/bin/calabash-android-console.rb +4 -4
- data/bin/calabash-android-run.rb +10 -2
- data/calabash-android.gemspec +0 -1
- data/irbrc +0 -2
- data/lib/calabash-android/helpers.rb +17 -45
- data/lib/calabash-android/lib/TestServer.apk +0 -0
- data/lib/calabash-android/operations.rb +43 -144
- data/lib/calabash-android/steps/list_steps.rb +1 -1
- data/lib/calabash-android/steps/time_picker_steps.rb +1 -1
- data/lib/calabash-android/version.rb +1 -1
- data/test-server/AndroidManifest.xml +0 -2
- data/test-server/build.xml +0 -1
- data/test-server/instrumentation-backend/.classpath +1 -0
- data/test-server/instrumentation-backend/AndroidManifest.xml +1 -1
- data/test-server/instrumentation-backend/antlr/UIQuery.g +5 -48
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Command.java +3 -4
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Result.java +1 -7
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/HttpServer.java +29 -14
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/Swipe.java +5 -11
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/location/FakeGPSLocation.java +10 -13
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/CalabashChromeClient.java +36 -131
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpBodyHtml.java +18 -38
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpHtml.java +16 -38
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/EnterTextByCssSelector.java +66 -94
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteAsyncJavascript.java +33 -55
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteJavascript.java +31 -53
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/PressByCssSelector.java +27 -52
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Query.java +24 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/QueryHelper.java +32 -39
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ScrollTo.java +41 -56
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetPropertyByCssSelector.java +25 -50
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetText.java +22 -19
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Touch.java +44 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Query.java +43 -155
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQuery.tokens +12 -19
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ViewMapper.java +11 -41
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQuery.tokens +10 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryLexer.java +242 -1010
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryParser.java +98 -406
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryAST.java +1 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTClassName.java +25 -52
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTWith.java +89 -153
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryDirection.java +2 -12
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryEvaluator.java +141 -58
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryUtils.java +7 -157
- data/test-server/instrumentation-backend/tests/sh/calaba/instrumentationbackend/query/tests/UIQueryTest.java +134 -0
- metadata +98 -128
- data/lib/calabash-android/lib/unsign.jar +0 -0
- data/lib/calabash-android/wait_helpers.rb +0 -93
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/FranklyResult.java +0 -95
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/FinishOpenedActivities.java +0 -19
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/GetOpenedActivities.java +0 -31
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/GoBackToActivity.java +0 -67
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/DragCoordinates.java +0 -28
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/LeftKey.java +0 -24
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/RightKey.java +0 -24
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/UpKey.java +0 -24
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/version/Version.java +0 -31
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/JavaScriptOperation.java +0 -44
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/CompletedFuture.java +0 -40
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/InvocationOperation.java +0 -222
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Operation.java +0 -7
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/PropertyOperation.java +0 -56
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQueryResultVoid.java +0 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/BeginsWithRelation.java +0 -45
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/ComparisonOperator.java +0 -54
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/ContainsRelation.java +0 -41
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/EndsWithRelation.java +0 -42
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/LikeRelation.java +0 -79
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/PartialFutureList.java +0 -100
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTPredicate.java +0 -147
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTPredicateRelation.java +0 -5
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryVisibility.java +0 -32
data/Rakefile
CHANGED
|
@@ -3,19 +3,18 @@ load 'lib/calabash-android/helpers.rb'
|
|
|
3
3
|
|
|
4
4
|
def build
|
|
5
5
|
test_server_template_dir = File.join(File.dirname(__FILE__), 'test-server')
|
|
6
|
-
|
|
6
|
+
|
|
7
7
|
Dir.mktmpdir do |workspace_dir|
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
@test_server_dir = File.join(workspace_dir, 'test-server')
|
|
10
10
|
FileUtils.cp_r(test_server_template_dir, workspace_dir)
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
ant_executable = (is_windows? ? "ant.bat" : "ant")
|
|
13
13
|
args = [
|
|
14
14
|
ant_executable,
|
|
15
|
-
"clean",
|
|
15
|
+
"clean",
|
|
16
16
|
"package",
|
|
17
17
|
"-Dandroid.api.level=16",
|
|
18
|
-
"-Dversion=#{Calabash::Android::VERSION}",
|
|
19
18
|
]
|
|
20
19
|
Dir.chdir(@test_server_dir) do
|
|
21
20
|
STDOUT.sync = true
|
|
@@ -29,11 +28,13 @@ def build
|
|
|
29
28
|
end
|
|
30
29
|
|
|
31
30
|
FileUtils.mkdir_p "test_servers" unless File.exist? "test_servers"
|
|
32
|
-
|
|
31
|
+
|
|
33
32
|
FileUtils.cp(File.join(@test_server_dir, "bin", "Test_unsigned.apk"), File.join(File.dirname(__FILE__), 'lib/calabash-android/lib/TestServer.apk'))
|
|
34
33
|
end
|
|
35
34
|
end
|
|
36
35
|
|
|
36
|
+
|
|
37
|
+
|
|
37
38
|
task :build do
|
|
38
39
|
unless File.exists? "test-server/calabash-js/src"
|
|
39
40
|
puts "calabash-js not found!"
|
|
@@ -47,5 +48,4 @@ task :build do
|
|
|
47
48
|
|
|
48
49
|
end
|
|
49
50
|
|
|
50
|
-
|
|
51
51
|
Bundler::GemHelper.install_tasks
|
data/bin/calabash-android
CHANGED
|
@@ -1,15 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
|
|
3
3
|
require 'fileutils'
|
|
4
|
-
require 'rbconfig'
|
|
5
4
|
require 'calabash-android/helpers'
|
|
6
5
|
|
|
7
|
-
# for ruby 1.9.1 and earlier
|
|
8
|
-
unless defined? RbConfig.ruby
|
|
9
|
-
def RbConfig.ruby
|
|
10
|
-
File.join(RbConfig::CONFIG["bindir"], RbConfig::CONFIG["ruby_install_name"] + RbConfig::CONFIG["EXEEXT"])
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
6
|
|
|
14
7
|
require File.join(File.dirname(__FILE__), "calabash-android-helpers")
|
|
15
8
|
require File.join(File.dirname(__FILE__), "calabash-android-generate")
|
|
@@ -69,7 +62,7 @@ elsif cmd == 'console'
|
|
|
69
62
|
puts "No such file #{ARGV.first}"
|
|
70
63
|
exit 1
|
|
71
64
|
end
|
|
72
|
-
calabash_console
|
|
65
|
+
calabash_console ARGV.first
|
|
73
66
|
exit 0
|
|
74
67
|
elsif cmd == 'setup'
|
|
75
68
|
calabash_setup
|
|
@@ -18,7 +18,7 @@ def calabash_build(app)
|
|
|
18
18
|
FileUtils.cp(unsigned_test_apk, "TestServer.apk")
|
|
19
19
|
FileUtils.cp(File.join(File.dirname(__FILE__), '..', 'test-server/AndroidManifest.xml'), "AndroidManifest.xml")
|
|
20
20
|
|
|
21
|
-
unless system %Q{
|
|
21
|
+
unless system %Q{ruby -pi.bak -e "gsub(/#targetPackage#/, '#{package_name(app)}')" AndroidManifest.xml}
|
|
22
22
|
raise "Could not replace package name in manifest"
|
|
23
23
|
end
|
|
24
24
|
|
|
@@ -5,7 +5,9 @@ def calabash_console(app_path = nil)
|
|
|
5
5
|
ENV["TEST_SERVER_PORT"] = "34777"
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
-
ENV["IRBRC"]
|
|
8
|
+
unless ENV["IRBRC"]
|
|
9
|
+
ENV["IRBRC"] = File.join(File.dirname(__FILE__), '..', 'irbrc')
|
|
10
|
+
end
|
|
9
11
|
|
|
10
12
|
unless ENV["PACKAGE_NAME"]
|
|
11
13
|
ENV["PACKAGE_NAME"] = package_name(app_path)
|
|
@@ -23,7 +25,5 @@ def calabash_console(app_path = nil)
|
|
|
23
25
|
ENV["TEST_APP_PATH"] = test_server_path
|
|
24
26
|
end
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
system "#{RbConfig.ruby} -S irb"
|
|
28
|
+
system "irb"
|
|
29
29
|
end
|
data/bin/calabash-android-run.rb
CHANGED
|
@@ -13,7 +13,15 @@ def calabash_run(app_path = nil)
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
if app_path
|
|
16
|
-
|
|
16
|
+
unless File.exist?(test_server_path(app_path))
|
|
17
|
+
if ARGV.include? "--no-build"
|
|
18
|
+
puts "No test server found for this combination of app and calabash version. Exiting!"
|
|
19
|
+
exit 1
|
|
20
|
+
else
|
|
21
|
+
puts "No test server found for this combination of app and calabash version. Recreating test server."
|
|
22
|
+
calabash_build(app_path)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
17
25
|
|
|
18
26
|
test_server_path = test_server_path(app_path)
|
|
19
27
|
if ENV["TEST_SERVER_PORT"]
|
|
@@ -32,7 +40,7 @@ def calabash_run(app_path = nil)
|
|
|
32
40
|
|
|
33
41
|
STDOUT.sync = true
|
|
34
42
|
arguments = ARGV - ["--no-build"]
|
|
35
|
-
cmd = "
|
|
43
|
+
cmd = "cucumber #{arguments.join(" ")} #{env}"
|
|
36
44
|
log cmd
|
|
37
45
|
exit_code = system(cmd)
|
|
38
46
|
|
data/calabash-android.gemspec
CHANGED
data/irbrc
CHANGED
|
@@ -38,27 +38,22 @@ def test_server_path(apk_file_path)
|
|
|
38
38
|
"test_servers/#{checksum(apk_file_path)}_#{Calabash::Android::VERSION}.apk"
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
def build_test_server_if_needed(app_path)
|
|
43
|
-
unless File.exist?(test_server_path(app_path))
|
|
44
|
-
if ARGV.include? "--no-build"
|
|
45
|
-
puts "No test server found for this combination of app and calabash version. Exiting!"
|
|
46
|
-
exit 1
|
|
47
|
-
else
|
|
48
|
-
puts "No test server found for this combination of app and calabash version. Recreating test server."
|
|
49
|
-
calabash_build(app_path)
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
41
|
def resign_apk(app_path)
|
|
55
42
|
Dir.mktmpdir do |tmp_dir|
|
|
56
43
|
log "Resign apk"
|
|
57
44
|
unsigned_path = File.join(tmp_dir, 'unsigned.apk')
|
|
58
45
|
FileUtils.cp(app_path, unsigned_path)
|
|
59
46
|
|
|
60
|
-
|
|
47
|
+
#Delete META-INF/*
|
|
48
|
+
to_remove = Zip::ZipFile.foreach(unsigned_path).find_all { |e| /^META-INF\// =~ e.name}.collect &:name
|
|
61
49
|
|
|
50
|
+
Zip::ZipFile.open(unsigned_path) do |zip_file|
|
|
51
|
+
to_remove.each do |x|
|
|
52
|
+
log "Removing #{x}"
|
|
53
|
+
zip_file.remove x
|
|
54
|
+
end
|
|
55
|
+
zip_file.commit
|
|
56
|
+
end
|
|
62
57
|
sign_apk(unsigned_path, app_path)
|
|
63
58
|
end
|
|
64
59
|
end
|
|
@@ -72,7 +67,7 @@ def sign_apk(app_path, dest_path)
|
|
|
72
67
|
jarsigner_path = "jarsigner"
|
|
73
68
|
end
|
|
74
69
|
|
|
75
|
-
cmd = "#{jarsigner_path} -sigalg MD5withRSA -digestalg SHA1 -signedjar #{dest_path} -storepass #{keystore["keystore_password"]} -keystore #{keystore["keystore_location"]} #{app_path} #{keystore["keystore_alias"]}"
|
|
70
|
+
cmd = "#{jarsigner_path} -sigalg MD5withRSA -digestalg SHA1 -signedjar #{dest_path} -storepass #{keystore["keystore_password"]} -keystore \"#{File.expand_path keystore["keystore_location"]}\" #{app_path} #{keystore["keystore_alias"]}"
|
|
76
71
|
log cmd
|
|
77
72
|
unless system(cmd)
|
|
78
73
|
puts "jarsigner command: #{cmd}"
|
|
@@ -82,32 +77,19 @@ end
|
|
|
82
77
|
|
|
83
78
|
def read_keystore_info
|
|
84
79
|
if File.exist? ".calabash_settings"
|
|
85
|
-
|
|
86
|
-
keystore["keystore_location"] = '"' + File.expand_path(keystore["keystore_location"]) + '"' if keystore["keystore_location"]
|
|
87
|
-
keystore
|
|
80
|
+
JSON.parse(IO.read(".calabash_settings"))
|
|
88
81
|
else
|
|
89
82
|
{
|
|
90
|
-
"keystore_location" =>
|
|
83
|
+
"keystore_location" => "#{ENV["HOME"]}/.android/debug.keystore",
|
|
91
84
|
"keystore_password" => "android",
|
|
92
85
|
"keystore_alias" => "androiddebugkey",
|
|
93
86
|
}
|
|
94
87
|
end
|
|
95
88
|
end
|
|
96
89
|
|
|
97
|
-
def keytool_path
|
|
98
|
-
if is_windows?
|
|
99
|
-
"\"#{ENV["JAVA_HOME"]}/bin/keytool.exe\""
|
|
100
|
-
else
|
|
101
|
-
"keytool"
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
|
|
105
90
|
def fingerprint_from_keystore
|
|
106
91
|
keystore_info = read_keystore_info
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
log cmd
|
|
110
|
-
fingerprints = `#{cmd}`
|
|
92
|
+
fingerprints = `keytool -v -list -alias #{keystore_info["keystore_alias"]} -keystore #{keystore_info["keystore_location"]} -storepass #{keystore_info["keystore_password"]}`
|
|
111
93
|
md5_fingerprint = extract_md5_fingerprint(fingerprints)
|
|
112
94
|
log "MD5 fingerprint for keystore (#{keystore_info["keystore_location"]}): #{md5_fingerprint}"
|
|
113
95
|
md5_fingerprint
|
|
@@ -125,9 +107,7 @@ def fingerprint_from_apk(app_path)
|
|
|
125
107
|
raise "No RSA file found in META-INF. Cannot proceed." if rsa_files.empty?
|
|
126
108
|
raise "More than one RSA file found in META-INF. Cannot proceed." if rsa_files.length > 1
|
|
127
109
|
|
|
128
|
-
|
|
129
|
-
log cmd
|
|
130
|
-
fingerprints = `#{cmd}`
|
|
110
|
+
fingerprints = `keytool -v -printcert -file #{rsa_files.first}`
|
|
131
111
|
md5_fingerprint = extract_md5_fingerprint(fingerprints)
|
|
132
112
|
log "MD5 fingerprint for signing cert (#{app_path}): #{md5_fingerprint}"
|
|
133
113
|
md5_fingerprint
|
|
@@ -136,17 +116,9 @@ def fingerprint_from_apk(app_path)
|
|
|
136
116
|
end
|
|
137
117
|
|
|
138
118
|
def extract_md5_fingerprint(fingerprints)
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
if fingerprints.encoding.name == "CP850"
|
|
143
|
-
fingerprints = fingerprints.gsub("\xA0".force_encoding("CP850"),"")
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
m = fingerprints.scan(/MD5\s*:\s*((?:[a-fA-F\d]{2}:){15}[a-fA-F\d]{2})/).flatten
|
|
148
|
-
raise "No MD5 fingerprint found:\n #{fingerprints}" if m.empty?
|
|
149
|
-
m.first
|
|
119
|
+
m = fingerprints.scan(/MD5:\s+((?:[[:xdigit:]][[:xdigit:]]:){15}[[:xdigit:]][[:xdigit:]])/)
|
|
120
|
+
raise "No MD5 fingerprint found:\n #{fingerprints}" unless m
|
|
121
|
+
m.last.first
|
|
150
122
|
end
|
|
151
123
|
|
|
152
124
|
def is_windows?
|
|
Binary file
|
|
@@ -6,16 +6,13 @@ require 'json'
|
|
|
6
6
|
require 'socket'
|
|
7
7
|
require 'timeout'
|
|
8
8
|
require 'calabash-android/helpers'
|
|
9
|
-
require 'calabash-android/wait_helpers'
|
|
10
|
-
require 'calabash-android/version'
|
|
11
9
|
require 'retriable'
|
|
12
|
-
require 'cucumber'
|
|
13
10
|
|
|
14
11
|
|
|
15
12
|
module Calabash module Android
|
|
16
13
|
|
|
17
14
|
module Operations
|
|
18
|
-
|
|
15
|
+
|
|
19
16
|
|
|
20
17
|
def log(message)
|
|
21
18
|
$stdout.puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S")} - #{message}" if (ARGV.include? "-v" or ARGV.include? "--verbose")
|
|
@@ -26,13 +23,12 @@ module Operations
|
|
|
26
23
|
end
|
|
27
24
|
|
|
28
25
|
def macro(txt)
|
|
29
|
-
if self.respond_to
|
|
26
|
+
if self.respond_to?:step
|
|
30
27
|
step(txt)
|
|
31
28
|
else
|
|
32
29
|
Then(txt)
|
|
33
30
|
end
|
|
34
31
|
end
|
|
35
|
-
|
|
36
32
|
def default_device
|
|
37
33
|
unless @default_device
|
|
38
34
|
@default_device = Device.new(self, ENV["ADB_DEVICE_ARG"], ENV["TEST_SERVER_PORT"], ENV["APP_PATH"], ENV["TEST_APP_PATH"])
|
|
@@ -40,22 +36,10 @@ module Operations
|
|
|
40
36
|
@default_device
|
|
41
37
|
end
|
|
42
38
|
|
|
43
|
-
def set_default_device(device)
|
|
44
|
-
@default_device = device
|
|
45
|
-
end
|
|
46
|
-
|
|
47
39
|
def performAction(action, *arguments)
|
|
48
40
|
default_device.perform_action(action, *arguments)
|
|
49
41
|
end
|
|
50
42
|
|
|
51
|
-
def reinstall_apps
|
|
52
|
-
default_device.reinstall_apps
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def reinstall_test_server
|
|
56
|
-
default_device.reinstall_test_server
|
|
57
|
-
end
|
|
58
|
-
|
|
59
43
|
def install_app(app_path)
|
|
60
44
|
default_device.install_app(app_path)
|
|
61
45
|
end
|
|
@@ -73,7 +57,7 @@ module Operations
|
|
|
73
57
|
default_device.clear_app_data
|
|
74
58
|
end
|
|
75
59
|
|
|
76
|
-
def start_test_server_in_background
|
|
60
|
+
def start_test_server_in_background
|
|
77
61
|
default_device.start_test_server_in_background()
|
|
78
62
|
end
|
|
79
63
|
|
|
@@ -98,49 +82,32 @@ module Operations
|
|
|
98
82
|
default_device.set_gps_coordinates(latitude, longitude)
|
|
99
83
|
end
|
|
100
84
|
|
|
101
|
-
def
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
# end
|
|
113
|
-
# rescue Exception => e
|
|
114
|
-
# raise e
|
|
115
|
-
# end
|
|
116
|
-
# value
|
|
117
|
-
#end
|
|
85
|
+
def wait_for(timeout, &block)
|
|
86
|
+
begin
|
|
87
|
+
Timeout::timeout(timeout) do
|
|
88
|
+
until block.call
|
|
89
|
+
sleep 0.3
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
rescue Exception => e
|
|
93
|
+
raise e
|
|
94
|
+
end
|
|
95
|
+
end
|
|
118
96
|
|
|
119
97
|
def query(uiquery, *args)
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if
|
|
123
|
-
|
|
98
|
+
if uiquery.start_with? "webView"
|
|
99
|
+
uiquery.slice!(0, "webView".length)
|
|
100
|
+
if uiquery =~ /(css|xpath):\s*(.*)/
|
|
101
|
+
r = performAction("query", $1, $2)
|
|
102
|
+
JSON.parse(r["message"])
|
|
124
103
|
else
|
|
125
|
-
|
|
104
|
+
raise "Invalid query #{uiquery}"
|
|
126
105
|
end
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
uiquery = opts[:query] || "android.widget.ListView"
|
|
133
|
-
skip_if = opts[:skip_if] || lambda { |i| false }
|
|
134
|
-
stop_when = opts[:stop_when] || lambda { |i| false }
|
|
135
|
-
check_element_exists(uiquery)
|
|
136
|
-
num_items = query(opts[:query], :adapter, :count).first
|
|
137
|
-
num_items.times do |item|
|
|
138
|
-
next if skip_if.call(item)
|
|
139
|
-
break if stop_when.call(item)
|
|
140
|
-
|
|
141
|
-
scroll_to_row(opts[:query], item)
|
|
142
|
-
sleep(opts[:post_scroll]) if opts[:post_scroll] and opts[:post_scroll] > 0
|
|
143
|
-
yield(item)
|
|
106
|
+
else
|
|
107
|
+
arguments = [*args]
|
|
108
|
+
operation = {"method_name"=>"query", "arguments" => arguments}
|
|
109
|
+
data = {"query" => uiquery, "operation" => operation}
|
|
110
|
+
JSON.parse(http("/map",data))
|
|
144
111
|
end
|
|
145
112
|
end
|
|
146
113
|
|
|
@@ -165,6 +132,10 @@ module Operations
|
|
|
165
132
|
|
|
166
133
|
class Device
|
|
167
134
|
|
|
135
|
+
def make_default_device
|
|
136
|
+
@cucumber_world.default_device = self
|
|
137
|
+
end
|
|
138
|
+
|
|
168
139
|
def initialize(cucumber_world, serial, server_port, app_path, test_server_path)
|
|
169
140
|
@cucumber_world = cucumber_world
|
|
170
141
|
@serial = serial
|
|
@@ -180,10 +151,6 @@ module Operations
|
|
|
180
151
|
def reinstall_apps()
|
|
181
152
|
uninstall_app(package_name(@app_path))
|
|
182
153
|
install_app(@app_path)
|
|
183
|
-
reinstall_test_server()
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
def reinstall_test_server()
|
|
187
154
|
uninstall_app(package_name(@test_server_path))
|
|
188
155
|
install_app(@test_server_path)
|
|
189
156
|
end
|
|
@@ -197,7 +164,7 @@ module Operations
|
|
|
197
164
|
succeeded = `#{adb_command} shell pm list packages`.include?("package:#{pn}")
|
|
198
165
|
|
|
199
166
|
unless succeeded
|
|
200
|
-
|
|
167
|
+
Cucumber.wants_to_quit = true
|
|
201
168
|
raise "#{pn} did not get installed. Aborting!"
|
|
202
169
|
end
|
|
203
170
|
end
|
|
@@ -344,30 +311,14 @@ module Operations
|
|
|
344
311
|
raise "Could not clear data" unless system(cmd)
|
|
345
312
|
end
|
|
346
313
|
|
|
347
|
-
def start_test_server_in_background
|
|
348
|
-
raise "Will not start test server because of previous failures." if
|
|
314
|
+
def start_test_server_in_background
|
|
315
|
+
raise "Will not start test server because of previous failures." if Cucumber.wants_to_quit
|
|
349
316
|
|
|
350
317
|
if keyguard_enabled?
|
|
351
318
|
wake_up
|
|
352
319
|
end
|
|
353
320
|
|
|
354
|
-
|
|
355
|
-
:main_activity => options[:main_activity] || main_activity(@app_path),
|
|
356
|
-
:debug => options[:debug] || false,
|
|
357
|
-
:class => options[:class] || "sh.calaba.instrumentationbackend.InstrumentationBackend"}
|
|
358
|
-
|
|
359
|
-
cmd_arr = [adb_command, "shell am instrument"]
|
|
360
|
-
|
|
361
|
-
env_options.each_pair do |key, val|
|
|
362
|
-
cmd_arr << "-e"
|
|
363
|
-
cmd_arr << key.to_s
|
|
364
|
-
cmd_arr << val.to_s
|
|
365
|
-
end
|
|
366
|
-
|
|
367
|
-
cmd_arr << "sh.calaba.android.test/sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner"
|
|
368
|
-
|
|
369
|
-
cmd = cmd_arr.join(" ")
|
|
370
|
-
|
|
321
|
+
cmd = "#{adb_command} shell am instrument -e target_package #{ENV["PACKAGE_NAME"]} -e main_activity #{ENV["MAIN_ACTIVITY"]} -e class sh.calaba.instrumentationbackend.InstrumentationBackend sh.calaba.android.test/sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner"
|
|
371
322
|
log "Starting test server using:"
|
|
372
323
|
log cmd
|
|
373
324
|
raise "Could not execute command to start test server" unless system("#{cmd} 2>&1")
|
|
@@ -389,37 +340,12 @@ module Operations
|
|
|
389
340
|
log "Instrumentation backend is ready!"
|
|
390
341
|
end
|
|
391
342
|
end
|
|
392
|
-
rescue Exception => e
|
|
393
343
|
|
|
344
|
+
rescue
|
|
394
345
|
msg = "Unable to make connection to Calabash Test Server at http://127.0.0.1:#{@server_port}/\n"
|
|
395
346
|
msg << "Please check the logcat output for more info about what happened\n"
|
|
396
347
|
raise msg
|
|
397
348
|
end
|
|
398
|
-
|
|
399
|
-
log "Checking client-server version match..."
|
|
400
|
-
response = perform_action('version')
|
|
401
|
-
unless response['success']
|
|
402
|
-
msg = ["Unable to obtain Test Server version. "]
|
|
403
|
-
msg << "Please run 'reinstall_test_server' to make sure you have the correct version"
|
|
404
|
-
msg_s = msg.join("\n")
|
|
405
|
-
log(msg_s)
|
|
406
|
-
raise msg_s
|
|
407
|
-
end
|
|
408
|
-
unless response['message'] == Calabash::Android::VERSION
|
|
409
|
-
|
|
410
|
-
msg = ["Calabash Client and Test-server version mismatch."]
|
|
411
|
-
msg << "Client version #{Calabash::Android::VERSION}"
|
|
412
|
-
msg << "Test-server version #{response['message']}"
|
|
413
|
-
msg << "Expected Test-server version #{Calabash::Android::VERSION}"
|
|
414
|
-
msg << "\n\nSolution:\n\n"
|
|
415
|
-
msg << "Run 'reinstall_test_server' to make sure you have the correct version"
|
|
416
|
-
msg_s = msg.join("\n")
|
|
417
|
-
log(msg_s)
|
|
418
|
-
raise msg_s
|
|
419
|
-
end
|
|
420
|
-
log("Client and server versions match. Proceeding...")
|
|
421
|
-
|
|
422
|
-
|
|
423
349
|
end
|
|
424
350
|
|
|
425
351
|
def shutdown_test_server
|
|
@@ -443,15 +369,6 @@ module Operations
|
|
|
443
369
|
def set_gps_coordinates(latitude, longitude)
|
|
444
370
|
perform_action('set_gps_coordinates', latitude, longitude)
|
|
445
371
|
end
|
|
446
|
-
|
|
447
|
-
def input_keyevent(keycode)
|
|
448
|
-
cmd = "#{adb_command} shell input keyevent #{keycode.to_s}"
|
|
449
|
-
result = `#{cmd}`
|
|
450
|
-
end
|
|
451
|
-
|
|
452
|
-
def press_back_key
|
|
453
|
-
input_keyevent(4)
|
|
454
|
-
end
|
|
455
372
|
end
|
|
456
373
|
|
|
457
374
|
|
|
@@ -462,24 +379,22 @@ module Operations
|
|
|
462
379
|
|
|
463
380
|
def screenshot_and_raise(msg)
|
|
464
381
|
screenshot_embed
|
|
382
|
+
sleep 5
|
|
465
383
|
raise(msg)
|
|
466
384
|
end
|
|
467
385
|
|
|
468
386
|
def touch(uiquery,*args)
|
|
469
|
-
raise "Cannot touch nil" unless uiquery
|
|
470
|
-
|
|
471
387
|
if uiquery.instance_of? String
|
|
472
388
|
elements = query(uiquery, *args)
|
|
473
|
-
raise "No elements found
|
|
389
|
+
raise "No elements found" if elements.empty?
|
|
474
390
|
element = elements.first
|
|
475
391
|
else
|
|
476
392
|
element = uiquery
|
|
477
|
-
element = element.first if element.instance_of?(Array)
|
|
478
393
|
end
|
|
479
394
|
|
|
480
395
|
|
|
481
|
-
center_x = element["
|
|
482
|
-
center_y = element["
|
|
396
|
+
center_x = element["frame"]["x"] + element["frame"]["width"] / 2
|
|
397
|
+
center_y = element["frame"]["y"] + element["frame"]["height"] / 2
|
|
483
398
|
performAction("touch_coordinate", center_x, center_y)
|
|
484
399
|
end
|
|
485
400
|
|
|
@@ -521,8 +436,7 @@ module Operations
|
|
|
521
436
|
end
|
|
522
437
|
|
|
523
438
|
def scroll_to_row(uiquery,number)
|
|
524
|
-
|
|
525
|
-
puts "TODO:detect end of scroll - use sleep for now"
|
|
439
|
+
ni
|
|
526
440
|
end
|
|
527
441
|
|
|
528
442
|
def pinch(in_out,options={})
|
|
@@ -537,16 +451,12 @@ module Operations
|
|
|
537
451
|
ni
|
|
538
452
|
end
|
|
539
453
|
|
|
540
|
-
def element_does_not_exist(uiquery)
|
|
541
|
-
query(uiquery).empty?
|
|
542
|
-
end
|
|
543
|
-
|
|
544
454
|
def element_exists(uiquery)
|
|
545
|
-
|
|
455
|
+
!query(uiquery).empty?
|
|
546
456
|
end
|
|
547
457
|
|
|
548
458
|
def view_with_mark_exists(expected_mark)
|
|
549
|
-
element_exists( "
|
|
459
|
+
element_exists( "view marked:'#{expected_mark}'" )
|
|
550
460
|
end
|
|
551
461
|
|
|
552
462
|
def check_element_exists( query )
|
|
@@ -595,19 +505,8 @@ module Operations
|
|
|
595
505
|
ni
|
|
596
506
|
end
|
|
597
507
|
|
|
598
|
-
def map(query, method_name, *method_args)
|
|
599
|
-
|
|
600
|
-
:method_name => method_name,
|
|
601
|
-
:arguments => method_args
|
|
602
|
-
}
|
|
603
|
-
res = http("/map",
|
|
604
|
-
{:query => query, :operation => operation_map})
|
|
605
|
-
res = JSON.parse(res)
|
|
606
|
-
if res['outcome'] != 'SUCCESS'
|
|
607
|
-
screenshot_and_raise "map #{query}, #{method_name} failed because: #{res['reason']}\n#{res['details']}"
|
|
608
|
-
end
|
|
609
|
-
|
|
610
|
-
res['results']
|
|
508
|
+
def map( query, method_name, *method_args )
|
|
509
|
+
ni
|
|
611
510
|
end
|
|
612
511
|
|
|
613
512
|
def url_for( verb )
|
|
@@ -26,7 +26,7 @@ Then /^The "([^\"]*)" for row (\d+) should be "([^\"]*)"$/ do | view_id, row, va
|
|
|
26
26
|
|
|
27
27
|
if( response['children'] )
|
|
28
28
|
found_id = false
|
|
29
|
-
response['children']
|
|
29
|
+
response['children'] each do | view |
|
|
30
30
|
if( view['id'] == view_id )
|
|
31
31
|
raise "Text is #{view['text']}, expected #{value}" unless( view['text'] == value )
|
|
32
32
|
found_id = true
|
|
@@ -4,5 +4,5 @@ Given /^I set the time to "(\d\d:\d\d)" on TimePicker with index "([^\"]*)"$/ do
|
|
|
4
4
|
end
|
|
5
5
|
|
|
6
6
|
Given /^I set the "([^\"]*)" time to "(\d\d:\d\d)"$/ do |content_description, time|
|
|
7
|
-
performAction('set_time_with_description',
|
|
7
|
+
performAction('set_time_with_description', time, content_description)
|
|
8
8
|
end
|
|
@@ -22,8 +22,6 @@
|
|
|
22
22
|
|
|
23
23
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
|
24
24
|
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
|
|
25
|
-
<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION"/>
|
|
26
|
-
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
|
27
25
|
<uses-permission android:name="android.permission.INTERNET" />
|
|
28
26
|
|
|
29
27
|
</manifest>
|
data/test-server/build.xml
CHANGED
|
@@ -69,7 +69,6 @@
|
|
|
69
69
|
<copy todir="${staging.dir}/assets">
|
|
70
70
|
<fileset dir="${calabashjs.dir}"/>
|
|
71
71
|
</copy>
|
|
72
|
-
<replace file="${staging.dir}/src/sh/calaba/instrumentationbackend/actions/version/Version.java" token="####VERSION####" value="${version}" failOnNoReplacements="true" />
|
|
73
72
|
</target>
|
|
74
73
|
|
|
75
74
|
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
<classpathentry kind="src" path="src"/>
|
|
4
4
|
<classpathentry kind="src" path="gen"/>
|
|
5
5
|
<classpathentry kind="src" path="assets"/>
|
|
6
|
+
<classpathentry kind="src" path="tests"/>
|
|
6
7
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
|
7
8
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
|
8
9
|
<classpathentry kind="lib" path="libs/robotium-solo-3.6.jar"/>
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
<uses-sdk android:minSdkVersion="6" />
|
|
8
8
|
|
|
9
|
-
<application android:label="CalabashTestServer"
|
|
9
|
+
<application android:label="CalabashTestServer" >
|
|
10
10
|
<uses-library android:name="android.test.runner" />
|
|
11
11
|
<uses-library android:name="com.google.android.maps" android:required="false" />
|
|
12
12
|
</application>
|