flaky 0.0.17 → 0.0.18
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.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
|