mirror of
				https://github.com/moby/moby.git
				synced 2022-11-09 12:21:53 -05:00 
			
		
		
		
	Initial bats based integration tests for testing daemon network configs
Pre-reqs : * docker machine (https://github.com/docker/machine) * bats (https://github.com/sstephenson/bats) * virtualbox Signed-off-by: Madhu Venugopal <madhu@docker.com>
This commit is contained in:
		
							parent
							
								
									293cf1b4db
								
							
						
					
					
						commit
						8f63aa82b0
					
				
					 4 changed files with 192 additions and 0 deletions
				
			
		
							
								
								
									
										34
									
								
								libnetwork/test/integration/README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								libnetwork/test/integration/README.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								libnetwork/test/integration/daemon-configs.bats
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								libnetwork/test/integration/daemon-configs.bats
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								libnetwork/test/integration/daemon.cfg
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								libnetwork/test/integration/daemon.cfg
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
									
								
								libnetwork/test/integration/helpers.bash
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								libnetwork/test/integration/helpers.bash
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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 "$@"
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue