/ test / sharness_test_coverage_helper.sh
sharness_test_coverage_helper.sh
  1  #!/bin/sh
  2  
  3  USAGE="$0 [-h] [-v]"
  4  
  5  usage() {
  6      echo "$USAGE"
  7      echo "	Print sharness test coverage"
  8      echo "	Options:"
  9      echo "		-h|--help: print this usage message and exit"
 10      echo "		-v|--verbose: print logs of what happens"
 11      exit 0
 12  }
 13  
 14  log() {
 15      test -z "$VERBOSE" || echo "->" "$@"
 16  }
 17  
 18  die() {
 19      printf >&2 "fatal: %s\n" "$@"
 20      exit 1
 21  }
 22  
 23  # get user options
 24  while [ "$#" -gt "0" ]; do
 25      # get options
 26      arg="$1"
 27      shift
 28  
 29      case "$arg" in
 30  	-h|--help)
 31  	    usage ;;
 32  	-v|--verbose)
 33  	    VERBOSE=1 ;;
 34  	-*)
 35  	    die "unrecognised option: '$arg'\n$USAGE" ;;
 36  	*)
 37  	    die "too many arguments\n$USAGE" ;;
 38      esac
 39  done
 40  
 41  log "Create temporary directory"
 42  DATE=$(date +"%Y-%m-%dT%H:%M:%SZ")
 43  TMPDIR=$(mktemp -d "/tmp/coverage_helper.$DATE.XXXXXX") ||
 44  die "could not 'mktemp -d /tmp/coverage_helper.$DATE.XXXXXX'"
 45  
 46  log "Grep the sharness tests for ipfs commands"
 47  CMD_RAW="$TMPDIR/ipfs_cmd_raw.txt"
 48  git grep -n -E '\Wipfs\W' -- sharness/t*-*.sh >"$CMD_RAW" ||
 49  die "Could not grep ipfs in the sharness tests"
 50  
 51  grep_out() {
 52      pattern="$1"
 53      src="$TMPDIR/ipfs_cmd_${2}.txt"
 54      dst="$TMPDIR/ipfs_cmd_${3}.txt"
 55      desc="$4"
 56  
 57      log "Remove $desc"
 58      egrep -v "$pattern" "$src" >"$dst" || die "Could not remove $desc"
 59  }
 60  
 61  grep_out 'test_expect_.*ipfs' raw expect "test_expect_{success,failure} lines"
 62  grep_out '^[^:]+:[^:]+:\s*#' expect comment "comments"
 63  grep_out 'test_description=' comment desc "test_description lines"
 64  grep_out '^[^:]+:[^:]+:\s*\w+="[^"]*"\s*(\&\&)?\s*$' desc def "variable definition lines"
 65  grep_out '^[^:]+:[^:]+:\s*e?grep\W[^|]*\Wipfs' def grep "grep lines"
 66  grep_out '^[^:]+:[^:]+:\s*cat\W[^|]*\Wipfs' grep cat "cat lines"
 67  grep_out '^[^:]+:[^:]+:\s*rmdir\W[^|]*\Wipfs' cat rmdir "rmdir lines"
 68  grep_out '^[^:]+:[^:]+:\s*echo\W[^|]*\Wipfs' cat echo "echo lines"
 69  
 70  grep_in() {
 71      pattern="$1"
 72      src="$TMPDIR/ipfs_cmd_${2}.txt"
 73      dst="$TMPDIR/ipfs_cmd_${3}.txt"
 74      desc="$4"
 75  
 76      log "Keep $desc"
 77      egrep "$pattern" "$src" >"$dst"
 78  }
 79  
 80  grep_in '\Wipfs\W.*/ipfs/' echo slash_in1 "ipfs.*/ipfs/"
 81  grep_in '/ipfs/.*\Wipfs\W' echo slash_in2 "/ipfs/.*ipfs"
 82  
 83  grep_out '/ipfs/' echo slash "/ipfs/"
 84  
 85  grep_in '\Wipfs\W.*\.ipfs' slash dot_in1 "ipfs.*\.ipfs"
 86  grep_in '\.ipfs.*\Wipfs\W' slash dot_in2 "\.ipfs.*ipfs"
 87  
 88  grep_out '\.ipfs' slash dot ".ipfs"
 89  
 90  log "Print result"
 91  CMD_RES="$TMPDIR/ipfs_cmd_result.txt"
 92  for f in dot slash_in1 slash_in2 dot_in1 dot_in2
 93  do
 94      fname="$TMPDIR/ipfs_cmd_${f}.txt"
 95      cat "$fname" || die "Could not cat '$fname'"
 96  done | sort | uniq >"$CMD_RES" || die "Could not write '$CMD_RES'"
 97  
 98  log "Get all the ipfs commands from 'ipfs commands'"
 99  CMD_CMDS="$TMPDIR/commands.txt"
