PageRenderTime 53ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/graphviz-2.28.0/rtest/rtest.sh.rtest-errout-fix

#
Korn Shell | 403 lines | 332 code | 32 blank | 39 comment | 64 complexity | a6fc8b358de038212213c9585726a373 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, EPL-1.0, CPL-1.0, BSD-3-Clause, LGPL-2.1
  1. #! /bin/ksh
  2. #
  3. # Graphviz regression test driver
  4. #
  5. # Also relies on strps.awk.
  6. #
  7. # TODO:
  8. # Fix to allow multiple test data sets depending
  9. # on architecture, etc. Maintain common ones in REFDIR.
  10. # Report differences with shared version and with new output.
  11. # bsh, linux-ksh filter
  12. bar=1;echo foo | read bar<<- \!
  13. 2
  14. !
  15. if ((bar==1))
  16. then
  17. echo "Graphviz test suite requires ksh93"
  18. exit 1
  19. fi
  20. # csh, ksh88 filter
  21. (( 1.5 == 1 )) && { echo "Graphviz test suite requires ksh93"; exit 1; }
  22. TESTFILE=tests.txt # Test specifications
  23. GRAPHDIR=graphs # Directory of input graphs and data
  24. OUTDIR=ndata # Directory for test output
  25. OUTHTML=nhtml # Directory for html test report
  26. REFDIR=nshare # Directory for expected test output
  27. GENERATE= # If set, generate test data
  28. VERBOSE= # If set, give verbose output
  29. NOOP= # If set, just print list of tests
  30. DOT=../cmd/dot/dot_builtins # build tree version with a builtin set of plugins
  31. # should be $(top_builddir)/cmd/dot/dot_static
  32. DIFFIMG=../contrib/diffimg/diffimg # build tree version
  33. TESTNAME= # name of test
  34. GRAPH= # graph specification
  35. IDX=
  36. typeset -i i j SUBTESTCNT
  37. typeset -i CRASH_CNT DIFF_CNT TOT_CNT
  38. typeset -i LINECNT=0
  39. typeset -A TESTTYPES
  40. typeset -a ALG
  41. typeset -a FMT
  42. typeset -a FLAGS
  43. TMPINFILE=tmp$$.gv
  44. TMPFILE1=tmpnew$$
  45. TMPFILE2=tmpref$$
  46. # Read single line, storing it in LINE and update count.
  47. # Return 0 on success.
  48. function readLine
  49. {
  50. if read -u 3 LINE
  51. then
  52. (( LINECNT+=1 ))
  53. return 0
  54. else
  55. return 1
  56. fi
  57. }
  58. # Skip blank lines and comments (lines starting with #)
  59. # Use first real line as the test name
  60. function skipLines
  61. {
  62. while readLine
  63. do
  64. if [[ -n $LINE && ${LINE:0:1} != \# ]]
  65. then
  66. return 0
  67. fi
  68. done
  69. return 1
  70. }
  71. # Subtests have the form: layout format optional_flags
  72. # Store the 3 parts in the arrays ALG, FMT, FLAGS.
  73. # Stop at a blank line
  74. function readSubtests
  75. {
  76. (( SUBTESTCNT=0 ))
  77. while readLine
  78. do
  79. if [[ -z "$LINE" ]]
  80. then
  81. return
  82. fi
  83. if [[ ${LINE:0:1} != \# ]]
  84. then
  85. echo $LINE | read ALG0 FMT0 FLAGS0
  86. ALG[$SUBTESTCNT]=$ALG0
  87. FMT[$SUBTESTCNT]=$FMT0
  88. FLAGS[$SUBTESTCNT]=$FLAGS0
  89. (( SUBTESTCNT+=1 ))
  90. fi
  91. done
  92. }
  93. function readTest
  94. {
  95. # read test name
  96. if skipLines
  97. then
  98. TESTNAME=$LINE
  99. else
  100. return 1
  101. fi
  102. # read input graph
  103. if skipLines
  104. then
  105. GRAPH=$LINE
  106. else
  107. return 1
  108. fi
  109. readSubtests
  110. return 0
  111. }
  112. # newfile = $1
  113. # oldfile = $2
  114. # assume subscript indicates file type
  115. function strip {
  116. case $1 in
  117. *.ps )
  118. awk -f strps.awk $1 > $TFILE1
  119. awk -f strps.awk $2 > $TFILE2
  120. ;;
  121. *.svg )
  122. sed '/^<!--/d' < $1 | sed '/-->$/d' > $TFILE1
  123. sed '/^<!--/d' < $2 | sed '/-->$/d' > $TFILE2
  124. ;;
  125. * )
  126. cp $1 $TFILE1
  127. cp $2 $TFILE2
  128. ;;
  129. esac
  130. }
  131. # Compare old and new output and report if different.
  132. # Args: testname index fmt
  133. function doDiff
  134. {
  135. FILE1=$OUTDIR/$OUTFILE
  136. FILE2=$REFDIR/$OUTFILE
  137. F=${3%%:*}
  138. case $F in
  139. ps | ps2 )
  140. awk -f strps.awk $FILE1 > $TMPFILE1
  141. awk -f strps.awk $FILE2 > $TMPFILE2
  142. diff -q $TMPFILE2 $TMPFILE1 > /dev/null
  143. if [[ $? != 0 ]]
  144. then
  145. print -u 2 "Test $1:$2 : == Failed == $OUTFILE"
  146. (( DIFF_CNT+=1 ))
  147. fi
  148. ;;
  149. svg )
  150. sed '/^<!--/d' < $FILE1 | sed '/-->$/d' > $TMPFILE1
  151. sed '/^<!--/d' < $FILE2 | sed '/-->$/d' > $TMPFILE2
  152. diff -q $TMPFILE2 $TMPFILE1 > /dev/null
  153. if [[ $? != 0 ]]
  154. then
  155. print -u 2 "Test $1:$2 : == Failed == $OUTFILE"
  156. (( DIFF_CNT+=1 ))
  157. fi
  158. ;;
  159. png )
  160. $DIFFIMG $FILE2 $FILE1 >$OUTHTML/dif_$OUTFILE
  161. if [[ $? != 0 ]]
  162. then
  163. echo "<p>" >>$OUTHTML/index.html
  164. cp $FILE2 $OUTHTML/old_$OUTFILE
  165. echo "<img src=\"old_$OUTFILE\" width=\"192\" height=\"192\">" >>$OUTHTML/index.html
  166. cp $FILE1 $OUTHTML/new_$OUTFILE
  167. echo "<img src=\"new_$OUTFILE\" width=\"192\" height=\"192\">" >>$OUTHTML/index.html
  168. echo "<img src=\"dif_$OUTFILE\" width=\"192\" height=\"192\">" >>$OUTHTML/index.html
  169. print -u 2 "Test $1:$2 : == Failed == $OUTFILE"
  170. (( DIFF_CNT+=1 ))
  171. else
  172. rm $OUTHTML/dif_$OUTFILE
  173. fi
  174. ;;
  175. * )
  176. diff -q $FILE2 $FILE1 > /dev/null
  177. if [[ $? != 0 ]]
  178. then
  179. print -u 2 "Test $1:$2 : == Failed == $OUTFILE"
  180. (( DIFF_CNT+=1 ))
  181. fi
  182. ;;
  183. esac
  184. }
  185. # Generate output file name given 3 parameters.
  186. # testname layout format
  187. # If format ends in :*, remove this, change the colons to underscores,
  188. # and append to basename
  189. # If the last two parameters have been used before, add numeric suffix.
  190. function genOutname
  191. {
  192. if [[ $3 == *:* ]]
  193. then
  194. F=${3%%:*}
  195. XFMT=${3#$F}
  196. XFMT=${XFMT/:/_}
  197. else
  198. F=$3
  199. XFMT=""
  200. fi
  201. IDX="$2$XFMT$F"
  202. j=${TESTTYPES[$IDX]}
  203. if (( j == 0 ))
  204. then
  205. TESTTYPES[$IDX]=1
  206. J=""
  207. else
  208. TESTTYPES[$IDX]=$(( j+1 ))
  209. J=$j
  210. fi
  211. OUTFILE="$1_$2$XFMT$J.$F"
  212. }
  213. # clear out all entries of associated array
  214. function aunset #name
  215. {
  216. typeset i
  217. nameref v=$1
  218. for i in ${!v[@]}
  219. do unset v[$i]
  220. done
  221. }
  222. function doTest
  223. {
  224. if (( SUBTESTCNT == 0 ))
  225. then
  226. return
  227. fi
  228. case $GRAPH in
  229. = )
  230. INFILE=$GRAPHDIR/$TESTNAME.gv
  231. ;;
  232. graph* | digraph* )
  233. INFILE=$TMPINFILE
  234. echo "$GRAPH" > $INFILE
  235. ;;
  236. *.gv )
  237. INFILE=$GRAPHDIR/$GRAPH
  238. ;;
  239. * )
  240. echo "Unknown graph spec, test $TESTNAME - ignoring"
  241. return
  242. ;;
  243. esac
  244. for ((i=0;i<SUBTESTCNT;i++))
  245. do
  246. (( TOT_CNT+=1 ))
  247. genOutname $TESTNAME ${ALG[$i]} ${FMT[$i]}
  248. OUTPATH=$OUTDIR/$OUTFILE
  249. KFLAGS=${ALG[$i]}
  250. TFLAGS=${FMT[$i]}
  251. test -z "$KFLAGS" || KFLAGS="-K$KFLAGS"
  252. test -z "$TFLAGS" || TFLAGS="-T$TFLAGS"
  253. testcmd="$DOT $KFLAGS $TFLAGS ${FLAGS[$i]} -o$OUTPATH $INFILE"
  254. if [[ -n "$VERBOSE" ]]
  255. then
  256. print $testcmd
  257. fi
  258. if [[ $NOOP == 1 ]]
  259. then
  260. continue
  261. fi
  262. $testcmd 2> errout
  263. RVAL=$?
  264. if [[ $RVAL != 0 || ! -s $OUTPATH ]]
  265. then
  266. (( CRASH_CNT+=1 ))
  267. print -u 2 "Test $TESTNAME:$i : == Layout failed =="
  268. print -u 2 " $testcmd"
  269. elif [[ -s errout ]]
  270. then
  271. cat errout
  272. elif [[ $GENERATE == 1 ]]
  273. then
  274. continue
  275. elif [[ -r $REFDIR/$OUTFILE ]]
  276. then
  277. doDiff $TESTNAME $i ${FMT[$i]}
  278. else
  279. print -u 2 "Test $TESTNAME:$i : == No file $REFDIR/$OUTFILE for comparison =="
  280. fi
  281. done
  282. # clear TESTTYPES
  283. aunset TESTTYPES
  284. # for W in ${!TESTTYPES[@]}
  285. # do
  286. # TESTTYPES[$W]=0
  287. # done
  288. }
  289. trap 'rm -f $TMPFILE1 $TMPFILE2 $TMPINFILE errout; exit' 0 1 2 3 15
  290. Usage='rtest [-gvn] [TESTFILE]\n
  291. -g : generate test data\n
  292. -v : verbose\n
  293. -n : print test'
  294. while getopts :gnv c
  295. do
  296. case $c in
  297. n )
  298. VERBOSE=1
  299. NOOP=1
  300. ;;
  301. v )
  302. VERBOSE=1
  303. ;;
  304. g )
  305. GENERATE=1
  306. if [[ ! -d "$REFDIR" ]]
  307. then
  308. mkdir $REFDIR
  309. fi
  310. OUTDIR=$REFDIR
  311. ;;
  312. :)
  313. echo $OPTARG requires a value
  314. exit 2
  315. ;;
  316. \? )
  317. if [[ "$OPTARG" == '?' ]]
  318. then
  319. echo $Usage
  320. exit 0
  321. else
  322. echo "rtest: unknown flag $OPTARG - ignored"
  323. fi
  324. ;;
  325. esac
  326. done
  327. shift $((OPTIND-1))
  328. if [[ $# > 0 ]]
  329. then
  330. if [[ -r $1 ]]
  331. then
  332. TESTFILE=$1
  333. else
  334. print -u 2 "Test file $1 does not exist"
  335. exit 1
  336. fi
  337. fi
  338. # Check environment and initialize
  339. if [[ $NOOP != 1 ]]
  340. then
  341. if [[ ! -d "$REFDIR" ]]
  342. then
  343. print -u 2 "Test data directory $REFDIR does not exist"
  344. exit 1
  345. fi
  346. if [[ ! -d "$OUTDIR" ]]
  347. then
  348. mkdir $OUTDIR
  349. fi
  350. if [[ ! -d "$OUTHTML" ]]
  351. then
  352. mkdir $OUTHTML
  353. fi
  354. rm -f $OUTHTML/*
  355. if [[ ! -x $DOT ]]
  356. then
  357. print -u 2 "$DOT program is not executable"
  358. exit 1
  359. fi
  360. if [[ ! -x $DIFFIMG ]]
  361. then
  362. print -u 2 "$DIFFIMG program is not executable"
  363. exit 1
  364. fi
  365. fi
  366. exec 3< $TESTFILE
  367. while readTest
  368. do
  369. doTest
  370. done
  371. print -u 2 "No. tests: $TOT_CNT Layout failures: $CRASH_CNT Changes: $DIFF_CNT"