diff --git a/.travis.yml b/.travis.yml index 7ce858ba9c..2661cee5f6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,14 @@ language: go sudo: false go: - 1.3 +install: +- export GOPATH=${TRAVIS_BUILD_DIR}/Godeps/_workspace:$GOPATH +- export PATH=${TRAVIS_BUILD_DIR}/Godeps/_workspace/bin:$PATH +- go get -t -v ./... +- go get code.google.com/p/go.tools/cmd/cover script: - script/validate-dco - script/validate-gofmt - go test -v -short ./... +- rm -rf $HOME/.docker +- script/generate-coverage diff --git a/Dockerfile b/Dockerfile index d34c8d1a1c..6cff738012 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,16 @@ FROM golang:1.3-cross RUN apt-get update && apt-get install -y --no-install-recommends openssh-client + +# TODO: Vendor these `go get` commands using Godep. RUN go get github.com/mitchellh/gox RUN go get github.com/aktau/github-release RUN go get github.com/tools/godep RUN go get code.google.com/p/go.tools/cmd/cover + ENV GOPATH /go/src/github.com/docker/machine/Godeps/_workspace:/go ENV MACHINE_BINARY /go/src/github.com/docker/machine/docker-machine ENV USER root + WORKDIR /go/src/github.com/docker/machine + ADD . /go/src/github.com/docker/machine diff --git a/README.md b/README.md index fe7e45d0f8..2b35eb1d80 100644 --- a/README.md +++ b/README.md @@ -358,6 +358,28 @@ pass an argument to that script to specify which directory, e.g.: If you make a pull request, it is highly encouraged that you submit tests for the code that you have added or modified in the same pull request. +## Code Coverage + +Machine includes a script to check for missing `*_test.go` files and to generate +an [HTML-based repesentation of which code is covered by tests](http://blog.golang.org/cover#TOC_5.). + +To run the code coverage script, execute: + +```console +$ ./script/coverage serve +``` + +You will see the results of the code coverage check as they come in. + +This will also generate the code coverage website and serve it from a container +on port 8000. By default, `/` will show you the source files from the base +directory, and you can navigate to the coverage for any particular subdirectory +of the Docker Machine repo's root by going to that path. For instance, to see +the coverage for the VirtualBox driver's package, browse to `/drivers/virtualbox`. + +![](/docs/img/coverage.png) + +You can hit `CTRL+C` to stop the server. ## Integration Tests There is a suite of integration tests that will run for the drivers. In order diff --git a/docs/img/coverage.png b/docs/img/coverage.png new file mode 100644 index 0000000000..210a30ff83 Binary files /dev/null and b/docs/img/coverage.png differ diff --git a/drivers/amazonec2/amz/auth_test.go b/drivers/amazonec2/amz/auth_test.go new file mode 100644 index 0000000000..c4228e299f --- /dev/null +++ b/drivers/amazonec2/amz/auth_test.go @@ -0,0 +1 @@ +package amz diff --git a/drivers/amazonec2/amz/block_device_mapping_test.go b/drivers/amazonec2/amz/block_device_mapping_test.go new file mode 100644 index 0000000000..c4228e299f --- /dev/null +++ b/drivers/amazonec2/amz/block_device_mapping_test.go @@ -0,0 +1 @@ +package amz diff --git a/drivers/amazonec2/amz/describe_instances_test.go b/drivers/amazonec2/amz/describe_instances_test.go new file mode 100644 index 0000000000..c4228e299f --- /dev/null +++ b/drivers/amazonec2/amz/describe_instances_test.go @@ -0,0 +1 @@ +package amz diff --git a/drivers/amazonec2/amz/describe_keypairs_test.go b/drivers/amazonec2/amz/describe_keypairs_test.go new file mode 100644 index 0000000000..c4228e299f --- /dev/null +++ b/drivers/amazonec2/amz/describe_keypairs_test.go @@ -0,0 +1 @@ +package amz diff --git a/drivers/amazonec2/amz/describe_security_groups_test.go b/drivers/amazonec2/amz/describe_security_groups_test.go new file mode 100644 index 0000000000..c4228e299f --- /dev/null +++ b/drivers/amazonec2/amz/describe_security_groups_test.go @@ -0,0 +1 @@ +package amz diff --git a/drivers/amazonec2/amz/describe_subnets_test.go b/drivers/amazonec2/amz/describe_subnets_test.go new file mode 100644 index 0000000000..c4228e299f --- /dev/null +++ b/drivers/amazonec2/amz/describe_subnets_test.go @@ -0,0 +1 @@ +package amz diff --git a/drivers/amazonec2/amz/ec2_test.go b/drivers/amazonec2/amz/ec2_test.go new file mode 100644 index 0000000000..c4228e299f --- /dev/null +++ b/drivers/amazonec2/amz/ec2_test.go @@ -0,0 +1 @@ +package amz diff --git a/drivers/amazonec2/amz/error_codes_test.go b/drivers/amazonec2/amz/error_codes_test.go new file mode 100644 index 0000000000..c4228e299f --- /dev/null +++ b/drivers/amazonec2/amz/error_codes_test.go @@ -0,0 +1 @@ +package amz diff --git a/drivers/amazonec2/amz/error_test.go b/drivers/amazonec2/amz/error_test.go new file mode 100644 index 0000000000..c4228e299f --- /dev/null +++ b/drivers/amazonec2/amz/error_test.go @@ -0,0 +1 @@ +package amz diff --git a/drivers/amazonec2/amz/ip_permission_test.go b/drivers/amazonec2/amz/ip_permission_test.go new file mode 100644 index 0000000000..c4228e299f --- /dev/null +++ b/drivers/amazonec2/amz/ip_permission_test.go @@ -0,0 +1 @@ +package amz diff --git a/drivers/amazonec2/amz/keypair_test.go b/drivers/amazonec2/amz/keypair_test.go new file mode 100644 index 0000000000..c4228e299f --- /dev/null +++ b/drivers/amazonec2/amz/keypair_test.go @@ -0,0 +1 @@ +package amz diff --git a/drivers/amazonec2/amz/security_group_test.go b/drivers/amazonec2/amz/security_group_test.go new file mode 100644 index 0000000000..c4228e299f --- /dev/null +++ b/drivers/amazonec2/amz/security_group_test.go @@ -0,0 +1 @@ +package amz diff --git a/drivers/amazonec2/amz/tags_test.go b/drivers/amazonec2/amz/tags_test.go new file mode 100644 index 0000000000..c4228e299f --- /dev/null +++ b/drivers/amazonec2/amz/tags_test.go @@ -0,0 +1 @@ +package amz diff --git a/drivers/azure/azure_test.go b/drivers/azure/azure_test.go new file mode 100644 index 0000000000..6512f735e0 --- /dev/null +++ b/drivers/azure/azure_test.go @@ -0,0 +1 @@ +package azure diff --git a/drivers/digitalocean/digitalocean_test.go b/drivers/digitalocean/digitalocean_test.go new file mode 100644 index 0000000000..53c59d2fe1 --- /dev/null +++ b/drivers/digitalocean/digitalocean_test.go @@ -0,0 +1 @@ +package digitalocean diff --git a/drivers/google/auth_util_test.go b/drivers/google/auth_util_test.go new file mode 100644 index 0000000000..71664db3c8 --- /dev/null +++ b/drivers/google/auth_util_test.go @@ -0,0 +1 @@ +package google diff --git a/drivers/google/compute_util_test.go b/drivers/google/compute_util_test.go new file mode 100644 index 0000000000..71664db3c8 --- /dev/null +++ b/drivers/google/compute_util_test.go @@ -0,0 +1 @@ +package google diff --git a/drivers/google/google_test.go b/drivers/google/google_test.go new file mode 100644 index 0000000000..71664db3c8 --- /dev/null +++ b/drivers/google/google_test.go @@ -0,0 +1 @@ +package google diff --git a/drivers/none/none_test.go b/drivers/none/none_test.go new file mode 100644 index 0000000000..5467f722f3 --- /dev/null +++ b/drivers/none/none_test.go @@ -0,0 +1 @@ +package none diff --git a/drivers/openstack/client_test.go b/drivers/openstack/client_test.go new file mode 100644 index 0000000000..a0d778caa2 --- /dev/null +++ b/drivers/openstack/client_test.go @@ -0,0 +1 @@ +package openstack diff --git a/drivers/openstack/openstack_test.go b/drivers/openstack/openstack_test.go new file mode 100644 index 0000000000..a0d778caa2 --- /dev/null +++ b/drivers/openstack/openstack_test.go @@ -0,0 +1 @@ +package openstack diff --git a/drivers/rackspace/client_test.go b/drivers/rackspace/client_test.go new file mode 100644 index 0000000000..5d17b32caa --- /dev/null +++ b/drivers/rackspace/client_test.go @@ -0,0 +1 @@ +package rackspace diff --git a/drivers/rackspace/rackspace_test.go b/drivers/rackspace/rackspace_test.go new file mode 100644 index 0000000000..5d17b32caa --- /dev/null +++ b/drivers/rackspace/rackspace_test.go @@ -0,0 +1 @@ +package rackspace diff --git a/drivers/softlayer/driver_test.go b/drivers/softlayer/driver_test.go new file mode 100644 index 0000000000..22853c9ea9 --- /dev/null +++ b/drivers/softlayer/driver_test.go @@ -0,0 +1 @@ +package softlayer diff --git a/drivers/softlayer/softlayer_test.go b/drivers/softlayer/softlayer_test.go new file mode 100644 index 0000000000..22853c9ea9 --- /dev/null +++ b/drivers/softlayer/softlayer_test.go @@ -0,0 +1 @@ +package softlayer diff --git a/drivers/virtualbox/network_test.go b/drivers/virtualbox/network_test.go new file mode 100644 index 0000000000..50e40b533b --- /dev/null +++ b/drivers/virtualbox/network_test.go @@ -0,0 +1 @@ +package virtualbox diff --git a/drivers/virtualbox/vbm_test.go b/drivers/virtualbox/vbm_test.go new file mode 100644 index 0000000000..50e40b533b --- /dev/null +++ b/drivers/virtualbox/vbm_test.go @@ -0,0 +1 @@ +package virtualbox diff --git a/drivers/virtualbox/virtualbox_test.go b/drivers/virtualbox/virtualbox_test.go new file mode 100644 index 0000000000..50e40b533b --- /dev/null +++ b/drivers/virtualbox/virtualbox_test.go @@ -0,0 +1 @@ +package virtualbox diff --git a/drivers/vmwarefusion/fusion_test.go b/drivers/vmwarefusion/fusion_test.go new file mode 100644 index 0000000000..5eacfbb54e --- /dev/null +++ b/drivers/vmwarefusion/fusion_test.go @@ -0,0 +1 @@ +package vmwarefusion diff --git a/drivers/vmwarefusion/vmrun_test.go b/drivers/vmwarefusion/vmrun_test.go new file mode 100644 index 0000000000..5eacfbb54e --- /dev/null +++ b/drivers/vmwarefusion/vmrun_test.go @@ -0,0 +1 @@ +package vmwarefusion diff --git a/drivers/vmwarefusion/vmx_test.go b/drivers/vmwarefusion/vmx_test.go new file mode 100644 index 0000000000..5eacfbb54e --- /dev/null +++ b/drivers/vmwarefusion/vmx_test.go @@ -0,0 +1 @@ +package vmwarefusion diff --git a/drivers/vmwarevcloudair/vcloudair_test.go b/drivers/vmwarevcloudair/vcloudair_test.go new file mode 100644 index 0000000000..99039e4f38 --- /dev/null +++ b/drivers/vmwarevcloudair/vcloudair_test.go @@ -0,0 +1 @@ +package vmwarevcloudair diff --git a/drivers/vmwarevsphere/errors/config_error_test.go b/drivers/vmwarevsphere/errors/config_error_test.go new file mode 100644 index 0000000000..04b32187ba --- /dev/null +++ b/drivers/vmwarevsphere/errors/config_error_test.go @@ -0,0 +1 @@ +package errors diff --git a/drivers/vmwarevsphere/errors/datastore_error_test.go b/drivers/vmwarevsphere/errors/datastore_error_test.go new file mode 100644 index 0000000000..04b32187ba --- /dev/null +++ b/drivers/vmwarevsphere/errors/datastore_error_test.go @@ -0,0 +1 @@ +package errors diff --git a/drivers/vmwarevsphere/errors/errors_test.go b/drivers/vmwarevsphere/errors/errors_test.go new file mode 100644 index 0000000000..04b32187ba --- /dev/null +++ b/drivers/vmwarevsphere/errors/errors_test.go @@ -0,0 +1 @@ +package errors diff --git a/drivers/vmwarevsphere/errors/govc_error_test.go b/drivers/vmwarevsphere/errors/govc_error_test.go new file mode 100644 index 0000000000..04b32187ba --- /dev/null +++ b/drivers/vmwarevsphere/errors/govc_error_test.go @@ -0,0 +1 @@ +package errors diff --git a/drivers/vmwarevsphere/errors/guest_error_test.go b/drivers/vmwarevsphere/errors/guest_error_test.go new file mode 100644 index 0000000000..04b32187ba --- /dev/null +++ b/drivers/vmwarevsphere/errors/guest_error_test.go @@ -0,0 +1 @@ +package errors diff --git a/drivers/vmwarevsphere/errors/login_error_test.go b/drivers/vmwarevsphere/errors/login_error_test.go new file mode 100644 index 0000000000..04b32187ba --- /dev/null +++ b/drivers/vmwarevsphere/errors/login_error_test.go @@ -0,0 +1 @@ +package errors diff --git a/drivers/vmwarevsphere/errors/state_error_test.go b/drivers/vmwarevsphere/errors/state_error_test.go new file mode 100644 index 0000000000..04b32187ba --- /dev/null +++ b/drivers/vmwarevsphere/errors/state_error_test.go @@ -0,0 +1 @@ +package errors diff --git a/drivers/vmwarevsphere/errors/vm_error_test.go b/drivers/vmwarevsphere/errors/vm_error_test.go new file mode 100644 index 0000000000..04b32187ba --- /dev/null +++ b/drivers/vmwarevsphere/errors/vm_error_test.go @@ -0,0 +1 @@ +package errors diff --git a/drivers/vmwarevsphere/govc_test.go b/drivers/vmwarevsphere/govc_test.go new file mode 100644 index 0000000000..6c68b2fc86 --- /dev/null +++ b/drivers/vmwarevsphere/govc_test.go @@ -0,0 +1 @@ +package vmwarevsphere diff --git a/drivers/vmwarevsphere/vc_conn_test.go b/drivers/vmwarevsphere/vc_conn_test.go new file mode 100644 index 0000000000..6c68b2fc86 --- /dev/null +++ b/drivers/vmwarevsphere/vc_conn_test.go @@ -0,0 +1 @@ +package vmwarevsphere diff --git a/drivers/vmwarevsphere/vsphere_test.go b/drivers/vmwarevsphere/vsphere_test.go new file mode 100644 index 0000000000..6c68b2fc86 --- /dev/null +++ b/drivers/vmwarevsphere/vsphere_test.go @@ -0,0 +1 @@ +package vmwarevsphere diff --git a/script/coverage b/script/coverage new file mode 100755 index 0000000000..659a578de2 --- /dev/null +++ b/script/coverage @@ -0,0 +1,17 @@ +#!/bin/bash + +set -e +docker build -t docker-machine . + +if [[ "$1" == "serve" ]]; then + SERVE=yes +else + SERVE=no +fi + +docker run -it \ + -e IN_CONTAINER=yes \ + -e SERVE=${SERVE} \ + -p 8000:8000 \ + --rm docker-machine \ + ./script/generate-coverage diff --git a/script/generate-coverage b/script/generate-coverage new file mode 100755 index 0000000000..7eaac72e8d --- /dev/null +++ b/script/generate-coverage @@ -0,0 +1,55 @@ +#!/bin/bash + +set -e + +COVERAGE_DIR=/tmp/coverage + +generate_coverage_for_dir () { + echo + echo "Generating coverage report for $1..." + cd "$1" >/dev/null + PKG_COVERAGE_DIR=${COVERAGE_DIR}/"$1" + PKG_PROFILE=${PKG_COVERAGE_DIR}/profile.txt + mkdir -p ${PKG_COVERAGE_DIR} + go test -covermode=set -coverprofile=${PKG_PROFILE} + go tool cover -html=${PKG_PROFILE} -o ${PKG_COVERAGE_DIR}/index.html + cd - >/dev/null + echo "Done generating coverage for $1." + for f in $(ls "$1"); do + REL_PATH="$1/$f" + for exclude in ${EXCLUDED_DIRS}; do + if [[ "$REL_PATH" == "$exclude" ]]; then + continue 2 + fi + done + # If file is directory and not Godeps + # (don't worry about generating 3rd party code coverage) + if [[ -d "$REL_PATH" ]]; then + # invoke recursively + generate_coverage_for_dir ${REL_PATH} + fi + done + echo +} + +if [[ "$IN_CONTAINER" == "yes" ]]; then + cd /go/src/github.com/docker + DIR="machine" +else + DIR="." +fi + +# Script will bomb out on some dirs if there are no buildable source files, +# we shouldn't be checking these anyway so skip over them. +EXCLUDED_DIRS="${DIR}/Godeps ${DIR}/_integration-test ${DIR}/docs ${DIR}/script" + +generate_coverage_for_dir ${DIR} +echo "Done checking and generating coverage!" + +if [[ "$SERVE" == "yes" ]]; then + cd ${COVERAGE_DIR}/machine + echo "*****************************************" + echo "* Serving coverage file on port 8000... *" + echo "*****************************************" + python -m SimpleHTTPServer 8000 +fi