flaky 0.0.7 → 0.0.8
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/lib/flaky/appium.rb +24 -7
- data/lib/flaky/logcat.rb +41 -0
- data/lib/flaky/reset_android.rb +62 -0
- data/lib/flaky/run/all_tests.rb +1 -1
- data/lib/flaky/run/one_test.rb +1 -1
- data/lib/flaky/run.rb +24 -12
- data/lib/flaky.rb +3 -2
- data/readme.md +3 -0
- data/release_notes.md +7 -0
- metadata +15 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f9ff093338f06bfed3fa22d003f989fab204700
|
4
|
+
data.tar.gz: 688ede60f2d512a8178c2ab01afddb582c80e598
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6267bde8b466674dcc2fa27d37012a24de5b243a19c29c0f66f87096ba8429cb1378132a83d963722e5ba9c1ccc9dce71fc830fb615b532e80ea335235f64301
|
7
|
+
data.tar.gz: f12d59ff098bb2bacf1fc13c8cfbd6766e8acdd0936dc35375a1677f6cd61631aac41a9dd48329121dbbe0ec221cf0e05ab2a38462e73dad35e41cc04e8b0c8c
|
data/lib/flaky/appium.rb
CHANGED
@@ -19,7 +19,8 @@ module Flaky
|
|
19
19
|
#noinspection RubyResolve
|
20
20
|
class Appium
|
21
21
|
include POSIX::Spawn
|
22
|
-
|
22
|
+
# logcat is read & stopped by run.execute
|
23
|
+
attr_reader :ready, :pid, :in, :out, :err, :log, :tail, :logcat
|
23
24
|
@@thread = nil
|
24
25
|
|
25
26
|
def self.remove_ios_apps
|
@@ -46,17 +47,29 @@ module Flaky
|
|
46
47
|
Process::waitpid(_pid) if _pid
|
47
48
|
end
|
48
49
|
|
49
|
-
|
50
|
+
# android: true to activate Android mode
|
51
|
+
def initialize opts={}
|
50
52
|
@ready = false
|
51
53
|
@pid, @in, @out, @err = nil
|
52
54
|
@log = ''
|
53
55
|
@tail = nil
|
56
|
+
@android = opts.fetch(:android, false)
|
57
|
+
if @android
|
58
|
+
@droid = Flaky::Android.new
|
59
|
+
@logcat = Flaky::Logcat.new
|
60
|
+
end
|
54
61
|
end
|
55
62
|
|
56
63
|
def start
|
57
64
|
@log = ''
|
58
65
|
self.stop # stop existing process
|
59
|
-
|
66
|
+
|
67
|
+
if @android
|
68
|
+
@droid.reset
|
69
|
+
@logcat.start
|
70
|
+
else
|
71
|
+
self.class.remove_ios_apps
|
72
|
+
end
|
60
73
|
|
61
74
|
@@thread.exit if @@thread
|
62
75
|
@@thread = Thread.new do
|
@@ -102,6 +115,10 @@ module Flaky
|
|
102
115
|
self.class.kill_all 'node'
|
103
116
|
end
|
104
117
|
|
118
|
+
def end_all_instruments
|
119
|
+
self.class.kill_all 'instruments'
|
120
|
+
end
|
121
|
+
|
105
122
|
# Invoked inside a thread by `self.go`
|
106
123
|
def launch
|
107
124
|
@log = ''
|
@@ -109,9 +126,9 @@ module Flaky
|
|
109
126
|
@ready = false
|
110
127
|
appium_home = ENV['APPIUM_HOME']
|
111
128
|
raise "ENV['APPIUM_HOME'] must be set!" if appium_home.nil? || appium_home.empty?
|
112
|
-
contains_appium = File.exists?(File.join(ENV['APPIUM_HOME'], '
|
113
|
-
raise "Appium home `#{appium_home}` doesn't contain
|
114
|
-
cmd = %Q(cd "#{appium_home}"; node
|
129
|
+
contains_appium = File.exists?(File.join(ENV['APPIUM_HOME'], 'bin', 'appium.js'))
|
130
|
+
raise "Appium home `#{appium_home}` doesn't contain bin/appium.js!" unless contains_appium
|
131
|
+
cmd = %Q(cd "#{appium_home}"; node .)
|
115
132
|
@pid, @in, @out, @err = popen4 cmd
|
116
133
|
@in.close
|
117
134
|
self # used to chain `launch.wait`
|
@@ -122,11 +139,11 @@ module Flaky
|
|
122
139
|
# https://github.com/tmm1/pygments.rb/blob/master/lib/pygments/popen.rb
|
123
140
|
begin
|
124
141
|
Process.kill 'KILL', @pid
|
125
|
-
Process.waitpid @pid
|
126
142
|
rescue
|
127
143
|
end unless @pid.nil?
|
128
144
|
@pid = nil
|
129
145
|
self.end_all_nodes
|
146
|
+
self.end_all_instruments unless @android
|
130
147
|
|
131
148
|
@tail.stop if @tail
|
132
149
|
end
|
data/lib/flaky/logcat.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# log = Flaky::Logcat.new
|
3
|
+
# log.start; log.stop
|
4
|
+
module Flaky
|
5
|
+
class Logcat
|
6
|
+
attr_reader :pid, :in, :out, :err
|
7
|
+
@@thread = nil
|
8
|
+
@@data = nil
|
9
|
+
|
10
|
+
# Start the logcat process and capture the output
|
11
|
+
def start
|
12
|
+
# make sure the adb devices command doesn't error.
|
13
|
+
while (!POSIX::Spawn::Child.new('adb kill-server; adb devices').err.empty?)
|
14
|
+
sleep 0.5
|
15
|
+
end
|
16
|
+
|
17
|
+
cmd = 'adb logcat'
|
18
|
+
@pid, @in, @@out, @err = POSIX::Spawn::popen4 cmd
|
19
|
+
@in.close
|
20
|
+
@data = ''
|
21
|
+
|
22
|
+
@@thread.exit if @@thread
|
23
|
+
@@thread = Thread.new do
|
24
|
+
# out.read blocks until the process ends
|
25
|
+
@@data = @@out.read
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Stop and return the data
|
30
|
+
def stop
|
31
|
+
begin
|
32
|
+
[@in, @out, @err].each { |io| io.close unless io.nil? || io.closed? }
|
33
|
+
Process.kill 'KILL', @pid
|
34
|
+
Process.waitpid @pid
|
35
|
+
rescue
|
36
|
+
end
|
37
|
+
|
38
|
+
@@data
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Flaky
|
3
|
+
|
4
|
+
# Flaky::Android.new.reset
|
5
|
+
class Android
|
6
|
+
def initialize
|
7
|
+
apk_path = ENV['APK_PATH']
|
8
|
+
raise 'Environment variable APK_PATH must be set' if apk_path.nil? ||
|
9
|
+
apk_path.empty? || File.extname(apk_path).downcase != '.apk'
|
10
|
+
@md5 = Digest::MD5.file(apk_path).hexdigest
|
11
|
+
@apk = apk_path
|
12
|
+
|
13
|
+
app_package = ENV['APP_PACKAGE']
|
14
|
+
raise 'Environment variable APP_PACKAGE must be set' if app_package.nil? ||
|
15
|
+
app_package.empty?
|
16
|
+
@package = app_package
|
17
|
+
end
|
18
|
+
|
19
|
+
def _remove_old_apks
|
20
|
+
list_apks = POSIX::Spawn::Child.new 'adb shell "ls /data/local/tmp/*.apk"'
|
21
|
+
raise "list_apks errored with: #{list_apks.err}" unless list_apks.err.empty?
|
22
|
+
|
23
|
+
apk_on_device = false
|
24
|
+
remove_apks = ''
|
25
|
+
list_apks.out.split(/\r?\n/).each do |path|
|
26
|
+
if path.include?(@md5)
|
27
|
+
apk_on_device = true
|
28
|
+
else
|
29
|
+
remove_apks += ' rm \\"' + path + '\\";'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# must return if there are no apks to remove
|
34
|
+
return if remove_apks.empty?
|
35
|
+
|
36
|
+
remove_apks = 'adb shell "' + remove_apks + '"'
|
37
|
+
remove_apks = POSIX::Spawn::Child.new remove_apks
|
38
|
+
raise "remove_apks errored with: #{remove_apks.err}" unless remove_apks.err.empty?
|
39
|
+
end
|
40
|
+
|
41
|
+
def _push_apk
|
42
|
+
# dir must exist before pushing
|
43
|
+
POSIX::Spawn::Child.new 'adb shell "mkdir /data/local/tmp/"'
|
44
|
+
push_apk = POSIX::Spawn::Child.new %Q(adb push "#{@apk}" "/data/local/tmp/#{@md5}.apk")
|
45
|
+
raise "push_apk errored with: #{push_apk.err}" unless push_apk.err.empty?
|
46
|
+
end
|
47
|
+
|
48
|
+
def _reinstall_apk
|
49
|
+
POSIX::Spawn::Child.new %Q(adb shell "am force-stop #{@package}")
|
50
|
+
apk_uninstall = POSIX::Spawn::Child.new "adb uninstall #{@package}"
|
51
|
+
raise "apk_uninstall errored with: #{apk_uninstall.err}" unless apk_uninstall.err.empty?
|
52
|
+
apk_install = POSIX::Spawn::Child.new "adb shell pm install /data/local/tmp/#{@md5}.apk"
|
53
|
+
raise "apk_install errored with: #{apk_install.err}" unless apk_install.err.empty?
|
54
|
+
end
|
55
|
+
|
56
|
+
def reset
|
57
|
+
apk_on_device = _remove_old_apks
|
58
|
+
_push_apk unless apk_on_device
|
59
|
+
_reinstall_apk
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/flaky/run/all_tests.rb
CHANGED
@@ -24,7 +24,7 @@ module Flaky
|
|
24
24
|
|
25
25
|
count.times do
|
26
26
|
appium.start
|
27
|
-
run_cmd = "cd #{current_dir}; rake
|
27
|
+
run_cmd = "cd #{current_dir}; rake #{os.downcase}['#{name}']"
|
28
28
|
passed = flaky.execute run_cmd: run_cmd, test_name: test_name, appium: appium
|
29
29
|
break if passed # move onto the next test after one successful run
|
30
30
|
end
|
data/lib/flaky/run/one_test.rb
CHANGED
data/lib/flaky/run.rb
CHANGED
@@ -14,6 +14,17 @@ module Flaky
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
+
class LogArtifact
|
18
|
+
def initialize opts={}
|
19
|
+
@result_dir = opts.fetch :result_dir, ''
|
20
|
+
@pass_str = opts.fetch :pass_str, ''
|
21
|
+
end
|
22
|
+
|
23
|
+
def name str
|
24
|
+
File.join @result_dir, @pass_str, str
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
17
28
|
class Run
|
18
29
|
include Flaky::Color
|
19
30
|
attr_reader :tests, :result_dir, :result_file
|
@@ -102,24 +113,25 @@ module Flaky
|
|
102
113
|
postfix = "#{runs}_#{test_name}_" + postfix
|
103
114
|
postfix = '0' + postfix if runs <= 9
|
104
115
|
|
105
|
-
log_name = "#{postfix}.html"
|
106
|
-
log_name = File.join result_dir, pass_str, log_name
|
107
|
-
Flaky.write log_name, log
|
108
116
|
|
109
|
-
|
110
|
-
|
117
|
+
log_file = LogArtifact.new result_dir: result_dir, pass_str: pass_str
|
118
|
+
|
119
|
+
# html Ruby test log
|
120
|
+
Flaky.write log_file.name("#{postfix}.html"), log
|
111
121
|
|
112
|
-
|
122
|
+
# iOS simulator system log
|
123
|
+
File.open(log_file.name("#{postfix}.server.log.txt"), 'w') do |f|
|
113
124
|
f.write appium.tail.out.readpartial(999_999_999)
|
114
125
|
end
|
115
126
|
|
116
|
-
|
117
|
-
|
127
|
+
# adb logcat log
|
128
|
+
logcat = appium.logcat ? appium.logcat.stop : nil
|
129
|
+
File.open(log_file.name("#{postfix}.logcat.txt"), 'w') do |f|
|
130
|
+
f.write logcat
|
131
|
+
end if logcat
|
118
132
|
|
119
|
-
#
|
120
|
-
|
121
|
-
# f.write appium.log
|
122
|
-
# end
|
133
|
+
# appium server log
|
134
|
+
Flaky.write log_file.name("#{postfix}.appium.html"), appium.log
|
123
135
|
|
124
136
|
passed
|
125
137
|
end
|
data/lib/flaky.rb
CHANGED
@@ -6,10 +6,11 @@ require 'rubygems' # gem requires
|
|
6
6
|
require 'chronic_duration'
|
7
7
|
require 'escape_utils'
|
8
8
|
require 'posix/spawn' # http://rubygems.org/gems/posix-spawn
|
9
|
+
require 'digest/md5'
|
9
10
|
|
10
11
|
module Flaky
|
11
|
-
VERSION = '0.0.
|
12
|
-
DATE = '2013-10-
|
12
|
+
VERSION = '0.0.8' unless defined? ::Flaky::VERSION
|
13
|
+
DATE = '2013-10-17' unless defined? ::Flaky::DATE
|
13
14
|
|
14
15
|
# https://github.com/appium/ruby_lib/blob/0e203d76610abd519ba9d2fe9c14b50c94df5bbd/lib/appium_lib.rb#L24
|
15
16
|
def self.add_to_path file, path=false
|
data/readme.md
CHANGED
@@ -4,6 +4,9 @@ Run Appium iOS tests to measure flakiness.
|
|
4
4
|
|
5
5
|
- `gem install flaky`
|
6
6
|
- `flake 3 ios[nop]` - Run the iOS test named nop 3 times.
|
7
|
+
- `flake 3 ios` - Run all the iOS tests up to 3 times.
|
8
|
+
If a test passes then it moves onto the next test.
|
9
|
+
If a test fails 3 times then it moves onto the next test.
|
7
10
|
|
8
11
|
Results are stored in `/tmp/flaky`
|
9
12
|
|
data/release_notes.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
#### v0.0.7 2013-10-11
|
2
|
+
|
3
|
+
- [26bc5cc](https://github.com/appium/flaky/commit/26bc5cc6b43e3de7398e6d9e8c9bb615353020eb) Release 0.0.7
|
4
|
+
- [9e854aa](https://github.com/appium/flaky/commit/9e854aae8c4b7eb64afc79c3f8716944ea9667ad) Add all tests run option
|
5
|
+
- [153119a](https://github.com/appium/flaky/commit/153119a59ba6b8c1d4c2f6d6311aa87f73b1a635) Add link to appium in the readme
|
6
|
+
|
7
|
+
|
1
8
|
#### v0.0.6 2013-10-03
|
2
9
|
|
3
10
|
- [86d8137](https://github.com/appium/flaky/commit/86d8137e3f1f348be8ee76e42bea0de36280d5a5) Release 0.0.6
|
metadata
CHANGED
@@ -1,69 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flaky
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- code@bootstraponline.com
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chronic_duration
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 0.10.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.10.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: escape_utils
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 0.3.2
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.3.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: posix-spawn
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 0.3.6
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.3.6
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - ~>
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 10.1.0
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - ~>
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 10.1.0
|
69
69
|
description: Measure flaky Ruby Appium tests.
|
@@ -81,6 +81,8 @@ files:
|
|
81
81
|
- lib/flaky.rb
|
82
82
|
- lib/flaky/appium.rb
|
83
83
|
- lib/flaky/log.rb
|
84
|
+
- lib/flaky/logcat.rb
|
85
|
+
- lib/flaky/reset_android.rb
|
84
86
|
- lib/flaky/run.rb
|
85
87
|
- lib/flaky/run/all_tests.rb
|
86
88
|
- lib/flaky/run/one_test.rb
|
@@ -100,17 +102,17 @@ require_paths:
|
|
100
102
|
- lib
|
101
103
|
required_ruby_version: !ruby/object:Gem::Requirement
|
102
104
|
requirements:
|
103
|
-
- -
|
105
|
+
- - ">="
|
104
106
|
- !ruby/object:Gem::Version
|
105
107
|
version: 1.9.3
|
106
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
109
|
requirements:
|
108
|
-
- -
|
110
|
+
- - ">="
|
109
111
|
- !ruby/object:Gem::Version
|
110
112
|
version: '0'
|
111
113
|
requirements: []
|
112
114
|
rubyforge_project:
|
113
|
-
rubygems_version: 2.1.
|
115
|
+
rubygems_version: 2.1.9
|
114
116
|
signing_key:
|
115
117
|
specification_version: 4
|
116
118
|
summary: Measure flaky Ruby Appium tests
|