acouchi 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/acouchi.rb +2 -0
- data/lib/acouchi/apk_installer.rb +24 -0
- data/lib/acouchi/apk_modifier.rb +4 -8
- data/lib/acouchi/executables.rb +7 -0
- data/lib/acouchi/process_launcher.rb +17 -13
- data/lib/acouchi/project_builder.rb +2 -12
- data/lib/acouchi/test_runner.rb +6 -14
- data/lib/acouchi/version.rb +1 -1
- data/lib/acouchi/which.rb +12 -11
- metadata +4 -2
data/lib/acouchi.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
module Acouchi
|
2
|
+
class ApkInstaller
|
3
|
+
def initialize configuration
|
4
|
+
@configuration = configuration
|
5
|
+
@apk_path = File.join(configuration.project_path, "bin", configuration.apk)
|
6
|
+
end
|
7
|
+
|
8
|
+
def install_apk
|
9
|
+
ProcessLauncher.new(
|
10
|
+
Executables.adb,
|
11
|
+
"install",
|
12
|
+
@apk_path
|
13
|
+
).start_and_crash_if_process_fails
|
14
|
+
end
|
15
|
+
|
16
|
+
def uninstall_apk
|
17
|
+
ProcessLauncher.new(
|
18
|
+
Executables.adb,
|
19
|
+
"uninstall",
|
20
|
+
@configuration.target_package
|
21
|
+
).start
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/acouchi/apk_modifier.rb
CHANGED
@@ -32,16 +32,12 @@ module Acouchi
|
|
32
32
|
@apktool ||= Which.find_executable("apktool.bat", "apktool")
|
33
33
|
end
|
34
34
|
|
35
|
-
def execute_apktool command
|
36
|
-
ProcessLauncher.new(apktool, command)
|
37
|
-
end
|
38
|
-
|
39
35
|
def decompile_apk
|
40
|
-
ProcessLauncher.new(apktool, "d", @apk, @output_path).start_and_crash_if_process_fails
|
36
|
+
ProcessLauncher.new(apktool, "d", @apk, @output_path).with_inherited_io.start_and_crash_if_process_fails
|
41
37
|
end
|
42
38
|
|
43
39
|
def compile_apk
|
44
|
-
ProcessLauncher.new(apktool, "b", @output_path).start_and_crash_if_process_fails
|
40
|
+
ProcessLauncher.new(apktool, "b", @output_path).with_inherited_io.start_and_crash_if_process_fails
|
45
41
|
end
|
46
42
|
|
47
43
|
def sign_apk_in_debug_mode
|
@@ -58,11 +54,11 @@ module Acouchi
|
|
58
54
|
"android",
|
59
55
|
@new_apk,
|
60
56
|
"androiddebugkey"
|
61
|
-
).start_and_crash_if_process_fails
|
57
|
+
).with_inherited_io.start_and_crash_if_process_fails
|
62
58
|
end
|
63
59
|
|
64
60
|
def overwrite_original_apk
|
65
|
-
|
61
|
+
FileUtils.mv(@new_apk, @apk)
|
66
62
|
end
|
67
63
|
end
|
68
64
|
end
|
@@ -1,37 +1,41 @@
|
|
1
|
+
require "childprocess"
|
2
|
+
|
1
3
|
module Acouchi
|
2
4
|
class ProcessLauncher
|
5
|
+
DEFAULT_START_OPTIONS = {:inherit_io => true}
|
6
|
+
|
3
7
|
def initialize(*arguments)
|
4
8
|
@arguments = arguments
|
5
9
|
@process = ChildProcess.build(*@arguments)
|
10
|
+
self
|
11
|
+
end
|
12
|
+
|
13
|
+
def with_inherited_io
|
6
14
|
@process.io.inherit!
|
15
|
+
self
|
7
16
|
end
|
8
17
|
|
9
18
|
def start
|
10
|
-
write_out_arguments
|
11
19
|
@process.start
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
def wait
|
12
24
|
@process.wait
|
25
|
+
self
|
13
26
|
end
|
14
27
|
|
15
28
|
def start_in_background
|
16
|
-
write_out_arguments
|
17
29
|
@process.start
|
18
|
-
|
19
|
-
|
20
|
-
def stop
|
21
|
-
@process.stop
|
30
|
+
self
|
22
31
|
end
|
23
32
|
|
24
33
|
def start_and_crash_if_process_fails
|
25
|
-
start
|
26
|
-
|
34
|
+
start.wait
|
27
35
|
if @process.crashed?
|
28
36
|
raise "A process exited with a non-zero exit code.\nThe command executed was \"#{@arguments.join(" ")}\""
|
29
37
|
end
|
38
|
+
self
|
30
39
|
end
|
31
|
-
|
32
|
-
private
|
33
|
-
def write_out_arguments
|
34
|
-
p @arguments
|
35
|
-
end
|
36
40
|
end
|
37
41
|
end
|
@@ -21,7 +21,6 @@ module Acouchi
|
|
21
21
|
|
22
22
|
apk_path = File.join(configuration.project_path, "bin", configuration.apk)
|
23
23
|
modify_manifest(apk_path)
|
24
|
-
install_apk(apk_path)
|
25
24
|
end
|
26
25
|
|
27
26
|
def temporarily_copy_over_source_files
|
@@ -76,23 +75,14 @@ module Acouchi
|
|
76
75
|
end
|
77
76
|
end
|
78
77
|
|
79
|
-
def adb
|
80
|
-
Which.which?("adb.exe") || Which.which?("adb")
|
81
|
-
end
|
82
|
-
|
83
78
|
def ant
|
84
|
-
Which.
|
79
|
+
Which.find_executable("ant.exe", "ant")
|
85
80
|
end
|
86
81
|
|
87
82
|
def build_apk
|
88
83
|
Dir.chdir configuration.project_path do
|
89
|
-
ProcessLauncher.new(ant, "clean", "debug").start_and_crash_if_process_fails
|
84
|
+
ProcessLauncher.new(ant, "clean", "debug").with_inherited_io.start_and_crash_if_process_fails
|
90
85
|
end
|
91
86
|
end
|
92
|
-
|
93
|
-
def install_apk apk_path
|
94
|
-
ProcessLauncher.new(adb, "uninstall", configuration.target_package).start
|
95
|
-
ProcessLauncher.new(adb, "install", apk_path).start_and_crash_if_process_fails
|
96
|
-
end
|
97
87
|
end
|
98
88
|
end
|
data/lib/acouchi/test_runner.rb
CHANGED
@@ -1,19 +1,16 @@
|
|
1
|
-
require "childprocess"
|
2
|
-
|
3
1
|
module Acouchi
|
4
2
|
class TestRunner
|
5
3
|
def initialize configuration
|
6
4
|
@configuration = configuration
|
7
5
|
end
|
8
6
|
|
9
|
-
def adb
|
10
|
-
@adb ||= Which.find_executable("adb")
|
11
|
-
end
|
12
|
-
|
13
7
|
def start
|
14
|
-
|
15
|
-
|
16
|
-
|
8
|
+
apk_installer = ApkInstaller.new(@configuration)
|
9
|
+
apk_installer.uninstall_apk
|
10
|
+
apk_installer.install_apk
|
11
|
+
|
12
|
+
ProcessLauncher.new(Executables.adb, "forward", "tcp:7103", "tcp:7103").start_and_crash_if_process_fails
|
13
|
+
@test_runner_process = ProcessLauncher.new(Executables.adb, "shell", "am", "instrument", "-w", "#{@configuration.target_package}/android.test.InstrumentationTestRunner")
|
17
14
|
@test_runner_process.start_in_background
|
18
15
|
|
19
16
|
while ready? == false
|
@@ -23,16 +20,11 @@ module Acouchi
|
|
23
20
|
|
24
21
|
def stop
|
25
22
|
HTTParty.get("http://127.0.0.1:7103/finish") rescue nil
|
26
|
-
@test_runner_process.stop
|
27
23
|
end
|
28
24
|
|
29
25
|
private
|
30
26
|
def ready?
|
31
27
|
HTTParty.get("http://127.0.0.1:7103/").body == "Acouchi" rescue false
|
32
28
|
end
|
33
|
-
|
34
|
-
def force_stop
|
35
|
-
ChildProcess.build(adb, "shell", "am", "force-stop", @configuration.target_package).start.wait
|
36
|
-
end
|
37
29
|
end
|
38
30
|
end
|
data/lib/acouchi/version.rb
CHANGED
data/lib/acouchi/which.rb
CHANGED
@@ -1,16 +1,5 @@
|
|
1
1
|
module Acouchi
|
2
2
|
class Which
|
3
|
-
def self.which? command
|
4
|
-
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
5
|
-
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
6
|
-
exts.each { |ext|
|
7
|
-
exe = "#{path}/#{command}#{ext}"
|
8
|
-
return exe if File.executable? exe
|
9
|
-
}
|
10
|
-
end
|
11
|
-
return nil
|
12
|
-
end
|
13
|
-
|
14
3
|
def self.find_executable *aliases
|
15
4
|
if executable = aliases.find {|a| which? a}
|
16
5
|
executable
|
@@ -18,5 +7,17 @@ module Acouchi
|
|
18
7
|
raise %{Couldn't find any matches for the aliases "#{aliases.join(", ")}"}
|
19
8
|
end
|
20
9
|
end
|
10
|
+
|
11
|
+
private
|
12
|
+
def self.which? command
|
13
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
14
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
15
|
+
exts.each { |ext|
|
16
|
+
exe = "#{path}/#{command}#{ext}"
|
17
|
+
return exe if File.executable? exe
|
18
|
+
}
|
19
|
+
end
|
20
|
+
return nil
|
21
|
+
end
|
21
22
|
end
|
22
23
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acouchi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httparty
|
@@ -92,9 +92,11 @@ files:
|
|
92
92
|
- jars/gson-2.2.2.jar
|
93
93
|
- jars/robotium-solo-3.4.1.jar
|
94
94
|
- lib/acouchi.rb
|
95
|
+
- lib/acouchi/apk_installer.rb
|
95
96
|
- lib/acouchi/apk_modifier.rb
|
96
97
|
- lib/acouchi/configuration.rb
|
97
98
|
- lib/acouchi/cucumber.rb
|
99
|
+
- lib/acouchi/executables.rb
|
98
100
|
- lib/acouchi/process_launcher.rb
|
99
101
|
- lib/acouchi/project_builder.rb
|
100
102
|
- lib/acouchi/rspec/matchers.rb
|