![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
FRDM K64F Metronome
pal/Test/Unity/test/rakefile_helper.rb@0:dbad57390bd1, 2017-05-14 (annotated)
- Committer:
- ram54288
- Date:
- Sun May 14 18:37:05 2017 +0000
- Revision:
- 0:dbad57390bd1
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ram54288 | 0:dbad57390bd1 | 1 | # ========================================== |
ram54288 | 0:dbad57390bd1 | 2 | # Unity Project - A Test Framework for C |
ram54288 | 0:dbad57390bd1 | 3 | # Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams |
ram54288 | 0:dbad57390bd1 | 4 | # [Released under MIT License. Please refer to license.txt for details] |
ram54288 | 0:dbad57390bd1 | 5 | # ========================================== |
ram54288 | 0:dbad57390bd1 | 6 | |
ram54288 | 0:dbad57390bd1 | 7 | require 'yaml' |
ram54288 | 0:dbad57390bd1 | 8 | require 'fileutils' |
ram54288 | 0:dbad57390bd1 | 9 | require UNITY_ROOT + '../auto/unity_test_summary' |
ram54288 | 0:dbad57390bd1 | 10 | require UNITY_ROOT + '../auto/generate_test_runner' |
ram54288 | 0:dbad57390bd1 | 11 | require UNITY_ROOT + '../auto/colour_reporter' |
ram54288 | 0:dbad57390bd1 | 12 | |
ram54288 | 0:dbad57390bd1 | 13 | module RakefileHelpers |
ram54288 | 0:dbad57390bd1 | 14 | |
ram54288 | 0:dbad57390bd1 | 15 | C_EXTENSION = '.c' |
ram54288 | 0:dbad57390bd1 | 16 | |
ram54288 | 0:dbad57390bd1 | 17 | def load_configuration(config_file) |
ram54288 | 0:dbad57390bd1 | 18 | unless ($configured) |
ram54288 | 0:dbad57390bd1 | 19 | $cfg_file = "targets/#{config_file}" unless (config_file =~ /[\\|\/]/) |
ram54288 | 0:dbad57390bd1 | 20 | $cfg = YAML.load(File.read($cfg_file)) |
ram54288 | 0:dbad57390bd1 | 21 | $colour_output = false unless $cfg['colour'] |
ram54288 | 0:dbad57390bd1 | 22 | $configured = true if (config_file != DEFAULT_CONFIG_FILE) |
ram54288 | 0:dbad57390bd1 | 23 | end |
ram54288 | 0:dbad57390bd1 | 24 | end |
ram54288 | 0:dbad57390bd1 | 25 | |
ram54288 | 0:dbad57390bd1 | 26 | def configure_clean |
ram54288 | 0:dbad57390bd1 | 27 | CLEAN.include($cfg['compiler']['build_path'] + '*.*') unless $cfg['compiler']['build_path'].nil? |
ram54288 | 0:dbad57390bd1 | 28 | end |
ram54288 | 0:dbad57390bd1 | 29 | |
ram54288 | 0:dbad57390bd1 | 30 | def configure_toolchain(config_file=DEFAULT_CONFIG_FILE) |
ram54288 | 0:dbad57390bd1 | 31 | config_file += '.yml' unless config_file =~ /\.yml$/ |
ram54288 | 0:dbad57390bd1 | 32 | config_file = config_file unless config_file =~ /[\\|\/]/ |
ram54288 | 0:dbad57390bd1 | 33 | load_configuration(config_file) |
ram54288 | 0:dbad57390bd1 | 34 | configure_clean |
ram54288 | 0:dbad57390bd1 | 35 | end |
ram54288 | 0:dbad57390bd1 | 36 | |
ram54288 | 0:dbad57390bd1 | 37 | def get_unit_test_files |
ram54288 | 0:dbad57390bd1 | 38 | path = $cfg['compiler']['unit_tests_path'] + 'test*' + C_EXTENSION |
ram54288 | 0:dbad57390bd1 | 39 | path.gsub!(/\\/, '/') |
ram54288 | 0:dbad57390bd1 | 40 | FileList.new(path) |
ram54288 | 0:dbad57390bd1 | 41 | end |
ram54288 | 0:dbad57390bd1 | 42 | |
ram54288 | 0:dbad57390bd1 | 43 | def get_local_include_dirs |
ram54288 | 0:dbad57390bd1 | 44 | include_dirs = $cfg['compiler']['includes']['items'].dup |
ram54288 | 0:dbad57390bd1 | 45 | include_dirs.delete_if {|dir| dir.is_a?(Array)} |
ram54288 | 0:dbad57390bd1 | 46 | return include_dirs |
ram54288 | 0:dbad57390bd1 | 47 | end |
ram54288 | 0:dbad57390bd1 | 48 | |
ram54288 | 0:dbad57390bd1 | 49 | def extract_headers(filename) |
ram54288 | 0:dbad57390bd1 | 50 | includes = [] |
ram54288 | 0:dbad57390bd1 | 51 | lines = File.readlines(filename) |
ram54288 | 0:dbad57390bd1 | 52 | lines.each do |line| |
ram54288 | 0:dbad57390bd1 | 53 | m = line.match(/^\s*#include\s+\"\s*(.+\.[hH])\s*\"/) |
ram54288 | 0:dbad57390bd1 | 54 | if not m.nil? |
ram54288 | 0:dbad57390bd1 | 55 | includes << m[1] |
ram54288 | 0:dbad57390bd1 | 56 | end |
ram54288 | 0:dbad57390bd1 | 57 | end |
ram54288 | 0:dbad57390bd1 | 58 | return includes |
ram54288 | 0:dbad57390bd1 | 59 | end |
ram54288 | 0:dbad57390bd1 | 60 | |
ram54288 | 0:dbad57390bd1 | 61 | def find_source_file(header, paths) |
ram54288 | 0:dbad57390bd1 | 62 | paths.each do |dir| |
ram54288 | 0:dbad57390bd1 | 63 | src_file = dir + header.ext(C_EXTENSION) |
ram54288 | 0:dbad57390bd1 | 64 | if (File.exists?(src_file)) |
ram54288 | 0:dbad57390bd1 | 65 | return src_file |
ram54288 | 0:dbad57390bd1 | 66 | end |
ram54288 | 0:dbad57390bd1 | 67 | end |
ram54288 | 0:dbad57390bd1 | 68 | return nil |
ram54288 | 0:dbad57390bd1 | 69 | end |
ram54288 | 0:dbad57390bd1 | 70 | |
ram54288 | 0:dbad57390bd1 | 71 | def tackit(strings) |
ram54288 | 0:dbad57390bd1 | 72 | if strings.is_a?(Array) |
ram54288 | 0:dbad57390bd1 | 73 | result = "\"#{strings.join}\"" |
ram54288 | 0:dbad57390bd1 | 74 | else |
ram54288 | 0:dbad57390bd1 | 75 | result = strings |
ram54288 | 0:dbad57390bd1 | 76 | end |
ram54288 | 0:dbad57390bd1 | 77 | return result |
ram54288 | 0:dbad57390bd1 | 78 | end |
ram54288 | 0:dbad57390bd1 | 79 | |
ram54288 | 0:dbad57390bd1 | 80 | def squash(prefix, items) |
ram54288 | 0:dbad57390bd1 | 81 | result = '' |
ram54288 | 0:dbad57390bd1 | 82 | items.each { |item| result += " #{prefix}#{tackit(item)}" } |
ram54288 | 0:dbad57390bd1 | 83 | return result |
ram54288 | 0:dbad57390bd1 | 84 | end |
ram54288 | 0:dbad57390bd1 | 85 | |
ram54288 | 0:dbad57390bd1 | 86 | def should(behave, &block) |
ram54288 | 0:dbad57390bd1 | 87 | if block |
ram54288 | 0:dbad57390bd1 | 88 | puts "Should " + behave |
ram54288 | 0:dbad57390bd1 | 89 | yield block |
ram54288 | 0:dbad57390bd1 | 90 | else |
ram54288 | 0:dbad57390bd1 | 91 | puts "UNIMPLEMENTED CASE: Should #{behave}" |
ram54288 | 0:dbad57390bd1 | 92 | end |
ram54288 | 0:dbad57390bd1 | 93 | end |
ram54288 | 0:dbad57390bd1 | 94 | |
ram54288 | 0:dbad57390bd1 | 95 | def build_compiler_fields |
ram54288 | 0:dbad57390bd1 | 96 | command = tackit($cfg['compiler']['path']) |
ram54288 | 0:dbad57390bd1 | 97 | if $cfg['compiler']['defines']['items'].nil? |
ram54288 | 0:dbad57390bd1 | 98 | defines = '' |
ram54288 | 0:dbad57390bd1 | 99 | else |
ram54288 | 0:dbad57390bd1 | 100 | defines = squash($cfg['compiler']['defines']['prefix'], $cfg['compiler']['defines']['items'] + ['UNITY_OUTPUT_CHAR=putcharSpy']) |
ram54288 | 0:dbad57390bd1 | 101 | end |
ram54288 | 0:dbad57390bd1 | 102 | options = squash('', $cfg['compiler']['options']) |
ram54288 | 0:dbad57390bd1 | 103 | includes = squash($cfg['compiler']['includes']['prefix'], $cfg['compiler']['includes']['items']) |
ram54288 | 0:dbad57390bd1 | 104 | includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) |
ram54288 | 0:dbad57390bd1 | 105 | return {:command => command, :defines => defines, :options => options, :includes => includes} |
ram54288 | 0:dbad57390bd1 | 106 | end |
ram54288 | 0:dbad57390bd1 | 107 | |
ram54288 | 0:dbad57390bd1 | 108 | def compile(file, defines=[]) |
ram54288 | 0:dbad57390bd1 | 109 | compiler = build_compiler_fields |
ram54288 | 0:dbad57390bd1 | 110 | cmd_str = "#{compiler[:command]}#{compiler[:defines]}#{compiler[:options]}#{compiler[:includes]} #{file} " + |
ram54288 | 0:dbad57390bd1 | 111 | "#{$cfg['compiler']['object_files']['prefix']}#{$cfg['compiler']['object_files']['destination']}" |
ram54288 | 0:dbad57390bd1 | 112 | obj_file = "#{File.basename(file, C_EXTENSION)}#{$cfg['compiler']['object_files']['extension']}" |
ram54288 | 0:dbad57390bd1 | 113 | execute(cmd_str + obj_file) |
ram54288 | 0:dbad57390bd1 | 114 | return obj_file |
ram54288 | 0:dbad57390bd1 | 115 | end |
ram54288 | 0:dbad57390bd1 | 116 | |
ram54288 | 0:dbad57390bd1 | 117 | def build_linker_fields |
ram54288 | 0:dbad57390bd1 | 118 | command = tackit($cfg['linker']['path']) |
ram54288 | 0:dbad57390bd1 | 119 | if $cfg['linker']['options'].nil? |
ram54288 | 0:dbad57390bd1 | 120 | options = '' |
ram54288 | 0:dbad57390bd1 | 121 | else |
ram54288 | 0:dbad57390bd1 | 122 | options = squash('', $cfg['linker']['options']) |
ram54288 | 0:dbad57390bd1 | 123 | end |
ram54288 | 0:dbad57390bd1 | 124 | if ($cfg['linker']['includes'].nil? || $cfg['linker']['includes']['items'].nil?) |
ram54288 | 0:dbad57390bd1 | 125 | includes = '' |
ram54288 | 0:dbad57390bd1 | 126 | else |
ram54288 | 0:dbad57390bd1 | 127 | includes = squash($cfg['linker']['includes']['prefix'], $cfg['linker']['includes']['items']) |
ram54288 | 0:dbad57390bd1 | 128 | end |
ram54288 | 0:dbad57390bd1 | 129 | includes = includes.gsub(/\\ /, ' ').gsub(/\\\"/, '"').gsub(/\\$/, '') # Remove trailing slashes (for IAR) |
ram54288 | 0:dbad57390bd1 | 130 | return {:command => command, :options => options, :includes => includes} |
ram54288 | 0:dbad57390bd1 | 131 | end |
ram54288 | 0:dbad57390bd1 | 132 | |
ram54288 | 0:dbad57390bd1 | 133 | def link_it(exe_name, obj_list) |
ram54288 | 0:dbad57390bd1 | 134 | linker = build_linker_fields |
ram54288 | 0:dbad57390bd1 | 135 | cmd_str = "#{linker[:command]}#{linker[:options]}#{linker[:includes]} " + |
ram54288 | 0:dbad57390bd1 | 136 | (obj_list.map{|obj|"#{$cfg['linker']['object_files']['path']}#{obj} "}).join + |
ram54288 | 0:dbad57390bd1 | 137 | $cfg['linker']['bin_files']['prefix'] + ' ' + |
ram54288 | 0:dbad57390bd1 | 138 | $cfg['linker']['bin_files']['destination'] + |
ram54288 | 0:dbad57390bd1 | 139 | exe_name + $cfg['linker']['bin_files']['extension'] |
ram54288 | 0:dbad57390bd1 | 140 | execute(cmd_str) |
ram54288 | 0:dbad57390bd1 | 141 | end |
ram54288 | 0:dbad57390bd1 | 142 | |
ram54288 | 0:dbad57390bd1 | 143 | def build_simulator_fields |
ram54288 | 0:dbad57390bd1 | 144 | return nil if $cfg['simulator'].nil? |
ram54288 | 0:dbad57390bd1 | 145 | if $cfg['simulator']['path'].nil? |
ram54288 | 0:dbad57390bd1 | 146 | command = '' |
ram54288 | 0:dbad57390bd1 | 147 | else |
ram54288 | 0:dbad57390bd1 | 148 | command = (tackit($cfg['simulator']['path']) + ' ') |
ram54288 | 0:dbad57390bd1 | 149 | end |
ram54288 | 0:dbad57390bd1 | 150 | if $cfg['simulator']['pre_support'].nil? |
ram54288 | 0:dbad57390bd1 | 151 | pre_support = '' |
ram54288 | 0:dbad57390bd1 | 152 | else |
ram54288 | 0:dbad57390bd1 | 153 | pre_support = squash('', $cfg['simulator']['pre_support']) |
ram54288 | 0:dbad57390bd1 | 154 | end |
ram54288 | 0:dbad57390bd1 | 155 | if $cfg['simulator']['post_support'].nil? |
ram54288 | 0:dbad57390bd1 | 156 | post_support = '' |
ram54288 | 0:dbad57390bd1 | 157 | else |
ram54288 | 0:dbad57390bd1 | 158 | post_support = squash('', $cfg['simulator']['post_support']) |
ram54288 | 0:dbad57390bd1 | 159 | end |
ram54288 | 0:dbad57390bd1 | 160 | return {:command => command, :pre_support => pre_support, :post_support => post_support} |
ram54288 | 0:dbad57390bd1 | 161 | end |
ram54288 | 0:dbad57390bd1 | 162 | |
ram54288 | 0:dbad57390bd1 | 163 | def execute(command_string, verbose=true) |
ram54288 | 0:dbad57390bd1 | 164 | report command_string |
ram54288 | 0:dbad57390bd1 | 165 | output = `#{command_string}`.chomp |
ram54288 | 0:dbad57390bd1 | 166 | report(output) if (verbose && !output.nil? && (output.length > 0)) |
ram54288 | 0:dbad57390bd1 | 167 | if $?.exitstatus != 0 |
ram54288 | 0:dbad57390bd1 | 168 | raise "Command failed. (Returned #{$?.exitstatus})" |
ram54288 | 0:dbad57390bd1 | 169 | end |
ram54288 | 0:dbad57390bd1 | 170 | return output |
ram54288 | 0:dbad57390bd1 | 171 | end |
ram54288 | 0:dbad57390bd1 | 172 | |
ram54288 | 0:dbad57390bd1 | 173 | def report_summary |
ram54288 | 0:dbad57390bd1 | 174 | summary = UnityTestSummary.new |
ram54288 | 0:dbad57390bd1 | 175 | summary.set_root_path(UNITY_ROOT) |
ram54288 | 0:dbad57390bd1 | 176 | results_glob = "#{$cfg['compiler']['build_path']}*.test*" |
ram54288 | 0:dbad57390bd1 | 177 | results_glob.gsub!(/\\/, '/') |
ram54288 | 0:dbad57390bd1 | 178 | results = Dir[results_glob] |
ram54288 | 0:dbad57390bd1 | 179 | summary.set_targets(results) |
ram54288 | 0:dbad57390bd1 | 180 | report summary.run |
ram54288 | 0:dbad57390bd1 | 181 | end |
ram54288 | 0:dbad57390bd1 | 182 | |
ram54288 | 0:dbad57390bd1 | 183 | def run_tests(test_files) |
ram54288 | 0:dbad57390bd1 | 184 | report 'Running Unity system tests...' |
ram54288 | 0:dbad57390bd1 | 185 | |
ram54288 | 0:dbad57390bd1 | 186 | # Tack on TEST define for compiling unit tests |
ram54288 | 0:dbad57390bd1 | 187 | load_configuration($cfg_file) |
ram54288 | 0:dbad57390bd1 | 188 | test_defines = ['TEST'] |
ram54288 | 0:dbad57390bd1 | 189 | $cfg['compiler']['defines']['items'] = [] if $cfg['compiler']['defines']['items'].nil? |
ram54288 | 0:dbad57390bd1 | 190 | $cfg['compiler']['defines']['items'] << 'TEST' |
ram54288 | 0:dbad57390bd1 | 191 | |
ram54288 | 0:dbad57390bd1 | 192 | include_dirs = get_local_include_dirs |
ram54288 | 0:dbad57390bd1 | 193 | |
ram54288 | 0:dbad57390bd1 | 194 | # Build and execute each unit test |
ram54288 | 0:dbad57390bd1 | 195 | test_files.each do |test| |
ram54288 | 0:dbad57390bd1 | 196 | obj_list = [] |
ram54288 | 0:dbad57390bd1 | 197 | |
ram54288 | 0:dbad57390bd1 | 198 | if !$cfg['compiler']['aux_sources'].nil? |
ram54288 | 0:dbad57390bd1 | 199 | $cfg['compiler']['aux_sources'].each do |aux| |
ram54288 | 0:dbad57390bd1 | 200 | obj_list << compile(aux, test_defines) |
ram54288 | 0:dbad57390bd1 | 201 | end |
ram54288 | 0:dbad57390bd1 | 202 | end |
ram54288 | 0:dbad57390bd1 | 203 | |
ram54288 | 0:dbad57390bd1 | 204 | # Detect dependencies and build required modules |
ram54288 | 0:dbad57390bd1 | 205 | extract_headers(test).each do |header| |
ram54288 | 0:dbad57390bd1 | 206 | # Compile corresponding source file if it exists |
ram54288 | 0:dbad57390bd1 | 207 | src_file = find_source_file(header, include_dirs) |
ram54288 | 0:dbad57390bd1 | 208 | if !src_file.nil? |
ram54288 | 0:dbad57390bd1 | 209 | obj_list << compile(src_file, test_defines) |
ram54288 | 0:dbad57390bd1 | 210 | end |
ram54288 | 0:dbad57390bd1 | 211 | end |
ram54288 | 0:dbad57390bd1 | 212 | |
ram54288 | 0:dbad57390bd1 | 213 | # Build the test runner (generate if configured to do so) |
ram54288 | 0:dbad57390bd1 | 214 | test_base = File.basename(test, C_EXTENSION) |
ram54288 | 0:dbad57390bd1 | 215 | |
ram54288 | 0:dbad57390bd1 | 216 | runner_name = test_base + '_Runner.c' |
ram54288 | 0:dbad57390bd1 | 217 | runner_path = '' |
ram54288 | 0:dbad57390bd1 | 218 | |
ram54288 | 0:dbad57390bd1 | 219 | if $cfg['compiler']['runner_path'].nil? |
ram54288 | 0:dbad57390bd1 | 220 | runner_path = $cfg['compiler']['build_path'] + runner_name |
ram54288 | 0:dbad57390bd1 | 221 | else |
ram54288 | 0:dbad57390bd1 | 222 | runner_path = $cfg['compiler']['runner_path'] + runner_name |
ram54288 | 0:dbad57390bd1 | 223 | end |
ram54288 | 0:dbad57390bd1 | 224 | |
ram54288 | 0:dbad57390bd1 | 225 | options = $cfg[:unity] |
ram54288 | 0:dbad57390bd1 | 226 | options[:use_param_tests] = (test =~ /parameterized/) ? true : false |
ram54288 | 0:dbad57390bd1 | 227 | UnityTestRunnerGenerator.new(options).run(test, runner_path) |
ram54288 | 0:dbad57390bd1 | 228 | obj_list << compile(runner_path, test_defines) |
ram54288 | 0:dbad57390bd1 | 229 | |
ram54288 | 0:dbad57390bd1 | 230 | # Build the test module |
ram54288 | 0:dbad57390bd1 | 231 | obj_list << compile(test, test_defines) |
ram54288 | 0:dbad57390bd1 | 232 | |
ram54288 | 0:dbad57390bd1 | 233 | # Link the test executable |
ram54288 | 0:dbad57390bd1 | 234 | link_it(test_base, obj_list) |
ram54288 | 0:dbad57390bd1 | 235 | |
ram54288 | 0:dbad57390bd1 | 236 | # Execute unit test and generate results file |
ram54288 | 0:dbad57390bd1 | 237 | simulator = build_simulator_fields |
ram54288 | 0:dbad57390bd1 | 238 | executable = $cfg['linker']['bin_files']['destination'] + test_base + $cfg['linker']['bin_files']['extension'] |
ram54288 | 0:dbad57390bd1 | 239 | if simulator.nil? |
ram54288 | 0:dbad57390bd1 | 240 | cmd_str = executable |
ram54288 | 0:dbad57390bd1 | 241 | else |
ram54288 | 0:dbad57390bd1 | 242 | cmd_str = "#{simulator[:command]} #{simulator[:pre_support]} #{executable} #{simulator[:post_support]}" |
ram54288 | 0:dbad57390bd1 | 243 | end |
ram54288 | 0:dbad57390bd1 | 244 | output = execute(cmd_str) |
ram54288 | 0:dbad57390bd1 | 245 | test_results = $cfg['compiler']['build_path'] + test_base |
ram54288 | 0:dbad57390bd1 | 246 | if output.match(/OK$/m).nil? |
ram54288 | 0:dbad57390bd1 | 247 | test_results += '.testfail' |
ram54288 | 0:dbad57390bd1 | 248 | else |
ram54288 | 0:dbad57390bd1 | 249 | test_results += '.testpass' |
ram54288 | 0:dbad57390bd1 | 250 | end |
ram54288 | 0:dbad57390bd1 | 251 | File.open(test_results, 'w') { |f| f.print output } |
ram54288 | 0:dbad57390bd1 | 252 | |
ram54288 | 0:dbad57390bd1 | 253 | end |
ram54288 | 0:dbad57390bd1 | 254 | end |
ram54288 | 0:dbad57390bd1 | 255 | end |