citrun

watch C/C++ source code execute
Log | Files | Refs | LICENSE

openbsd.subr (3972B)


      1 #
      2 # OpenBSD ports infrastructure compatibility layer for end to end testing.
      3 # Exports CITRUN_PROCDIR.
      4 #
      5 [ `uname` != "OpenBSD" ] && return 0
      6 
      7 set -eu
      8 . tt/libtap.subr
      9 
     10 type comm cut diff make nm sed sort > /dev/null || \
     11 	bail "OpenBSD end to end script dependencies not met"
     12 
     13 # Script arguments give the path in the OpenBSD ports system.
     14 portdir="/usr/ports/$1/$2"
     15 workdist=`make -C $portdir show=WRKDIST`
     16 workdir=`make -C $portdir show=WRKDIR`
     17 
     18 workdir_inst="${workdir}-citrun"
     19 workdist_inst=`make -C $portdir WRKDIR=$workdir_inst show=WRKDIST`
     20 
     21 # Release testing must be done on installed package.
     22 if ! pkg_info -e citrun-9999; then
     23 	echo "C It Run not found."
     24 	exit 1
     25 fi
     26 
     27 # This is used by the OpenBSD /usr/ports/infrastructure/.
     28 portpath="/usr/local/share/citrun:$workdir_inst/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11R6/bin"
     29 
     30 export CITRUN_PROCDIR="$workdir/procdir/"
     31 
     32 pkg_extract()
     33 {
     34 	make -C $portdir extract > /dev/null
     35 	ok "is vanilla src extracted in '$workdir'" test $? -eq 0
     36 }
     37 
     38 pkg_extract_instrumented()
     39 {
     40 	make -C $portdir WRKDIR="$workdir_inst" extract > /dev/null
     41 	ok "is instrumented src extracted in '$workdir_inst'" test $? -eq 0
     42 }
     43 
     44 pkg_check_deps()
     45 {
     46 	make -C $portdir full-all-depends > $workdir/deps
     47 	#make -C $portdir full-test-depends >> $workdir/deps
     48 	sort $workdir/deps | uniq > $workdir/deps.uniq
     49 
     50 	pkg_info -q > $workdir/installed
     51 	comm -2 -3 $workdir/deps.uniq $workdir/installed > $workdir/deps_needed
     52 
     53 	diff -u /dev/null $workdir/deps_needed || bail "dependencies not met"
     54 	ok "is all `wc -l < $workdir/deps.uniq` port dependencies met"
     55 }
     56 
     57 pkg_build()
     58 {
     59 	start=`date +%s`
     60 
     61 	make -C $portdir build > $workdir/build.stdout 2> $workdir/build.stderr
     62 	ok 'is make build exit code 0' test $? -eq 0
     63 
     64 	diag "Vanilla build took $((`date +%s` - start)) sec"
     65 }
     66 
     67 pkg_build_instrumented()
     68 {
     69 	start=`date +%s`
     70 
     71 	make -C $portdir PORTPATH="$portpath" WRKDIR="$workdir_inst" build \
     72 		> $workdir_inst/build.stdout \
     73 		2> $workdir_inst/build.stderr
     74 	ok 'is instrumented make build exit code 0' test $? -eq 0
     75 
     76 	diag "Instrumented build took $((`date +%s` - start)) sec"
     77 }
     78 
     79 pkg_test()
     80 {
     81 	start=`date +%s`
     82 
     83 	make -C $portdir test > $workdir/test.stdout 2> $workdir/test.stderr
     84 	ok 'is make test exit code 0' test $? -eq 0
     85 
     86 	diag "Vanilla test took $((`date +%s` - start)) sec"
     87 }
     88 
     89 pkg_test_instrumented()
     90 {
     91 	ok 'is test with instrumentation successful' \
     92 		make -C $portdir PORTPATH="${portpath}" test
     93 }
     94 
     95 pkg_citrun_check()
     96 {
     97 	citrun_check $workdist_inst > $workdir_inst/check.out
     98 	ok 'is citrun_check successful' test $? -eq 0
     99 
    100 	ok 'is Milliseconds sanitized' \
    101 		sed -i.bak -e "/Milliseconds spent/d" $workdir_inst/check.out
    102 	ok 'is citrun_check output identical' \
    103 		diff -u $workdir_inst/check.good $workdir_inst/check.out
    104 }
    105 
    106 pkg_clean()
    107 {
    108 	make -C $portdir clean=all > /dev/null
    109 	ok 'is make clean exit code 0' test $? -eq 0
    110 	ok 'is rm -rf instrumented workdir exit code 0' rm -rf $workdir_inst
    111 }
    112 
    113 #
    114 # By default operates on build.std{out,err} but optionally takes extra files as
    115 # parameters.
    116 #
    117 pkg_scrub_logs()
    118 {
    119 	#
    120 	# Replace port specific paths like /usr/ports/pobj/.* and .text section
    121 	# hex offsets with constants.
    122 	#
    123 	sed -i.bak \
    124 		-e 's;/usr/ports/pobj/.*/;<port_path>;' \
    125 		-e 's/\.text+0x[0-9a-f]*/\.text+OFF/' \
    126 		$workdir/build.stdout $workdir_inst/build.stdout \
    127 		$workdir/build.stderr $workdir_inst/build.stderr \
    128 		$@
    129 }
    130 
    131 pkg_diff_build_logs()
    132 {
    133 	ok 'is build stdout identical' \
    134 		diff -u $workdir/build.stdout $workdir_inst/build.stdout
    135 	ok 'is build stderr identical' \
    136 		diff -u $workdir/build.stderr $workdir_inst/build.stderr
    137 }
    138 
    139 pkg_diff_symbols()
    140 {
    141 	nm -P $workdist/$1 | cut -f 1-2 -d ' ' | cut -f 1 -d '.' > $workdir/nm.out
    142 	ok "is nm on vanilla binary '$1' exit code 0" test $? -eq 0
    143 
    144 	nm -P $workdist_inst/$1 | cut -f 1-2 -d ' ' | cut -f 1 -d '.' > $workdir_inst/nm.out
    145 	ok "is nm on instrumented binary '$1' exit code 0'" test $? -eq 0
    146 
    147 	ok 'is symbol diff empty' diff -u $workdir/nm.out $workdir_inst/nm.out
    148 }