100  ipfs commands --flags >"$CMD_CMDS" || die "'ipfs commands' failed"
101  
102  # Portable function to reverse lines in a file
103  reverse() {
104      if type tac >/dev/null
105      then
106  	tac "$@"
107      else
108  	tail -r "$@"
109      fi
110  }
111  
112  log "Match the test line commands with the commands they use"
113  GLOBAL_REV="$TMPDIR/global_results_reversed.txt"
114  
115  process_command() {
116      ipfs="$1"
117      cmd="$2"
118      sub1="$3"
119      sub2="$4"
120      sub3="$5"
121  
122      if test -n "$cmd"
123      then
124  	CMD_OUT="$TMPDIR/res_${ipfs}_${cmd}"
125  	PATTERN="$ipfs(\W.*)*\W$cmd"
126  	NAME="$ipfs $cmd"
127  
128  	if test -n "$sub1"
129  	then
130  	    CMD_OUT="${CMD_OUT}_${sub1}"
131  	    PATTERN="$PATTERN(\W.*)*\W$sub1"
132  	    NAME="$NAME $sub1"
133  
134  	    if test -n "$sub2"
135  	    then
136  		CMD_OUT="${CMD_OUT}_${sub2}"
137  		PATTERN="$PATTERN(\W.*)*\W$sub2"
138  		NAME="$NAME $sub2"
139  
140  		if test -n "$sub3"
141  		then
142  		    CMD_OUT="${CMD_OUT}_${sub3}"
143  		    PATTERN="$PATTERN(\W.*)*\W$sub3"
144  		    NAME="$NAME $sub3"
145  		fi
146  	    fi
147  	fi
148  
149  	egrep "$PATTERN" "$CMD_RES" >"$CMD_OUT.txt"
150  	reverse "$CMD_OUT.txt" | sed -e 's/^sharness\///' | cut -d- -f1 | uniq -c >>"$GLOBAL_REV"
151      fi
152  }
153  
154  reverse "$CMD_CMDS" | while read -r line
155  do
156      LONG_CMD=$(echo "$line" | cut -d/ -f1)
157      SHORT_CMD=$(expr "$line" : "[^/]*/*\(.*\)")
158  
159      log "Processing $LONG_CMD"
160      process_command $LONG_CMD
161      LONG_NAME="$NAME"
162  
163      log "Processing $SHORT_CMD"
164      process_command $SHORT_CMD
165      SHORT_NAME="$NAME"
166  
167      test -n "$SHORT_CMD" && echo "$SHORT_NAME" >>"$GLOBAL_REV"
168      test "$LONG_CMD" != "ipfs" && echo "$LONG_NAME" >>"$GLOBAL_REV"
169      echo >>"$GLOBAL_REV"
170  done
171  
172  # The following will allow us to check that
173  # we are properly excluding enough stuff using:
174  # diff -u ipfs_cmd_result.txt cmd_found.txt
175  log "Get all the line commands that matched"
176  CMD_FOUND="$TMPDIR/cmd_found.txt"
177  cat $TMPDIR/res_*.txt | sort -n | uniq >"$CMD_FOUND"
178  
179  log "Print results"
180  reverse "$GLOBAL_REV"
181  
182  # Remove temp directory...