Home | History | Annotate | Download | only in 3.6.1
      1 #!/bin/bash
      2 #
      3 # Tests for wrapper.sh.
      4 
      5 set -euo pipefail
      6 
      7 # The location of the script under test.
      8 readonly WRAPPER="$(realpath "$(dirname "$0")/wrapper.sh")"
      9 # The name of the tests to run. Each test correspond to a function in this file
     10 # whose name is the name of the test prefixed by 'test'.
     11 readonly TEST_NAMES=(
     12   SuccessfulCase
     13   FailedCase
     14   FailedSignalCase
     15 )
     16 
     17 # Fails with an error message.
     18 function fatal() {
     19   echo 1>&2 "FATAL: $@"
     20   exit 113
     21 }
     22 
     23 function withTestFiles() {
     24   (
     25     echo '1'
     26     echo '2'
     27     echo '3'
     28     echo '4'
     29     echo '5'
     30     echo '6'
     31     echo '7'
     32   ) >testfile
     33   (
     34     echo 'module: 1'
     35     echo 'module: 2'
     36     echo 'module: 3'
     37     echo 'module: 4'
     38     echo 'module: 5'
     39     echo 'module: 6'
     40     echo 'module: 7'
     41   ) >testfileWithModule
     42   (
     43     echo 'module: 3'
     44     echo 'module: 4'
     45     echo 'module: 5'
     46     echo 'module: 6'
     47     echo 'module: 7'
     48   ) >testfileWithModuleTruncated
     49 }
     50 
     51 function expectNoWrapOutput() {
     52   if [ "$(cat output-wrap)" != '' ]; then
     53     echo 'Wrap should not generate any output'
     54     diff testfile output || true
     55     return 1
     56   fi
     57 }
     58 
     59 function expectSavedOutput() {
     60   if ! diff testfile output; then
     61     echo 'Should have saved the correct output'
     62     diff testfile output || true
     63     return 1
     64   fi
     65 }
     66 
     67 function expectFullOutputWithModule() {
     68   if ! diff testfileWithModule output-eval; then
     69     echo 'Should have printed the full output'
     70     diff testfileWithModule output || true
     71     return 1
     72   fi
     73 }
     74 
     75 function expectTruncatedOutputWithModule() {
     76   if ! diff testfileWithModuleTruncated output-eval; then
     77     echo 'Should have printed the truncated output'
     78     diff testfileWithModuleTruncated output || true
     79     return 1
     80   fi
     81 }
     82 
     83 function whenWrap() {
     84   "$WRAPPER" module "$PWD/output" "$PWD/retval" 'wrap' "$@" \
     85     2>/dev/null \
     86     >output-wrap
     87 }
     88 
     89 function whenEval() {
     90   "$WRAPPER" module "$PWD/output" "$PWD/retval" 'eval' "$@" \
     91     >output-eval 2>&1
     92 }
     93 
     94 function testSuccessfulCase() {
     95   withTestFiles
     96   (
     97     echo '#!/bin/bash'
     98     echo
     99     echo 'cat testfile'
    100   ) >script.sh
    101   chmod 755 script.sh
    102   whenWrap "$PWD/script.sh"
    103   expectNoWrapOutput
    104   if ! whenEval; then
    105     echo 'Should have run successfully'
    106     return 1
    107   fi
    108   expectSavedOutput
    109   expectTruncatedOutputWithModule
    110 }
    111 
    112 function testFailedCase() {
    113   withTestFiles
    114   (
    115     echo '#!/bin/bash'
    116     echo
    117     echo 'cat testfile'
    118     echo 'exit 1'
    119   ) >script.sh
    120   chmod 755 script.sh
    121   whenWrap "$PWD/script.sh"
    122   expectNoWrapOutput
    123   if whenEval; then
    124     echo 'Should have failed to run'
    125     return 1
    126   fi
    127   expectSavedOutput
    128   expectFullOutputWithModule
    129 }
    130 function testFailedSignalCase() {
    131   withTestFiles
    132   (
    133     echo '#!/bin/bash'
    134     echo
    135     echo 'cat testfile'
    136     echo 'kill -TERM $$'
    137     echo 'echo Should not be printed'
    138   ) >script.sh
    139   chmod 755 script.sh
    140   whenWrap "$PWD/script.sh"
    141   expectNoWrapOutput
    142   if whenEval; then
    143     echo 'Should have failed to run'
    144     return 1
    145   fi
    146   expectSavedOutput
    147   expectFullOutputWithModule
    148 }
    149 
    150 
    151 function main() {
    152   local result=0
    153   local tmp="$(mktemp -d)"
    154   for test_name in "${TEST_NAMES[@]}"; do
    155     mkdir -p "$tmp/$test_name"
    156     cd "$tmp/$test_name"
    157     echo -n "Running $test_name..."
    158     test"$test_name" >log || {
    159       echo "FAILED";
    160       sed -e "s/^/$test_name: /" <log
    161       rm log
    162       result=1;
    163       continue;
    164     }
    165     echo "PASSED"
    166     rm log
    167   done
    168   return "$result"
    169 }
    170 
    171 
    172 main "$@"
    173