coverband 4.1.0 → 4.2.0
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 +5 -5
- data/.gitignore +6 -1
- data/.travis.yml +4 -2
- data/README.md +74 -51
- data/Rakefile +1 -1
- data/changes.md +45 -25
- data/coverband.gemspec +4 -0
- data/lib/coverband/adapters/base.rb +24 -1
- data/lib/coverband/adapters/redis_store.rb +29 -8
- data/lib/coverband/at_exit.rb +19 -2
- data/lib/coverband/collectors/coverage.rb +35 -73
- data/lib/coverband/collectors/delta.rb +67 -0
- data/lib/coverband/integrations/background.rb +4 -3
- data/lib/coverband/integrations/rack_server_check.rb +4 -1
- data/lib/coverband/integrations/resque.rb +4 -1
- data/lib/coverband/reporters/base.rb +21 -14
- data/lib/coverband/reporters/html_report.rb +40 -15
- data/lib/coverband/reporters/web.rb +29 -6
- data/lib/coverband/utils/html_formatter.rb +20 -4
- data/lib/coverband/utils/railtie.rb +8 -0
- data/lib/coverband/utils/result.rb +3 -2
- data/lib/coverband/utils/results.rb +63 -0
- data/lib/coverband/utils/source_file.rb +5 -0
- data/lib/coverband/version.rb +1 -1
- data/lib/coverband.rb +23 -3
- data/public/application.css +5 -0
- data/public/application.js +108 -1644
- data/public/dependencies.js +1581 -0
- data/public/favicon.png +0 -0
- data/test/benchmarks/benchmark.rake +31 -0
- data/test/benchmarks/coverage_fork.sh +37 -0
- data/test/{unit/adapters_base_test.rb → coverband/adapters/base_test.rb} +1 -1
- data/test/{unit/adapters_file_store_test.rb → coverband/adapters/file_store_test.rb} +1 -1
- data/test/{unit/adapters_redis_store_test.rb → coverband/adapters/redis_store_test.rb} +27 -10
- data/test/coverband/collectors/coverage_test.rb +73 -0
- data/test/coverband/collectors/delta_test.rb +52 -0
- data/test/{unit → coverband}/coverband_test.rb +7 -0
- data/test/coverband/integrations/background_test.rb +31 -0
- data/test/{unit → coverband/integrations}/middleware_test.rb +2 -1
- data/test/{unit/rack_server_checkout_test.rb → coverband/integrations/rack_server_check_test.rb} +1 -1
- data/test/{unit → coverband/integrations}/resque_worker_test.rb +9 -3
- data/test/{unit/reports_base_test.rb → coverband/reporters/base_test.rb} +5 -5
- data/test/{unit/reports_console_test.rb → coverband/reporters/console_test.rb} +2 -2
- data/test/{unit/reports_html_test.rb → coverband/reporters/html_test.rb} +7 -8
- data/test/{unit/reports_web_test.rb → coverband/reporters/web_test.rb} +2 -2
- data/test/{unit → integration}/full_stack_test.rb +10 -8
- data/test/{unit → integration}/rails_full_stack_test.rb +23 -4
- data/test/rails4_dummy/config/application.rb +1 -1
- data/test/rails4_dummy/config/coverband.rb +4 -1
- data/test/rails4_dummy/tmp/.keep +0 -0
- data/test/rails5_dummy/config/application.rb +1 -1
- data/test/rails5_dummy/config/coverband.rb +3 -1
- data/test/rails5_dummy/tmp/.keep +0 -0
- data/test/rails_test_helper.rb +13 -8
- data/test/test_helper.rb +9 -13
- data/test/unique_files.rb +23 -0
- data/views/file_list.erb +9 -0
- data/views/gem_list.erb +1 -1
- data/views/layout.erb +4 -3
- data/views/source_file.erb +16 -4
- data/views/source_file_loader.erb +7 -0
- metadata +100 -59
- data/test/unit/background_test.rb +0 -28
- data/test/unit/collectors_coverage_test.rb +0 -53
- data/test/unit/rails_gems_full_stack_test.rb +0 -36
- /data/test/{unit → coverband}/at_exit_test.rb +0 -0
- /data/test/{unit → coverband}/configuration_test.rb +0 -0
- /data/test/{unit → coverband/integrations}/test_resque_job.rb +0 -0
- /data/test/{unit → coverband}/utils/file_groups_test.rb +0 -0
- /data/test/{unit → coverband}/utils/file_list_test.rb +0 -0
- /data/test/{unit → coverband}/utils/gem_list_test.rb +0 -0
- /data/test/{unit → coverband}/utils/lines_classifier_test.rb +0 -0
- /data/test/{unit → coverband}/utils/result_test.rb +0 -0
- /data/test/{unit → coverband}/utils/s3_report_test.rb +0 -0
- /data/test/{unit → coverband}/utils/source_file_line_test.rb +0 -0
- /data/test/{unit → coverband}/utils/source_file_test.rb +0 -0
- /data/test/{unit/dog.rb → dog.rb} +0 -0
data/public/favicon.png
ADDED
|
Binary file
|
|
@@ -219,12 +219,43 @@ namespace :benchmarks do
|
|
|
219
219
|
$stdout = previous_out
|
|
220
220
|
end
|
|
221
221
|
|
|
222
|
+
def measure_configure_memory
|
|
223
|
+
require 'memory_profiler'
|
|
224
|
+
# warmup
|
|
225
|
+
3.times { Coverband.configure }
|
|
226
|
+
|
|
227
|
+
previous_out = $stdout
|
|
228
|
+
capture = StringIO.new
|
|
229
|
+
$stdout = capture
|
|
230
|
+
|
|
231
|
+
MemoryProfiler.report do
|
|
232
|
+
10.times do
|
|
233
|
+
Coverband.configure do |config|
|
|
234
|
+
redis_url = ENV['CACHE_REDIS_URL'] || ENV['REDIS_URL']
|
|
235
|
+
config.store = Coverband::Adapters::RedisStore.new(Redis.new(url: redis_url), redis_namespace: 'coverband_data')
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
end.pretty_print
|
|
239
|
+
data = $stdout.string
|
|
240
|
+
$stdout = previous_out
|
|
241
|
+
puts data
|
|
242
|
+
raise 'leaking memory!!!' unless data.match('Total retained: 0 bytes')
|
|
243
|
+
ensure
|
|
244
|
+
$stdout = previous_out
|
|
245
|
+
end
|
|
246
|
+
|
|
222
247
|
desc 'runs memory reporting on Redis store'
|
|
223
248
|
task memory_reporting: [:setup] do
|
|
224
249
|
puts 'runs memory benchmarking to ensure we dont leak'
|
|
225
250
|
measure_memory
|
|
226
251
|
end
|
|
227
252
|
|
|
253
|
+
desc 'runs memory reporting on configure'
|
|
254
|
+
task memory_configure_reporting: [:setup] do
|
|
255
|
+
puts 'runs memory benchmarking on configure to ensure we dont leak'
|
|
256
|
+
measure_configure_memory
|
|
257
|
+
end
|
|
258
|
+
|
|
228
259
|
desc 'runs memory leak check via Rails tests'
|
|
229
260
|
task memory_rails: [:setup] do
|
|
230
261
|
puts 'runs memory rails test to ensure we dont leak'
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
# This is a small script to illustrate how previous results get wiped out by forking
|
|
4
|
+
# this has implications of forking processes like Resque...
|
|
5
|
+
# this in the end would cause coverage.array_diff
|
|
6
|
+
# with previous results to add NEGATIVE code hits to the stored Coverage
|
|
7
|
+
# which in turn causes all sorts of crazy issues.
|
|
8
|
+
#
|
|
9
|
+
# ruby test/benchmarks/coverage_fork.rb
|
|
10
|
+
# in parent before fork
|
|
11
|
+
# {"/Users/danmayer/projects/coverband/test/dog.rb"=>[nil, nil, 1, 1, 2, nil, nil]}
|
|
12
|
+
# in child after fork
|
|
13
|
+
# {"/Users/danmayer/projects/coverband/test/dog.rb"=>[nil, nil, 0, 0, 0, nil, nil]}
|
|
14
|
+
# now triggering hits
|
|
15
|
+
# {"/Users/danmayer/projects/coverband/test/dog.rb"=>[nil, nil, 0, 0, 3, nil, nil]}
|
|
16
|
+
#
|
|
17
|
+
# I believe this might be related to CoW and GC... not sure
|
|
18
|
+
# http://patshaughnessy.net/2012/3/23/why-you-should-be-excited-about-garbage-collection-in-ruby-2-0
|
|
19
|
+
#
|
|
20
|
+
# NOTE: That the child now has 0 hits where previously method definitions had 1
|
|
21
|
+
# this causes all sorts of bad things to happen.
|
|
22
|
+
require 'coverage'
|
|
23
|
+
Coverage.start
|
|
24
|
+
load './test/dog.rb'
|
|
25
|
+
Dog.new.bark
|
|
26
|
+
Dog.new.bark
|
|
27
|
+
puts 'in parent before fork'
|
|
28
|
+
puts Coverage.peek_result
|
|
29
|
+
fork do
|
|
30
|
+
puts 'in child after fork'
|
|
31
|
+
puts Coverage.peek_result
|
|
32
|
+
puts 'now triggering hits'
|
|
33
|
+
Dog.new.bark
|
|
34
|
+
Dog.new.bark
|
|
35
|
+
Dog.new.bark
|
|
36
|
+
puts Coverage.peek_result
|
|
37
|
+
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require File.expand_path('
|
|
3
|
+
require File.expand_path('../../test_helper', File.dirname(__FILE__))
|
|
4
4
|
|
|
5
5
|
class RedisTest < Minitest::Test
|
|
6
6
|
REDIS_STORAGE_FORMAT_VERSION = Coverband::Adapters::RedisStore::REDIS_STORAGE_FORMAT_VERSION
|
|
@@ -9,7 +9,6 @@ class RedisTest < Minitest::Test
|
|
|
9
9
|
super
|
|
10
10
|
@redis = Redis.new
|
|
11
11
|
@store = Coverband::Adapters::RedisStore.new(@redis)
|
|
12
|
-
@store.clear!
|
|
13
12
|
end
|
|
14
13
|
|
|
15
14
|
def test_coverage
|
|
@@ -34,6 +33,31 @@ class RedisTest < Minitest::Test
|
|
|
34
33
|
assert_equal [0, 2, 4], @store.coverage['app_path/dog.rb']['data']
|
|
35
34
|
end
|
|
36
35
|
|
|
36
|
+
def test_store_coverage_by_type
|
|
37
|
+
mock_file_hash
|
|
38
|
+
expected = basic_coverage
|
|
39
|
+
@store.type = :eager_loading
|
|
40
|
+
@store.save_report(expected)
|
|
41
|
+
assert_equal expected.keys, @store.coverage.keys
|
|
42
|
+
@store.coverage.each_pair do |key, data|
|
|
43
|
+
assert_equal expected[key], data['data']
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
@store.type = nil
|
|
47
|
+
assert_equal [], @store.coverage.keys
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_merged_coverage_with_types
|
|
51
|
+
mock_file_hash
|
|
52
|
+
assert_nil @store.type
|
|
53
|
+
@store.type = :eager_loading
|
|
54
|
+
@store.save_report('app_path/dog.rb' => [0, 1, 1])
|
|
55
|
+
@store.type = nil
|
|
56
|
+
@store.save_report('app_path/dog.rb' => [1, 0, 1])
|
|
57
|
+
assert_equal [1, 1, 2], @store.get_coverage_report[:merged]['app_path/dog.rb']['data']
|
|
58
|
+
assert_nil @store.type
|
|
59
|
+
end
|
|
60
|
+
|
|
37
61
|
def test_covered_lines_for_file
|
|
38
62
|
mock_file_hash
|
|
39
63
|
expected = basic_coverage
|
|
@@ -46,16 +70,9 @@ class RedisTest < Minitest::Test
|
|
|
46
70
|
end
|
|
47
71
|
|
|
48
72
|
def test_clear
|
|
49
|
-
@redis.expects(:del).
|
|
73
|
+
@redis.expects(:del).twice
|
|
50
74
|
@store.clear!
|
|
51
75
|
end
|
|
52
76
|
|
|
53
|
-
private
|
|
54
77
|
|
|
55
|
-
def test_data
|
|
56
|
-
{
|
|
57
|
-
'/Users/danmayer/projects/cover_band_server/app.rb' => { 54 => 1, 55 => 2 },
|
|
58
|
-
'/Users/danmayer/projects/cover_band_server/server.rb' => { 5 => 1 }
|
|
59
|
-
}
|
|
60
|
-
end
|
|
61
78
|
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require File.expand_path('../../test_helper', File.dirname(__FILE__))
|
|
4
|
+
|
|
5
|
+
class CollectorsCoverageTest < Minitest::Test
|
|
6
|
+
attr_accessor :coverband
|
|
7
|
+
|
|
8
|
+
def setup
|
|
9
|
+
super
|
|
10
|
+
Coverband.configure do |config|
|
|
11
|
+
config.store = Coverband::Adapters::RedisStore.new(Redis.new)
|
|
12
|
+
end
|
|
13
|
+
@coverband = Coverband::Collectors::Coverage.instance.reset_instance
|
|
14
|
+
# preload first coverage hit
|
|
15
|
+
@coverband.report_coverage(true)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def teardown
|
|
19
|
+
Thread.current[:coverband_instance] = nil
|
|
20
|
+
Coverband.configure do |config|
|
|
21
|
+
end
|
|
22
|
+
@coverband = Coverband::Collectors::Coverage.instance.reset_instance
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
test 'Dog class coverage' do
|
|
26
|
+
file = require_unique_file
|
|
27
|
+
coverband.report_coverage(true)
|
|
28
|
+
coverage = Coverband.configuration.store.coverage
|
|
29
|
+
assert_equal(coverage[file]["data"], [nil, nil, 1, 1, 0, nil, nil])
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
test 'Dog method and class coverage' do
|
|
33
|
+
load File.expand_path('../../dog.rb', File.dirname(__FILE__))
|
|
34
|
+
Dog.new.bark
|
|
35
|
+
coverband.report_coverage(true)
|
|
36
|
+
coverage = Coverband.configuration.store.coverage
|
|
37
|
+
assert_equal(coverage["./test/dog.rb"]["data"], [nil, nil, 1, 1, 1, nil, nil])
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
test 'gets coverage instance' do
|
|
41
|
+
assert_equal Coverband::Collectors::Coverage, coverband.class
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
test 'defaults to a redis store' do
|
|
45
|
+
assert_equal Coverband::Adapters::RedisStore, coverband.instance_variable_get('@store').class
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
test 'report_coverage raises errors in tests' do
|
|
49
|
+
@coverband.reset_instance
|
|
50
|
+
@coverband.expects(:ready_to_report?).raises('Oh no')
|
|
51
|
+
assert_raises RuntimeError do
|
|
52
|
+
@coverband.report_coverage
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
test 'report_coverage raises errors in tests with verbose enabled' do
|
|
57
|
+
Coverband.configuration.verbose = true
|
|
58
|
+
logger = mock()
|
|
59
|
+
Coverband.configuration.logger = logger
|
|
60
|
+
@coverband.reset_instance
|
|
61
|
+
@coverband.expects(:ready_to_report?).raises('Oh no')
|
|
62
|
+
logger.expects(:error).times(3)
|
|
63
|
+
error = assert_raises RuntimeError do
|
|
64
|
+
@coverband.report_coverage
|
|
65
|
+
end
|
|
66
|
+
assert_match /Oh no/, error.message
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
test 'default tmp ignores' do
|
|
70
|
+
heroku_build_file = '/tmp/build_81feca8c72366e4edf020dc6f1937485/config/initializers/assets.rb'
|
|
71
|
+
assert_equal false, @coverband.send(:track_file?, heroku_build_file)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require File.expand_path('../../test_helper', File.dirname(__FILE__))
|
|
4
|
+
require './lib/coverband/collectors/delta'
|
|
5
|
+
|
|
6
|
+
class CollectorsDeltaTest < Minitest::Test
|
|
7
|
+
class MockSystemCoverage < Struct.new(:results)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def mock_coverage(coverage)
|
|
11
|
+
MockSystemCoverage.new(coverage)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def setup
|
|
15
|
+
Coverband::Collectors::Delta.reset
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
test 'No previous results' do
|
|
19
|
+
current_coverage = {
|
|
20
|
+
'car.rb' => [0,5,1]
|
|
21
|
+
}
|
|
22
|
+
results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
|
|
23
|
+
assert_equal(current_coverage, results)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
test 'Coverage has gone up' do
|
|
27
|
+
current_coverage = {
|
|
28
|
+
'car.rb' => [nil,1,5,1]
|
|
29
|
+
}
|
|
30
|
+
results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
|
|
31
|
+
assert_equal(current_coverage, results)
|
|
32
|
+
|
|
33
|
+
current_coverage = {
|
|
34
|
+
'car.rb' => [nil,1,7,1]
|
|
35
|
+
}
|
|
36
|
+
results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
|
|
37
|
+
assert_equal({'car.rb' => [nil, 0, 2, 0]}, results)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
test 'New file added to coverage' do
|
|
41
|
+
current_coverage = {}
|
|
42
|
+
results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
|
|
43
|
+
assert_equal(current_coverage, results)
|
|
44
|
+
|
|
45
|
+
current_coverage = {
|
|
46
|
+
'dealership.rb' => [nil,1,1,nil]
|
|
47
|
+
}
|
|
48
|
+
results = Coverband::Collectors::Delta.results(mock_coverage(current_coverage))
|
|
49
|
+
assert_equal(current_coverage, results)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
@@ -23,4 +23,11 @@ class CoverbandTest < Minitest::Test
|
|
|
23
23
|
Coverband::Background.expects(:start).never
|
|
24
24
|
::Coverband.start
|
|
25
25
|
end
|
|
26
|
+
|
|
27
|
+
test 'Eager load coverage' do
|
|
28
|
+
Coverband.eager_loading_coverage!
|
|
29
|
+
assert_equal :eager_loading, Coverband.configuration.store.type
|
|
30
|
+
Coverband.runtime_coverage!
|
|
31
|
+
assert_nil Coverband.configuration.store.type
|
|
32
|
+
end
|
|
26
33
|
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require File.expand_path('../../test_helper', File.dirname(__FILE__))
|
|
4
|
+
|
|
5
|
+
class BackgroundTest < Minitest::Test
|
|
6
|
+
class ThreadDouble < Struct.new(:alive)
|
|
7
|
+
def exit
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def alive?
|
|
11
|
+
alive
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_start
|
|
16
|
+
Thread.expects(:new).yields.returns(ThreadDouble.new(true))
|
|
17
|
+
Coverband::Background.expects(:loop).yields
|
|
18
|
+
Coverband::Background.expects(:sleep).with(30)
|
|
19
|
+
Coverband::Collectors::Coverage.instance.expects(:report_coverage).once
|
|
20
|
+
2.times { Coverband::Background.start }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_start_dead_thread
|
|
24
|
+
Thread.expects(:new).yields.returns(ThreadDouble.new(false)).twice
|
|
25
|
+
Coverband::Background.expects(:loop).yields.twice
|
|
26
|
+
Coverband::Background.expects(:sleep).with(30).twice
|
|
27
|
+
Coverband::Collectors::Coverage.instance.expects(:report_coverage).twice
|
|
28
|
+
2.times { Coverband::Background.start }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require File.expand_path('
|
|
3
|
+
require File.expand_path('../../test_helper', File.dirname(__FILE__))
|
|
4
4
|
require 'rack'
|
|
5
5
|
|
|
6
6
|
class MiddlewareTest < Minitest::Test
|
|
@@ -62,6 +62,7 @@ class MiddlewareTest < Minitest::Test
|
|
|
62
62
|
request = Rack::MockRequest.env_for('/anything.json')
|
|
63
63
|
Coverband::Collectors::Coverage.instance.reset_instance
|
|
64
64
|
collector = Coverband::Collectors::Coverage.instance
|
|
65
|
+
collector.report_coverage(true)
|
|
65
66
|
collector.instance_variable_set('@reporting_frequency', 100.0)
|
|
66
67
|
middleware = Coverband::Middleware.new(fake_app)
|
|
67
68
|
store = Coverband::Collectors::Coverage.instance.instance_variable_get('@store')
|
data/test/{unit/rack_server_checkout_test.rb → coverband/integrations/rack_server_check_test.rb}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require File.expand_path('
|
|
3
|
+
require File.expand_path('../../test_helper', File.dirname(__FILE__))
|
|
4
4
|
|
|
5
5
|
class RackServerCheckTest < Minitest::Test
|
|
6
6
|
test 'returns true when running in rack server' do
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require File.expand_path('
|
|
3
|
+
require File.expand_path('../../test_helper', File.dirname(__FILE__))
|
|
4
4
|
|
|
5
5
|
class ResqueWorkerTest < Minitest::Test
|
|
6
6
|
def enqueue_and_run_job
|
|
@@ -23,7 +23,7 @@ class ResqueWorkerTest < Minitest::Test
|
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
test 'resque job coverage' do
|
|
26
|
-
relative_job_file = './
|
|
26
|
+
relative_job_file = './integrations/test_resque_job.rb'
|
|
27
27
|
resque_job_file = File.expand_path('./test_resque_job.rb', File.dirname(__FILE__))
|
|
28
28
|
require resque_job_file
|
|
29
29
|
|
|
@@ -31,6 +31,12 @@ class ResqueWorkerTest < Minitest::Test
|
|
|
31
31
|
|
|
32
32
|
assert !Coverband::Background.running?
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
# TODO: There is a test only type issue where the test is looking at eager data
|
|
35
|
+
# it merged eager and eager for merged and runtime is eager
|
|
36
|
+
Coverband.runtime_coverage!
|
|
37
|
+
report = Coverband.configuration.store.get_coverage_report
|
|
38
|
+
|
|
39
|
+
assert_equal 0, report[Coverband::EAGER_TYPE][relative_job_file]['data'][4]
|
|
40
|
+
assert_equal 1, report[Coverband::RUNTIME_TYPE][relative_job_file]['data'][4]
|
|
35
41
|
end
|
|
36
42
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require File.expand_path('
|
|
3
|
+
require File.expand_path('../../test_helper', File.dirname(__FILE__))
|
|
4
4
|
|
|
5
5
|
class ReportsBaseTest < Minitest::Test
|
|
6
6
|
test 'relative_path_to_full fix filename from a key with a swappable path' do
|
|
@@ -110,10 +110,10 @@ class ReportsBaseTest < Minitest::Test
|
|
|
110
110
|
roots = ['/app/', '/full/remote_app/path/']
|
|
111
111
|
|
|
112
112
|
lines_hit = [1, 3, 6]
|
|
113
|
-
store.stubs(:
|
|
113
|
+
store.stubs(:merged_coverage).returns(key => lines_hit)
|
|
114
114
|
expected = { key => [1, 3, 6] }
|
|
115
115
|
|
|
116
|
-
assert_equal expected, Coverband::Reporters::Base.send(:get_current_scov_data_imp, store, roots)
|
|
116
|
+
assert_equal expected, Coverband::Reporters::Base.send(:get_current_scov_data_imp, store, roots)[:merged]
|
|
117
117
|
end
|
|
118
118
|
|
|
119
119
|
###
|
|
@@ -153,7 +153,7 @@ class ReportsBaseTest < Minitest::Test
|
|
|
153
153
|
roots = ['/base/[0-9]*/', '/base/78/app/']
|
|
154
154
|
|
|
155
155
|
lines_hit = [1, 3, 6]
|
|
156
|
-
store.stubs(:
|
|
156
|
+
store.stubs(:merged_coverage).returns(coverage)
|
|
157
157
|
File.expects(:exist?).at_least_once
|
|
158
158
|
.with('/base/[0-9]*/app/controllers/dashboard_controller.rb')
|
|
159
159
|
.returns(false)
|
|
@@ -163,6 +163,6 @@ class ReportsBaseTest < Minitest::Test
|
|
|
163
163
|
"last_updated_at"=>1549618094,
|
|
164
164
|
"file_hash"=>"14dc84e940e26cbfb9ac79b43862e762",
|
|
165
165
|
"data"=>[38, 38, 38, nil, 38, 38, nil, nil, 38, nil, 38, 80, 80, nil, 80, 80, 80, 80, 80, 80, 80, nil, nil, 38, nil, 38, 80, 55, 0, 0, 0, 0, nil, nil, nil, nil, 0, 0, nil, nil, 38, 80, 80, 80, nil, nil, nil, nil, nil, 38, 80, nil, nil, 38, 80, nil, nil]}
|
|
166
|
-
assert_equal expected, Coverband::Reporters::Base.send(:get_current_scov_data_imp, store, roots)[key]
|
|
166
|
+
assert_equal expected, Coverband::Reporters::Base.send(:get_current_scov_data_imp, store, roots)[:merged][key]
|
|
167
167
|
end
|
|
168
168
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require File.expand_path('
|
|
3
|
+
require File.expand_path('../../test_helper', File.dirname(__FILE__))
|
|
4
4
|
|
|
5
5
|
class HTMLReportTest < Minitest::Test
|
|
6
6
|
REDIS_STORAGE_FORMAT_VERSION = Coverband::Adapters::RedisStore::REDIS_STORAGE_FORMAT_VERSION
|
|
@@ -26,7 +26,7 @@ class HTMLReportTest < Minitest::Test
|
|
|
26
26
|
.returns('app_path')
|
|
27
27
|
@store.send(:save_report, basic_coverage)
|
|
28
28
|
|
|
29
|
-
report = Coverband::Reporters::ConsoleReport.report(@store)
|
|
29
|
+
report = Coverband::Reporters::ConsoleReport.report(@store)[:merged]
|
|
30
30
|
expected = { './dog.rb' => [0, 1, 2] }
|
|
31
31
|
assert_equal(expected.keys, report.keys)
|
|
32
32
|
end
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require File.expand_path('
|
|
3
|
+
require File.expand_path('../../test_helper', File.dirname(__FILE__))
|
|
4
4
|
|
|
5
5
|
class ReportHTMLTest < Minitest::Test
|
|
6
|
-
REDIS_STORAGE_FORMAT_VERSION = Coverband::Adapters::RedisStore::REDIS_STORAGE_FORMAT_VERSION
|
|
7
|
-
|
|
8
6
|
def setup
|
|
9
7
|
super
|
|
10
8
|
@redis = Redis.new
|
|
@@ -22,9 +20,9 @@ class ReportHTMLTest < Minitest::Test
|
|
|
22
20
|
mock_file_hash
|
|
23
21
|
@store.send(:save_report, basic_coverage)
|
|
24
22
|
|
|
25
|
-
html = Coverband::Reporters::HTMLReport.
|
|
23
|
+
html = Coverband::Reporters::HTMLReport.new(@store,
|
|
26
24
|
html: true,
|
|
27
|
-
open_report: false)
|
|
25
|
+
open_report: false).report
|
|
28
26
|
assert_match 'Generated by', html
|
|
29
27
|
end
|
|
30
28
|
|
|
@@ -38,9 +36,10 @@ class ReportHTMLTest < Minitest::Test
|
|
|
38
36
|
mock_file_hash
|
|
39
37
|
@store.send(:save_report, basic_coverage)
|
|
40
38
|
|
|
39
|
+
reporter = Coverband::Reporters::HTMLReport.new(@store,
|
|
40
|
+
html: false,
|
|
41
|
+
open_report: false)
|
|
41
42
|
Coverband::Utils::HTMLFormatter.any_instance.expects(:format!).once
|
|
42
|
-
|
|
43
|
-
html: false,
|
|
44
|
-
open_report: false)
|
|
43
|
+
reporter.report
|
|
45
44
|
end
|
|
46
45
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require File.expand_path('
|
|
3
|
+
require File.expand_path('../../test_helper', File.dirname(__FILE__))
|
|
4
4
|
require 'aws-sdk-s3'
|
|
5
|
-
require File.expand_path('
|
|
5
|
+
require File.expand_path('../../../lib/coverband/reporters/web', File.dirname(__FILE__))
|
|
6
6
|
require 'rack/test'
|
|
7
7
|
|
|
8
8
|
ENV['RACK_ENV'] = 'test'
|
|
@@ -17,11 +17,15 @@ class FullStackTest < Minitest::Test
|
|
|
17
17
|
config.s3_bucket = nil
|
|
18
18
|
config.background_reporting_enabled = false
|
|
19
19
|
config.root_paths = ["#{File.expand_path('../', File.dirname(__FILE__))}/"]
|
|
20
|
+
config.track_gems = true
|
|
20
21
|
end
|
|
21
22
|
Coverband.configuration.store.clear!
|
|
22
23
|
Coverband.start
|
|
24
|
+
Coverband::Collectors::Coverage.instance.runtime!
|
|
23
25
|
@rack_file = File.expand_path(TEST_RACK_APP, File.dirname(__FILE__))
|
|
24
|
-
|
|
26
|
+
require @rack_file
|
|
27
|
+
# preload first coverage hit
|
|
28
|
+
Coverband::Collectors::Coverage.instance.report_coverage(true)
|
|
25
29
|
end
|
|
26
30
|
|
|
27
31
|
test 'call app' do
|
|
@@ -29,20 +33,18 @@ class FullStackTest < Minitest::Test
|
|
|
29
33
|
middleware = Coverband::Middleware.new(fake_app_with_lines)
|
|
30
34
|
results = middleware.call(request)
|
|
31
35
|
assert_equal 'Hello Rack!', results.last
|
|
32
|
-
sleep(0.
|
|
33
|
-
expected = [nil, nil,
|
|
36
|
+
sleep(0.2)
|
|
37
|
+
expected = [nil, nil, 0, nil, 0, 0, 1, nil, nil]
|
|
34
38
|
assert_equal expected, Coverband.configuration.store.coverage[RELATIVE_FILE]['data']
|
|
35
39
|
|
|
36
40
|
# additional calls increase count by 1
|
|
37
41
|
middleware.call(request)
|
|
38
|
-
sleep(0.
|
|
39
|
-
expected = [nil, nil,
|
|
42
|
+
sleep(0.2)
|
|
43
|
+
expected = [nil, nil, 0, nil, 0, 0, 2, nil, nil]
|
|
40
44
|
assert_equal expected, Coverband.configuration.store.coverage[RELATIVE_FILE]['data']
|
|
41
45
|
end
|
|
42
46
|
|
|
43
47
|
test 'call app with gem tracking' do
|
|
44
|
-
Coverband.configuration.track_gems = true
|
|
45
|
-
Coverband::Collectors::Coverage.instance.reset_instance
|
|
46
48
|
require 'rainbow'
|
|
47
49
|
Rainbow('this text is red').red
|
|
48
50
|
request = Rack::MockRequest.env_for('/anything.json')
|
|
@@ -50,7 +52,7 @@ class FullStackTest < Minitest::Test
|
|
|
50
52
|
results = middleware.call(request)
|
|
51
53
|
assert_equal 'Hello Rack!', results.last
|
|
52
54
|
sleep(0.1)
|
|
53
|
-
assert Coverband.configuration.store.coverage.keys.any? { |key| key.end_with?('rainbow/
|
|
55
|
+
assert Coverband.configuration.store.coverage.keys.any? { |key| key.end_with?('rainbow/global.rb') }
|
|
54
56
|
end
|
|
55
57
|
|
|
56
58
|
private
|
|
@@ -8,10 +8,11 @@ class RailsFullStackTest < Minitest::Test
|
|
|
8
8
|
|
|
9
9
|
def setup
|
|
10
10
|
super
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
Coverband.
|
|
14
|
-
|
|
11
|
+
rails_setup
|
|
12
|
+
# preload first coverage hit
|
|
13
|
+
Coverband::Collectors::Coverage.instance.report_coverage(true)
|
|
14
|
+
require 'rainbow'
|
|
15
|
+
Rainbow('this text is red').red
|
|
15
16
|
end
|
|
16
17
|
|
|
17
18
|
def teardown
|
|
@@ -20,6 +21,9 @@ class RailsFullStackTest < Minitest::Test
|
|
|
20
21
|
Capybara.use_default_driver
|
|
21
22
|
end
|
|
22
23
|
|
|
24
|
+
# We have to combine everything in one test
|
|
25
|
+
# because we can only initialize rails once per test
|
|
26
|
+
# run. Possibly fork test runs to avoid this problem in future?
|
|
23
27
|
test 'this is how we do it' do
|
|
24
28
|
visit '/dummy/show'
|
|
25
29
|
Coverband.report_coverage(true)
|
|
@@ -28,6 +32,21 @@ class RailsFullStackTest < Minitest::Test
|
|
|
28
32
|
within page.find('a', text: /dummy_controller.rb/).find(:xpath, '../..') do
|
|
29
33
|
assert_selector('td', text: '100.0 %')
|
|
30
34
|
end
|
|
35
|
+
|
|
36
|
+
#Test gems are reporting coverage
|
|
37
|
+
assert_content('Gems')
|
|
38
|
+
assert page.html.match('rainbow/wrapper.rb')
|
|
39
|
+
|
|
40
|
+
#Test eager load data stored separately
|
|
41
|
+
dummy_controller = "./test/rails#{Rails::VERSION::MAJOR}_dummy/app/controllers/dummy_controller.rb"
|
|
42
|
+
store.type = :eager_loading
|
|
43
|
+
eager_expected = [1, 1, 0, nil, nil]
|
|
44
|
+
results = store.coverage[dummy_controller]['data']
|
|
45
|
+
assert_equal(eager_expected, results)
|
|
46
|
+
|
|
47
|
+
store.type = nil
|
|
48
|
+
runtime_expected = [0, 0, 1, nil, nil]
|
|
49
|
+
results = store.coverage[dummy_controller]['data']
|
|
31
50
|
end
|
|
32
51
|
|
|
33
52
|
###
|
|
@@ -4,5 +4,8 @@ Coverband.configure do |config|
|
|
|
4
4
|
config.ignore = %w[vendor .erb$ .slim$]
|
|
5
5
|
config.root_paths = []
|
|
6
6
|
config.logger = Rails.logger
|
|
7
|
-
config.
|
|
7
|
+
config.verbose = true
|
|
8
|
+
config.background_reporting_enabled = false
|
|
9
|
+
config.track_gems = true
|
|
10
|
+
config.gem_details = true
|
|
8
11
|
end
|
|
File without changes
|
|
@@ -5,5 +5,7 @@ Coverband.configure do |config|
|
|
|
5
5
|
config.root_paths = []
|
|
6
6
|
config.logger = Rails.logger
|
|
7
7
|
config.verbose = true
|
|
8
|
-
config.
|
|
8
|
+
config.background_reporting_enabled = false
|
|
9
|
+
config.track_gems = true
|
|
10
|
+
config.gem_details = true
|
|
9
11
|
end
|
|
File without changes
|