diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 86932c4..4caefbc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,7 +15,7 @@ test: - cd $GOPATH/src/$CI_PROJECT_PATH - go get -u github.com/golang/dep/cmd/dep - $GOPATH/bin/dep ensure - - go test $(go list ./... | grep -v /vendor/) + - ./script/coverage build: image: docker:latest diff --git a/script/coverage b/script/coverage new file mode 100755 index 0000000..680e4fb --- /dev/null +++ b/script/coverage @@ -0,0 +1,46 @@ +#!/bin/sh +# Based on https://github.com/mlafeldt/chef-runner/blob/34269dbb726c243dff9764007e7bd7f0fe9ee331/script/coverage +# Generate test coverage statistics for Go packages. +# +# Works around the fact that `go test -coverprofile` currently does not work +# with multiple packages, see https://code.google.com/p/go/issues/detail?id=6909 +# +# Usage: script/coverage [--html] +# +# --html Additionally create HTML report and open it in browser +# + +set -e + +workdir=.cover +profile="$workdir/cover.out" +mode=count + +generate_cover_data() { + rm -rf "$workdir" + mkdir "$workdir" + + go test -i "$@" # compile dependencies first before serializing go test invocations + for pkg in "$@"; do + f="$workdir/$(echo $pkg | tr / -).cover" + go test -covermode="$mode" -coverprofile="$f" "$pkg" + done + + echo "mode: $mode" >"$profile" + grep -h -v "^mode:" "$workdir"/*.cover >>"$profile" +} + +show_cover_report() { + go tool cover -${1}="$profile" +} + +generate_cover_data $(go list ./... | grep -v /vendor/) +show_cover_report func +case "$1" in +"") + ;; +--html) + show_cover_report html ;; +*) + echo >&2 "error: invalid option: $1"; exit 1 ;; +esac diff --git a/script/test b/script/test new file mode 100755 index 0000000..fd4a6b4 --- /dev/null +++ b/script/test @@ -0,0 +1,27 @@ +#!/bin/sh +# Based on https://github.com/mlafeldt/chef-runner/blob/34269dbb726c243dff9764007e7bd7f0fe9ee331/script/test +# Run package tests for a file/directory, or all tests if no argument is passed. +# Useful to e.g. execute package tests for the file currently open in Vim. +# Usage: script/test [path] + +set -e + +go_pkg_from_path() { + path=$1 + if test -d "$path"; then + dir="$path" + else + dir=$(dirname "$path") + fi + (cd "$dir" && go list) +} + +if test $# -gt 0; then + pkg=$(go_pkg_from_path "$1") + verbose=-v +else + pkg=$(go list ./... | grep -v /vendor/) + verbose= +fi + +exec go test ${GOTESTOPTS:-$verbose} $pkg