defaults.rb 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. require 'constants'
  2. require 'system_wrapper'
  3. require 'file_path_utils'
  4. DEFAULT_TEST_COMPILER_TOOL = {
  5. :executable => FilePathUtils.os_executable_ext('gcc').freeze,
  6. :name => 'default_test_compiler'.freeze,
  7. :stderr_redirect => StdErrRedirect::NONE.freeze,
  8. :background_exec => BackgroundExec::NONE.freeze,
  9. :optional => false.freeze,
  10. :arguments => [
  11. {"-I\"$\"" => 'COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR'}.freeze,
  12. {"-I\"$\"" => 'COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE'}.freeze,
  13. {"-D$" => 'COLLECTION_DEFINES_TEST_AND_VENDOR'}.freeze,
  14. "-DGNU_COMPILER".freeze,
  15. "-c \"${1}\"".freeze,
  16. "-o \"${2}\"".freeze,
  17. # gcc's list file output options are complex; no use of ${3} parameter in default config
  18. ].freeze
  19. }
  20. DEFAULT_TEST_LINKER_TOOL = {
  21. :executable => FilePathUtils.os_executable_ext('gcc').freeze,
  22. :name => 'default_test_linker'.freeze,
  23. :stderr_redirect => StdErrRedirect::NONE.freeze,
  24. :background_exec => BackgroundExec::NONE.freeze,
  25. :optional => false.freeze,
  26. :arguments => [
  27. "\"${1}\"".freeze,
  28. "-o \"${2}\"".freeze,
  29. ].freeze
  30. }
  31. DEFAULT_TEST_FIXTURE_TOOL = {
  32. :executable => '${1}'.freeze,
  33. :name => 'default_test_fixture'.freeze,
  34. :stderr_redirect => StdErrRedirect::AUTO.freeze,
  35. :background_exec => BackgroundExec::NONE.freeze,
  36. :optional => false.freeze,
  37. :arguments => [].freeze
  38. }
  39. DEFAULT_TEST_INCLUDES_PREPROCESSOR_TOOL = {
  40. :executable => FilePathUtils.os_executable_ext('cpp').freeze,
  41. :name => 'default_test_includes_preprocessor'.freeze,
  42. :stderr_redirect => StdErrRedirect::NONE.freeze,
  43. :background_exec => BackgroundExec::NONE.freeze,
  44. :optional => false.freeze,
  45. :arguments => [
  46. '-MM'.freeze,
  47. '-MG'.freeze,
  48. # avoid some possibility of deep system lib header file complications by omitting vendor paths
  49. # if cpp is run on *nix system, escape spaces in paths; if cpp on windows just use the paths collection as is
  50. {"-I\"$\"" => "{SystemWrapper.windows? ? COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE : COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE.map{|path| path.gsub(\/ \/, \'\\\\ \') }}"}.freeze,
  51. {"-D$" => 'COLLECTION_DEFINES_TEST_AND_VENDOR'}.freeze,
  52. {"-D$" => 'DEFINES_TEST_PREPROCESS'}.freeze,
  53. "-DGNU_PREPROCESSOR".freeze,
  54. '-w'.freeze,
  55. '-nostdinc'.freeze,
  56. "\"${1}\"".freeze
  57. ].freeze
  58. }
  59. DEFAULT_TEST_FILE_PREPROCESSOR_TOOL = {
  60. :executable => FilePathUtils.os_executable_ext('gcc').freeze,
  61. :name => 'default_test_file_preprocessor'.freeze,
  62. :stderr_redirect => StdErrRedirect::NONE.freeze,
  63. :background_exec => BackgroundExec::NONE.freeze,
  64. :optional => false.freeze,
  65. :arguments => [
  66. '-E'.freeze,
  67. {"-I\"$\"" => 'COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR'}.freeze,
  68. {"-I\"$\"" => 'COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE'}.freeze,
  69. {"-D$" => 'COLLECTION_DEFINES_TEST_AND_VENDOR'}.freeze,
  70. {"-D$" => 'DEFINES_TEST_PREPROCESS'}.freeze,
  71. "-DGNU_PREPROCESSOR".freeze,
  72. "\"${1}\"".freeze,
  73. "-o \"${2}\"".freeze
  74. ].freeze
  75. }
  76. DEFAULT_TEST_DEPENDENCIES_GENERATOR_TOOL = {
  77. :executable => FilePathUtils.os_executable_ext('gcc').freeze,
  78. :name => 'default_test_dependencies_generator'.freeze,
  79. :stderr_redirect => StdErrRedirect::NONE.freeze,
  80. :background_exec => BackgroundExec::NONE.freeze,
  81. :optional => false.freeze,
  82. :arguments => [
  83. {"-I\"$\"" => 'COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR'}.freeze,
  84. {"-I\"$\"" => 'COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE'}.freeze,
  85. {"-D$" => 'COLLECTION_DEFINES_TEST_AND_VENDOR'}.freeze,
  86. {"-D$" => 'DEFINES_TEST_PREPROCESS'}.freeze,
  87. "-DGNU_PREPROCESSOR".freeze,
  88. "-MT \"${3}\"".freeze,
  89. '-MM'.freeze,
  90. '-MD'.freeze,
  91. '-MG'.freeze,
  92. "-MF \"${2}\"".freeze,
  93. "-c \"${1}\"".freeze,
  94. ].freeze
  95. }
  96. DEFAULT_RELEASE_DEPENDENCIES_GENERATOR_TOOL = {
  97. :executable => FilePathUtils.os_executable_ext('gcc').freeze,
  98. :name => 'default_release_dependencies_generator'.freeze,
  99. :stderr_redirect => StdErrRedirect::NONE.freeze,
  100. :background_exec => BackgroundExec::NONE.freeze,
  101. :optional => false.freeze,
  102. :arguments => [
  103. {"-I\"$\"" => 'COLLECTION_PATHS_SOURCE_INCLUDE_VENDOR'}.freeze,
  104. {"-I\"$\"" => 'COLLECTION_PATHS_RELEASE_TOOLCHAIN_INCLUDE'}.freeze,
  105. {"-D$" => 'COLLECTION_DEFINES_RELEASE_AND_VENDOR'}.freeze,
  106. {"-D$" => 'DEFINES_RELEASE_PREPROCESS'}.freeze,
  107. "-DGNU_PREPROCESSOR".freeze,
  108. "-MT \"${3}\"".freeze,
  109. '-MM'.freeze,
  110. '-MD'.freeze,
  111. '-MG'.freeze,
  112. "-MF \"${2}\"".freeze,
  113. "-c \"${1}\"".freeze,
  114. ].freeze
  115. }
  116. DEFAULT_RELEASE_COMPILER_TOOL = {
  117. :executable => FilePathUtils.os_executable_ext('gcc').freeze,
  118. :name => 'default_release_compiler'.freeze,
  119. :stderr_redirect => StdErrRedirect::NONE.freeze,
  120. :background_exec => BackgroundExec::NONE.freeze,
  121. :optional => false.freeze,
  122. :arguments => [
  123. {"-I\"$\"" => 'COLLECTION_PATHS_SOURCE_INCLUDE_VENDOR'}.freeze,
  124. {"-I\"$\"" => 'COLLECTION_PATHS_RELEASE_TOOLCHAIN_INCLUDE'}.freeze,
  125. {"-D$" => 'COLLECTION_DEFINES_RELEASE_AND_VENDOR'}.freeze,
  126. "-DGNU_COMPILER".freeze,
  127. "-c \"${1}\"".freeze,
  128. "-o \"${2}\"".freeze,
  129. # gcc's list file output options are complex; no use of ${3} parameter in default config
  130. ].freeze
  131. }
  132. DEFAULT_RELEASE_ASSEMBLER_TOOL = {
  133. :executable => FilePathUtils.os_executable_ext('as').freeze,
  134. :name => 'default_release_assembler'.freeze,
  135. :stderr_redirect => StdErrRedirect::NONE.freeze,
  136. :background_exec => BackgroundExec::NONE.freeze,
  137. :optional => false.freeze,
  138. :arguments => [
  139. {"-I\"$\"" => 'COLLECTION_PATHS_SOURCE_AND_INCLUDE'}.freeze,
  140. "\"${1}\"".freeze,
  141. "-o \"${2}\"".freeze,
  142. ].freeze
  143. }
  144. DEFAULT_RELEASE_LINKER_TOOL = {
  145. :executable => FilePathUtils.os_executable_ext('gcc').freeze,
  146. :name => 'default_release_linker'.freeze,
  147. :stderr_redirect => StdErrRedirect::NONE.freeze,
  148. :background_exec => BackgroundExec::NONE.freeze,
  149. :optional => false.freeze,
  150. :arguments => [
  151. "\"${1}\"".freeze,
  152. "-o \"${2}\"".freeze,
  153. ].freeze
  154. }
  155. DEFAULT_TOOLS_TEST = {
  156. :tools => {
  157. :test_compiler => DEFAULT_TEST_COMPILER_TOOL,
  158. :test_linker => DEFAULT_TEST_LINKER_TOOL,
  159. :test_fixture => DEFAULT_TEST_FIXTURE_TOOL,
  160. }
  161. }
  162. DEFAULT_TOOLS_TEST_PREPROCESSORS = {
  163. :tools => {
  164. :test_includes_preprocessor => DEFAULT_TEST_INCLUDES_PREPROCESSOR_TOOL,
  165. :test_file_preprocessor => DEFAULT_TEST_FILE_PREPROCESSOR_TOOL,
  166. }
  167. }
  168. DEFAULT_TOOLS_TEST_DEPENDENCIES = {
  169. :tools => {
  170. :test_dependencies_generator => DEFAULT_TEST_DEPENDENCIES_GENERATOR_TOOL,
  171. }
  172. }
  173. DEFAULT_TOOLS_RELEASE = {
  174. :tools => {
  175. :release_compiler => DEFAULT_RELEASE_COMPILER_TOOL,
  176. :release_linker => DEFAULT_RELEASE_LINKER_TOOL,
  177. }
  178. }
  179. DEFAULT_TOOLS_RELEASE_ASSEMBLER = {
  180. :tools => {
  181. :release_assembler => DEFAULT_RELEASE_ASSEMBLER_TOOL,
  182. }
  183. }
  184. DEFAULT_TOOLS_RELEASE_DEPENDENCIES = {
  185. :tools => {
  186. :release_dependencies_generator => DEFAULT_RELEASE_DEPENDENCIES_GENERATOR_TOOL,
  187. }
  188. }
  189. DEFAULT_RELEASE_TARGET_NAME = 'project'
  190. DEFAULT_CEEDLING_CONFIG = {
  191. :project => {
  192. # :build_root must be set by user
  193. :use_exceptions => true,
  194. :use_mocks => true,
  195. :compile_threads => 1,
  196. :test_threads => 1,
  197. :use_test_preprocessor => false,
  198. :use_deep_dependencies => false,
  199. :test_file_prefix => 'test_',
  200. :options_paths => [],
  201. :release_build => false,
  202. },
  203. :release_build => {
  204. # :output is set while building configuration -- allows smart default system-dependent file extension handling
  205. :use_assembly => false,
  206. :artifacts => [],
  207. },
  208. :paths => {
  209. :test => [], # must be populated by user
  210. :source => [], # must be populated by user
  211. :support => [],
  212. :include => [],
  213. :test_toolchain_include => [],
  214. :release_toolchain_include => [],
  215. },
  216. :files => {
  217. :test => [],
  218. :source => [],
  219. :assembly => [],
  220. :support => [],
  221. :include => [],
  222. },
  223. # unlike other top-level entries, environment's value is an array to preserve order
  224. :environment => [
  225. # when evaluated, this provides wider text field for rake task comments
  226. {:rake_columns => '120'},
  227. ],
  228. :defines => {
  229. :test => [],
  230. :test_preprocess => [],
  231. :release => [],
  232. :release_preprocess => [],
  233. },
  234. :flags => {},
  235. :extension => {
  236. :header => '.h',
  237. :source => '.c',
  238. :assembly => '.s',
  239. :object => '.o',
  240. :executable => ( SystemWrapper.windows? ? EXTENSION_WIN_EXE : EXTENSION_NONWIN_EXE ),
  241. :map => '.map',
  242. :list => '.lst',
  243. :testpass => '.pass',
  244. :testfail => '.fail',
  245. :dependencies => '.d',
  246. },
  247. :unity => {
  248. :defines => []
  249. },
  250. :cmock => {
  251. :defines => []
  252. },
  253. :cexception => {
  254. :defines => []
  255. },
  256. :test_runner => {
  257. :includes => [],
  258. :file_suffix => '_runner',
  259. },
  260. # all tools populated while building up config structure
  261. :tools => {},
  262. # empty argument lists for default tools
  263. # (these can be overridden in project file to add arguments to tools without totally redefining tools)
  264. :test_compiler => { :arguments => [] },
  265. :test_linker => { :arguments => [] },
  266. :test_fixture => {
  267. :arguments => [],
  268. :link_objects => [], # compiled object files to always be linked in (e.g. cmock.o if using mocks)
  269. },
  270. :test_includes_preprocessor => { :arguments => [] },
  271. :test_file_preprocessor => { :arguments => [] },
  272. :test_dependencies_generator => { :arguments => [] },
  273. :release_compiler => { :arguments => [] },
  274. :release_linker => { :arguments => [] },
  275. :release_assembler => { :arguments => [] },
  276. :release_dependencies_generator => { :arguments => [] },
  277. :plugins => {
  278. :load_paths => [],
  279. :enabled => [],
  280. }
  281. }.freeze
  282. DEFAULT_TESTS_RESULTS_REPORT_TEMPLATE = %q{
  283. % ignored = hash[:results][:counts][:ignored]
  284. % failed = hash[:results][:counts][:failed]
  285. % stdout_count = hash[:results][:counts][:stdout]
  286. % header_prepend = ((hash[:header].length > 0) ? "#{hash[:header]}: " : '')
  287. % banner_width = 25 + header_prepend.length # widest message
  288. % if (ignored > 0)
  289. <%=@ceedling[:plugin_reportinator].generate_banner(header_prepend + 'IGNORED UNIT TEST SUMMARY')%>
  290. % hash[:results][:ignores].each do |ignore|
  291. % ignore[:collection].each do |item|
  292. <%=ignore[:source][:path]%><%=File::SEPARATOR%><%=ignore[:source][:file]%>:<%=item[:line]%>:<%=item[:test]%>
  293. % if (item[:message].length > 0)
  294. : "<%=item[:message]%>"
  295. % else
  296. <%="\n"%>
  297. % end
  298. % end
  299. % end
  300. % end
  301. % if (failed > 0)
  302. <%=@ceedling[:plugin_reportinator].generate_banner(header_prepend + "\e[31m" 'FAILED UNIT TEST SUMMARY')%>
  303. % hash[:results][:failures].each do |failure|
  304. % failure[:collection].each do |item|
  305. <%=failure[:source][:path]%><%=File::SEPARATOR%><%=failure[:source][:file]%>:<%=item[:line]%>:<%=item[:test]%>
  306. % if (item[:message].length > 0)
  307. : "<%=item[:message]%>"
  308. % else
  309. <%="\n"%>
  310. % end
  311. % end
  312. % end
  313. % end
  314. % if (stdout_count > 0)
  315. <%=@ceedling[:plugin_reportinator].generate_banner(header_prepend + 'UNIT TEST OTHER OUTPUT')%>
  316. % hash[:results][:stdout].each do |string|
  317. % string[:collection].each do |item|
  318. <%=string[:source][:path]%><%=File::SEPARATOR%><%=string[:source][:file]%>: "<%=item%>"
  319. % end
  320. % end
  321. % end
  322. % total_string = hash[:results][:counts][:total].to_s
  323. % format_string = "%#{total_string.length}i"
  324. <%=@ceedling[:plugin_reportinator].generate_banner(header_prepend + 'OVERALL UNIT TEST SUMMARY')%>
  325. % if (hash[:results][:counts][:total] > 0)
  326. TESTED: <%=hash[:results][:counts][:total].to_s%>
  327. PASSED: <%=sprintf(format_string, hash[:results][:counts][:passed])%>
  328. FAILED: <%=sprintf(format_string, failed)%>
  329. IGNORED: <%=sprintf(format_string, ignored)%>
  330. % else
  331. No tests executed.
  332. % end
  333. }