1#!/bin/bash 2 3# Run all the different permutations of all the tests and other things 4# This helps ensure that nothing gets broken. 5 6_tests() { 7 local gover=$( go version | cut -f 3 -d ' ' ) 8 # note that codecgen requires fastpath, so you cannot do "codecgen notfastpath" 9 local a=( "" "safe" "notfastpath" "notfastpath safe" "codecgen" "codecgen safe" ) 10 for i in "${a[@]}" 11 do 12 echo ">>>> TAGS: $i" 13 local i2=${i:-default} 14 case $gover in 15 go1.[0-6]*) go vet -printfuncs "errorf" "$@" && 16 go test ${zargs[*]} -vet off -tags "$i" "$@" ;; 17 *) go vet -printfuncs "errorf" "$@" && 18 go test ${zargs[*]} -vet off -tags "alltests $i" -run "Suite" -coverprofile "${i2// /-}.cov.out" "$@" ;; 19 esac 20 if [[ "$?" != 0 ]]; then return 1; fi 21 done 22 echo "++++++++ TEST SUITES ALL PASSED ++++++++" 23} 24 25 26# is a generation needed? 27_ng() { 28 local a="$1" 29 if [[ ! -e "$a" ]]; then echo 1; return; fi 30 for i in `ls -1 *.go.tmpl gen.go values_test.go` 31 do 32 if [[ "$a" -ot "$i" ]]; then echo 1; return; fi 33 done 34} 35 36_prependbt() { 37 cat > ${2} <<EOF 38// +build generated 39 40EOF 41 cat ${1} >> ${2} 42 rm -f ${1} 43} 44 45# _build generates fast-path.go and gen-helper.go. 46_build() { 47 if ! [[ "${zforce}" || $(_ng "fast-path.generated.go") || $(_ng "gen-helper.generated.go") || $(_ng "gen.generated.go") ]]; then return 0; fi 48 49 if [ "${zbak}" ]; then 50 _zts=`date '+%m%d%Y_%H%M%S'` 51 _gg=".generated.go" 52 [ -e "gen-helper${_gg}" ] && mv gen-helper${_gg} gen-helper${_gg}__${_zts}.bak 53 [ -e "fast-path${_gg}" ] && mv fast-path${_gg} fast-path${_gg}__${_zts}.bak 54 [ -e "gen${_gg}" ] && mv gen${_gg} gen${_gg}__${_zts}.bak 55 fi 56 rm -f gen-helper.generated.go fast-path.generated.go gen.generated.go \ 57 *safe.generated.go *_generated_test.go *.generated_ffjson_expose.go 58 59 cat > gen.generated.go <<EOF 60// +build codecgen.exec 61 62// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. 63// Use of this source code is governed by a MIT license found in the LICENSE file. 64 65package codec 66 67// DO NOT EDIT. THIS FILE IS AUTO-GENERATED FROM gen-dec-(map|array).go.tmpl 68 69const genDecMapTmpl = \` 70EOF 71 cat >> gen.generated.go < gen-dec-map.go.tmpl 72 cat >> gen.generated.go <<EOF 73\` 74 75const genDecListTmpl = \` 76EOF 77 cat >> gen.generated.go < gen-dec-array.go.tmpl 78 cat >> gen.generated.go <<EOF 79\` 80 81const genEncChanTmpl = \` 82EOF 83 cat >> gen.generated.go < gen-enc-chan.go.tmpl 84 cat >> gen.generated.go <<EOF 85\` 86EOF 87 cat > gen-from-tmpl.codec.generated.go <<EOF 88package codec 89import "io" 90func GenInternalGoFile(r io.Reader, w io.Writer) error { 91return genInternalGoFile(r, w) 92} 93EOF 94 cat > gen-from-tmpl.generated.go <<EOF 95//+build ignore 96 97package main 98 99import "${zpkg}" 100import "os" 101 102func run(fnameIn, fnameOut string) { 103println("____ " + fnameIn + " --> " + fnameOut + " ______") 104fin, err := os.Open(fnameIn) 105if err != nil { panic(err) } 106defer fin.Close() 107fout, err := os.Create(fnameOut) 108if err != nil { panic(err) } 109defer fout.Close() 110err = codec.GenInternalGoFile(fin, fout) 111if err != nil { panic(err) } 112} 113 114func main() { 115run("fast-path.go.tmpl", "fast-path.generated.go") 116run("gen-helper.go.tmpl", "gen-helper.generated.go") 117run("mammoth-test.go.tmpl", "mammoth_generated_test.go") 118run("mammoth2-test.go.tmpl", "mammoth2_generated_test.go") 119} 120EOF 121 122 sed -e 's+// __DO_NOT_REMOVE__NEEDED_FOR_REPLACING__IMPORT_PATH__FOR_CODEC_BENCH__+import . "github.com/ugorji/go/codec"+' \ 123 shared_test.go > bench/shared_test.go 124 125 # explicitly return 0 if this passes, else return 1 126 go run -tags "notfastpath safe codecgen.exec" gen-from-tmpl.generated.go && 127 rm -f gen-from-tmpl.*generated.go && 128 return 0 129 return 1 130} 131 132_codegenerators() { 133 local c5="_generated_test.go" 134 local c7="$PWD/codecgen" 135 local c8="$c7/__codecgen" 136 local c9="codecgen-scratch.go" 137 138 if ! [[ $zforce || $(_ng "values_codecgen${c5}") ]]; then return 0; fi 139 140 # Note: ensure you run the codecgen for this codebase/directory i.e. ./codecgen/codecgen 141 true && 142 echo "codecgen ... " && 143 if [[ $zforce || ! -f "$c8" || "$c7/gen.go" -nt "$c8" ]]; then 144 echo "rebuilding codecgen ... " && ( cd codecgen && go build -o $c8 ${zargs[*]} . ) 145 fi && 146 $c8 -rt codecgen -t 'codecgen generated' -o values_codecgen${c5} -d 19780 $zfin $zfin2 && 147 cp mammoth2_generated_test.go $c9 && 148 $c8 -t '!notfastpath' -o mammoth2_codecgen${c5} -d 19781 mammoth2_generated_test.go && 149 rm -f $c9 && 150 echo "generators done!" 151} 152 153_prebuild() { 154 echo "prebuild: zforce: $zforce" 155 local d="$PWD" 156 zfin="test_values.generated.go" 157 zfin2="test_values_flex.generated.go" 158 zpkg="github.com/ugorji/go/codec" 159 # zpkg=${d##*/src/} 160 # zgobase=${d%%/src/*} 161 # rm -f *_generated_test.go 162 rm -f codecgen-*.go && 163 _build && 164 cp $d/values_test.go $d/$zfin && 165 cp $d/values_flex_test.go $d/$zfin2 && 166 _codegenerators && 167 if [[ "$(type -t _codegenerators_external )" = "function" ]]; then _codegenerators_external ; fi && 168 if [[ $zforce ]]; then go install ${zargs[*]} .; fi && 169 echo "prebuild done successfully" 170 rm -f $d/$zfin $d/$zfin2 171 unset zfin zfin2 zpkg 172} 173 174_make() { 175 zforce=1 176 (cd codecgen && go install ${zargs[*]} .) && _prebuild && go install ${zargs[*]} . 177 unset zforce 178} 179 180_clean() { 181 rm -f gen-from-tmpl.*generated.go \ 182 codecgen-*.go \ 183 test_values.generated.go test_values_flex.generated.go 184} 185 186_release() { 187 local reply 188 read -p "Pre-release validation takes a few minutes and MUST be run from within GOPATH/src. Confirm y/n? " -n 1 -r reply 189 echo 190 if [[ ! $reply =~ ^[Yy]$ ]]; then return 1; fi 191 192 # expects GOROOT, GOROOT_BOOTSTRAP to have been set. 193 if [[ -z "${GOROOT// }" || -z "${GOROOT_BOOTSTRAP// }" ]]; then return 1; fi 194 # (cd $GOROOT && git checkout -f master && git pull && git reset --hard) 195 (cd $GOROOT && git pull) 196 local f=`pwd`/make.release.out 197 cat > $f <<EOF 198========== `date` =========== 199EOF 200 # # go 1.6 and below kept giving memory errors on Mac OS X during SDK build or go run execution, 201 # # that is fine, as we only explicitly test the last 3 releases and tip (2 years). 202 zforce=1 203 for i in 1.10 1.11 1.12 master 204 do 205 echo "*********** $i ***********" >>$f 206 if [[ "$i" != "master" ]]; then i="release-branch.go$i"; fi 207 (false || 208 (echo "===== BUILDING GO SDK for branch: $i ... =====" && 209 cd $GOROOT && 210 git checkout -f $i && git reset --hard && git clean -f . && 211 cd src && ./make.bash >>$f 2>&1 && sleep 1 ) ) && 212 echo "===== GO SDK BUILD DONE =====" && 213 _prebuild && 214 echo "===== PREBUILD DONE with exit: $? =====" && 215 _tests "$@" 216 if [[ "$?" != 0 ]]; then return 1; fi 217 done 218 unset zforce 219 echo "++++++++ RELEASE TEST SUITES ALL PASSED ++++++++" 220} 221 222_usage() { 223 cat <<EOF 224primary usage: $0 225 -[tmpfxnld] -> [tests, make, prebuild (force) (external), inlining diagnostics, mid-stack inlining, race detector] 226 -v -> verbose 227EOF 228 if [[ "$(type -t _usage_run)" = "function" ]]; then _usage_run ; fi 229} 230 231_main() { 232 if [[ -z "$1" ]]; then _usage; return 1; fi 233 local x 234 unset zforce 235 zargs=() 236 zbenchflags="" 237 OPTIND=1 238 while getopts ":ctmnrgpfvlzdb:" flag 239 do 240 case "x$flag" in 241 'xf') zforce=1 ;; 242 'xv') zverbose=1 ;; 243 'xl') zargs+=("-gcflags"); zargs+=("-l=4") ;; 244 'xn') zargs+=("-gcflags"); zargs+=("-m=2") ;; 245 'xd') zargs+=("-race") ;; 246 'xb') x='b'; zbenchflags=${OPTARG} ;; 247 x\?) _usage; return 1 ;; 248 *) x=$flag ;; 249 esac 250 done 251 shift $((OPTIND-1)) 252 # echo ">>>> _main: extra args: $@" 253 case "x$x" in 254 'xt') _tests "$@" ;; 255 'xm') _make "$@" ;; 256 'xr') _release "$@" ;; 257 'xg') _go ;; 258 'xp') _prebuild "$@" ;; 259 'xc') _clean "$@" ;; 260 'xz') _analyze "$@" ;; 261 'xb') _bench "$@" ;; 262 esac 263 unset zforce zargs zbenchflags 264} 265 266[ "." = `dirname $0` ] && _main "$@" 267 268