ruboto 0.5.4 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +9 -9
- data/README.md +2 -0
- data/Rakefile +71 -7
- data/assets/Rakefile +2 -407
- data/assets/libs/dexmaker20120305.jar +0 -0
- data/assets/rakelib/ruboto.rake +428 -0
- data/assets/samples/sample_broadcast_receiver.rb +7 -3
- data/assets/samples/sample_broadcast_receiver_test.rb +47 -1
- data/assets/src/RubotoActivity.java +6 -2
- data/assets/src/org/ruboto/EntryPointActivity.java +2 -2
- data/assets/src/org/ruboto/Script.java +91 -24
- data/assets/src/org/ruboto/test/ActivityTest.java +27 -24
- data/assets/src/org/ruboto/test/InstrumentationTestRunner.java +42 -8
- data/assets/src/ruboto/activity.rb +1 -1
- data/assets/src/ruboto/base.rb +17 -6
- data/assets/src/ruboto/generate.rb +458 -0
- data/assets/src/ruboto/legacy.rb +9 -12
- data/assets/src/ruboto/widget.rb +9 -1
- data/lib/java_class_gen/android_api.xml +1 -1
- data/lib/ruboto.rb +1 -2
- data/lib/ruboto/commands/base.rb +19 -4
- data/lib/ruboto/sdk_versions.rb +12 -0
- data/lib/ruboto/util/build.rb +10 -11
- data/lib/ruboto/util/update.rb +150 -51
- data/lib/ruboto/util/verify.rb +6 -4
- data/lib/ruboto/util/xml_element.rb +2 -2
- data/lib/ruboto/version.rb +1 -1
- data/test/activity/option_menu_activity.rb +5 -1
- data/test/activity/psych_activity.rb +11 -6
- data/test/activity/stack_activity_test.rb +13 -5
- data/test/app_test_methods.rb +4 -3
- data/test/broadcast_receiver_test.rb +86 -0
- data/test/minimal_app_test.rb +27 -19
- data/test/rake_test.rb +13 -2
- data/test/ruboto_gen_test.rb +17 -3
- data/test/ruboto_update_test.rb +24 -2
- data/test/service_test.rb +1 -1
- data/test/test_helper.rb +134 -62
- data/test/update_test_methods.rb +40 -14
- data/test/updated_example_test_methods.rb +41 -0
- metadata +12 -6
data/lib/ruboto/util/verify.rb
CHANGED
@@ -10,9 +10,10 @@ module Ruboto
|
|
10
10
|
#
|
11
11
|
|
12
12
|
def verify_manifest
|
13
|
+
return @manifest if @manifest
|
13
14
|
abort "cannot find your AndroidManifest.xml to extract info from it. Make sure you're in the root directory of your app" unless
|
14
15
|
File.exists? 'AndroidManifest.xml'
|
15
|
-
@manifest
|
16
|
+
@manifest = REXML::Document.new(File.read('AndroidManifest.xml')).root
|
16
17
|
end
|
17
18
|
|
18
19
|
def save_manifest
|
@@ -54,10 +55,11 @@ module Ruboto
|
|
54
55
|
end
|
55
56
|
|
56
57
|
def verify_target_sdk
|
58
|
+
return @target_sdk if @target_sdk
|
57
59
|
verify_sdk_versions
|
58
|
-
|
59
|
-
abort "you must specify a target sdk level in the manifest (e.g., <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='8' />)" unless
|
60
|
-
@target_sdk
|
60
|
+
target_sdk_attr ||= @uses_sdk.attribute('android:targetSdkVersion').value
|
61
|
+
abort "you must specify a target sdk level in the manifest (e.g., <uses-sdk android:minSdkVersion='3' android:targetSdkVersion='8' />)" unless target_sdk_attr
|
62
|
+
@target_sdk = target_sdk_attr.to_i
|
61
63
|
end
|
62
64
|
|
63
65
|
def verify_strings
|
@@ -185,7 +185,7 @@ module Ruboto
|
|
185
185
|
(attribute("return") ? attribute("return") : "void"),
|
186
186
|
attribute("name"), parameters,
|
187
187
|
if_else(
|
188
|
-
"callbackProcs[#{constant_string}] != null",
|
188
|
+
"callbackProcs != null && callbackProcs[#{constant_string}] != null",
|
189
189
|
[super_string] + ruby_call,
|
190
190
|
[super_return]
|
191
191
|
)
|
@@ -197,4 +197,4 @@ module Ruboto
|
|
197
197
|
end
|
198
198
|
end
|
199
199
|
end
|
200
|
-
end
|
200
|
+
end
|
data/lib/ruboto/version.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
# TODO(uwe): Remove when we stop supporting Ruby 1.8 mode
|
2
|
+
if RUBY_VERSION < "1.9"
|
3
|
+
require 'jruby'
|
4
|
+
require 'rbconfig'
|
5
|
+
org.jruby.ext.psych.PsychLibrary.new.load(JRuby.runtime, false)
|
6
|
+
$LOADED_FEATURES << 'psych.so'
|
7
|
+
$LOAD_PATH << File.join(Config::CONFIG['libdir'], 'ruby/1.9')
|
8
|
+
end
|
9
|
+
# TODO end
|
10
|
+
|
11
|
+
with_large_stack{require 'psych.rb'}
|
7
12
|
|
8
13
|
Psych::Parser
|
9
14
|
Psych::Handler
|
@@ -11,11 +11,19 @@ setup do |activity|
|
|
11
11
|
end
|
12
12
|
|
13
13
|
test('stack depth') do |activity|
|
14
|
-
os_offset = {13 => 1}[android.os.Build::VERSION::SDK_INT].to_i
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
os_offset = {13 => 1, 15 => 1}[android.os.Build::VERSION::SDK_INT].to_i
|
15
|
+
if org.ruboto.Script.uses_platform_apk?
|
16
|
+
jruby_offset = {
|
17
|
+
'0.4.7' => [0, 0, 0, 0],
|
18
|
+
'0.4.8.dev' => [0, -1, -1, -1],
|
19
|
+
}[org.ruboto.Script.platform_version_name] || [0, 0, 0, 0]
|
20
|
+
else
|
21
|
+
jruby_offset = {
|
22
|
+
'1.5.6' => [-2, -5, -6, -8],
|
23
|
+
'1.7.0.dev' => [0, -1, -1, -1],
|
24
|
+
}[org.jruby.runtime.Constants::VERSION] || [0, 0, 0, 0]
|
25
|
+
end
|
26
|
+
version_message ="ANDROID: #{android.os.Build::VERSION::SDK_INT}, PLATFORM: #{org.ruboto.Script.uses_platform_apk ? org.ruboto.Script.platform_version_name : 'STANDALONE'}, JRuby: #{org.jruby.runtime.Constants::VERSION}"
|
19
27
|
assert_equal 44 + os_offset + jruby_offset[0], activity.find_view_by_id(42).text.to_i, version_message
|
20
28
|
assert_equal 68 + os_offset + jruby_offset[1], activity.find_view_by_id(43).text.to_i, version_message
|
21
29
|
assert_equal 77 + os_offset + jruby_offset[2], activity.find_view_by_id(44).text.to_i, version_message
|
data/test/app_test_methods.rb
CHANGED
@@ -5,18 +5,19 @@ module AppTestMethods
|
|
5
5
|
|
6
6
|
def test_activity_tests
|
7
7
|
# TODO(uwe): Remove check when we stop supporting jruby-jars 1.5.6
|
8
|
-
if ON_JRUBY_JARS_1_5_6
|
8
|
+
if Test::Unit::TestCase::ON_JRUBY_JARS_1_5_6
|
9
9
|
puts "Skipping YAML tests on jruby-jars-1.5.6"
|
10
10
|
else
|
11
11
|
assert_code 'YamlLoads', "with_large_stack{require 'yaml'}"
|
12
12
|
end
|
13
13
|
|
14
|
-
assert_code 'ReadSourceFile',
|
14
|
+
assert_code 'ReadSourceFile', 'File.read(__FILE__)'
|
15
15
|
assert_code 'DirListsFilesInApk', 'Dir["#{File.dirname(__FILE__)}/*"].each{|f| raise "File #{f.inspect} not found" unless File.exists?(f)}'
|
16
|
+
assert_code 'RepeatRubotoImport', 'ruboto_import :TextView ; ruboto_import :TextView'
|
16
17
|
|
17
18
|
Dir[File.expand_path('activity/*_test.rb', File.dirname(__FILE__))].each do |test_src|
|
18
19
|
# TODO(uwe): Remove check when we stop supporting jruby-jars 1.5.6
|
19
|
-
next if ON_JRUBY_JARS_1_5_6 && test_src =~ /psych_activity_test.rb$/
|
20
|
+
next if Test::Unit::TestCase::ON_JRUBY_JARS_1_5_6 && test_src =~ /psych_activity_test.rb$/
|
20
21
|
|
21
22
|
snake_name = test_src.chomp('_test.rb')
|
22
23
|
activity_name = File.basename(snake_name).split('_').map { |s| "#{s[0..0].upcase}#{s[1..-1]}" }.join
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require File.expand_path("test_helper", File.dirname(__FILE__))
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
class BroadcastReceiverTest < Test::Unit::TestCase
|
5
|
+
SRC_DIR ="#{APP_DIR}/src"
|
6
|
+
|
7
|
+
def setup
|
8
|
+
generate_app
|
9
|
+
end
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
cleanup_app
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_generated_broadcast_receiver
|
16
|
+
action_name ='org.ruboto.example.click_broadcast'
|
17
|
+
message = 'Broadcast received!'
|
18
|
+
Dir.chdir APP_DIR do
|
19
|
+
activity_filename = 'src/ruboto_test_app_activity.rb'
|
20
|
+
activity_content = File.read(activity_filename)
|
21
|
+
|
22
|
+
assert activity_content.sub!(/ def on_create\(bundle\)\n/, <<EOF)
|
23
|
+
def on_create(bundle)
|
24
|
+
@receiver = $package.ClickReceiver.new
|
25
|
+
filter = android.content.IntentFilter.new('#{action_name}')
|
26
|
+
Thread.start do
|
27
|
+
begin
|
28
|
+
android.os.Looper.prepare
|
29
|
+
registerReceiver(@receiver, filter, nil, android.os.Handler.new)
|
30
|
+
android.os.Looper.loop
|
31
|
+
rescue
|
32
|
+
puts "Exception starting receiver"
|
33
|
+
puts $!.message
|
34
|
+
puts $!.backtrace.join("\n")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
EOF
|
38
|
+
|
39
|
+
assert activity_content.sub!(/ @handle_click = proc do \|view\|\n.*? end\n/m, <<EOF)
|
40
|
+
@handle_click = proc do |view|
|
41
|
+
intent = android.content.Intent.new
|
42
|
+
intent.set_action '#{action_name}'
|
43
|
+
send_broadcast(intent)
|
44
|
+
end
|
45
|
+
EOF
|
46
|
+
File.open(activity_filename, 'w') { |f| f << activity_content }
|
47
|
+
|
48
|
+
system "#{RUBOTO_CMD} gen class BroadcastReceiver --name ClickReceiver"
|
49
|
+
FileUtils.rm 'test/src/click_receiver_test.rb'
|
50
|
+
receiver_filename = 'src/click_receiver.rb'
|
51
|
+
receiver_content = File.read(receiver_filename)
|
52
|
+
|
53
|
+
assert receiver_content.sub!(/ def on_receive\(context, intent\)\n.*? end\n/m, <<EOF)
|
54
|
+
def on_receive(context, intent)
|
55
|
+
Log.d "RUBOTO TEST", "Changing UI text"
|
56
|
+
context.run_on_ui_thread{$activity.find_view_by_id(42).text = '#{message}'}
|
57
|
+
Log.d "RUBOTO TEST", "UI text changed OK!"
|
58
|
+
rescue
|
59
|
+
Log.e "RUBOTO TEST", "Exception changing UI text: \#{$!.message}"
|
60
|
+
Log.e "RUBOTO TEST", $!.message
|
61
|
+
Log.e "RUBOTO TEST", $!.backtrace.join("\n")
|
62
|
+
end
|
63
|
+
EOF
|
64
|
+
File.open(receiver_filename, 'w') { |f| f << receiver_content }
|
65
|
+
|
66
|
+
test_filename = 'test/src/ruboto_test_app_activity_test.rb'
|
67
|
+
test_content = File.read(test_filename)
|
68
|
+
|
69
|
+
assert test_content.sub!(/'button changes text'/, "'button changes text', :ui => false")
|
70
|
+
assert test_content.sub!(/ button.performClick/, <<EOF)
|
71
|
+
clicked_at = nil
|
72
|
+
activity.run_on_ui_thread do
|
73
|
+
button.performClick
|
74
|
+
clicked_at = Time.now
|
75
|
+
end
|
76
|
+
|
77
|
+
sleep 0.1 until clicked_at && (@text_view.text == '#{message}' || (Time.now - clicked_at) > 10)
|
78
|
+
EOF
|
79
|
+
assert test_content.sub!(/What hath Matz wrought!/, message)
|
80
|
+
File.open(test_filename, 'w') { |f| f << test_content }
|
81
|
+
end
|
82
|
+
|
83
|
+
run_app_tests
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
data/test/minimal_app_test.rb
CHANGED
@@ -1,26 +1,34 @@
|
|
1
1
|
require File.expand_path("test_helper", File.dirname(__FILE__))
|
2
|
-
require 'bigdecimal'
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
if RubotoTest::RUBOTO_PLATFORM == 'STANDALONE'
|
4
|
+
require 'bigdecimal'
|
5
|
+
|
6
|
+
class MinimalAppTest < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
generate_app :excluded_stdlibs => %w{ant cgi digest dl drb ffi irb net optparse racc rbconfig rdoc rexml rinda rss
|
7
9
|
rubygems runit shell soap test uri webrick win32 wsdl xmlrpc xsd ../1.9}
|
8
|
-
|
10
|
+
end
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
|
12
|
+
def teardown
|
13
|
+
cleanup_app
|
14
|
+
end
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
def test_minimal_apk_is_less_than_3_mb
|
17
|
+
apk_size = BigDecimal(File.size("#{APP_DIR}/bin/RubotoTestApp-debug.apk").to_s) / (1024 * 1024)
|
18
|
+
upper_limit = {
|
19
|
+
# '1.5.6' => 3.7,
|
20
|
+
'1.6.7' => 3.2,
|
21
|
+
'1.7.0.dev' => ANDROID_TARGET < 15 ? 3.4 : 3.8, # Without dexmaker for Android < 4.0.3
|
22
|
+
}[JRUBY_JARS_VERSION.to_s] || 3.2
|
23
|
+
lower_limit = upper_limit * 0.9
|
24
|
+
version_message ="JRuby: #{JRUBY_JARS_VERSION}"
|
25
|
+
assert apk_size <= upper_limit, "APK was larger than #{'%.1f' % upper_limit}MB: #{'%.1f' % apk_size.ceil(1)}MB. #{version_message}"
|
26
|
+
assert apk_size >= lower_limit, "APK was smaller than #{'%.1f' % lower_limit}MB: #{'%.1f' % apk_size.floor(1)}MB. You should lower the limit. #{version_message}"
|
27
|
+
end
|
21
28
|
|
22
|
-
|
23
|
-
|
24
|
-
|
29
|
+
def test_minimal_apk_succeeds_tests
|
30
|
+
run_app_tests
|
31
|
+
end
|
25
32
|
|
26
|
-
end
|
33
|
+
end
|
34
|
+
end
|
data/test/rake_test.rb
CHANGED
@@ -9,7 +9,8 @@ class RakeTest < Test::Unit::TestCase
|
|
9
9
|
cleanup_app
|
10
10
|
end
|
11
11
|
|
12
|
-
|
12
|
+
# FIXME(uwe): Remove condition when we stop supporting android-7
|
13
|
+
if ANDROID_OS == 7
|
13
14
|
puts "Skipping sdcard test since files on sdcard are not removed on android-7 on app uninstall"
|
14
15
|
else
|
15
16
|
def test_that_update_scripts_task_copies_files_to_sdcard_and_are_read_by_activity
|
@@ -32,9 +33,19 @@ class RakeTest < Test::Unit::TestCase
|
|
32
33
|
# assert_equal apk_timestamp, File.ctime("bin/#{APP_NAME}-debug.apk"), 'APK should not have been rebuilt'
|
33
34
|
# FIXME end
|
34
35
|
|
35
|
-
|
36
|
+
assert_match %r{^/sdcard/Android/data/#{PACKAGE}/files/scripts$}, `adb shell ls -d /sdcard/Android/data/#{PACKAGE}/files/scripts`.chomp
|
36
37
|
end
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
41
|
+
def test_that_apk_is_built_if_only_one_ruby_source_file_has_changed
|
42
|
+
Dir.chdir APP_DIR do
|
43
|
+
system 'rake install'
|
44
|
+
apk_timestamp = File.ctime("bin/#{APP_NAME}-debug.apk")
|
45
|
+
FileUtils.touch "src/ruboto_test_app_activity.rb"
|
46
|
+
system 'rake install'
|
47
|
+
assert_not_equal apk_timestamp, File.ctime("bin/#{APP_NAME}-debug.apk"), 'APK should have been rebuilt'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
40
51
|
end
|
data/test/ruboto_gen_test.rb
CHANGED
@@ -32,10 +32,24 @@ class RubotoGenTest < Test::Unit::TestCase
|
|
32
32
|
|
33
33
|
def test_new_apk_size_is_within_limits
|
34
34
|
apk_size = BigDecimal(File.size("#{APP_DIR}/bin/RubotoTestApp-debug.apk").to_s) / 1024
|
35
|
-
|
35
|
+
version = " PLATFORM: #{RUBOTO_PLATFORM}"
|
36
|
+
if RUBOTO_PLATFORM == 'STANDALONE'
|
37
|
+
upper_limit = {
|
38
|
+
'1.6.7' => 5800.0,
|
39
|
+
'1.7.0.dev' => 6666.0,
|
40
|
+
}[JRUBY_JARS_VERSION.to_s] || 4200.0
|
41
|
+
version << ", JRuby: #{JRUBY_JARS_VERSION.to_s}"
|
42
|
+
else
|
43
|
+
upper_limit = {
|
44
|
+
7 => 56.0,
|
45
|
+
10 => 60.0,
|
46
|
+
15 => 65.0,
|
47
|
+
}[ANDROID_TARGET] || 64.0
|
48
|
+
version << ", ANDROID_TARGET: #{ANDROID_TARGET}"
|
49
|
+
end
|
36
50
|
lower_limit = upper_limit * 0.9
|
37
|
-
assert apk_size <= upper_limit, "APK was larger than #{'%.1f' % upper_limit}KB: #{'%.1f' % apk_size.ceil(1)}KB"
|
38
|
-
assert apk_size >= lower_limit, "APK was smaller than #{'%.1f' % lower_limit}KB: #{'%.1f' % apk_size.
|
51
|
+
assert apk_size <= upper_limit, "APK was larger than #{'%.1f' % upper_limit}KB: #{'%.1f' % apk_size.ceil(1)}KB.#{version}"
|
52
|
+
assert apk_size >= lower_limit, "APK was smaller than #{'%.1f' % lower_limit}KB: #{'%.1f' % apk_size.floor(1)}KB. You should lower the limit.#{version}"
|
39
53
|
end
|
40
54
|
|
41
55
|
end
|
data/test/ruboto_update_test.rb
CHANGED
@@ -1,5 +1,27 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path('updated_example_test_methods', File.dirname(__FILE__))
|
2
|
+
require File.expand_path('update_test_methods', File.dirname(__FILE__))
|
2
3
|
|
3
|
-
|
4
|
+
# TODO(uwe): Delete obsolete examples when we stop supporting updating from them.
|
5
|
+
|
6
|
+
Dir.chdir "#{RubotoTest::PROJECT_DIR}/examples/" do
|
7
|
+
Dir["#{RubotoTest::APP_NAME}_*_tools_r*.tgz"].each do |f|
|
8
|
+
next unless f =~ /^#{RubotoTest::APP_NAME}_(.*)_tools_r(.*)\.tgz$/
|
9
|
+
ruboto_version = $1
|
10
|
+
tools_version = $2
|
11
|
+
self.class.class_eval <<EOF
|
12
|
+
class RubotoUpdatedExample#{ruboto_version.gsub('.', '_')}Tools#{tools_version}Test < Test::Unit::TestCase
|
13
|
+
include UpdatedExampleTestMethods
|
14
|
+
def setup
|
15
|
+
super('#{ruboto_version}', '#{tools_version}')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class RubotoUpdate#{ruboto_version.gsub('.', '_')}Tools#{tools_version}Test < Test::Unit::TestCase
|
4
20
|
include UpdateTestMethods
|
21
|
+
def setup
|
22
|
+
super('#{ruboto_version}', '#{tools_version}')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
EOF
|
26
|
+
end
|
5
27
|
end
|
data/test/service_test.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
|
+
$:.unshift('lib') unless $:.include?('lib')
|
1
2
|
require 'test/unit'
|
2
3
|
require 'rubygems'
|
3
4
|
require 'fileutils'
|
4
5
|
require 'yaml'
|
6
|
+
require 'ruboto/sdk_versions'
|
5
7
|
|
6
8
|
module RubotoTest
|
9
|
+
include Ruboto::SdkVersions
|
10
|
+
|
7
11
|
PROJECT_DIR = File.expand_path('..', File.dirname(__FILE__))
|
8
12
|
$LOAD_PATH << PROJECT_DIR
|
9
13
|
|
@@ -11,21 +15,28 @@ module RubotoTest
|
|
11
15
|
FileUtils.mkdir_p GEM_PATH
|
12
16
|
ENV['GEM_HOME'] = GEM_PATH
|
13
17
|
ENV['GEM_PATH'] = GEM_PATH
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
ENV['PATH'] = "#{GEM_PATH}/bin:#{ENV['PATH']}"
|
19
|
+
Gem.path << GEM_PATH
|
20
|
+
Gem.refresh
|
21
|
+
`gem query -i -n bundler`
|
22
|
+
system 'gem install bundler' unless $? == 0
|
23
|
+
system 'bundle --system'
|
24
|
+
lib_path = File.expand_path('lib', File.dirname(File.dirname(__FILE__)))
|
25
|
+
$LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
|
26
|
+
require 'ruboto'
|
27
|
+
require 'ruboto/version'
|
22
28
|
|
29
|
+
PACKAGE = 'org.ruboto.test_app'
|
30
|
+
APP_NAME = 'RubotoTestApp'
|
31
|
+
TMP_DIR = File.join PROJECT_DIR, 'tmp'
|
32
|
+
APP_DIR = File.join TMP_DIR, APP_NAME
|
33
|
+
ANDROID_TARGET = (ENV['ANDROID_TARGET'] && ENV['ANDROID_TARGET'].slice(/\d+/).to_i) || MINIMUM_SUPPORTED_SDK_LEVEL
|
23
34
|
VERSION_TO_API_LEVEL = {
|
24
|
-
'2.1'
|
25
|
-
'2.3'
|
35
|
+
'2.1' => 'android-7', '2.1-update1' => 'android-7', '2.2' => 'android-8',
|
36
|
+
'2.3' => 'android-9', '2.3.1' => 'android-9', '2.3.2' => 'android-9',
|
26
37
|
'2.3.3' => 'android-10', '2.3.4' => 'android-10',
|
27
|
-
'3.0'
|
28
|
-
'4.0.1' => 'android-14', '4.0.3' => 'android-15',
|
38
|
+
'3.0' => 'android-11', '3.1' => 'android-12', '3.2' => 'android-13',
|
39
|
+
'4.0.1' => 'android-14', '4.0.3' => 'android-15', '4.0.4' => 'android-15'
|
29
40
|
}
|
30
41
|
|
31
42
|
def self.version_from_device
|
@@ -34,7 +45,7 @@ module RubotoTest
|
|
34
45
|
start = Time.now
|
35
46
|
IO.popen('adb bugreport').each_line do |line|
|
36
47
|
if line =~ /sdk-eng (.*?) .*? .*? test-keys/
|
37
|
-
version
|
48
|
+
version = $1
|
38
49
|
api_level = VERSION_TO_API_LEVEL[version]
|
39
50
|
raise "Unknown version: #{version}" if api_level.nil?
|
40
51
|
puts "Getting version from device/emulator took #{(Time.now - start).to_i}s"
|
@@ -47,21 +58,44 @@ module RubotoTest
|
|
47
58
|
raise "Unable to read device/emulator apilevel"
|
48
59
|
end
|
49
60
|
|
50
|
-
def install_jruby_jars_gem
|
51
|
-
|
61
|
+
def self.install_jruby_jars_gem
|
62
|
+
version_requirement = "-v #{ENV['JRUBY_JARS_VERSION']}" if ENV['JRUBY_JARS_VERSION']
|
63
|
+
`gem query -i -n jruby-jars #{version_requirement}`
|
64
|
+
system "gem install jruby-jars #{version_requirement}" unless $? == 0
|
52
65
|
raise "install of jruby-jars failed with return code #$?" unless $? == 0
|
53
|
-
|
66
|
+
if ENV['JRUBY_JARS_VERSION']
|
67
|
+
exclusion_clause = %Q{-v "!=#{ENV['JRUBY_JARS_VERSION']}"}
|
68
|
+
`gem query -u -n jruby-jars #{exclusion_clause}`
|
69
|
+
system %Q{gem uninstall jruby-jars --all #{exclusion_clause}"} unless $? == 0
|
70
|
+
raise "Uninstall of jruby-jars failed with return code #$?" unless $? == 0
|
71
|
+
end
|
54
72
|
end
|
55
73
|
|
56
|
-
|
57
|
-
|
74
|
+
def install_jruby_jars_gem
|
75
|
+
RubotoTest::install_jruby_jars_gem
|
76
|
+
end
|
58
77
|
|
78
|
+
def uninstall_jruby_jars_gem
|
79
|
+
`gem query --no-installed -n jruby-jars`
|
80
|
+
system 'gem uninstall jruby-jars --all' if $? != 0
|
81
|
+
assert_equal 0, $?, "uninstall of jruby-jars failed with return code #$?"
|
82
|
+
end
|
83
|
+
|
84
|
+
def install_ruboto_gem(version)
|
85
|
+
version_requirement = "-v #{version}"
|
86
|
+
`gem query -i -n ^ruboto$ #{version_requirement}`
|
87
|
+
system "gem install ruboto #{version_requirement}" unless $? == 0
|
88
|
+
raise "install of ruboto #{version} failed with return code #$?" unless $? == 0
|
89
|
+
end
|
90
|
+
|
91
|
+
ANDROID_OS = (ENV['ANDROID_OS'] || version_from_device).slice(/\d+/).to_i
|
59
92
|
puts "ANDROID_OS: #{ANDROID_OS}"
|
60
|
-
|
93
|
+
puts "ANDROID_TARGET: #{ANDROID_TARGET}"
|
61
94
|
|
62
|
-
|
63
|
-
|
64
|
-
|
95
|
+
RUBOTO_CMD = "ruby -rubygems -I #{PROJECT_DIR}/lib #{PROJECT_DIR}/bin/ruboto"
|
96
|
+
|
97
|
+
puts "ANDROID_HOME: #{ANDROID_HOME}"
|
98
|
+
puts "ANDROID_SDK_TOOLS_REVISION: #{ANDROID_TOOLS_REVISION}"
|
65
99
|
|
66
100
|
install_jruby_jars_gem
|
67
101
|
|
@@ -74,10 +108,19 @@ class Test::Unit::TestCase
|
|
74
108
|
# FIXME end
|
75
109
|
|
76
110
|
raise StandardError.new("Can't find Gem specification jruby-jars.") unless gem_spec
|
77
|
-
JRUBY_JARS_VERSION
|
111
|
+
JRUBY_JARS_VERSION = gem_spec.version
|
112
|
+
puts "JRUBY_JARS_VERSION: #{JRUBY_JARS_VERSION}"
|
113
|
+
|
114
|
+
RUBOTO_PLATFORM = ENV['RUBOTO_PLATFORM'] || 'CURRENT'
|
115
|
+
puts "RUBOTO_PLATFORM: #{RUBOTO_PLATFORM}"
|
78
116
|
|
79
117
|
# FIXME(uwe): Remove when we stop supporting JRuby 1.5.6
|
80
118
|
ON_JRUBY_JARS_1_5_6 = JRUBY_JARS_VERSION == Gem::Version.new('1.5.6')
|
119
|
+
end
|
120
|
+
|
121
|
+
class Test::Unit::TestCase
|
122
|
+
include RubotoTest
|
123
|
+
extend RubotoTest
|
81
124
|
|
82
125
|
alias old_run run
|
83
126
|
|
@@ -97,7 +140,8 @@ class Test::Unit::TestCase
|
|
97
140
|
|
98
141
|
def mark_test_end(test_name)
|
99
142
|
log
|
100
|
-
|
143
|
+
duration = (Time.now - @start_time).to_i
|
144
|
+
log "Ended test #{test_name}: #{passed? ? 'PASSED' : 'FAILED'} after #{duration / 60}:#{'%02d' % (duration % 60)}"
|
101
145
|
log '=' * 80
|
102
146
|
log
|
103
147
|
end
|
@@ -108,86 +152,114 @@ class Test::Unit::TestCase
|
|
108
152
|
end
|
109
153
|
|
110
154
|
def generate_app(options = {})
|
111
|
-
|
155
|
+
example = options.delete(:example) || false
|
156
|
+
update = options.delete(:update) || false
|
112
157
|
excluded_stdlibs = options.delete(:excluded_stdlibs)
|
158
|
+
standalone = options.delete(:standalone) || !!excluded_stdlibs || ENV['RUBOTO_PLATFORM'] == 'STANDALONE'
|
113
159
|
raise "Unknown options: #{options.inspect}" unless options.empty?
|
114
160
|
Dir.mkdir TMP_DIR unless File.exists? TMP_DIR
|
115
161
|
|
116
|
-
if excluded_stdlibs
|
117
|
-
system 'rake platform:uninstall'
|
118
|
-
else
|
119
|
-
system 'rake platform:install'
|
120
|
-
end
|
121
|
-
if $? != 0
|
122
|
-
FileUtils.rm_rf 'tmp/RubotoCore'
|
123
|
-
fail 'Error (un)installing RubotoCore'
|
124
|
-
end
|
125
|
-
|
126
162
|
FileUtils.rm_rf APP_DIR if File.exists? APP_DIR
|
127
|
-
template_dir = "#{APP_DIR}_template_#{$$}
|
163
|
+
template_dir = "#{APP_DIR}_template_#{$$}"
|
164
|
+
template_dir << "_example_#{example}" if example
|
165
|
+
template_dir << '_updated' if update
|
166
|
+
template_dir << '_standalone' if standalone
|
167
|
+
template_dir << "_without_#{excluded_stdlibs.map { |ed| ed.gsub(/[.\/]/, '_') }.join('_')}" if excluded_stdlibs
|
128
168
|
if File.exists?(template_dir)
|
129
169
|
puts "Copying app from template #{template_dir}"
|
130
170
|
FileUtils.cp_r template_dir, APP_DIR, :preserve => true
|
131
171
|
else
|
132
172
|
install_jruby_jars_gem
|
133
173
|
|
134
|
-
if
|
174
|
+
if example
|
135
175
|
Dir.chdir TMP_DIR do
|
136
|
-
system "tar xzf #{PROJECT_DIR}/examples
|
137
|
-
end
|
138
|
-
if ENV['ANDROID_HOME']
|
139
|
-
android_home = ENV['ANDROID_HOME']
|
140
|
-
else
|
141
|
-
android_home = File.dirname(File.dirname(`which adb`))
|
176
|
+
system "tar xzf #{PROJECT_DIR}/examples/#{APP_NAME}_#{example}.tgz"
|
142
177
|
end
|
143
178
|
Dir.chdir APP_DIR do
|
144
|
-
File.open('local.properties', 'w') { |f| f.puts "sdk.dir=#{
|
145
|
-
File.open('test/local.properties', 'w') { |f| f.puts "sdk.dir=#{
|
146
|
-
|
147
|
-
|
148
|
-
|
179
|
+
File.open('local.properties', 'w') { |f| f.puts "sdk.dir=#{ANDROID_HOME}" }
|
180
|
+
File.open('test/local.properties', 'w') { |f| f.puts "sdk.dir=#{ANDROID_HOME}" }
|
181
|
+
if standalone
|
182
|
+
exclude_stdlibs(excluded_stdlibs) if excluded_stdlibs
|
183
|
+
FileUtils.touch 'libs/jruby-core-x.x.x.jar'
|
184
|
+
FileUtils.touch 'libs/jruby-stdlib-x.x.x.jar'
|
185
|
+
else
|
186
|
+
FileUtils.rm(Dir['libs/{jruby-*.jar,dexmaker*.jar}'])
|
187
|
+
end
|
188
|
+
update_app if update
|
149
189
|
end
|
150
190
|
else
|
151
|
-
unless
|
152
|
-
system 'gem uninstall jruby-jars --all'
|
153
|
-
assert_equal 0, $?, "uninstall of jruby-jars failed with return code #$?"
|
154
|
-
end
|
191
|
+
uninstall_jruby_jars_gem unless standalone
|
155
192
|
puts "Generating app #{APP_DIR}"
|
156
|
-
system "#{RUBOTO_CMD} gen app --package #{PACKAGE} --path #{APP_DIR} --name #{APP_NAME} --target
|
193
|
+
system "#{RUBOTO_CMD} gen app --package #{PACKAGE} --path #{APP_DIR} --name #{APP_NAME} --target android-#{ANDROID_TARGET}"
|
157
194
|
if $? != 0
|
158
195
|
FileUtils.rm_rf APP_DIR
|
159
196
|
raise "gen app failed with return code #$?"
|
160
197
|
end
|
161
|
-
if
|
198
|
+
if standalone
|
162
199
|
Dir.chdir APP_DIR do
|
163
|
-
exclude_stdlibs(excluded_stdlibs)
|
200
|
+
exclude_stdlibs(excluded_stdlibs) if excluded_stdlibs
|
164
201
|
system "#{RUBOTO_CMD} update jruby --force"
|
165
202
|
raise "update jruby failed with return code #$?" if $? != 0
|
166
203
|
end
|
167
204
|
end
|
168
205
|
end
|
169
|
-
|
170
|
-
|
171
|
-
|
206
|
+
|
207
|
+
# FIXME(uwe): Installation with dexmaker fails on Android < 4.0.3 due to complex interface structure
|
208
|
+
# Fixme(uwe): Remove when solved
|
209
|
+
if standalone && ANDROID_OS < 15
|
210
|
+
Dir.chdir APP_DIR do
|
211
|
+
puts "Removing dexmaker jar for android-#{ANDROID_OS}"
|
212
|
+
FileUtils.rm(Dir['libs/dexmaker*.jar'])
|
213
|
+
end
|
214
|
+
end
|
215
|
+
# FIXME end
|
216
|
+
|
217
|
+
unless example && !update
|
218
|
+
Dir.chdir APP_DIR do
|
219
|
+
system 'rake debug'
|
220
|
+
assert_equal 0, $?
|
221
|
+
end
|
172
222
|
end
|
173
223
|
puts "Storing app as template #{template_dir}"
|
174
224
|
FileUtils.cp_r APP_DIR, template_dir, :preserve => true
|
175
225
|
end
|
176
226
|
end
|
177
227
|
|
228
|
+
def update_app
|
229
|
+
system "#{RUBOTO_CMD} update app"
|
230
|
+
assert_equal 0, $?, "update app failed with return code #$?"
|
231
|
+
end
|
232
|
+
|
178
233
|
def cleanup_app
|
179
234
|
# FileUtils.rm_rf APP_DIR if File.exists? APP_DIR
|
180
235
|
end
|
181
236
|
|
182
237
|
def run_app_tests
|
183
|
-
if [
|
238
|
+
if [7, 8].include? ANDROID_OS
|
184
239
|
puts "Skipping instrumentation tests on #{ANDROID_OS} since they don't work."
|
240
|
+
return
|
241
|
+
end
|
242
|
+
check_platform_installation(Dir['libs/jruby-core-*.jar'].any?)
|
243
|
+
Dir.chdir APP_DIR do
|
244
|
+
system 'rake test:quick'
|
245
|
+
assert_equal 0, $?, "tests failed with return code #$?"
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
def check_platform_installation(standalone)
|
250
|
+
if standalone
|
251
|
+
system 'rake platform:uninstall'
|
185
252
|
else
|
186
|
-
|
187
|
-
system
|
188
|
-
|
253
|
+
if RUBOTO_PLATFORM == 'CURRENT'
|
254
|
+
system "rake platform:current platform:install"
|
255
|
+
elsif RUBOTO_PLATFORM == 'MASTER'
|
256
|
+
system "rake platform:install"
|
189
257
|
end
|
190
258
|
end
|
259
|
+
if $? != 0
|
260
|
+
FileUtils.rm_rf 'tmp/RubotoCore'
|
261
|
+
fail 'Error (un)installing RubotoCore'
|
262
|
+
end
|
191
263
|
end
|
192
264
|
|
193
265
|
def exclude_stdlibs(excluded_stdlibs)
|