1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
# vim: set sw=2 sts=2 et tw=80 :
require 'rspec'
# XXX Super ugly hack to keep from starting beaker nodes
module Kernel
# make an alias of the original require
alias original_require require
# rewrite require
def require(name)
original_require name if name != 'spec_helper_acceptance'
end
end
UNSUPPORTED_PLATFORMS = [].freeze
def fact(*_args)
[]
end
# XXX End hax
# Get a list of functions for test coverage
function_list = Dir[File.join(File.dirname(__FILE__), '..', '..', 'lib', 'puppet', 'parser', 'functions', '*.rb')].map do |function_rb|
File.basename(function_rb, '.rb')
end
## Configure rspec to parse tests
options = RSpec::Core::ConfigurationOptions.new(['spec/acceptance'])
configuration = RSpec.configuration
world = RSpec.world
options.parse_options
options.configure(configuration)
configuration.load_spec_files
## Collect up tests and example groups into a hash
def get_tests(children)
children.each_with_object({}) do |c, memo|
memo[c.description] = {}
memo[c.description]['groups'] = get_tests(c.children) unless c.children.empty?
unless c.examples.empty?
memo[c.description]['tests'] = c.examples.map { |e|
e.description unless e.pending?
}.compact
end
next if c.examples.empty?
memo[c.description]['pending_tests'] = c.examples.map { |e|
e.description if e.pending?
}.compact
end
end
def count_test_types_in(type, group)
return 0 if group.nil?
group.reduce(0) do |m, (k, v)|
m += v.length if k == type
m += count_tests_in(v) if v.is_a?(Hash)
m
end
end
def count_tests_in(group)
count_test_types_in('tests', group)
end
def count_pending_tests_in(group)
count_test_types_in('pending_tests', group)
end
# Convert tests hash to csv format
def to_csv(function_list, tests)
function_list.map { |function_name|
v = tests["#{function_name} function"]
if v
positive_tests = count_tests_in(v['groups']['success'])
negative_tests = count_tests_in(v['groups']['failure'])
pending_tests =
count_pending_tests_in(v['groups']['failure']) +
count_pending_tests_in(v['groups']['failure'])
else
positive_tests = 0
negative_tests = 0
pending_tests = 0
end
'%-25s, %-9d, %-9d, %-9d' % [function_name, positive_tests, negative_tests, pending_tests]
}.compact
end
tests = get_tests(world.example_groups)
csv = to_csv(function_list, tests)
percentage_tested = "#{tests.count * 100 / function_list.count}%"
printf("%-25s, %-9s, %-9s, %-9s\n", "#{percentage_tested} have tests.", 'Positive', 'Negative', 'Pending')
puts csv
|