2
1

test_lib_config.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. import pytest
  2. import checkpackagelib.test_util as util
  3. import checkpackagelib.lib_config as m
  4. AttributesOrder = [
  5. ('good example',
  6. 'any',
  7. 'config BR2_PACKAGE_FOO\n'
  8. 'bool "foo"\n'
  9. 'default y\n'
  10. 'depends on BR2_USE_BAR # runtime\n'
  11. 'select BR2_PACKAGE_BAZ\n'
  12. 'help\n'
  13. '\t help text\n',
  14. []),
  15. ('depends before default',
  16. 'any',
  17. 'config BR2_PACKAGE_FOO\n'
  18. 'bool "foo"\n'
  19. 'depends on BR2_USE_BAR\n'
  20. 'default y\n',
  21. [['any:4: attributes order: type, default, depends on, select, help (url#_config_files)',
  22. 'default y\n']]),
  23. ('select after help',
  24. 'any',
  25. 'config BR2_PACKAGE_FOO\n'
  26. 'bool "foo"\n'
  27. 'help\n'
  28. '\t help text\n'
  29. 'select BR2_PACKAGE_BAZ\n',
  30. [['any:5: attributes order: type, default, depends on, select, help (url#_config_files)',
  31. 'select BR2_PACKAGE_BAZ\n']]),
  32. ('string',
  33. 'any',
  34. 'config BR2_PACKAGE_FOO_PLUGINS\n'
  35. 'string "foo plugins"\n'
  36. 'default "all"\n',
  37. []),
  38. ('ignore tabs',
  39. 'any',
  40. 'config\tBR2_PACKAGE_FOO_PLUGINS\n'
  41. 'default\t"all"\n'
  42. 'string\t"foo plugins"\n',
  43. [['any:3: attributes order: type, default, depends on, select, help (url#_config_files)',
  44. 'string\t"foo plugins"\n']]),
  45. ('choice',
  46. 'any',
  47. 'config BR2_PACKAGE_FOO\n'
  48. 'bool "foo"\n'
  49. 'if BR2_PACKAGE_FOO\n'
  50. '\n'
  51. 'choice\n'
  52. 'prompt "type of foo"\n'
  53. 'default BR2_PACKAGE_FOO_STRING\n'
  54. '\n'
  55. 'config BR2_PACKAGE_FOO_NONE\n'
  56. 'bool "none"\n'
  57. '\n'
  58. 'config BR2_PACKAGE_FOO_STRING\n'
  59. 'bool "string"\n'
  60. '\n'
  61. 'endchoice\n'
  62. '\n'
  63. 'endif\n'
  64. '\n',
  65. []),
  66. ('type after default',
  67. 'any',
  68. 'config BR2_PACKAGE_FOO\n'
  69. 'bool "foo"\n'
  70. 'if BR2_PACKAGE_FOO\n'
  71. '\n'
  72. 'choice\n'
  73. 'default BR2_PACKAGE_FOO_STRING\n'
  74. 'prompt "type of foo"\n',
  75. [['any:7: attributes order: type, default, depends on, select, help (url#_config_files)',
  76. 'prompt "type of foo"\n']]),
  77. ('menu',
  78. 'any',
  79. 'menuconfig BR2_PACKAGE_FOO\n'
  80. 'bool "foo"\n'
  81. 'help\n'
  82. '\t help text\n'
  83. '\t help text\n'
  84. '\n'
  85. 'if BR2_PACKAGE_FOO\n'
  86. '\n'
  87. 'menu "foo plugins"\n'
  88. 'config BR2_PACKAGE_FOO_COUNTER\n'
  89. 'bool "counter"\n'
  90. '\n'
  91. 'endmenu\n'
  92. '\n'
  93. 'endif\n',
  94. []),
  95. ]
  96. @pytest.mark.parametrize('testname,filename,string,expected', AttributesOrder)
  97. def test_AttributesOrder(testname, filename, string, expected):
  98. warnings = util.check_file(m.AttributesOrder, filename, string)
  99. assert warnings == expected
  100. CommentsMenusPackagesOrder = [
  101. ('top menu (good)',
  102. 'package/Config.in',
  103. 'menu "Target packages"\n'
  104. 'source "package/busybox/Config.in"\n'
  105. 'source "package/skeleton/Config.in"\n',
  106. []),
  107. ('top menu (bad)',
  108. 'package/Config.in',
  109. 'source "package/skeleton/Config.in"\n'
  110. 'source "package/busybox/Config.in"\n',
  111. [['package/Config.in:2: Packages in: The top level menu,\n'
  112. ' are not alphabetically ordered;\n'
  113. " correct order: '-', '_', digits, capitals, lowercase;\n"
  114. ' first incorrect package: busybox',
  115. 'source "package/busybox/Config.in"\n']]),
  116. ('menu (bad)',
  117. 'package/Config.in',
  118. 'menu "Target packages"\n'
  119. 'source "package/skeleton/Config.in"\n'
  120. 'source "package/busybox/Config.in"\n',
  121. [['package/Config.in:3: Packages in: menu "Target packages",\n'
  122. ' are not alphabetically ordered;\n'
  123. " correct order: '-', '_', digits, capitals, lowercase;\n"
  124. ' first incorrect package: busybox',
  125. 'source "package/busybox/Config.in"\n']]),
  126. ('underscore (good)',
  127. 'package/Config.in.host',
  128. 'menu "Hardware handling"\n'
  129. 'menu "Firmware"\n'
  130. 'endmenu\n'
  131. 'source "package/usb_modeswitch/Config.in"\n'
  132. 'source "package/usbmount/Config.in"\n',
  133. []),
  134. ('underscore (bad)',
  135. 'package/Config.in.host',
  136. 'menu "Hardware handling"\n'
  137. 'menu "Firmware"\n'
  138. 'endmenu\n'
  139. 'source "package/usbmount/Config.in"\n'
  140. 'source "package/usb_modeswitch/Config.in"\n',
  141. [['package/Config.in.host:5: Packages in: menu "Hardware handling",\n'
  142. ' are not alphabetically ordered;\n'
  143. " correct order: '-', '_', digits, capitals, lowercase;\n"
  144. ' first incorrect package: usb_modeswitch',
  145. 'source "package/usb_modeswitch/Config.in"\n']]),
  146. ('ignore other files',
  147. 'any other file',
  148. 'menu "Hardware handling"\n'
  149. 'source "package/bbb/Config.in"\n'
  150. 'source "package/aaa/Config.in"\n',
  151. []),
  152. ('dash (bad)',
  153. 'package/Config.in',
  154. 'menu "packages"\n'
  155. 'source "package/a_a/Config.in"\n'
  156. 'source "package/a-a/Config.in"\n'
  157. 'source "package/a1a/Config.in"\n'
  158. 'source "package/aAa/Config.in"\n'
  159. 'source "package/aaa/Config.in"\n',
  160. [['package/Config.in:3: Packages in: menu "packages",\n'
  161. ' are not alphabetically ordered;\n'
  162. " correct order: '-', '_', digits, capitals, lowercase;\n"
  163. ' first incorrect package: a-a',
  164. 'source "package/a-a/Config.in"\n']]),
  165. ('underscore (bad)',
  166. 'package/Config.in',
  167. 'menu "packages"\n'
  168. 'source "package/a-a/Config.in"\n'
  169. 'source "package/a1a/Config.in"\n'
  170. 'source "package/a_a/Config.in"\n'
  171. 'source "package/aAa/Config.in"\n'
  172. 'source "package/aaa/Config.in"\n',
  173. [['package/Config.in:4: Packages in: menu "packages",\n'
  174. ' are not alphabetically ordered;\n'
  175. " correct order: '-', '_', digits, capitals, lowercase;\n"
  176. ' first incorrect package: a_a',
  177. 'source "package/a_a/Config.in"\n']]),
  178. ('digit (bad)',
  179. 'package/Config.in',
  180. 'menu "packages"\n'
  181. 'source "package/a-a/Config.in"\n'
  182. 'source "package/a_a/Config.in"\n'
  183. 'source "package/aAa/Config.in"\n'
  184. 'source "package/a1a/Config.in"\n'
  185. 'source "package/aaa/Config.in"\n',
  186. [['package/Config.in:5: Packages in: menu "packages",\n'
  187. ' are not alphabetically ordered;\n'
  188. " correct order: '-', '_', digits, capitals, lowercase;\n"
  189. ' first incorrect package: a1a',
  190. 'source "package/a1a/Config.in"\n']]),
  191. ('capitals (bad)',
  192. 'package/Config.in',
  193. 'menu "packages"\n'
  194. 'source "package/a-a/Config.in"\n'
  195. 'source "package/a_a/Config.in"\n'
  196. 'source "package/a1a/Config.in"\n'
  197. 'source "package/aaa/Config.in"\n'
  198. 'source "package/aAa/Config.in"\n',
  199. [['package/Config.in:6: Packages in: menu "packages",\n'
  200. ' are not alphabetically ordered;\n'
  201. " correct order: '-', '_', digits, capitals, lowercase;\n"
  202. ' first incorrect package: aAa',
  203. 'source "package/aAa/Config.in"\n']]),
  204. ('digits, capitals, underscore (good)',
  205. 'package/Config.in',
  206. 'menu "packages"\n'
  207. 'source "package/a-a/Config.in"\n'
  208. 'source "package/a_a/Config.in"\n'
  209. 'source "package/a1a/Config.in"\n'
  210. 'source "package/aAa/Config.in"\n'
  211. 'source "package/aaa/Config.in"\n',
  212. []),
  213. ('conditional menu (good)',
  214. 'package/Config.in',
  215. 'menu "Other"\n'
  216. 'source "package/linux-pam/Config.in"\n'
  217. 'if BR2_PACKAGE_LINUX_PAM\n'
  218. 'comment "linux-pam plugins"\n'
  219. 'source "package/libpam-radius-auth/Config.in"\n'
  220. 'source "package/libpam-tacplus/Config.in"\n'
  221. 'endif\n'
  222. 'source "package/liquid-dsp/Config.in"\n',
  223. []),
  224. ('conditional menu (bad)',
  225. 'package/Config.in',
  226. 'menu "Other"\n'
  227. 'source "package/linux-pam/Config.in"\n'
  228. 'if BR2_PACKAGE_LINUX_PAM\n'
  229. 'comment "linux-pam plugins"\n'
  230. 'source "package/libpam-tacplus/Config.in"\n'
  231. 'source "package/libpam-radius-auth/Config.in"\n'
  232. 'endif\n'
  233. 'source "package/liquid-dsp/Config.in"\n',
  234. [['package/Config.in:6: Packages in: comment "linux-pam plugins",\n'
  235. ' are not alphabetically ordered;\n'
  236. " correct order: '-', '_', digits, capitals, lowercase;\n"
  237. ' first incorrect package: libpam-radius-auth',
  238. 'source "package/libpam-radius-auth/Config.in"\n']]),
  239. ('no conditional (bad)',
  240. 'package/Config.in',
  241. 'menu "Other"\n'
  242. 'source "package/linux-pam/Config.in"\n'
  243. 'source "package/libpam-radius-auth/Config.in"\n'
  244. 'source "package/libpam-tacplus/Config.in"\n'
  245. 'source "package/liquid-dsp/Config.in"\n',
  246. [['package/Config.in:3: Packages in: menu "Other",\n'
  247. ' are not alphabetically ordered;\n'
  248. " correct order: '-', '_', digits, capitals, lowercase;\n"
  249. ' first incorrect package: libpam-radius-auth',
  250. 'source "package/libpam-radius-auth/Config.in"\n']]),
  251. ]
  252. @pytest.mark.parametrize('testname,filename,string,expected', CommentsMenusPackagesOrder)
  253. def test_CommentsMenusPackagesOrder(testname, filename, string, expected):
  254. warnings = util.check_file(m.CommentsMenusPackagesOrder, filename, string)
  255. assert warnings == expected
  256. HelpText = [
  257. ('single line',
  258. 'any',
  259. 'config BR2_PACKAGE_FOO\n'
  260. 'bool "foo"\n'
  261. 'default y\n'
  262. 'depends on BR2_USE_BAR # runtime\n'
  263. 'select BR2_PACKAGE_BAZ\n'
  264. 'help\n'
  265. '\t help text\n',
  266. []),
  267. ('larger than 72',
  268. 'any',
  269. 'help\n'
  270. '\t 123456789 123456789 123456789 123456789 123456789 123456789 12\n'
  271. '\t 123456789 123456789 123456789 123456789 123456789 123456789 123\n'
  272. '\t help text\n',
  273. [['any:3: help text: <tab><2 spaces><62 chars> (url#writing-rules-config-in)',
  274. '\t 123456789 123456789 123456789 123456789 123456789 123456789 123\n',
  275. '\t 123456789 123456789 123456789 123456789 123456789 123456789 12']]),
  276. ('long url at beginning of line',
  277. 'any',
  278. 'help\n'
  279. '\t 123456789 123456789 123456789 123456789 123456789 123456789 12\n'
  280. '\t http://url.that.is.longer.than.seventy.two.characthers/folder_name\n'
  281. '\t https://url.that.is.longer.than.seventy.two.characthers/folder_name\n'
  282. '\t git://url.that.is.longer.than.seventy.two.characthers/folder_name\n',
  283. []),
  284. ('long url not at beginning of line',
  285. 'any',
  286. 'help\n'
  287. '\t 123456789 123456789 123456789 123456789 123456789 123456789 12\n'
  288. '\t refer to http://url.that.is.longer.than.seventy.two.characthers/folder_name\n'
  289. '\n'
  290. '\t http://url.that.is.longer.than.seventy.two.characthers/folder_name\n',
  291. [['any:3: help text: <tab><2 spaces><62 chars> (url#writing-rules-config-in)',
  292. '\t refer to http://url.that.is.longer.than.seventy.two.characthers/folder_name\n',
  293. '\t 123456789 123456789 123456789 123456789 123456789 123456789 12']]),
  294. ('allow beautified items',
  295. 'any',
  296. 'help\n'
  297. '\t 123456789 123456789 123456789 123456789 123456789 123456789 12\n'
  298. '\t summary:\n'
  299. '\t - enable that config\n'
  300. '\t - built it\n',
  301. []),
  302. ]
  303. @pytest.mark.parametrize('testname,filename,string,expected', HelpText)
  304. def test_HelpText(testname, filename, string, expected):
  305. warnings = util.check_file(m.HelpText, filename, string)
  306. assert warnings == expected
  307. Indent = [
  308. ('good example',
  309. 'any',
  310. 'config BR2_PACKAGE_FOO\n'
  311. '\tbool "foo"\n'
  312. '\tdefault y\n'
  313. '\tdepends on BR2_TOOLCHAIN_HAS_THREADS\n'
  314. '\tdepends on BR2_INSTALL_LIBSTDCPP\n'
  315. '# very useful comment\n'
  316. '\tselect BR2_PACKAGE_BAZ\n'
  317. '\thelp\n'
  318. '\t help text\n'
  319. '\n'
  320. 'comment "foo needs toolchain w/ C++, threads"\n'
  321. '\tdepends on !BR2_INSTALL_LIBSTDCPP || \\\n'
  322. '\t\t!BR2_TOOLCHAIN_HAS_THREADS\n'
  323. '\n'
  324. 'source "package/foo/bar/Config.in"\n',
  325. []),
  326. ('spaces',
  327. 'any',
  328. 'config BR2_PACKAGE_FOO\n'
  329. ' bool "foo"\n',
  330. [['any:2: should be indented with one tab (url#_config_files)',
  331. ' bool "foo"\n']]),
  332. ('without indent',
  333. 'any',
  334. 'config BR2_PACKAGE_FOO\n'
  335. 'default y\n',
  336. [['any:2: should be indented with one tab (url#_config_files)',
  337. 'default y\n']]),
  338. ('too much tabs',
  339. 'any',
  340. 'config BR2_PACKAGE_FOO\n'
  341. '\t\tdepends on BR2_TOOLCHAIN_HAS_THREADS\n',
  342. [['any:2: should be indented with one tab (url#_config_files)',
  343. '\t\tdepends on BR2_TOOLCHAIN_HAS_THREADS\n']]),
  344. ('help',
  345. 'any',
  346. 'config BR2_PACKAGE_FOO\n'
  347. ' help\n',
  348. [['any:2: should be indented with one tab (url#_config_files)',
  349. ' help\n']]),
  350. ('continuation line',
  351. 'any',
  352. 'comment "foo needs toolchain w/ C++, threads"\n'
  353. '\tdepends on !BR2_INSTALL_LIBSTDCPP || \\\n'
  354. ' !BR2_TOOLCHAIN_HAS_THREADS\n',
  355. [['any:3: continuation line should be indented using tabs',
  356. ' !BR2_TOOLCHAIN_HAS_THREADS\n']]),
  357. ('comment with tabs',
  358. 'any',
  359. '\tcomment "foo needs toolchain w/ C++, threads"\n',
  360. [['any:1: should not be indented',
  361. '\tcomment "foo needs toolchain w/ C++, threads"\n']]),
  362. ('comment with spaces',
  363. 'any',
  364. ' comment "foo needs toolchain w/ C++, threads"\n',
  365. [['any:1: should not be indented',
  366. ' comment "foo needs toolchain w/ C++, threads"\n']]),
  367. ]
  368. @pytest.mark.parametrize('testname,filename,string,expected', Indent)
  369. def test_Indent(testname, filename, string, expected):
  370. warnings = util.check_file(m.Indent, filename, string)
  371. assert warnings == expected