Skip to content

Commit

Permalink
Initial bats based integration tests for testing daemon network configs
Browse files Browse the repository at this point in the history
Pre-reqs :
* docker machine (https://github.com/docker/machine)
* bats (https://github.com/sstephenson/bats)
* virtualbox

Signed-off-by: Madhu Venugopal <[email protected]>
  • Loading branch information
mavenugo committed Apr 25, 2015
1 parent 9c3c270 commit c7b679e
Show file tree
Hide file tree
Showing 4 changed files with 192 additions and 0 deletions.
34 changes: 34 additions & 0 deletions test/integration/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# LibNetwork Integration Tests

Integration tests provide end-to-end testing of LibNetwork and Drivers.

While unit tests verify the code is working as expected by relying on mocks and
artificially created fixtures, integration tests actually use real docker
engines and communicate to it through the CLI.

Note that integration tests do **not** replace unit tests and Docker is used as a good use-case.

As a rule of thumb, code should be tested thoroughly with unit tests.
Integration tests on the other hand are meant to test a specific feature end to end.

Integration tests are written in *bash* using the
[bats](https://github.com/sstephenson/bats) framework.

## Pre-Requisites

1. Bats (https://github.com/sstephenson/bats#installing-bats-from-source)
2. Docker Machine (https://github.com/docker/machine)
3. Virtualbox (as a Docker machine driver)

## Running integration tests

* Start by [installing] (https://github.com/sstephenson/bats#installing-bats-from-source) *bats* on your system.
* If not done already, [install](https://docs.docker.com/machine/) *docker-machine* into /usr/bin
* Make sure Virtualbox is installed as well, which will be used by docker-machine as a driver to launch VMs

In order to run all integration tests, pass *bats* the test path:
```
$ bats test/integration/daemon-configs.bats
```


104 changes: 104 additions & 0 deletions test/integration/daemon-configs.bats
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
#!/usr/bin/env bats

load helpers

export DRIVER=virtualbox
export NAME="bats-$DRIVER-daemon-configs"
export MACHINE_STORAGE_PATH=/tmp/machine-bats-daemon-test-$DRIVER
# Default memsize is 1024MB and disksize is 20000MB
# These values are defined in drivers/virtualbox/virtualbox.go
export DEFAULT_MEMSIZE=1024
export DEFAULT_DISKSIZE=20000
export CUSTOM_MEMSIZE=1536
export CUSTOM_DISKSIZE=10000
export CUSTOM_CPUCOUNT=1
export BAD_URL="http://dev.null:9111/bad.iso"

function setup() {
# add sleep because vbox; ugh
sleep 1
}

findDiskSize() {
# SATA-0-0 is usually the boot2disk.iso image
# We assume that SATA 1-0 is root disk VMDK and grab this UUID
# e.g. "SATA-ImageUUID-1-0"="fb5f33a7-e4e3-4cb9-877c-f9415ae2adea"
# TODO(slashk): does this work on Windows ?
run bash -c "VBoxManage showvminfo --machinereadable $NAME | grep SATA-ImageUUID-1-0 | cut -d'=' -f2"
run bash -c "VBoxManage showhdinfo $output | grep "Capacity:" | awk -F' ' '{ print $2 }'"
}

findMemorySize() {
run bash -c "VBoxManage showvminfo --machinereadable $NAME | grep memory= | cut -d'=' -f2"
}

findCPUCount() {
run bash -c "VBoxManage showvminfo --machinereadable $NAME | grep cpus= | cut -d'=' -f2"
}

buildMachineWithOldIsoCheckUpgrade() {
run wget https://github.com/boot2docker/boot2docker/releases/download/v1.4.1/boot2docker.iso -O $MACHINE_STORAGE_PATH/cache/boot2docker.iso
run machine create -d virtualbox $NAME
run machine upgrade $NAME
}

@test "$DRIVER: machine should not exist" {
run machine active $NAME
[ "$status" -eq 1 ]
}

@test "$DRIVER: VM should not exist" {
run VBoxManage showvminfo $NAME
[ "$status" -eq 1 ]
}

@test "$DRIVER: create" {
run machine create -d $DRIVER $NAME
[ "$status" -eq 0 ]
}

@test "$DRIVER: active" {
run machine active $NAME
[ "$status" -eq 0 ]
}

@test "$DRIVER: check default machine memory size" {
findMemorySize
[[ ${output} == "${DEFAULT_MEMSIZE}" ]]
}

@test "$DRIVER: check default machine disksize" {
findDiskSize
[[ ${output} == *"$DEFAULT_DISKSIZE"* ]]
}

@test "$DRIVER: test bridge-ip" {
run machine ssh $NAME sudo /etc/init.d/docker stop
run machine ssh $NAME sudo ifconfig docker0 down
run machine ssh $NAME sudo ip link delete docker0
BIP='--bip=172.168.45.1/24'
set_extra_config $BIP
cat ${TMP_EXTRA_ARGS_FILE} | machine ssh $NAME sudo tee /var/lib/boot2docker/profile
cat ${DAEMON_CFG_FILE} | machine ssh $NAME "sudo tee -a /var/lib/boot2docker/profile"
run machine ssh $NAME sudo /etc/init.d/docker start
run machine ssh $NAME ifconfig docker0
[ "$status" -eq 0 ]
[[ ${lines[1]} =~ "172.168.45.1" ]]
}

@test "$DRIVER: run busybox container" {
run machine ssh $NAME sudo cat /var/lib/boot2docker/profile
run docker $(machine config $NAME) run busybox echo hello world
[ "$status" -eq 0 ]
}

@test "$DRIVER: remove machine" {
run machine rm -f $NAME
}

# Cleanup of machine store should always be the last 'test'
@test "$DRIVER: cleanup" {
run rm -rf $MACHINE_STORAGE_PATH
[ "$status" -eq 0 ]
}

4 changes: 4 additions & 0 deletions test/integration/daemon.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
CACERT=/var/lib/boot2docker/ca.pem
SERVERCERT=/var/lib/boot2docker/server-key.pem
SERVERKEY=/var/lib/boot2docker/server.pem
DOCKER_TLS=no
50 changes: 50 additions & 0 deletions test/integration/helpers.bash
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#!/bin/bash

# Root directory of the repository.
MACHINE_ROOT=/usr/bin

PLATFORM=`uname -s | tr '[:upper:]' '[:lower:]'`
ARCH=`uname -m`

if [ "$ARCH" = "x86_64" ]; then
ARCH="amd64"
else
ARCH="386"
fi
MACHINE_BIN_NAME=docker-machine_$PLATFORM-$ARCH
BATS_LOG=/tmp/bats.log

touch ${BATS_LOG}
rm ${BATS_LOG}

teardown() {
echo "$BATS_TEST_NAME
----------
$output
----------
" >> ${BATS_LOG}
}

EXTRA_ARGS_CFG='EXTRA_ARGS'
EXTRA_ARGS='--tlsverify --tlscacert=/var/lib/boot2docker/ca.pem --tlskey=/var/lib/boot2docker/server-key.pem --tlscert=/var/lib/boot2docker/server.pem --label=provider=virtualbox -H tcp://0.0.0.0:2376'
TMP_EXTRA_ARGS_FILE=/tmp/tmp_extra_args
DAEMON_CFG_FILE=${BATS_TEST_DIRNAME}/daemon.cfg
set_extra_config() {
if [ -f ${TMP_EXTRA_ARGS_FILE} ];
then
rm ${TMP_EXTRA_ARGS_FILE}
fi
echo -n "${EXTRA_ARGS_CFG}='" > ${TMP_EXTRA_ARGS_FILE}
echo -n "$1 " >> ${TMP_EXTRA_ARGS_FILE}
echo "${EXTRA_ARGS}'" >> ${TMP_EXTRA_ARGS_FILE}
}

if [ ! -e $MACHINE_ROOT/$MACHINE_BIN_NAME ]; then
echo "${MACHINE_ROOT}/${MACHINE_BIN_NAME} not found"
exit 1
fi

function machine() {
${MACHINE_ROOT}/$MACHINE_BIN_NAME "$@"
}

0 comments on commit c7b679e

Please sign in to comment.