mc-test 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  1. #!/bin/sh
  2. # Midnight Commander Test Suite
  3. #
  4. # (c) 2005 Roland Illig <roland.illig@gmx.de>
  5. #
  6. # Licensed under the GPL 2.0
  7. set -efu
  8. ### initialize environment ###
  9. LC_CTYPE="C"; export LC_ALL
  10. LC_COLLATE="C"; export LC_COLLATE
  11. LC_MONETARY="C"; export LC_MONETARY
  12. LC_NUMERIC="C"; export LC_NUMERIC
  13. LC_TIME="C"; export LC_TIME
  14. LC_MESSAGES="C"; export LC_MESSAGES
  15. LC_ALL="C"; export LC_ALL
  16. ### set default configuration ###
  17. mc_nice_value="19"
  18. mc_basedir="/tmp/mc-current-build"
  19. mc_srcdir="" # default: ${mc_basedir}/src
  20. mc_builddir="" # default: ${mc_basedir}/build
  21. mc_prefixdir="" # default: ${mc_basedir}/installed
  22. mc_logdir="" # default: ${mc_basedir}/logs
  23. mc_cvs_rsh="ssh"
  24. mc_cvs_repository=":ext:anoncvs@cvs.gnu.org:/cvsroot/mc"
  25. mc_cvs_module="mc"
  26. mc_cvs_tag="HEAD"
  27. mc_configure_args_pre="--enable-maintainer-mode"
  28. mc_configure_args_post=""
  29. mc_make="make"
  30. mc_make_flags=""
  31. mc_cpp="" # default: ${mc_cc} -E
  32. mc_cppflags=""
  33. mc_cc="cc"
  34. mc_cflags=""
  35. mc_ldflags=""
  36. do_clean_basedir=no
  37. do_download=auto
  38. do_autoconf=auto
  39. do_clean_workdir=no
  40. do_configure=auto
  41. do_make_clean=no
  42. do_make_all=yes
  43. do_make_install=yes
  44. ### command line parsing ###
  45. usage() {
  46. cat >&2 <<EOF
  47. usage: `basename $0` [options ...] [<testname ...>]
  48. -config <file> load the configuration from <file>
  49. -basedir <dir> set the base directory
  50. -srcdir <dir> select the directory where the source code is
  51. read from or will be downloaded to from CVS
  52. -[dont-]download checkout or update from CVS (default: ${do_download})
  53. -[dont-]autoconf generate the configure script (default: ${do_autoconf})
  54. -[dont-]cleanwork recreate the build directory (default: ${do_clean_workdir})
  55. -[dont-]configure run configure (default: ${do_configure})
  56. -[dont-]clean make clean (default: ${do_make_clean})
  57. -[dont-]build make all (default: ${do_make_all})
  58. -[dont-]install make install (default: ${do_make_install})
  59. -fast only do what's necessary
  60. -nice <n> set the nice(1) value (default: ${mc_nice_value})
  61. -quiet disable most status messages (default: ${quiet:-"no"}${quiet+"yes"})
  62. EOF
  63. exit 1
  64. }
  65. while test $# -ne 0; do
  66. case "$1" in
  67. -config) shift; . "$1"; shift;;
  68. -basedir) shift; mc_basedir="$1"; shift;;
  69. -cvs-repository) shift; mc_cvs_repository="$1"; shift;;
  70. -cvs-module) shift; mc_cvs_module="$1"; shift;;
  71. -srcdir) shift; mc_srcdir="$1"; shift;;
  72. -cleanup) shift; do_clean_basedir=yes;;
  73. -download) shift; do_download=yes;;
  74. -dont-download) shift; do_download=no;;
  75. -autoconf) shift; do_autoconf=yes;;
  76. -dont-autoconf) shift; do_autoconf=no;;
  77. -cleanwork) shift; do_clean_workdir=yes;;
  78. -dont-cleanwork) shift; do_clean_workdir=no;;
  79. -configure) shift; do_configure=yes;;
  80. -dont-configure) shift; do_configure=no;;
  81. -clean) shift; do_make_clean=yes;;
  82. -dont-clean) shift; do_make_clean=no;;
  83. -build) shift; do_make_all=yes;;
  84. -dont-build) shift; do_make_all=no;;
  85. -install) shift; do_make_install=yes;;
  86. -dont-install) shift; do_make_install=no;;
  87. -fast) shift; do_clean_workdir=no
  88. do_autoconf=no
  89. do_configure=no
  90. do_make_clean=no
  91. do_make_all=yes;;
  92. -nice) shift; nice_value="$1"; shift;;
  93. -quiet) shift; quiet="yes";;
  94. --) shift; break;;
  95. -) shift; break;;
  96. -*) usage;;
  97. *) break;;
  98. esac
  99. done
  100. ### Initialization ###
  101. renice ${mc_nice_value} $$ 1>/dev/null 2>&1 || true
  102. ### Tools ###
  103. configure_args_enable_all="--enable-largefile --enable-nls "\
  104. "--enable-netcode --enable-background --enable-charset "\
  105. "--with-mmap --with-included-gettext --with-x "\
  106. "--with-vfs --with-mcfs --with-samba --with-ext2undel "\
  107. "--with-gpm-mouse --with-subshell --with-edit"
  108. configure_args_disable_all="--disable-largefile --disable-nls "\
  109. "--disable-netcode --disable-background --disable-charset "\
  110. "--without-mmap --without-included-gettext --without-x "\
  111. "--without-vfs --without-mcfs --without-samba --without-ext2undel "\
  112. "--without-gpm-mouse --without-subshell --without-edit"
  113. errors=0
  114. warnings=0
  115. # feature tests
  116. if test x"`echo -n`" = x"-n"; then
  117. echo_n="echo"
  118. echo_cont=" " # a tab character
  119. else
  120. echo_n="echo -n"
  121. echo_cont=" "
  122. fi
  123. show_file() {
  124. if test -f "$1"; then
  125. echo "" 1>&2
  126. sed -e '10s,.*,(more lines follow ...),' -e '10q' "$1" 1>&2
  127. echo "" 1>&2
  128. fi
  129. return 0
  130. }
  131. phase_start() {
  132. ${echo_n} "[`date`] $1"
  133. return 0
  134. }
  135. phase_ok() {
  136. echo "${echo_cont}ok"
  137. return 0
  138. }
  139. phase_warnings() {
  140. echo "${echo_cont}WARNINGS"
  141. warnings=`expr $warnings + 1`
  142. if test $# -gt 0; then show_file "$1"; fi
  143. return 0
  144. }
  145. phase_ok_or_warnings() {
  146. fsize=`wc -c < "$1"`
  147. { test -n "${fsize}" && test ${fsize} -eq 0
  148. } && phase_ok || phase_warnings "$1"
  149. return 0
  150. }
  151. phase_failed() {
  152. echo "${echo_cont}FAILED"
  153. failed=yes
  154. errors=`expr $errors + 1`
  155. if test $# -gt 0; then show_file "$1"; fi
  156. return 0
  157. }
  158. setup_preconf_env=\
  159. "out=\"\${mc_logdir}/\${test_phase}.out\";"\
  160. "err=\"\${mc_logdir}/\${test_phase}.err\";"
  161. preconf_download() {
  162. test_phase="download"
  163. eval "${setup_preconf_env}"
  164. if test ${do_download} = no && test -d "${mc_srcdir}/CVS"; then
  165. return 0
  166. fi
  167. mkdir -p "${mc_logdir}"
  168. if test -d "${mc_srcdir}/CVS"; then
  169. phase_start "updating CVS copy ..."
  170. ( cd "${mc_srcdir}" \
  171. && env CVS_RSH=${mc_cvs_rsh} cvs update -r "${mc_cvs_tag}" -dP
  172. ) 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}"
  173. else
  174. phase_start "getting fresh CVS copy ..."
  175. ( mkdir -p "${mc_srcdir}" \
  176. && cd "${mc_srcdir}/.." \
  177. && env CVS_RSH=${mc_cvs_rsh} cvs -d "${mc_cvs_repository}" checkout -P -r "${mc_cvs_tag}" -d "`basename "${mc_srcdir}"`" "${mc_cvs_module}"
  178. ) 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}"
  179. fi
  180. }
  181. preconf_autoconf() {
  182. test_phase="autoconf"
  183. eval "${setup_preconf_env}"
  184. if test ${do_autoconf} != yes && test -f "${mc_srcdir}/configure"; then
  185. return 0
  186. fi
  187. mkdir -p "${mc_logdir}"
  188. phase_start "creating ./configure script ..."
  189. { cd "${mc_srcdir}" \
  190. && echo "#!/bin/sh" > ./configure.mc \
  191. && chmod +x ./configure.mc \
  192. && ${SHELL-"/bin/sh"} ./autogen.sh
  193. } 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}"
  194. }
  195. setup_testenv=\
  196. "test_srcdir=\"\${mc_srcdir}\";"\
  197. "test_workdir=\"\${mc_builddir}/\${testname}\";"\
  198. "test_prefix=\"\${mc_prefixdir}/\${testname}\";"\
  199. "test_logdir=\"\${mc_logdir}/\${testname}\";"\
  200. "out=\"\${test_logdir}/\${test_phase}.out\";"\
  201. "err=\"\${test_logdir}/\${test_phase}.err\";"
  202. confbuild_cleanwork() {
  203. test_phase="cleanwork"
  204. eval "${setup_testenv}"
  205. if test ${do_clean_workdir} = no || test ! -d "${test_workdir}"; then
  206. return 0
  207. fi
  208. mkdir -p "${test_logdir}"
  209. phase_start "cleaning directory for ${testname} ..."
  210. { rm -rf "${test_workdir}"
  211. } 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}"
  212. }
  213. confbuild_configure() {
  214. test_phase="configure"
  215. eval "${setup_testenv}"
  216. if test ${do_configure} = no && test -f "${test_workdir}/Makefile"; then
  217. return 0
  218. fi
  219. mkdir -p "${test_logdir}"
  220. phase_start "configuring for ${testname} ..."
  221. ( set -e
  222. mkdir -p "${test_workdir}"
  223. cd "${test_workdir}"
  224. cmd="${test_srcdir}/configure"
  225. cmd="${cmd} --prefix=\"${test_prefix}\""
  226. cmd="${cmd} MAKE=\"${mc_make}\""
  227. cmd="${cmd} CPP=\"${mc_cpp}\""
  228. cmd="${cmd} CPPFLAGS=\"${mc_cppflags}\""
  229. cmd="${cmd} CC=\"${mc_cc}\""
  230. cmd="${cmd} CFLAGS=\"${mc_cflags}\""
  231. cmd="${cmd} LDFLAGS=\"${mc_ldflags}\""
  232. cmd="${cmd} ${mc_configure_args_pre}"
  233. cmd="${cmd} ${configure_args}"
  234. cmd="${cmd} ${mc_configure_args_post}"
  235. echo "running $cmd"
  236. eval "$cmd"
  237. ) 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}"
  238. }
  239. confbuild_make() {
  240. make_target="$1"
  241. test_phase="make_${make_target}"
  242. eval "${setup_testenv}"
  243. if eval "test \${do_make_${make_target}} = no"; then
  244. return 0
  245. fi
  246. mkdir -p "${test_logdir}"
  247. phase_start "running \"make ${make_target}\" for ${testname} ..."
  248. ( cd "${test_workdir}" \
  249. && eval "${mc_make} ${mc_make_flags} ${make_target}"
  250. ) 1>"${out}" 2>"${err}" && phase_ok_or_warnings "${err}" || phase_failed "${err}"
  251. }
  252. confbuild() {
  253. failed=no
  254. confbuild_cleanwork
  255. if test ${failed} = yes; then return 0; fi
  256. confbuild_configure
  257. if test ${failed} = yes; then return 0; fi
  258. confbuild_make "clean"
  259. if test ${failed} = yes; then return 0; fi
  260. confbuild_make "all"
  261. if test ${failed} = yes; then return 0; fi
  262. confbuild_make "install"
  263. if test ${failed} = yes; then return 0; fi
  264. }
  265. test_plain() {
  266. testname="plain" \
  267. configure_args="" \
  268. confbuild
  269. }
  270. test_charset() {
  271. testname="charset" \
  272. configure_args="--enable-charset" \
  273. confbuild
  274. }
  275. test_no_charset() {
  276. testname="no_charset" \
  277. configure_args="--disable-charset" \
  278. confbuild
  279. }
  280. test_X11() {
  281. testname="X11" \
  282. configure_args="--with-x" \
  283. confbuild
  284. }
  285. test_no_X11() {
  286. testname="no_X11" \
  287. configure_args="--without-x" \
  288. confbuild
  289. }
  290. test_vfs() {
  291. testname="vfs" \
  292. configure_args="--with-vfs" \
  293. confbuild
  294. }
  295. test_no_vfs() {
  296. testname="no_vfs" \
  297. configure_args="--without-vfs" \
  298. confbuild
  299. }
  300. test_mcfs() {
  301. testname="mcfs" \
  302. configure_args="--with-mcfs" \
  303. confbuild
  304. }
  305. test_no_mcfs() {
  306. testname="no_mcfs" \
  307. configure_args="--without-mcfs" \
  308. confbuild
  309. }
  310. test_samba() {
  311. testname="samba" \
  312. configure_args="--with-samba" \
  313. confbuild
  314. }
  315. test_no_samba() {
  316. testname="no_samba" \
  317. configure_args="--without-samba" \
  318. confbuild
  319. }
  320. test_ext2undel() {
  321. testname="ext2undel" \
  322. configure_args="--with-ext2undel" \
  323. confbuild
  324. }
  325. test_no_ext2undel() {
  326. testname="no_ext2undel" \
  327. configure_args="--without-ext2undel" \
  328. confbuild
  329. }
  330. test_slang() {
  331. testname="slang" \
  332. configure_args="--with-screen=slang" \
  333. confbuild
  334. }
  335. test_mcslang() {
  336. testname="mcslang" \
  337. configure_args="--with-screen=mcslang" \
  338. confbuild
  339. }
  340. test_ncurses() {
  341. testname="ncurses" \
  342. configure_args="--with-screen=ncurses" \
  343. confbuild
  344. }
  345. test_maintainer() {
  346. testname="maintainer" \
  347. configure_args="--enable-maintainer-mode" \
  348. confbuild
  349. }
  350. test_no_maintainer() {
  351. testname="no_maintainer" \
  352. configure_args="--disable-maintainer-mode" \
  353. confbuild
  354. }
  355. test_i18n() {
  356. testname="i18n" \
  357. configure_args="--enable-nls" \
  358. confbuild
  359. }
  360. test_no_i18n() {
  361. testname="no_i18n" \
  362. configure_args="--disable-nls" \
  363. confbuild
  364. }
  365. test_no_features() {
  366. testname="no_features" \
  367. configure_args="${configure_args_disable_all}"
  368. confbuild
  369. }
  370. test_all_features() {
  371. testname="all_features" \
  372. configure_args="${configure_args_enable_all}" \
  373. confbuild
  374. }
  375. test_all_warnings() {
  376. testname="all_warnings" \
  377. configure_args="${configure_args_enable_all} --enable-gcc-warnings" \
  378. confbuild
  379. }
  380. run_tests() {
  381. failed=no
  382. preconf_download
  383. if test ${failed} = yes; then return 0; fi
  384. preconf_autoconf
  385. if test ${failed} = yes; then return 0; fi
  386. for i in "$@"; do
  387. if type test_"${i}" 2>/dev/null \
  388. | grep "function" 1>/dev/null 2>&1; then
  389. eval "test_${i}"
  390. else
  391. echo "[`date`] test \"$i\" not found." 1>&2
  392. errors=`expr $errors + 1`
  393. fi
  394. done
  395. }
  396. if test -z "${mc_srcdir}"; then mc_srcdir="${mc_basedir}/src"; fi
  397. if test -z "${mc_prefixdir}"; then mc_prefixdir="${mc_basedir}/installed"; fi
  398. if test -z "${mc_builddir}"; then mc_builddir="${mc_basedir}/build"; fi
  399. if test -z "${mc_logdir}"; then mc_logdir="${mc_basedir}/logs"; fi
  400. if test -z "${mc_cpp}"; then mc_cpp="${mc_cc} -E"; fi
  401. if test ${do_clean_basedir} = yes; then
  402. phase_start "cleaning up everything ..."
  403. { rm -rf "${mc_basedir}"
  404. } && phase_ok || phase_failed
  405. else
  406. if test $# -gt 0; then
  407. run_tests "$@"
  408. else
  409. run_tests `sed -n -e 's,^test_\([a-z0-9_]*\)() .*{,\1,p' $0`
  410. fi
  411. fi
  412. if test ${errors} -ne 0 || test ${warnings} -ne 0; then
  413. echo "[`date`] finished with ${errors} errors and ${warnings} warnings."
  414. else
  415. echo "[`date`] finished successfully."
  416. fi
  417. exit ${errors}