diff --git a/.travis.yml b/.travis.yml index 00e5ca58e..caa7e46db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,4 +16,9 @@ env: script: - make $TEST_SUITE -sudo: false #docker containers for CI +# For docker containers + +sudo: required + +services: + - docker diff --git a/Dockerfile b/Dockerfile index 88a8bf4f0..92f175c5a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,8 +7,6 @@ ENV VERSION master EXPOSE 4001 5001 8080 # 4001 = Swarm, 5001 = API, 8080 = HTTP transport -VOLUME /data/ipfs - ADD bin/container_daemon /usr/local/bin/start_ipfs ADD bin/container_shacheck /usr/local/bin/shacheck @@ -24,6 +22,7 @@ RUN adduser -D -h /data -u 1000 ipfs \ && apk del wget zip curl USER ipfs +VOLUME /data/ipfs ENTRYPOINT ["/usr/local/bin/start_ipfs"] diff --git a/circle.yml b/circle.yml index bc6724ac1..13f2ad543 100644 --- a/circle.yml +++ b/circle.yml @@ -3,10 +3,13 @@ machine: TEST_NO_FUSE: 1 TEST_VERBOSE: 1 TRAVIS: 1 + CIRCLE: 1 post: - sudo rm -rf /usr/local/go - if [ ! -e go1.5.linux-amd64.tar.gz ]; then curl -o go1.5.linux-amd64.tar.gz https://storage.googleapis.com/golang/go1.5.linux-amd64.tar.gz; fi - sudo tar -C /usr/local -xzf go1.5.linux-amd64.tar.gz + services: + - docker dependencies: pre: diff --git a/p2p/net/swarm/dial_test.go b/p2p/net/swarm/dial_test.go index d0e0cdbb0..552749359 100644 --- a/p2p/net/swarm/dial_test.go +++ b/p2p/net/swarm/dial_test.go @@ -89,7 +89,7 @@ func TestSimultDials(t *testing.T) { func newSilentPeer(t *testing.T) (peer.ID, ma.Multiaddr, net.Listener) { dst := testutil.RandPeerIDFatal(t) - lst, err := net.Listen("tcp", ":0") + lst, err := net.Listen("tcp4", "0.0.0.0:0") if err != nil { t.Fatal(err) } diff --git a/test/ipfs-test-lib.sh b/test/ipfs-test-lib.sh index b05287c2e..8ba04e8ee 100644 --- a/test/ipfs-test-lib.sh +++ b/test/ipfs-test-lib.sh @@ -35,3 +35,30 @@ shellquote() { done printf '\n' } + +# Docker + +# This takes a directory, that should contain a Dockerfile, as argument +docker_build() { + docker build --rm "$1" +} + +# This takes an image as argument and writes a docker ID on stdout +docker_run() { + docker run -it -d -p 8080:8080 -p 4001:4001 -p 5001:5001 "$1" +} + +# This takes a docker ID and a command as arguments +docker_exec() { + if test "$CIRCLE" = 1 + then + sudo lxc-attach -n "$(docker inspect --format '{{.Id}}' $1)" -- /bin/bash -c "$2" + else + docker exec -i "$1" /bin/bash -c "$2" + fi +} + +# This takes a docker ID as argument +docker_stop() { + docker stop "$1" +} diff --git a/test/sharness/lib/test-lib.sh b/test/sharness/lib/test-lib.sh index 21f566ee2..db1d4031a 100644 --- a/test/sharness/lib/test-lib.sh +++ b/test/sharness/lib/test-lib.sh @@ -41,6 +41,7 @@ SHARNESS_LIB="lib/sharness/sharness.sh" # grab + output options test "$TEST_NO_FUSE" != 1 && test_set_prereq FUSE test "$TEST_EXPENSIVE" = 1 && test_set_prereq EXPENSIVE +type docker && test_set_prereq DOCKER if test "$TEST_VERBOSE" = 1; then echo '# TEST_VERBOSE='"$TEST_VERBOSE" diff --git a/test/sharness/t0300-docker-image.sh b/test/sharness/t0300-docker-image.sh new file mode 100755 index 000000000..1d0759e77 --- /dev/null +++ b/test/sharness/t0300-docker-image.sh @@ -0,0 +1,63 @@ +#!/bin/sh +# +# Copyright (c) 2015 Christian Couder +# MIT Licensed; see the LICENSE file in this repository. +# + +test_description="Test docker image" + +. lib/test-lib.sh + +# if in travis CI on OSX, docker is not available +if ! test_have_prereq DOCKER; then + skip_all='skipping docker tests, docker not available' + + test_done +fi + +test_expect_success "'docker --version' works" ' + docker --version >actual +' + +test_expect_success "'docker --version' output looks good" ' + egrep "^Docker version" actual +' + +test_expect_success "current user is in the 'docker' group" ' + groups | egrep "\bdocker\b" +' + +TEST_TRASH_DIR=$(pwd) +TEST_SCRIPTS_DIR=$(dirname "$TEST_TRASH_DIR") +TEST_TESTS_DIR=$(dirname "$TEST_SCRIPTS_DIR") +APP_ROOT_DIR=$(dirname "$TEST_TESTS_DIR") + +test_expect_success "docker image build succeeds" ' + docker_build "$APP_ROOT_DIR" >actual +' + +test_expect_success "docker image build output looks good" ' + SUCCESS_LINE=$(egrep "^Successfully built" actual) && + IMAGE_ID=$(expr "$SUCCESS_LINE" : "^Successfully built \(.*\)") || + test_fsh cat actual +' + +test_expect_success "docker image runs" ' + DOC_ID=$(docker_run "$IMAGE_ID") +' + +test_expect_success "simple command can be run in docker container" ' + docker_exec "$DOC_ID" "echo Hello Worlds" >actual +' + +test_expect_success "simple command output looks good" ' + echo "Hello Worlds" >expected && + test_cmp expected actual +' + +test_expect_success "stop docker container" ' + docker_stop "$DOC_ID" +' + +test_done +