calabash-android 0.4.7.pre9 → 0.4.7.pre10
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.
- checksums.yaml +4 -4
- data/bin/calabash-android-console.rb +0 -4
- data/bin/calabash-android-run.rb +1 -7
- data/lib/calabash-android/helpers.rb +6 -2
- data/lib/calabash-android/lib/TestServer.apk +0 -0
- data/lib/calabash-android/lib/screenshotTaker.jar +0 -0
- data/lib/calabash-android/operations.rb +149 -9
- data/lib/calabash-android/version.rb +1 -1
- data/test-server/AndroidManifest.xml +3 -0
- data/test-server/instrumentation-backend/.classpath +1 -1
- data/test-server/instrumentation-backend/libs/robotium-solo-4.2.jar +0 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/ClearPreferences.java +36 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/GetPreferences.java +37 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/SetPreferences.java +56 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/TestHelpers.java +28 -4
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/preferences/ClearPreferences.java +37 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/preferences/GetPreferences.java +39 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/preferences/PreferencesUtils.java +229 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/preferences/SetPreferences.java +56 -0
- metadata +11 -3
- data/test-server/instrumentation-backend/libs/robotium-solo-4.1.jar +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f9bf0084a84ca0e23fb28a5dbc4309a4395cee8a
|
4
|
+
data.tar.gz: 62401164c05b9f8680516df03dccf9496266347c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f98938832bd593c95650fd10bb04961be5cd1f0e2183a1a351a6d97e86e297f408fbdc7f285b453e6f307e2d6de3e319339f4f92897459221a272e13adaaceb0
|
7
|
+
data.tar.gz: ef73bc3c23d04b37452a010390c8c3274d6ba55c9ea2c5de7a51f021f930ef532c9e7d481a5d73b1111447b3ecf61cc40a4201c43d7ef4ecedac0b533e6ae0c4
|
@@ -1,10 +1,6 @@
|
|
1
1
|
def calabash_console(app_path = nil)
|
2
2
|
test_server_path = test_server_path(app_path)
|
3
3
|
|
4
|
-
unless ENV["TEST_SERVER_PORT"]
|
5
|
-
ENV["TEST_SERVER_PORT"] = "34777"
|
6
|
-
end
|
7
|
-
|
8
4
|
ENV["IRBRC"] = File.join(File.dirname(__FILE__), '..', 'irbrc')
|
9
5
|
|
10
6
|
unless ENV["MAIN_ACTIVITY"]
|
data/bin/calabash-android-run.rb
CHANGED
@@ -16,15 +16,9 @@ def calabash_run(app_path = nil)
|
|
16
16
|
build_test_server_if_needed(app_path)
|
17
17
|
|
18
18
|
test_server_path = test_server_path(app_path)
|
19
|
-
if ENV["TEST_SERVER_PORT"]
|
20
|
-
test_server_port = ENV["TEST_SERVER_PORT"]
|
21
|
-
else
|
22
|
-
test_server_port = "34777"
|
23
|
-
end
|
24
19
|
env = "MAIN_ACTIVITY=#{main_activity(app_path)} "\
|
25
20
|
"APP_PATH=\"#{app_path}\" "\
|
26
|
-
"TEST_APP_PATH=\"#{test_server_path}\"
|
27
|
-
"TEST_SERVER_PORT=#{test_server_port}"
|
21
|
+
"TEST_APP_PATH=\"#{test_server_path}\""
|
28
22
|
else
|
29
23
|
env = ""
|
30
24
|
end
|
@@ -28,9 +28,9 @@ end
|
|
28
28
|
def manifest(app)
|
29
29
|
out_path = manifest_path(app)
|
30
30
|
manifest_file = File.join(out_path, 'AndroidManifest.xml')
|
31
|
-
unless File.
|
31
|
+
unless File.size?(manifest_file)
|
32
32
|
manifest_extractor = File.join(File.expand_path(File.dirname(__FILE__)),'lib', 'apktool-cli-1.5.3-SNAPSHOT.jar')
|
33
|
-
output = `java -jar "#{manifest_extractor}" d -s "#{app}" #{out_path} 2>&1`
|
33
|
+
output = `java -jar "#{manifest_extractor}" d -s --frame-path "#{framework_path(app)}" -f "#{app}" #{out_path} 2>&1`
|
34
34
|
raise "Unable to extract manifest: #{output}" unless File.size?(manifest_file)
|
35
35
|
# Tidy up a bit. It would be nice if apktool could just dump the manifest alone.
|
36
36
|
FileUtils.rm_rf(%w{res assets classes.dex}.map {|f| File.join(out_path, f) })
|
@@ -51,6 +51,10 @@ def manifest_path(apk_file_path)
|
|
51
51
|
"test_servers/#{checksum(apk_file_path)}_#{Calabash::Android::VERSION}.res"
|
52
52
|
end
|
53
53
|
|
54
|
+
def framework_path(apk_file_path)
|
55
|
+
"test_servers/apktool-#{checksum(apk_file_path)}_#{Calabash::Android::VERSION}"
|
56
|
+
end
|
57
|
+
|
54
58
|
|
55
59
|
def build_test_server_if_needed(app_path)
|
56
60
|
unless File.exist?(test_server_path(app_path))
|
Binary file
|
Binary file
|
@@ -117,6 +117,18 @@ module Operations
|
|
117
117
|
default_device.set_gps_coordinates(latitude, longitude)
|
118
118
|
end
|
119
119
|
|
120
|
+
def get_preferences(name)
|
121
|
+
default_device.get_preferences(name)
|
122
|
+
end
|
123
|
+
|
124
|
+
def set_preferences(name, hash)
|
125
|
+
default_device.set_preferences(name, hash)
|
126
|
+
end
|
127
|
+
|
128
|
+
def clear_preferences(name)
|
129
|
+
default_device.clear_preferences(name)
|
130
|
+
end
|
131
|
+
|
120
132
|
def query(uiquery, *args)
|
121
133
|
converted_args = []
|
122
134
|
args.each do |arg|
|
@@ -178,8 +190,8 @@ module Operations
|
|
178
190
|
def initialize(cucumber_world, serial, server_port, app_path, test_server_path, test_server_port = 7102)
|
179
191
|
|
180
192
|
@cucumber_world = cucumber_world
|
181
|
-
@serial = serial
|
182
|
-
@server_port = server_port
|
193
|
+
@serial = serial || default_serial
|
194
|
+
@server_port = server_port || default_server_port
|
183
195
|
@app_path = app_path
|
184
196
|
@test_server_path = test_server_path
|
185
197
|
@test_server_port = test_server_port
|
@@ -224,7 +236,7 @@ module Operations
|
|
224
236
|
unless succeeded
|
225
237
|
::Cucumber.wants_to_quit = true
|
226
238
|
raise "#{pn} did not get updated. Aborting!"
|
227
|
-
end
|
239
|
+
end
|
228
240
|
end
|
229
241
|
|
230
242
|
def uninstall_app(package_name)
|
@@ -400,10 +412,6 @@ module Operations
|
|
400
412
|
end
|
401
413
|
end
|
402
414
|
|
403
|
-
def serial
|
404
|
-
@serial || default_serial
|
405
|
-
end
|
406
|
-
|
407
415
|
def default_serial
|
408
416
|
devices = connected_devices
|
409
417
|
log "connected_devices: #{devices}"
|
@@ -412,11 +420,36 @@ module Operations
|
|
412
420
|
devices.first
|
413
421
|
end
|
414
422
|
|
423
|
+
def default_server_port
|
424
|
+
require 'yaml'
|
425
|
+
File.open(File.expand_path(server_port_configuration), File::RDWR|File::CREAT) do |f|
|
426
|
+
f.flock(File::LOCK_EX)
|
427
|
+
state = YAML::load(f) || {}
|
428
|
+
ports = state['server_ports'] ||= {}
|
429
|
+
return ports[serial] if ports.has_key?(serial)
|
430
|
+
|
431
|
+
port = 34777
|
432
|
+
port += 1 while ports.has_value?(port)
|
433
|
+
ports[serial] = port
|
434
|
+
|
435
|
+
f.rewind
|
436
|
+
f.write(YAML::dump(state))
|
437
|
+
f.truncate(f.pos)
|
438
|
+
|
439
|
+
log "Persistently allocated port #{port} to #{serial}"
|
440
|
+
return port
|
441
|
+
end
|
442
|
+
end
|
443
|
+
|
444
|
+
def server_port_configuration
|
445
|
+
File.expand_path(ENV['CALABASH_SERVER_PORTS'] || "~/.calabash.yaml")
|
446
|
+
end
|
447
|
+
|
415
448
|
def connected_devices
|
416
449
|
lines = `#{adb} devices`.split("\n")
|
417
450
|
lines.shift
|
418
451
|
lines.collect { |l| l.split("\t").first}
|
419
|
-
end
|
452
|
+
end
|
420
453
|
|
421
454
|
def wake_up
|
422
455
|
wake_up_cmd = "#{adb_command} shell am start -a android.intent.action.MAIN -n #{package_name(@test_server_path)}/sh.calaba.instrumentationbackend.WakeUp"
|
@@ -551,9 +584,116 @@ module Operations
|
|
551
584
|
def set_gps_coordinates(latitude, longitude)
|
552
585
|
perform_action('set_gps_coordinates', latitude, longitude)
|
553
586
|
end
|
554
|
-
end
|
555
587
|
|
588
|
+
def get_preferences(name)
|
589
|
+
|
590
|
+
log "Get preferences: #{name}, app running? #{app_running?}"
|
591
|
+
preferences = {}
|
592
|
+
|
593
|
+
if app_running?
|
594
|
+
json = perform_action('get_preferences', name);
|
595
|
+
else
|
596
|
+
|
597
|
+
logcat_id = get_logcat_id()
|
598
|
+
cmd = "#{adb_command} shell am instrument -e logcat #{logcat_id} -e name \"#{name}\" #{package_name(@test_server_path)}/sh.calaba.instrumentationbackend.GetPreferences"
|
599
|
+
|
600
|
+
raise "Could not get preferences" unless system(cmd)
|
601
|
+
|
602
|
+
logcat_cmd = get_logcat_cmd(logcat_id)
|
603
|
+
logcat_output = `#{logcat_cmd}`
|
604
|
+
|
605
|
+
json = get_json_from_logcat(logcat_output)
|
606
|
+
|
607
|
+
raise "Could not get preferences" unless json != nil and json["success"]
|
608
|
+
end
|
609
|
+
|
610
|
+
# at this point we have valid json, coming from an action
|
611
|
+
# or instrumentation, but we don't care, just parse
|
612
|
+
if json["bonusInformation"].length > 0
|
613
|
+
json["bonusInformation"].each do |item|
|
614
|
+
json_item = JSON.parse(item)
|
615
|
+
preferences[json_item["key"]] = json_item["value"]
|
616
|
+
end
|
617
|
+
end
|
618
|
+
|
619
|
+
preferences
|
620
|
+
end
|
621
|
+
|
622
|
+
def set_preferences(name, hash)
|
556
623
|
|
624
|
+
log "Set preferences: #{name}, #{hash}, app running? #{app_running?}"
|
625
|
+
|
626
|
+
if app_running?
|
627
|
+
perform_action('set_preferences', name, hash);
|
628
|
+
else
|
629
|
+
|
630
|
+
params = hash.map {|k,v| "-e \"#{k}\" \"#{v}\""}.join(" ")
|
631
|
+
|
632
|
+
logcat_id = get_logcat_id()
|
633
|
+
cmd = "#{adb_command} shell am instrument -e logcat #{logcat_id} -e name \"#{name}\" #{params} #{package_name(@test_server_path)}/sh.calaba.instrumentationbackend.SetPreferences"
|
634
|
+
|
635
|
+
raise "Could not set preferences" unless system(cmd)
|
636
|
+
|
637
|
+
logcat_cmd = get_logcat_cmd(logcat_id)
|
638
|
+
logcat_output = `#{logcat_cmd}`
|
639
|
+
|
640
|
+
json = get_json_from_logcat(logcat_output)
|
641
|
+
|
642
|
+
raise "Could not set preferences" unless json != nil and json["success"]
|
643
|
+
end
|
644
|
+
end
|
645
|
+
|
646
|
+
def clear_preferences(name)
|
647
|
+
|
648
|
+
log "Clear preferences: #{name}, app running? #{app_running?}"
|
649
|
+
|
650
|
+
if app_running?
|
651
|
+
perform_action('clear_preferences', name);
|
652
|
+
else
|
653
|
+
|
654
|
+
logcat_id = get_logcat_id()
|
655
|
+
cmd = "#{adb_command} shell am instrument -e logcat #{logcat_id} -e name \"#{name}\" #{package_name(@test_server_path)}/sh.calaba.instrumentationbackend.ClearPreferences"
|
656
|
+
raise "Could not clear preferences" unless system(cmd)
|
657
|
+
|
658
|
+
logcat_cmd = get_logcat_cmd(logcat_id)
|
659
|
+
logcat_output = `#{logcat_cmd}`
|
660
|
+
|
661
|
+
json = get_json_from_logcat(logcat_output)
|
662
|
+
|
663
|
+
raise "Could not clear preferences" unless json != nil and json["success"]
|
664
|
+
end
|
665
|
+
end
|
666
|
+
|
667
|
+
def get_json_from_logcat(logcat_output)
|
668
|
+
|
669
|
+
logcat_output.split(/\r?\n/).each do |line|
|
670
|
+
begin
|
671
|
+
json = JSON.parse(line)
|
672
|
+
return json
|
673
|
+
rescue
|
674
|
+
# nothing to do here, just discarding logcat rubbish
|
675
|
+
end
|
676
|
+
end
|
677
|
+
|
678
|
+
return nil
|
679
|
+
end
|
680
|
+
|
681
|
+
def get_logcat_id()
|
682
|
+
# we need a unique logcat tag so we can later
|
683
|
+
# query the logcat output and filter out everything
|
684
|
+
# but what we are interested in
|
685
|
+
|
686
|
+
random = (0..10000).to_a.sample
|
687
|
+
"#{Time.now.strftime("%s")}_#{random}"
|
688
|
+
end
|
689
|
+
|
690
|
+
def get_logcat_cmd(tag)
|
691
|
+
# returns raw logcat output for our tag
|
692
|
+
# filtering out everthing else
|
693
|
+
|
694
|
+
"#{adb_command} logcat -d -v raw #{tag}:* *:S"
|
695
|
+
end
|
696
|
+
end
|
557
697
|
|
558
698
|
def label(uiquery)
|
559
699
|
ni
|
@@ -19,6 +19,9 @@
|
|
19
19
|
<uses-sdk android:minSdkVersion="4" />
|
20
20
|
<instrumentation android:targetPackage="#targetPackage#" android:name="sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner" />
|
21
21
|
<instrumentation android:targetPackage="#targetPackage#" android:name="sh.calaba.instrumentationbackend.ClearAppData" />
|
22
|
+
<instrumentation android:targetPackage="#targetPackage#" android:name="sh.calaba.instrumentationbackend.ClearPreferences" />
|
23
|
+
<instrumentation android:targetPackage="#targetPackage#" android:name="sh.calaba.instrumentationbackend.SetPreferences" />
|
24
|
+
<instrumentation android:targetPackage="#targetPackage#" android:name="sh.calaba.instrumentationbackend.GetPreferences" />
|
22
25
|
|
23
26
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
24
27
|
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
|
@@ -4,8 +4,8 @@
|
|
4
4
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
5
5
|
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
6
6
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
|
7
|
-
<classpathentry kind="lib" path="libs/robotium-solo-4.1.jar"/>
|
8
7
|
<classpathentry kind="src" path="src"/>
|
9
8
|
<classpathentry kind="src" path="gen"/>
|
9
|
+
<classpathentry kind="lib" path="libs/robotium-solo-4.2.jar"/>
|
10
10
|
<classpathentry kind="output" path="bin/classes"/>
|
11
11
|
</classpath>
|
Binary file
|
data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/ClearPreferences.java
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
package sh.calaba.instrumentationbackend;
|
2
|
+
|
3
|
+
import sh.calaba.instrumentationbackend.actions.preferences.PreferencesUtils;
|
4
|
+
import android.content.SharedPreferences;
|
5
|
+
import android.os.Bundle;
|
6
|
+
import android.test.InstrumentationTestRunner;
|
7
|
+
import android.util.Log;
|
8
|
+
|
9
|
+
/**
|
10
|
+
* Allows clearing SharedPreferences.
|
11
|
+
*
|
12
|
+
* See Ruby API docs for more info:
|
13
|
+
* https://github.com/calabash/calabash-android/blob/master/documentation/ruby_api.md
|
14
|
+
*
|
15
|
+
* @author Juan Delgado (juan@ustwo.co.uk)
|
16
|
+
*/
|
17
|
+
public class ClearPreferences extends InstrumentationTestRunner {
|
18
|
+
|
19
|
+
@Override
|
20
|
+
public void onCreate(Bundle arguments) {
|
21
|
+
|
22
|
+
SharedPreferences preferences = null;
|
23
|
+
|
24
|
+
try{
|
25
|
+
preferences = PreferencesUtils.getPreferencesFromBundle(arguments, getTargetContext());
|
26
|
+
} catch(Exception e){
|
27
|
+
e.printStackTrace();
|
28
|
+
return;
|
29
|
+
}
|
30
|
+
|
31
|
+
preferences.edit().clear().commit();
|
32
|
+
|
33
|
+
String logcat = arguments.getString(PreferencesUtils.BUNDLE_LOGCAT_ID);
|
34
|
+
Log.d(logcat, PreferencesUtils.resultToJson(Result.successResult()));
|
35
|
+
}
|
36
|
+
}
|
data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/GetPreferences.java
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
package sh.calaba.instrumentationbackend;
|
2
|
+
|
3
|
+
import sh.calaba.instrumentationbackend.actions.preferences.PreferencesUtils;
|
4
|
+
import android.content.SharedPreferences;
|
5
|
+
import android.os.Bundle;
|
6
|
+
import android.test.InstrumentationTestRunner;
|
7
|
+
import android.util.Log;
|
8
|
+
|
9
|
+
/**
|
10
|
+
* Allows reading of SharedPreferences.
|
11
|
+
*
|
12
|
+
* See Ruby API docs for more info:
|
13
|
+
* https://github.com/calabash/calabash-android/blob/master/documentation/ruby_api.md
|
14
|
+
*
|
15
|
+
* @author Juan Delgado (juan@ustwo.co.uk)
|
16
|
+
*/
|
17
|
+
public class GetPreferences extends InstrumentationTestRunner {
|
18
|
+
|
19
|
+
@Override
|
20
|
+
public void onCreate(Bundle arguments) {
|
21
|
+
|
22
|
+
SharedPreferences preferences = null;
|
23
|
+
|
24
|
+
try{
|
25
|
+
preferences = PreferencesUtils.getPreferencesFromBundle(arguments, getTargetContext());
|
26
|
+
} catch(Exception e){
|
27
|
+
e.printStackTrace();
|
28
|
+
return;
|
29
|
+
}
|
30
|
+
|
31
|
+
Result result = Result.successResult();
|
32
|
+
PreferencesUtils.addPreferencesToResult(preferences, result);
|
33
|
+
|
34
|
+
String logcat = arguments.getString(PreferencesUtils.BUNDLE_LOGCAT_ID);
|
35
|
+
Log.d(logcat, PreferencesUtils.resultToJson(result));
|
36
|
+
}
|
37
|
+
}
|
data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/SetPreferences.java
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
package sh.calaba.instrumentationbackend;
|
2
|
+
|
3
|
+
import java.util.Set;
|
4
|
+
|
5
|
+
import sh.calaba.instrumentationbackend.actions.preferences.PreferencesUtils;
|
6
|
+
import android.content.SharedPreferences;
|
7
|
+
import android.os.Bundle;
|
8
|
+
import android.test.InstrumentationTestRunner;
|
9
|
+
import android.util.Log;
|
10
|
+
|
11
|
+
/**
|
12
|
+
* Allows writing of SharedPreferences.
|
13
|
+
*
|
14
|
+
* See Ruby API docs for more info:
|
15
|
+
* https://github.com/calabash/calabash-android/blob/master/documentation/ruby_api.md
|
16
|
+
*
|
17
|
+
* @author Juan Delgado (juan@ustwo.co.uk)
|
18
|
+
*/
|
19
|
+
public class SetPreferences extends InstrumentationTestRunner {
|
20
|
+
|
21
|
+
@Override
|
22
|
+
public void onCreate(Bundle arguments) {
|
23
|
+
|
24
|
+
SharedPreferences preferences = null;
|
25
|
+
|
26
|
+
try{
|
27
|
+
preferences = PreferencesUtils.getPreferencesFromBundle(arguments, getTargetContext());
|
28
|
+
} catch(Exception e){
|
29
|
+
e.printStackTrace();
|
30
|
+
return;
|
31
|
+
}
|
32
|
+
|
33
|
+
Set<String> keys = arguments.keySet();
|
34
|
+
|
35
|
+
String[] parserdArgs = new String[keys.size() * 2];
|
36
|
+
|
37
|
+
int added = 0;
|
38
|
+
for (String key : keys) {
|
39
|
+
|
40
|
+
if(key.equals(PreferencesUtils.BUNDLE_LOGCAT_ID) || key.equals(PreferencesUtils.BUNDLE_NAME)){
|
41
|
+
continue;
|
42
|
+
}
|
43
|
+
|
44
|
+
parserdArgs[added++] = key;
|
45
|
+
parserdArgs[added++] = arguments.get(key).toString();
|
46
|
+
}
|
47
|
+
|
48
|
+
SharedPreferences.Editor editor = preferences.edit();
|
49
|
+
|
50
|
+
PreferencesUtils.setPreferences(editor, parserdArgs);
|
51
|
+
editor.commit();
|
52
|
+
|
53
|
+
String logcat = arguments.getString(PreferencesUtils.BUNDLE_LOGCAT_ID);
|
54
|
+
Log.d(logcat, PreferencesUtils.resultToJson(Result.successResult()));
|
55
|
+
}
|
56
|
+
}
|
data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/TestHelpers.java
CHANGED
@@ -11,6 +11,7 @@ import java.util.Date;
|
|
11
11
|
import java.util.HashMap;
|
12
12
|
import java.util.Map;
|
13
13
|
|
14
|
+
import android.app.Activity;
|
14
15
|
import android.content.Context;
|
15
16
|
import android.content.res.Resources.NotFoundException;
|
16
17
|
import android.graphics.drawable.Drawable;
|
@@ -53,19 +54,42 @@ public class TestHelpers {
|
|
53
54
|
if (!expectedViewType.isInstance(theView)) {
|
54
55
|
throw new RuntimeException(String.format("getViewById: Expected to find a View of type %s but found one of type %s", expectedViewType.getClass().getName(), theView.getClass().getName()));
|
55
56
|
}
|
56
|
-
|
57
|
+
|
57
58
|
return (ViewType) theView;
|
58
59
|
}
|
59
60
|
|
60
61
|
public static View getViewById(String resName) {
|
61
|
-
int id =
|
62
|
+
int id = getIdFromString(resName);
|
62
63
|
if (id == 0) {
|
63
64
|
return null;
|
64
65
|
}
|
65
66
|
|
66
67
|
return InstrumentationBackend.solo.getView(id);
|
67
68
|
}
|
68
|
-
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Converts a string identifier name to the corresponding {@code R.id.*}
|
72
|
+
* (Integer) resource identifier.
|
73
|
+
*
|
74
|
+
* If the string appears to be a number, it will be converted to an
|
75
|
+
* integer and assumed to be an existing identifier.
|
76
|
+
*
|
77
|
+
* @param resName the resource identifier name
|
78
|
+
* @return the corresponding {@code R.id.[resName]} identifier
|
79
|
+
*/
|
80
|
+
public static int getIdFromString(String resName) {
|
81
|
+
try
|
82
|
+
{
|
83
|
+
// Check if th string is just a direct number (unlikely)
|
84
|
+
return Integer.parseInt(resName);
|
85
|
+
} catch (NumberFormatException nfe) {
|
86
|
+
// Assume this is an "R.id.<name>" string.
|
87
|
+
}
|
88
|
+
|
89
|
+
final Activity activity = InstrumentationBackend.solo.getCurrentActivity();
|
90
|
+
return activity.getResources().getIdentifier(resName, "id", activity.getPackageName());
|
91
|
+
}
|
92
|
+
|
69
93
|
public static Drawable getDrawableById(String resName) {
|
70
94
|
int id;
|
71
95
|
try {
|
@@ -117,7 +141,7 @@ public class TestHelpers {
|
|
117
141
|
public static void wait(int durationInSeconds) {
|
118
142
|
wait(new Double(durationInSeconds));
|
119
143
|
}
|
120
|
-
|
144
|
+
|
121
145
|
|
122
146
|
public static void wait(double durationInSeconds) {
|
123
147
|
try {
|
@@ -0,0 +1,37 @@
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.preferences;
|
2
|
+
|
3
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
4
|
+
import sh.calaba.instrumentationbackend.Result;
|
5
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
6
|
+
import android.content.SharedPreferences;
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Allows clearing SharedPreferences.
|
10
|
+
*
|
11
|
+
* See Ruby API docs for more info:
|
12
|
+
* https://github.com/calabash/calabash-android/blob/master/documentation/ruby_api.md
|
13
|
+
*
|
14
|
+
* @author Juan Delgado (juan@ustwo.co.uk)
|
15
|
+
*/
|
16
|
+
public class ClearPreferences implements Action {
|
17
|
+
|
18
|
+
@Override
|
19
|
+
public Result execute(String... args) {
|
20
|
+
|
21
|
+
try{
|
22
|
+
|
23
|
+
SharedPreferences preferences = PreferencesUtils.getPreferencesFromArgs(args, InstrumentationBackend.instrumentation.getTargetContext());
|
24
|
+
preferences.edit().clear().commit();
|
25
|
+
|
26
|
+
return Result.successResult();
|
27
|
+
|
28
|
+
} catch(Exception e) {
|
29
|
+
return Result.fromThrowable(e);
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
@Override
|
34
|
+
public String key() {
|
35
|
+
return "clear_preferences";
|
36
|
+
}
|
37
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.preferences;
|
2
|
+
|
3
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
4
|
+
import sh.calaba.instrumentationbackend.Result;
|
5
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
6
|
+
import android.content.SharedPreferences;
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Allows reading of SharedPreferences.
|
10
|
+
*
|
11
|
+
* See Ruby API docs for more info:
|
12
|
+
* https://github.com/calabash/calabash-android/blob/master/documentation/ruby_api.md
|
13
|
+
*
|
14
|
+
* @author Juan Delgado (juan@ustwo.co.uk)
|
15
|
+
*/
|
16
|
+
public class GetPreferences implements Action {
|
17
|
+
|
18
|
+
@Override
|
19
|
+
public Result execute(String... args) {
|
20
|
+
|
21
|
+
SharedPreferences preferences = null;
|
22
|
+
|
23
|
+
try{
|
24
|
+
preferences = PreferencesUtils.getPreferencesFromArgs(args, InstrumentationBackend.instrumentation.getTargetContext());
|
25
|
+
} catch(Exception e){
|
26
|
+
return Result.fromThrowable(e);
|
27
|
+
}
|
28
|
+
|
29
|
+
Result result = Result.successResult();
|
30
|
+
PreferencesUtils.addPreferencesToResult(preferences, result);
|
31
|
+
|
32
|
+
return result;
|
33
|
+
}
|
34
|
+
|
35
|
+
@Override
|
36
|
+
public String key() {
|
37
|
+
return "get_preferences";
|
38
|
+
}
|
39
|
+
}
|
@@ -0,0 +1,229 @@
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.preferences;
|
2
|
+
|
3
|
+
import java.util.Map;
|
4
|
+
import java.util.Map.Entry;
|
5
|
+
|
6
|
+
import sh.calaba.instrumentationbackend.Result;
|
7
|
+
import sh.calaba.org.codehaus.jackson.map.DeserializationConfig.Feature;
|
8
|
+
import sh.calaba.org.codehaus.jackson.map.ObjectMapper;
|
9
|
+
import android.content.Context;
|
10
|
+
import android.content.SharedPreferences;
|
11
|
+
import android.content.SharedPreferences.Editor;
|
12
|
+
import android.os.Bundle;
|
13
|
+
|
14
|
+
/**
|
15
|
+
* Utility methods for SharedPreferences actions and instrumentation.
|
16
|
+
*
|
17
|
+
* See Ruby API docs for more info:
|
18
|
+
* https://github.com/calabash/calabash-android/blob/master/documentation/ruby_api.md
|
19
|
+
*
|
20
|
+
* @author Juan Delgado (juan@ustwo.co.uk)
|
21
|
+
*/
|
22
|
+
public class PreferencesUtils {
|
23
|
+
|
24
|
+
private static final String MISSING_CONTEXT = "Missing context";
|
25
|
+
private static final String MISSING_BUNDLE = "Missing bundle";
|
26
|
+
private static final String MISSING_NAME = "Missing SharedPreferences name";
|
27
|
+
private static final String MISSING_LOGCAT_ID = "Missing LogCat ID";
|
28
|
+
private static final String MISSING_PREFERENCES = "Missing preferences";
|
29
|
+
private static final String MISSING_RESULT = "Missing result";
|
30
|
+
private static final String MISSING_EDITOR = "Missing editor";
|
31
|
+
private static final String MISSING_VALUES = "Missing values";
|
32
|
+
|
33
|
+
public static final String BUNDLE_NAME = "name";
|
34
|
+
public static final String BUNDLE_LOGCAT_ID = "logcat";
|
35
|
+
|
36
|
+
private final static ObjectMapper mapper = createJsonMapper();
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Returns a SharedPreferences object based on arguments and context.
|
40
|
+
*
|
41
|
+
* @param args First item on the array is the name expected to retrieve the SharedPreferences.
|
42
|
+
* @param context Typically the context of the tested application.
|
43
|
+
* @return A SharedPreferences instance.
|
44
|
+
*
|
45
|
+
* @throws IllegalArgumentException if missing args, name or context.
|
46
|
+
*/
|
47
|
+
public static SharedPreferences getPreferencesFromArgs(String[] args, Context context){
|
48
|
+
|
49
|
+
if(args == null){
|
50
|
+
throw new IllegalArgumentException(MISSING_NAME);
|
51
|
+
}
|
52
|
+
|
53
|
+
if(context == null){
|
54
|
+
throw new IllegalArgumentException(MISSING_CONTEXT);
|
55
|
+
}
|
56
|
+
|
57
|
+
String name = args[0];
|
58
|
+
|
59
|
+
if(name == null){
|
60
|
+
throw new IllegalArgumentException(MISSING_NAME);
|
61
|
+
}
|
62
|
+
|
63
|
+
return context.getSharedPreferences(name, Context.MODE_PRIVATE);
|
64
|
+
}
|
65
|
+
|
66
|
+
/**
|
67
|
+
* Returns a SharedPreferences object based on arguments and context.
|
68
|
+
*
|
69
|
+
* @param bundle Expected to contain "name" and "logcat" properties.
|
70
|
+
* @param context Typically the context of the tested application.
|
71
|
+
* @return A SharedPreferences instance.
|
72
|
+
*
|
73
|
+
* @throws IllegalArgumentException if missing bundle, name, logcat or context.
|
74
|
+
*/
|
75
|
+
public static SharedPreferences getPreferencesFromBundle(Bundle bundle, Context context){
|
76
|
+
|
77
|
+
if(bundle == null){
|
78
|
+
throw new IllegalArgumentException(MISSING_BUNDLE);
|
79
|
+
}
|
80
|
+
|
81
|
+
if(context == null){
|
82
|
+
throw new IllegalArgumentException(MISSING_CONTEXT);
|
83
|
+
}
|
84
|
+
|
85
|
+
String logcat = bundle.getString(PreferencesUtils.BUNDLE_LOGCAT_ID);
|
86
|
+
String name = bundle.getString(PreferencesUtils.BUNDLE_NAME);
|
87
|
+
|
88
|
+
if(logcat == null){
|
89
|
+
throw new IllegalArgumentException(MISSING_LOGCAT_ID);
|
90
|
+
}
|
91
|
+
|
92
|
+
if(name == null){
|
93
|
+
throw new IllegalArgumentException(MISSING_NAME);
|
94
|
+
}
|
95
|
+
|
96
|
+
return context.getSharedPreferences(name, Context.MODE_PRIVATE);
|
97
|
+
}
|
98
|
+
|
99
|
+
/**
|
100
|
+
* Iterates over the values stored in SharedPrefereces and adds them as JSON
|
101
|
+
* key:value pairs to the bonusInformation of a result.
|
102
|
+
*
|
103
|
+
* @param preferences SharedPreferences object we want to add.
|
104
|
+
* @param result The Result object we want to add to.
|
105
|
+
*
|
106
|
+
* @throws IllegalArgumentException if missing preferences or result.
|
107
|
+
*/
|
108
|
+
public static void addPreferencesToResult(SharedPreferences preferences, Result result){
|
109
|
+
|
110
|
+
if(preferences == null){
|
111
|
+
throw new IllegalArgumentException(MISSING_PREFERENCES);
|
112
|
+
}
|
113
|
+
|
114
|
+
if(result == null){
|
115
|
+
throw new IllegalArgumentException(MISSING_RESULT);
|
116
|
+
}
|
117
|
+
|
118
|
+
Map<String, ?> map = preferences.getAll();
|
119
|
+
|
120
|
+
for(Entry<String, ?> entry : map.entrySet()){
|
121
|
+
|
122
|
+
StringBuilder json = new StringBuilder();
|
123
|
+
String value = null;
|
124
|
+
|
125
|
+
json.append("{");
|
126
|
+
|
127
|
+
if(entry.getValue() instanceof Integer ||
|
128
|
+
entry.getValue() instanceof Float ||
|
129
|
+
entry.getValue() instanceof Boolean){
|
130
|
+
|
131
|
+
value = String.valueOf(entry.getValue());
|
132
|
+
|
133
|
+
} else {
|
134
|
+
value = "\"" + entry.getValue() + "\"";
|
135
|
+
}
|
136
|
+
|
137
|
+
json.append("\"key\": \"" + entry.getKey() + "\", ");
|
138
|
+
json.append("\"value\": " + value);
|
139
|
+
json.append("}");
|
140
|
+
|
141
|
+
result.addBonusInformation(json.toString());
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
/**
|
146
|
+
* Adds values to a SharedPreferences Editor object. Key,value
|
147
|
+
* pairs are expected to come in the values array one after another
|
148
|
+
* such as [key1, value1, key2, value2], etc. This is a side effect
|
149
|
+
* of the Ruby to Java communication through ADB.
|
150
|
+
*
|
151
|
+
* @param editor Editor to which add the values to.
|
152
|
+
* @param values Array of key/value pairs.
|
153
|
+
*
|
154
|
+
* @throws IllegalArgumentException if missing editor or values.
|
155
|
+
*/
|
156
|
+
public static void setPreferences(Editor editor, String[] values){
|
157
|
+
|
158
|
+
if(editor == null){
|
159
|
+
throw new IllegalArgumentException(MISSING_EDITOR);
|
160
|
+
}
|
161
|
+
|
162
|
+
if(values == null){
|
163
|
+
throw new IllegalArgumentException(MISSING_VALUES);
|
164
|
+
}
|
165
|
+
|
166
|
+
// we expect key/value pairs passed one after another such as:
|
167
|
+
// [key1 value1 key2 value2], etc
|
168
|
+
// So we go through them with a 2 step loop
|
169
|
+
int totalParsedArgs = values.length;
|
170
|
+
for(int i = 0; i <totalParsedArgs; i += 2){
|
171
|
+
|
172
|
+
if(values[i] == null){
|
173
|
+
break;
|
174
|
+
}
|
175
|
+
|
176
|
+
String key = values[i];
|
177
|
+
String value = values[i+1];
|
178
|
+
|
179
|
+
try {
|
180
|
+
|
181
|
+
int x = Integer.parseInt(value);
|
182
|
+
editor.putInt(key, x);
|
183
|
+
|
184
|
+
} catch (NumberFormatException e){
|
185
|
+
|
186
|
+
try {
|
187
|
+
|
188
|
+
float y = Float.parseFloat(value);
|
189
|
+
editor.putFloat(key, y);
|
190
|
+
|
191
|
+
} catch (NumberFormatException e1) {
|
192
|
+
|
193
|
+
if(value.equals("true") || value.equals("false")){
|
194
|
+
editor.putBoolean(key, Boolean.parseBoolean(value));
|
195
|
+
} else {
|
196
|
+
editor.putString(key, value);
|
197
|
+
}
|
198
|
+
}
|
199
|
+
}
|
200
|
+
}
|
201
|
+
}
|
202
|
+
|
203
|
+
/**
|
204
|
+
* Formats a Result object as a JSON string.
|
205
|
+
*
|
206
|
+
* @param result The result that has to be formatted.
|
207
|
+
* @return The result formatted as a JSON string
|
208
|
+
*
|
209
|
+
* @throws IllegalArgumentException if missing result.
|
210
|
+
*/
|
211
|
+
public static String resultToJson(Result result) {
|
212
|
+
|
213
|
+
if(result == null){
|
214
|
+
throw new IllegalArgumentException(MISSING_RESULT);
|
215
|
+
}
|
216
|
+
|
217
|
+
try {
|
218
|
+
return mapper.writeValueAsString(result);
|
219
|
+
} catch (Exception e) {
|
220
|
+
throw new RuntimeException(e);
|
221
|
+
}
|
222
|
+
}
|
223
|
+
|
224
|
+
private static ObjectMapper createJsonMapper() {
|
225
|
+
ObjectMapper mapper = new ObjectMapper();
|
226
|
+
mapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, true);
|
227
|
+
return mapper;
|
228
|
+
}
|
229
|
+
}
|
@@ -0,0 +1,56 @@
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.preferences;
|
2
|
+
|
3
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
4
|
+
import sh.calaba.instrumentationbackend.Result;
|
5
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
6
|
+
import android.content.SharedPreferences;
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Allows writing of SharedPreferences.
|
10
|
+
*
|
11
|
+
* See Ruby API docs for more info:
|
12
|
+
* https://github.com/calabash/calabash-android/blob/master/documentation/ruby_api.md
|
13
|
+
*
|
14
|
+
* @author Juan Delgado (juan@ustwo.co.uk)
|
15
|
+
*/
|
16
|
+
public class SetPreferences implements Action {
|
17
|
+
|
18
|
+
@Override
|
19
|
+
public Result execute(String... args) {
|
20
|
+
|
21
|
+
SharedPreferences preferences = null;
|
22
|
+
|
23
|
+
try{
|
24
|
+
preferences = PreferencesUtils.getPreferencesFromArgs(args, InstrumentationBackend.instrumentation.getTargetContext());
|
25
|
+
} catch(Exception e){
|
26
|
+
return Result.fromThrowable(e);
|
27
|
+
}
|
28
|
+
|
29
|
+
String[] parserdArgs = new String[args.length];
|
30
|
+
|
31
|
+
int totalArgs = args.length;
|
32
|
+
int added = 0;
|
33
|
+
for(int i = 0; i <totalArgs; i++){
|
34
|
+
|
35
|
+
String arg = args[i];
|
36
|
+
|
37
|
+
// ignoring SharedPreferences name and weird chars
|
38
|
+
if(arg.equals(args[0]) || arg.equals("{") || arg.equals("}")){
|
39
|
+
continue;
|
40
|
+
}
|
41
|
+
|
42
|
+
parserdArgs[added++] = arg;
|
43
|
+
}
|
44
|
+
|
45
|
+
SharedPreferences.Editor editor = preferences.edit();
|
46
|
+
PreferencesUtils.setPreferences(editor, parserdArgs);
|
47
|
+
editor.commit();
|
48
|
+
|
49
|
+
return Result.successResult();
|
50
|
+
}
|
51
|
+
|
52
|
+
@Override
|
53
|
+
public String key() {
|
54
|
+
return "set_preferences";
|
55
|
+
}
|
56
|
+
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: calabash-android
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.7.
|
4
|
+
version: 0.4.7.pre10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonas Maturana Larsen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cucumber
|
@@ -190,7 +190,7 @@ files:
|
|
190
190
|
- test-server/instrumentation-backend/build-libs/antlr-3.4-complete.jar
|
191
191
|
- test-server/instrumentation-backend/build-libs/junit.jar
|
192
192
|
- test-server/instrumentation-backend/build.xml
|
193
|
-
- test-server/instrumentation-backend/libs/robotium-solo-4.
|
193
|
+
- test-server/instrumentation-backend/libs/robotium-solo-4.2.jar
|
194
194
|
- test-server/instrumentation-backend/project.properties
|
195
195
|
- test-server/instrumentation-backend/res/drawable-hdpi/ic_launcher.png
|
196
196
|
- test-server/instrumentation-backend/res/drawable-ldpi/ic_launcher.png
|
@@ -287,10 +287,13 @@ files:
|
|
287
287
|
- test-server/instrumentation-backend/src/org/antlr/runtime/tree/TreeWizard.java
|
288
288
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/CalabashInstrumentationTestRunner.java
|
289
289
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/ClearAppData.java
|
290
|
+
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/ClearPreferences.java
|
290
291
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Command.java
|
291
292
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/FranklyResult.java
|
293
|
+
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/GetPreferences.java
|
292
294
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/InstrumentationBackend.java
|
293
295
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Result.java
|
296
|
+
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/SetPreferences.java
|
294
297
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/TestHelpers.java
|
295
298
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/WakeUp.java
|
296
299
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/Action.java
|
@@ -337,6 +340,10 @@ files:
|
|
337
340
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/map/SetMapZoom.java
|
338
341
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/map/TapAwayFromMarkers.java
|
339
342
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/map/TapMapMarker.java
|
343
|
+
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/preferences/ClearPreferences.java
|
344
|
+
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/preferences/GetPreferences.java
|
345
|
+
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/preferences/PreferencesUtils.java
|
346
|
+
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/preferences/SetPreferences.java
|
340
347
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/scrolling/ScrollDown.java
|
341
348
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/scrolling/ScrollUp.java
|
342
349
|
- test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/search/EnterQueryByIndex.java
|
@@ -861,3 +868,4 @@ signing_key:
|
|
861
868
|
specification_version: 4
|
862
869
|
summary: Client for calabash-android for automated functional testing on Android
|
863
870
|
test_files: []
|
871
|
+
has_rdoc:
|
Binary file
|