rubotium 0.0.4 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/bin/rubotium +4 -2
- data/lib/rubotium/adb/commands/command.rb +55 -0
- data/lib/rubotium/adb/commands/install_command.rb +19 -0
- data/lib/rubotium/adb/commands/instrument_command.rb +27 -0
- data/lib/rubotium/adb/commands/memory_command.rb +19 -0
- data/lib/rubotium/adb/commands/pull_command.rb +19 -0
- data/lib/rubotium/adb/commands/shell_command.rb +21 -0
- data/lib/rubotium/adb/commands/uninstall_command.rb +19 -0
- data/lib/rubotium/adb/commands.rb +7 -0
- data/lib/rubotium/adb/devices.rb +15 -6
- data/lib/rubotium/adb/parsers/procrank.rb +51 -0
- data/lib/rubotium/adb/parsers/single_test_result_parser.rb +61 -0
- data/lib/rubotium/adb/parsers/test_results_parser.rb +69 -0
- data/lib/rubotium/adb/parsers.rb +3 -0
- data/lib/rubotium/adb/test_result_parser.rb +5 -4
- data/lib/rubotium/adb.rb +3 -5
- data/lib/rubotium/apk/android_apk.rb +102 -0
- data/lib/rubotium/apk.rb +2 -2
- data/lib/rubotium/cmd.rb +1 -1
- data/lib/rubotium/device.rb +19 -33
- data/lib/rubotium/devices.rb +27 -14
- data/lib/rubotium/formatters/junit_formatter.rb +10 -11
- data/lib/rubotium/memory/data_point.rb +63 -0
- data/lib/rubotium/memory/monitor.rb +65 -0
- data/lib/rubotium/memory.rb +8 -0
- data/lib/rubotium/package.rb +7 -4
- data/lib/rubotium/runnable_test.rb +13 -0
- data/lib/rubotium/test_cases_reader.rb +32 -0
- data/lib/rubotium/test_result.rb +52 -0
- data/lib/rubotium/test_results.rb +18 -0
- data/lib/rubotium/test_runners/instrumentation_test_runner.rb +24 -0
- data/lib/rubotium/tests_runner.rb +80 -0
- data/lib/rubotium/version.rb +1 -1
- data/lib/rubotium.rb +54 -41
- data/rubotium.gemspec +0 -1
- data/spec/fixtures/adb_raw_result.rb +138 -0
- data/spec/fixtures/adb_raw_results.rb +153 -0
- data/spec/fixtures/adb_results.rb +4 -0
- data/spec/lib/rubotium/adb/adb_devices_spec.rb +43 -12
- data/spec/lib/rubotium/adb/adb_result_parser_spec.rb +22 -7
- data/spec/lib/rubotium/adb/adb_shell_spec.rb +11 -6
- data/spec/lib/rubotium/adb/parsers/procrank_spec.rb +61 -0
- data/spec/lib/rubotium/adb/parsers/single_test_result_parser_spec.rb +116 -0
- data/spec/lib/rubotium/adb/parsers/test_results_parser_spec.rb +108 -0
- data/spec/lib/rubotium/apk/android_apk_spec.rb +37 -0
- data/spec/lib/rubotium/apk/mock/BarcodeScanner4.2.apk +0 -0
- data/spec/lib/rubotium/apk/mock/UECExpress.apk +0 -0
- data/spec/lib/rubotium/apk/mock/dummy.apk +1 -0
- data/spec/lib/rubotium/apk/mock/sample.apk +0 -0
- data/spec/lib/rubotium/device_spec.rb +38 -0
- data/spec/lib/rubotium/devices_spec.rb +41 -24
- data/spec/lib/rubotium/memory/data_point_spec.rb +42 -0
- data/spec/lib/rubotium/memory/monitor_spec.rb +6 -0
- data/spec/lib/rubotium/tests_runner_spec.rb +47 -0
- data/spec/spec_helper.rb +2 -0
- data/test.rb +11 -0
- metadata +62 -41
- data/lib/rubotium/adb/command.rb +0 -21
- data/lib/rubotium/adb/install_command.rb +0 -17
- data/lib/rubotium/adb/instrumentation.rb +0 -36
- data/lib/rubotium/adb/uninstall_command.rb +0 -17
- data/lib/rubotium/apk/converter.rb +0 -22
- data/lib/rubotium/grouper.rb +0 -40
- data/lib/rubotium/jar_reader.rb +0 -70
- data/lib/rubotium/runable_test.rb +0 -11
- data/lib/rubotium/test_case.rb +0 -6
- data/lib/rubotium/test_suite.rb +0 -12
- data/spec/lib/rubotium/adb/adb_instrumentation_spec.rb +0 -32
- data/spec/lib/rubotium/grouper_spec.rb +0 -56
- data/spec/lib/rubotium/jar_reader_spec.rb +0 -58
data/lib/rubotium/device.rb
CHANGED
@@ -1,49 +1,35 @@
|
|
1
1
|
module Rubotium
|
2
2
|
class Device
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
@runner = test_runner
|
7
|
-
@retry = 1
|
8
|
-
@serial = serial
|
9
|
-
@results = {}
|
10
|
-
@command = Rubotium::Adb::Command.new(serial)
|
3
|
+
attr_reader :serial
|
4
|
+
def initialize(serial)
|
5
|
+
@serial = serial
|
11
6
|
end
|
12
7
|
|
13
|
-
def
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_package_name= name
|
18
|
-
runner.test_package_name = name
|
8
|
+
def name
|
9
|
+
@name ||= adb_command.shell('getprop ro.product.model').strip
|
19
10
|
end
|
20
11
|
|
21
12
|
def install(apk_path)
|
22
|
-
|
13
|
+
adb_command.install(apk_path)
|
23
14
|
end
|
24
15
|
|
25
16
|
def uninstall(package_name)
|
26
|
-
|
17
|
+
adb_command.uninstall(package_name)
|
18
|
+
end
|
19
|
+
|
20
|
+
def pull(path)
|
21
|
+
adb_command.pull(path)
|
27
22
|
end
|
28
23
|
|
29
|
-
def
|
30
|
-
|
31
|
-
puts "Running tests"
|
32
|
-
testsuite.each{|runable_test|
|
33
|
-
@results[runable_test.package_name] = [] if(@results[runable_test.package_name].nil?)
|
34
|
-
puts runable_test.name
|
35
|
-
run_count = 0
|
36
|
-
puts "TEST: #{runable_test.name}"
|
37
|
-
while ((result = runner.run_test(runable_test)) && (result.failed? || result.errored?) && run_count < @retry ) do
|
38
|
-
puts "RERUNNING TEST: #{runable_test.name}, STATUS: #{result.status}"
|
39
|
-
run_count += 1
|
40
|
-
end
|
41
|
-
puts "FINISHED with status: #{result.status}"
|
42
|
-
@results[runable_test.package_name].push(result)
|
43
|
-
}
|
24
|
+
def shell(command)
|
25
|
+
adb_command.shell(command)
|
44
26
|
end
|
45
27
|
|
46
28
|
private
|
47
|
-
attr_reader :
|
29
|
+
attr_reader :command
|
30
|
+
|
31
|
+
def adb_command
|
32
|
+
@command ||= Rubotium::Adb::Commands::Command.new(serial)
|
33
|
+
end
|
48
34
|
end
|
49
|
-
end
|
35
|
+
end
|
data/lib/rubotium/devices.rb
CHANGED
@@ -1,25 +1,38 @@
|
|
1
1
|
module Rubotium
|
2
2
|
class Devices
|
3
|
-
def initialize(
|
4
|
-
@
|
5
|
-
@
|
3
|
+
def initialize(options = {})
|
4
|
+
@match_serial = options[:serial] || ''
|
5
|
+
@match_name = options[:name] || ''
|
6
6
|
end
|
7
7
|
|
8
8
|
def all
|
9
9
|
raise NoDevicesError if attached_devices.empty?
|
10
|
-
raise NoMatchedDevicesError if
|
11
|
-
|
12
|
-
Device.new(device, Adb::Instrumentation.new(device))
|
13
|
-
}
|
10
|
+
raise NoMatchedDevicesError if matched_by_name.empty?
|
11
|
+
(matched_by_name + matched_by_serial).uniq
|
14
12
|
end
|
15
13
|
|
16
14
|
private
|
17
|
-
|
15
|
+
attr_reader :matched, :attached_devices, :match_name, :match_serial
|
16
|
+
|
17
|
+
def attached_devices
|
18
|
+
@attached_devices ||= adb_devices.attached
|
19
|
+
end
|
20
|
+
|
21
|
+
def matched_by_serial
|
22
|
+
attached_devices.select { |device|
|
23
|
+
device.serial.eql? match_serial
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def matched_by_name
|
28
|
+
attached_devices.select { |device|
|
29
|
+
device.name.include? match_name
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
def adb_devices
|
34
|
+
Adb::Devices.new
|
35
|
+
end
|
18
36
|
|
19
|
-
def matched_devices(device_matcher)
|
20
|
-
device_matcher ? attached_devices.select{|device|
|
21
|
-
device.include? device_matcher
|
22
|
-
} : attached_devices
|
23
|
-
end
|
24
37
|
end
|
25
|
-
end
|
38
|
+
end
|
@@ -4,22 +4,21 @@ module Rubotium
|
|
4
4
|
module Formatters
|
5
5
|
class JunitFormatter
|
6
6
|
attr_reader :xml
|
7
|
-
def initialize(
|
8
|
-
@
|
9
|
-
@results = device.results
|
7
|
+
def initialize(results, path_to_file)
|
8
|
+
@results = results
|
10
9
|
@report_file_path = path_to_file
|
11
10
|
|
12
11
|
@xml = Builder::XmlMarkup.new :target => ensure_io(report_path), :indent => 2
|
13
12
|
|
14
13
|
xml.testsuites do
|
15
|
-
results.each{|
|
16
|
-
start_test_suite(tests)
|
14
|
+
results.each{|package_name, tests|
|
15
|
+
start_test_suite(package_name, tests)
|
17
16
|
}
|
18
17
|
end
|
19
18
|
end
|
20
19
|
private
|
21
20
|
attr_reader :report_file_path, :device_serial, :results
|
22
|
-
def start_test_suite(tests)
|
21
|
+
def start_test_suite(package_name, tests)
|
23
22
|
failures = get_failures(tests)
|
24
23
|
errors = get_errors(tests)
|
25
24
|
tests_time = get_tests_time(tests)
|
@@ -27,7 +26,7 @@ module Rubotium
|
|
27
26
|
params = {
|
28
27
|
:errors => errors,
|
29
28
|
:failures => failures,
|
30
|
-
:name =>
|
29
|
+
:name => package_name,
|
31
30
|
:tests => tests_count,
|
32
31
|
:time => tests_time,
|
33
32
|
:timestamp => Time.now
|
@@ -41,13 +40,13 @@ module Rubotium
|
|
41
40
|
end
|
42
41
|
|
43
42
|
def print_testcase(test)
|
44
|
-
xml.testcase(:classname=>test.
|
43
|
+
xml.testcase(:classname=> test.class_name, :name=>test.test_name, :time=>test.time) do
|
45
44
|
has_failures(test)
|
46
45
|
has_errors(test)
|
47
46
|
end
|
48
47
|
end
|
49
48
|
|
50
|
-
|
49
|
+
def has_failures(test)
|
51
50
|
if test.failed?
|
52
51
|
xml.failure :message=>"", :type=>"" do
|
53
52
|
xml.cdata! test.stack_trace
|
@@ -80,7 +79,7 @@ module Rubotium
|
|
80
79
|
end
|
81
80
|
|
82
81
|
def report_path
|
83
|
-
|
82
|
+
report_file_path
|
84
83
|
end
|
85
84
|
|
86
85
|
def ensure_io(path_to_file)
|
@@ -88,4 +87,4 @@ module Rubotium
|
|
88
87
|
end
|
89
88
|
end
|
90
89
|
end
|
91
|
-
end
|
90
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'json'
|
2
|
+
module Rubotium
|
3
|
+
module Memory
|
4
|
+
class DataPoint
|
5
|
+
attr_reader :time
|
6
|
+
|
7
|
+
def initialize(time, data_struct)
|
8
|
+
@time = time
|
9
|
+
@data_struct = data_struct
|
10
|
+
end
|
11
|
+
|
12
|
+
def pid
|
13
|
+
parsed_result.pid
|
14
|
+
end
|
15
|
+
|
16
|
+
def vss
|
17
|
+
parsed_result.vss
|
18
|
+
end
|
19
|
+
|
20
|
+
def rss
|
21
|
+
parsed_result.rss
|
22
|
+
end
|
23
|
+
|
24
|
+
def pss
|
25
|
+
parsed_result.pss
|
26
|
+
end
|
27
|
+
|
28
|
+
def uss
|
29
|
+
parsed_result.uss
|
30
|
+
end
|
31
|
+
|
32
|
+
def cmdline
|
33
|
+
parsed_result.cmdline
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_s
|
37
|
+
to_json.to_json
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_json
|
41
|
+
{
|
42
|
+
:time => time,
|
43
|
+
:pid => pid,
|
44
|
+
:vss => vss,
|
45
|
+
:rss => rss,
|
46
|
+
:uss => uss,
|
47
|
+
:cmd => cmdline
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
attr_reader :data_struct
|
53
|
+
|
54
|
+
def parsed_result
|
55
|
+
@parsed_result ||= parser.parse
|
56
|
+
end
|
57
|
+
|
58
|
+
def parser
|
59
|
+
Rubotium::Adb::Parsers::Procrank.new(data_struct)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require_relative 'data_point'
|
2
|
+
|
3
|
+
module Rubotium
|
4
|
+
module Memory
|
5
|
+
class Monitor
|
6
|
+
def initialize(device, opts = {})
|
7
|
+
@device = device
|
8
|
+
@process_name = opts.delete(:process_name) || nil
|
9
|
+
@interval = opts.delete(:interval) || 0
|
10
|
+
end
|
11
|
+
|
12
|
+
def start
|
13
|
+
@should_pool_memory = !!process_name
|
14
|
+
start_probing_memory
|
15
|
+
end
|
16
|
+
|
17
|
+
def stop_and_save(io)
|
18
|
+
stop
|
19
|
+
io.write("[#{data_points.join(',')}]")
|
20
|
+
reset
|
21
|
+
end
|
22
|
+
|
23
|
+
def stop
|
24
|
+
@should_pool_memory = false
|
25
|
+
start_probing_memory.join
|
26
|
+
Rubotium.logger.debug("Memory collector stopped")
|
27
|
+
end
|
28
|
+
|
29
|
+
def data_points
|
30
|
+
data.clone
|
31
|
+
end
|
32
|
+
|
33
|
+
def reset
|
34
|
+
@data = []
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
attr_reader :device, :interval, :process_name
|
40
|
+
attr_accessor :should_pool_memory
|
41
|
+
|
42
|
+
def start_probing_memory
|
43
|
+
@pooling_thread ||= Thread.new do
|
44
|
+
while @should_pool_memory do
|
45
|
+
data.push(DataPoint.new(time, probe_memory))
|
46
|
+
sleep interval
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def data
|
52
|
+
@data ||= []
|
53
|
+
end
|
54
|
+
|
55
|
+
def time
|
56
|
+
Time.at(Time.now).strftime("%H:%M:%S")
|
57
|
+
end
|
58
|
+
|
59
|
+
def probe_memory
|
60
|
+
device.shell(Rubotium::Adb::Commands::MemoryCommand.new(process_name).executable_command)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/rubotium/package.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
require 'android_apk'
|
2
|
-
|
3
1
|
module Rubotium
|
4
2
|
class Package
|
5
|
-
def initialize(package_path)
|
3
|
+
def initialize(package_path, test_runner = '')
|
6
4
|
@package_path = package_path
|
5
|
+
@test_runner = test_runner || 'android.test.InstrumentationTestRunner'
|
7
6
|
end
|
8
7
|
|
9
8
|
def valid?
|
@@ -26,11 +25,15 @@ module Rubotium
|
|
26
25
|
analyzed_package.version_code
|
27
26
|
end
|
28
27
|
|
28
|
+
def test_runner
|
29
|
+
@test_runner
|
30
|
+
end
|
31
|
+
|
29
32
|
private
|
30
33
|
attr_reader :package_path
|
31
34
|
|
32
35
|
def analyzed_package
|
33
|
-
@analyzed_package ||= AndroidApk.
|
36
|
+
@analyzed_package ||= Rubotium::Apk::AndroidApk.new(package_path)
|
34
37
|
end
|
35
38
|
end
|
36
39
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Rubotium
|
2
|
+
class TestCasesReader
|
3
|
+
def initialize(device, test_package, options = {})
|
4
|
+
@device = device
|
5
|
+
@test_package = test_package
|
6
|
+
@annotation = options.delete(:annotation)
|
7
|
+
end
|
8
|
+
|
9
|
+
def read_tests
|
10
|
+
result = device.shell(instrument_command)
|
11
|
+
Rubotium::Adb::Parsers::TestResultsParser.new(result).test_results.map{|test|
|
12
|
+
create_runnable_test(test)
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_runnable_test(test)
|
17
|
+
Rubotium::RunnableTest.new(test.class_name, test.test_name)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
attr_reader :device, :test_package, :annotation
|
23
|
+
|
24
|
+
def instrument_command
|
25
|
+
"am instrument -w -r -e log true #{with_annotation} #{test_package.name}/#{test_package.test_runner}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def with_annotation
|
29
|
+
annotation ? "-e annotation #{annotation}" : ''
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Rubotium
|
2
|
+
class TestResult
|
3
|
+
|
4
|
+
attr_reader :stack_trace, :time, :error_message, :status, :test_name, :class_name, :device
|
5
|
+
|
6
|
+
def initialize(test_results_parser, runnable_test)
|
7
|
+
@parsed_result = test_results_parser
|
8
|
+
@class_name = runnable_test.package_name
|
9
|
+
@test_name = runnable_test.test_name
|
10
|
+
end
|
11
|
+
|
12
|
+
def stack_trace
|
13
|
+
if(failed_run?)
|
14
|
+
parsed_result.message
|
15
|
+
else
|
16
|
+
test_case.stack_trace
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def failed?
|
21
|
+
failed_run? || test_case.failed?
|
22
|
+
end
|
23
|
+
|
24
|
+
def passed?
|
25
|
+
not failed_run? and test_case.passed?
|
26
|
+
end
|
27
|
+
|
28
|
+
def errored?
|
29
|
+
failed_run? || test_case.errored?
|
30
|
+
end
|
31
|
+
|
32
|
+
def error_message
|
33
|
+
stack_trace
|
34
|
+
end
|
35
|
+
|
36
|
+
def time
|
37
|
+
parsed_result.time
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
attr_reader :parsed_result
|
43
|
+
|
44
|
+
def failed_run?
|
45
|
+
parsed_result.failed?
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_case
|
49
|
+
parsed_result.test_results.first
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Rubotium
|
2
|
+
class TestResults
|
3
|
+
def initialize(results)
|
4
|
+
@results = results
|
5
|
+
end
|
6
|
+
|
7
|
+
def group_by_package
|
8
|
+
json = {}
|
9
|
+
results.each{|result|
|
10
|
+
json[result.class_name] = [] unless json[result.class_name]
|
11
|
+
json[result.class_name].push(result)
|
12
|
+
}
|
13
|
+
json
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_reader :results
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Rubotium
|
2
|
+
module TestRunners
|
3
|
+
class InstrumentationTestRunner
|
4
|
+
def initialize(device, test_package, options = {})
|
5
|
+
@device = device
|
6
|
+
@test_package = test_package
|
7
|
+
@annotations = options.delete(:annotation)
|
8
|
+
end
|
9
|
+
|
10
|
+
def run_test(runnable_test)
|
11
|
+
result = device.shell(instrument_command(runnable_test))
|
12
|
+
Rubotium::TestResult.new(Rubotium::Adb::Parsers::TestResultsParser.new(result), runnable_test)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :device, :test_package
|
18
|
+
|
19
|
+
def instrument_command (runnable_test)
|
20
|
+
"am instrument -w -r -e class #{runnable_test.name} #{test_package.name}/#{test_package.test_runner}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'parallel'
|
2
|
+
module Rubotium
|
3
|
+
class TestsRunner
|
4
|
+
def initialize(devices, tests, tests_package, options = {})
|
5
|
+
@devices = devices
|
6
|
+
@tests = tests
|
7
|
+
@tests_package = tests_package
|
8
|
+
@tests_runner = tests_package.test_runner
|
9
|
+
@options = options
|
10
|
+
@test_number = 0
|
11
|
+
end
|
12
|
+
|
13
|
+
def tests_count
|
14
|
+
tests.count
|
15
|
+
end
|
16
|
+
|
17
|
+
def tests_to_execute
|
18
|
+
tests_queue.count
|
19
|
+
end
|
20
|
+
|
21
|
+
def tests_results
|
22
|
+
Rubotium::TestResults.new(results)
|
23
|
+
end
|
24
|
+
|
25
|
+
def run_tests
|
26
|
+
fill_tests_queue
|
27
|
+
Parallel.each(devices, :in_threads => devices.count) { |device|
|
28
|
+
until tests_queue.empty?
|
29
|
+
test = next_test
|
30
|
+
memory_monitor = Rubotium::Memory::Monitor.new(device, { :interval => 1 })
|
31
|
+
memory_monitor.start
|
32
|
+
display_test_progress
|
33
|
+
result = test_runner(device).run_test(test)
|
34
|
+
if(result.failed? || result.errored?)
|
35
|
+
result = test_runner(device).run_test(test)
|
36
|
+
end
|
37
|
+
results.push(result)
|
38
|
+
memory_monitor.stop_and_save(memory_results_file(test))
|
39
|
+
end
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
def display_test_progress
|
44
|
+
@test_number += 1
|
45
|
+
puts "Running test: #{@test_number} out of #{tests_count}"
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
attr_reader :devices, :tests_package, :tests
|
51
|
+
|
52
|
+
def memory_results_file(test)
|
53
|
+
File.open("results/memory_logs/#{test.name}.json", 'w+')
|
54
|
+
end
|
55
|
+
|
56
|
+
def results
|
57
|
+
@results ||= []
|
58
|
+
end
|
59
|
+
|
60
|
+
def next_test
|
61
|
+
tests_queue.pop
|
62
|
+
end
|
63
|
+
|
64
|
+
def fill_tests_queue
|
65
|
+
tests.map { |test| tests_queue.push(test) }
|
66
|
+
end
|
67
|
+
|
68
|
+
def tests_queue
|
69
|
+
@queue ||= Queue.new
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_runner(device)
|
73
|
+
Rubotium::TestRunners::InstrumentationTestRunner.new(device, tests_package)
|
74
|
+
end
|
75
|
+
|
76
|
+
def retrying_test_runner
|
77
|
+
Rubotium::TestRunners::RetryingTestRunner.new(device, test)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/rubotium/version.rb
CHANGED