flaky 0.0.17 → 0.0.18
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/flaky.rb +8 -19
- data/lib/flaky/appium.rb +8 -7
- data/lib/flaky/run.rb +40 -25
- data/lib/flaky/run/all_tests.rb +5 -4
- data/lib/flaky/run/from_file.rb +5 -4
- data/lib/flaky/run/one_test.rb +5 -4
- data/release_notes.md +9 -0
- metadata +11 -12
- data/lib/flaky/logcat.rb +0 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1230df6faa06f97954248aa5ecdce8c96ad43495
|
4
|
+
data.tar.gz: e1af21e3f6f1f43893ae8d5305253299f095d6ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b9041b34ae739d33093955b91379a0e0571d7a2f24c8df9570eaf97952c2635f779f994bd4ed529279be39c08686fc8ab18da7eca934d45fee5c17f173afcc0
|
7
|
+
data.tar.gz: c314d8c08a8d2544ffaa1e80ae6edbf6647a2825bcd83371f4f1759d15496573423b06bf2ea41b636aefe4b02c968a4493b643dcb34dd246986b50e7e68e06ab
|
data/lib/flaky.rb
CHANGED
@@ -9,26 +9,15 @@ require 'posix/spawn' # http://rubygems.org/gems/posix-spawn
|
|
9
9
|
require 'digest/md5'
|
10
10
|
|
11
11
|
module Flaky
|
12
|
-
VERSION = '0.0.
|
13
|
-
DATE = '2013-12-
|
12
|
+
VERSION = '0.0.18' unless defined? ::Flaky::VERSION
|
13
|
+
DATE = '2013-12-23' unless defined? ::Flaky::DATE
|
14
14
|
|
15
|
-
# https://github.com/appium/ruby_lib/blob/0e203d76610abd519ba9d2fe9c14b50c94df5bbd/lib/appium_lib.rb#L24
|
16
|
-
def self.add_to_path file, path=false
|
17
|
-
path = path ? "../#{path}/" : '..'
|
18
|
-
path = File.expand_path path, file
|
19
|
-
|
20
|
-
$:.unshift path unless $:.include? path
|
21
|
-
end
|
22
|
-
|
23
|
-
add_to_path __FILE__ # add this dir to path
|
24
|
-
|
25
|
-
# TODO: Use require_relative instead of add_to_path
|
26
15
|
# require internal files
|
27
|
-
|
28
|
-
|
29
|
-
|
16
|
+
require_relative 'flaky/appium'
|
17
|
+
require_relative 'flaky/applescript'
|
18
|
+
require_relative 'flaky/run'
|
30
19
|
|
31
|
-
|
32
|
-
|
33
|
-
|
20
|
+
require_relative 'flaky/run/all_tests'
|
21
|
+
require_relative 'flaky/run/from_file'
|
22
|
+
require_relative 'flaky/run/one_test'
|
34
23
|
end
|
data/lib/flaky/appium.rb
CHANGED
@@ -22,8 +22,7 @@ module Flaky
|
|
22
22
|
#noinspection RubyResolve
|
23
23
|
class Appium
|
24
24
|
include POSIX::Spawn
|
25
|
-
|
26
|
-
attr_reader :ready, :pid, :in, :out, :err, :log, :logcat, :ios, :android
|
25
|
+
attr_reader :ready, :pid, :in, :out, :err, :log, :ios, :android
|
27
26
|
@@thread = nil
|
28
27
|
|
29
28
|
def self.remove_ios_apps
|
@@ -33,9 +32,13 @@ module Flaky
|
|
33
32
|
# Must kill iPhone simulator or strange install errors will occur.
|
34
33
|
self.kill_all 'iPhone Simulator'
|
35
34
|
|
36
|
-
app_glob = "/Users/#{user}/Library/Application Support/iPhone Simulator/**/Applications
|
35
|
+
app_glob = "/Users/#{user}/Library/Application Support/iPhone Simulator/**/Applications"
|
37
36
|
Dir.glob(app_glob) do |ios_app_folder|
|
38
37
|
FileUtils.rm_rf ios_app_folder
|
38
|
+
root = File.dirname ios_app_folder
|
39
|
+
FileUtils.rm_rf File.join(root, 'Library/TCC')
|
40
|
+
FileUtils.rm_rf File.join(root, 'Library/Caches')
|
41
|
+
FileUtils.rm_rf File.join(root, 'Library/Media')
|
39
42
|
end
|
40
43
|
end
|
41
44
|
|
@@ -59,7 +62,6 @@ module Flaky
|
|
59
62
|
@android = opts.fetch(:android, false)
|
60
63
|
if @android
|
61
64
|
@droid = Flaky::Android.new
|
62
|
-
@logcat = Flaky::Logcat.new
|
63
65
|
end
|
64
66
|
@ios = ! @android
|
65
67
|
end
|
@@ -69,7 +71,6 @@ module Flaky
|
|
69
71
|
@log = "/tmp/flaky/tmp_log_#{Random.rand(10**4..10**5-1)}"
|
70
72
|
if @android
|
71
73
|
@droid.reset
|
72
|
-
@logcat.start
|
73
74
|
else
|
74
75
|
self.class.remove_ios_apps
|
75
76
|
end
|
@@ -100,12 +101,12 @@ module Flaky
|
|
100
101
|
end
|
101
102
|
|
102
103
|
def flush_buffer
|
103
|
-
return if @buffer.nil? || @buffer.empty?
|
104
|
+
return '' if @buffer.nil? || @buffer.empty?
|
104
105
|
File.open(@log, 'a') do |f|
|
105
106
|
f.write @buffer
|
106
107
|
end
|
107
108
|
@buffer = ''
|
108
|
-
@log
|
109
|
+
@log || ''
|
109
110
|
end
|
110
111
|
|
111
112
|
##
|
data/lib/flaky/run.rb
CHANGED
@@ -28,7 +28,9 @@ module Flaky
|
|
28
28
|
str = str + '_' if str[-1] != '_'
|
29
29
|
str += @test_name.split('/').last
|
30
30
|
|
31
|
-
File.
|
31
|
+
filename_only = File.basename(@test_name)
|
32
|
+
|
33
|
+
File.join @result_dir, @pass_str, filename_only, str, file_name
|
32
34
|
end
|
33
35
|
end
|
34
36
|
|
@@ -87,7 +89,7 @@ module Flaky
|
|
87
89
|
puts out
|
88
90
|
end
|
89
91
|
|
90
|
-
def _execute run_cmd, test_name, runs, appium
|
92
|
+
def _execute run_cmd, test_name, runs, appium, sauce
|
91
93
|
# must capture exit code or log is an array.
|
92
94
|
log, exit_code = Open3.capture2e run_cmd
|
93
95
|
|
@@ -139,24 +141,28 @@ module Flaky
|
|
139
141
|
# f.write appium.tail.out.readpartial(999_999_999)
|
140
142
|
# end
|
141
143
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
144
|
+
unless sauce
|
145
|
+
src_system_log = '/tmp/flaky_logs.txt'
|
146
|
+
if File.exists? src_system_log
|
147
|
+
# postfix is required! or the log will be saved to an incorrect path
|
148
|
+
system_log_path = log_file.name("#{postfix}.system.txt")
|
149
|
+
FileUtils.mkdir_p File.dirname(system_log_path)
|
150
|
+
FileUtils.copy_file src_system_log, system_log_path
|
151
|
+
File.delete src_system_log
|
152
|
+
end
|
153
|
+
|
154
|
+
# appium server log
|
155
|
+
appium_server_path = log_file.name("#{postfix}.appium.html")
|
156
|
+
FileUtils.mkdir_p File.dirname(appium_server_path)
|
157
|
+
File.open(appium_server_path, 'w') do |f|
|
158
|
+
# this may return nil
|
159
|
+
tmp_file = appium.flush_buffer
|
160
|
+
|
161
|
+
# todo: copy file instead of read & delete
|
162
|
+
if !tmp_file.nil? && !tmp_file.empty?
|
163
|
+
f.write File.read tmp_file
|
164
|
+
File.delete tmp_file
|
165
|
+
end
|
160
166
|
end
|
161
167
|
end
|
162
168
|
|
@@ -174,27 +180,36 @@ module Flaky
|
|
174
180
|
run_cmd = opts[:run_cmd]
|
175
181
|
test_name = opts[:test_name]
|
176
182
|
appium = opts[:appium]
|
183
|
+
sauce = opts[:sauce]
|
177
184
|
|
178
185
|
old_crash_files = []
|
179
|
-
|
186
|
+
# appium is nil when on sauce
|
187
|
+
if !sauce && appium && appium.ios
|
180
188
|
collect_crashes old_crash_files
|
181
189
|
end
|
182
190
|
|
183
191
|
raise 'must pass :run_cmd' unless run_cmd
|
184
192
|
raise 'must pass :test_name' unless test_name
|
185
|
-
|
193
|
+
# local appium is not required when running on Sauce
|
194
|
+
raise 'must pass :appium' unless appium || sauce
|
186
195
|
|
187
196
|
test = @tests[test_name] ||= {runs: 0, pass: 0, fail: 0}
|
188
197
|
runs = test[:runs] += 1
|
189
198
|
|
190
|
-
passed = _execute run_cmd, test_name, runs, appium
|
191
|
-
|
199
|
+
passed = _execute run_cmd, test_name, runs, appium, sauce
|
200
|
+
unless sauce
|
192
201
|
print cyan("\n #{test_name} ") if @last_test.nil? ||
|
193
202
|
@last_test != test_name
|
194
203
|
|
195
204
|
print passed ? green(' ✓') : red(' ✖')
|
205
|
+
else
|
206
|
+
print cyan("\n #{test_name} ")
|
207
|
+
print passed ? green(' ✓') : red(' ✖')
|
208
|
+
print " https://saucelabs.com/tests/#{File.read('/tmp/appium_lib_session').chomp}\n"
|
209
|
+
end
|
196
210
|
|
197
|
-
|
211
|
+
# appium is nil when running on Sauce
|
212
|
+
if !sauce && appium && appium.ios
|
198
213
|
new_crash_files = []
|
199
214
|
collect_crashes new_crash_files
|
200
215
|
|
data/lib/flaky/run/all_tests.rb
CHANGED
@@ -9,8 +9,9 @@ module Flaky
|
|
9
9
|
raise ':count must be an int' unless count.kind_of?(Integer)
|
10
10
|
raise ':os must be a string' unless os.kind_of?(String)
|
11
11
|
|
12
|
+
running_on_sauce = ENV['SAUCE_USERNAME'] ? true : false
|
12
13
|
flaky = Flaky::Run.new
|
13
|
-
appium = Appium.new
|
14
|
+
appium = Appium.new unless running_on_sauce
|
14
15
|
|
15
16
|
current_dir = Dir.pwd
|
16
17
|
raise "Rakefile doesn't exist in #{current_dir}" unless File.exists?(File.join(current_dir, 'Rakefile'))
|
@@ -26,14 +27,14 @@ module Flaky
|
|
26
27
|
|
27
28
|
count.times do
|
28
29
|
File.open('/tmp/flaky/current.txt', 'a') { |f| f.puts "Running: #{test_name} on #{os}" }
|
29
|
-
appium.start
|
30
|
+
appium.start unless running_on_sauce
|
30
31
|
run_cmd = "cd #{current_dir}; rake #{os.downcase}['#{name}']"
|
31
|
-
passed = flaky.execute run_cmd: run_cmd, test_name: test_name, appium: appium
|
32
|
+
passed = flaky.execute run_cmd: run_cmd, test_name: test_name, appium: appium, sauce: running_on_sauce
|
32
33
|
break if passed # move onto the next test after one successful run
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
36
|
-
appium.stop
|
37
|
+
appium.stop unless running_on_sauce
|
37
38
|
flaky.report
|
38
39
|
end
|
39
40
|
end # module Flaky
|
data/lib/flaky/run/from_file.rb
CHANGED
@@ -30,8 +30,9 @@ module Flaky
|
|
30
30
|
raise "Missing tests #{missing_tests}"
|
31
31
|
end
|
32
32
|
|
33
|
+
running_on_sauce = ENV['SAUCE_USERNAME'] ? true : false
|
33
34
|
flaky = Flaky::Run.new
|
34
|
-
appium = Appium.new
|
35
|
+
appium = Appium.new unless running_on_sauce
|
35
36
|
|
36
37
|
raise "Rakefile doesn't exist in #{current_dir}" unless File.exists?(File.join(current_dir, 'Rakefile'))
|
37
38
|
|
@@ -45,14 +46,14 @@ module Flaky
|
|
45
46
|
test_name = File.join(File.dirname(test_name), File.basename(test_name, '.*'))
|
46
47
|
|
47
48
|
count.times do
|
48
|
-
appium.start
|
49
|
+
appium.start unless running_on_sauce
|
49
50
|
run_cmd = "cd #{current_dir}; rake #{os.downcase}['#{name}']"
|
50
|
-
passed = flaky.execute run_cmd: run_cmd, test_name: test_name, appium: appium
|
51
|
+
passed = flaky.execute run_cmd: run_cmd, test_name: test_name, appium: appium, sauce: running_on_sauce
|
51
52
|
break if passed # move onto the next test after one successful run
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
55
|
-
appium.stop
|
56
|
+
appium.stop unless running_on_sauce
|
56
57
|
flaky.report
|
57
58
|
end
|
58
59
|
end # module Flaky
|
data/lib/flaky/run/one_test.rb
CHANGED
@@ -14,8 +14,9 @@ module Flaky
|
|
14
14
|
# ensure file name does not contain an extension
|
15
15
|
name = File.basename name, '.*'
|
16
16
|
|
17
|
+
running_on_sauce = ENV['SAUCE_USERNAME'] ? true : false
|
17
18
|
flaky = Flaky::Run.new
|
18
|
-
appium = Appium.new
|
19
|
+
appium = Appium.new unless running_on_sauce
|
19
20
|
|
20
21
|
current_dir = Dir.pwd
|
21
22
|
|
@@ -32,12 +33,12 @@ module Flaky
|
|
32
33
|
test_name = File.join(File.dirname(test_name), File.basename(test_name, '.*'))
|
33
34
|
|
34
35
|
count.times do
|
35
|
-
appium.start
|
36
|
+
appium.start unless running_on_sauce
|
36
37
|
run_cmd = "cd #{current_dir}; rake #{os.downcase}['#{name}']"
|
37
|
-
flaky.execute run_cmd: run_cmd, test_name: test_name, appium: appium
|
38
|
+
flaky.execute run_cmd: run_cmd, test_name: test_name, appium: appium, sauce: running_on_sauce
|
38
39
|
end
|
39
40
|
|
40
|
-
appium.stop
|
41
|
+
appium.stop unless running_on_sauce
|
41
42
|
flaky.report
|
42
43
|
end
|
43
44
|
end # module Flaky
|
data/release_notes.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
#### v0.0.17 2013-12-10
|
2
|
+
|
3
|
+
- [64078c1](https://github.com/appium/flaky/commit/64078c1ed2ee8a96a52f05aefb460216b48ea2b5) Release 0.0.17
|
4
|
+
- [208c9bb](https://github.com/appium/flaky/commit/208c9bbbeb17f2a70965cd530c3f5ee8d9a32369) Disable coloring
|
5
|
+
- [bf30e8e](https://github.com/appium/flaky/commit/bf30e8ed918a184f34ba316f472e5c0bfe9c0bb1) Fix nil error
|
6
|
+
- [b19f9e5](https://github.com/appium/flaky/commit/b19f9e548bcc40f70b232ac2225b7c71abd01415) Don't escape appium log. Timeout after 60s of color
|
7
|
+
- [a4a569f](https://github.com/appium/flaky/commit/a4a569fbaebdce9683d8294afae61ff7712a0e92) Record crashes per test in crashes.txt
|
8
|
+
|
9
|
+
|
1
10
|
#### v0.0.16 2013-12-09
|
2
11
|
|
3
12
|
- [fed719a](https://github.com/appium/flaky/commit/fed719af184a6f38a4d29b3c65f1906d6917c1fb) Release 0.0.16
|
metadata
CHANGED
@@ -1,55 +1,55 @@
|
|
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.18
|
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-12-
|
11
|
+
date: 2013-12-23 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: posix-spawn
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 0.3.6
|
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.6
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 10.1.0
|
48
48
|
type: :development
|
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: 10.1.0
|
55
55
|
description: Measure flaky Ruby Appium tests.
|
@@ -60,7 +60,7 @@ executables:
|
|
60
60
|
extensions: []
|
61
61
|
extra_rdoc_files: []
|
62
62
|
files:
|
63
|
-
-
|
63
|
+
- .gitignore
|
64
64
|
- LICENSE-2.0.txt
|
65
65
|
- Rakefile
|
66
66
|
- bin/flake
|
@@ -70,7 +70,6 @@ files:
|
|
70
70
|
- lib/flaky.rb
|
71
71
|
- lib/flaky/appium.rb
|
72
72
|
- lib/flaky/applescript.rb
|
73
|
-
- lib/flaky/logcat.rb
|
74
73
|
- lib/flaky/reset_android.rb
|
75
74
|
- lib/flaky/run.rb
|
76
75
|
- lib/flaky/run/all_tests.rb
|
@@ -92,12 +91,12 @@ require_paths:
|
|
92
91
|
- lib
|
93
92
|
required_ruby_version: !ruby/object:Gem::Requirement
|
94
93
|
requirements:
|
95
|
-
- -
|
94
|
+
- - '>='
|
96
95
|
- !ruby/object:Gem::Version
|
97
96
|
version: 1.9.3
|
98
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
98
|
requirements:
|
100
|
-
- -
|
99
|
+
- - '>='
|
101
100
|
- !ruby/object:Gem::Version
|
102
101
|
version: '0'
|
103
102
|
requirements: []
|
data/lib/flaky/logcat.rb
DELETED
@@ -1,41 +0,0 @@
|
|
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
|