Merge pull request #254 from peplin/test-suite-and-ci

Add an automated test runner for example programs and Travis CI integration
This commit is contained in:
Sudar 2014-09-10 11:00:34 +05:30
commit fe00b04a0e
35 changed files with 384 additions and 8 deletions

2
.gitignore vendored
View file

@ -1,3 +1,5 @@
*.o *.o
build-cli build-cli
/.project /.project
/dependencies
build-*

5
.travis.yml Normal file
View file

@ -0,0 +1,5 @@
language: c
compiler:
- gcc
script: script/runtests.sh
before_install: script/bootstrap.sh

View file

@ -212,6 +212,13 @@ Then, the following line must be added to the project Makefile :
$(CXX_NAME) -c -include Arduino.h -x c++ $(CXXFLAGS) $(CPPFLAGS) -fsyntax-only $(CHK_SOURCES) $(CXX_NAME) -c -include Arduino.h -x c++ $(CXXFLAGS) $(CPPFLAGS) -fsyntax-only $(CHK_SOURCES)
``` ```
## Test Suite
This project includes a suite of example Makefiles and small Arduino and chipKIT
programs to assist the developers. Run `script/bootstrap.sh` to attempt to
automatically install the dependencies (Arduino IDE, MPIDE, etc.). Run
`script/runtests.sh` to attempt to compile all of the examples.
### Bare-ArduinoProject ### Bare-ArduinoProject
If you are planning on using this makefile in a larger/professional project, you might want to take a look at the [Bare-ArduinoProject](https://github.com/WeAreLeka/Bare-Arduino-Project) framework. If you are planning on using this makefile in a larger/professional project, you might want to take a look at the [Bare-ArduinoProject](https://github.com/WeAreLeka/Bare-Arduino-Project) framework.

View file

@ -1,7 +1,11 @@
This folder contains the list of example Arduino sketches and makefile showing the different usage patterns This folder contains the list of example Arduino sketches and makefile showing
the different usage patterns
- BlinkInAVRC - Shows how to use plain AVR C code
- ATtinyBlink - Shows how to use different cores like ATtiny
These three examples are a step back, in the "tests" directory.
- Blink - Shows normal usage - Blink - Shows normal usage
- HelloWorld - Shows how to include Arduino libraries - HelloWorld - Shows how to include Arduino libraries
- BlinkInAVRC - Shows how to use plain AVR C code
- BlinkChipKIT - Shows how to use ChipKIT - BlinkChipKIT - Shows how to use ChipKIT
- ATtinyBlink - Shows how to use different cores like ATtiny

View file

@ -9,6 +9,7 @@ BOARD_TAG = attiny85-8
ARDUINO_LIBS = SoftwareSerial ARDUINO_LIBS = SoftwareSerial
include ../TestSuiteCommon.mk
include $(ARDMK_DIR)/Arduino.mk include $(ARDMK_DIR)/Arduino.mk
# !!! Important. You have to use make ispload to upload when using ISP programmer # !!! Important. You have to use make ispload to upload when using ISP programmer

View file

@ -1,4 +0,0 @@
BOARD_TAG = uno
ARDUINO_LIBS =
include ../../Arduino.mk

9
script/bootstrap.sh Executable file
View file

@ -0,0 +1,9 @@
#!/usr/bin/env bash
set -e
SCRIPTS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
pushd $SCRIPTS_DIR/..
source $SCRIPTS_DIR/bootstrap/chipkit.sh
source $SCRIPTS_DIR/bootstrap/arduino.sh

View file

@ -0,0 +1,44 @@
set -e
BOOTSTRAP_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $BOOTSTRAP_DIR/common.sh
echo "Installing dependencies for building for the Arduino"
if [ -z "$ARDUINO_DIR" ] || ! test -e $ARDUINO_DIR || [ $OS == "cygwin" ]; then
echo "Installing Arduino..."
ARDUINO_BASENAME="arduino-1.0.5"
if [ $OS == "cygwin" ]; then
ARDUINO_FILE="$ARDUINO_BASENAME-r2-windows".zip
EXTRACT_COMMAND="unzip -q"
elif [ $OS == "mac" ]; then
ARDUINO_FILE="$ARDUINO_BASENAME-macosx".zip
EXTRACT_COMMAND="unzip -q"
else
ARDUINO_FILE="$ARDUINO_BASENAME-linux64".tgz
EXTRACT_COMMAND="tar -xzf"
fi
ARDUINO_URL=http://arduino.googlecode.com/files/$ARDUINO_FILE
_pushd $DEPENDENCIES_FOLDER
if ! test -e $ARDUINO_FILE
then
echo "Downloading Arduino IDE..."
download $ARDUINO_URL $ARDUINO_FILE
fi
if ! test -d $ARDUINO_BASENAME
then
echo "Installing Arduino to local folder..."
$EXTRACT_COMMAND $ARDUINO_FILE
echo "Arduino installed"
fi
_popd
fi
echo
echo "${bldgreen}Arduino dependencies installed.$txtrst"

View file

@ -0,0 +1,61 @@
set -e
BOOTSTRAP_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $BOOTSTRAP_DIR/common.sh
echo "Installing dependencies for building for the chipKIT"
if [ -z "$MPIDE_DIR" ] || ! test -e $MPIDE_DIR || [ $OS == "cygwin" ]; then
echo "Installing MPIDE..."
if [ $OS == "cygwin" ]; then
MPIDE_BASENAME="mpide-0023-windows-20130715"
MPIDE_FILE="$MPIDE_BASENAME".zip
EXTRACT_COMMAND="unzip -q"
if ! command -v unzip >/dev/null 2>&1; then
_cygwin_error "unzip"
fi
elif [ $OS == "mac" ]; then
MPIDE_BASENAME=mpide-0023-macosx-20130715
MPIDE_FILE="$MPIDE_BASENAME".dmg
else
MPIDE_BASENAME=mpide-0023-linux64-20130817-test
MPIDE_FILE="$MPIDE_BASENAME".tgz
EXTRACT_COMMAND="tar -xzf"
fi
MPIDE_URL=http://chipkit.s3.amazonaws.com/builds/$MPIDE_FILE
_pushd $DEPENDENCIES_FOLDER
if ! test -e $MPIDE_FILE
then
echo "Downloading MPIDE..."
download $MPIDE_URL $MPIDE_FILE
fi
if ! test -d $MPIDE_BASENAME
then
echo "Installing MPIDE to local folder..."
if [ $OS == "mac" ]; then
hdiutil attach $MPIDE_FILE
cp -R /Volumes/Mpide/Mpide.app/Contents/Resources/Java $MPIDE_BASENAME
hdiutil detach /Volumes/Mpide
else
$EXTRACT_COMMAND $MPIDE_FILE
fi
echo "MPIDE installed"
fi
if [ $OS == "cygwin" ]; then
chmod a+x mpide/hardware/pic32/compiler/pic32-tools/bin/*
chmod a+x -R mpide/hardware/pic32/compiler/pic32-tools/pic32mx/
chmod a+x mpide/*.dll
chmod a+x mpide/hardware/tools/avr/bin/*
fi
_popd
fi
echo
echo "${bldgreen}chipKIT dependencies installed.$txtrst"

191
script/bootstrap/common.sh Normal file
View file

@ -0,0 +1,191 @@
#!/usr/bin/env bash
set -e
BOOTSTRAP_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
if [ -z $COMMON_SOURCED ]; then
# TODO this is kind of a hacky way of determining if root is required -
# ideally we wouuld set up a little virtualenv in the dependencies folder
SUDO_CMD=
if command -v sudo >/dev/null 2>&1; then
SUDO_CMD="sudo -E"
if [ -z $CI ] && [ -z $VAGRANT ]; then
echo "The bootstrap script needs to install a few packages to your system as an admin, and we will use the 'sudo' command - enter your password to continue"
$SUDO_CMD ls > /dev/null
fi
fi
KERNEL=`uname`
ARCH=`uname -m`
if [ ${KERNEL:0:7} == "MINGW32" ]; then
OS="windows"
elif [ ${KERNEL:0:6} == "CYGWIN" ]; then
OS="cygwin"
elif [ $KERNEL == "Darwin" ]; then
OS="mac"
else
OS="linux"
if ! command -v lsb_release >/dev/null 2>&1; then
# Arch Linux
if command -v pacman>/dev/null 2>&1; then
$SUDO_CMD pacman -S lsb-release
fi
fi
DISTRO=`lsb_release -si`
fi
die() {
echo >&2 "${bldred}$@${txtrst}"
exit 1
}
_cygwin_error() {
echo
echo "${bldred}Missing \"$1\"${txtrst} - run the Cygwin installer again and select the base package set:"
echo " $CYGWIN_PACKAGES"
echo "After installing the packages, re-run this bootstrap script."
die
}
if ! command -v tput >/dev/null 2>&1; then
if [ $OS == "cygwin" ]; then
echo "OPTIONAL: Install the \"ncurses\" package in Cygwin to get colored shell output"
fi
else
set +e
# These exit with 1 when provisioning in a Vagrant box...?
txtrst=$(tput sgr0) # reset
bldred=${txtbld}$(tput setaf 1)
bldgreen=${txtbld}$(tput setaf 2)
set -e
fi
_pushd() {
pushd $1 > /dev/null
}
_popd() {
popd > /dev/null
}
_wait() {
if [ -z $CI ] && [ -z $VAGRANT ]; then
echo "Press Enter when done"
read
fi
}
_install() {
if [ $OS == "cygwin" ]; then
_cygwin_error $1
elif [ $OS == "mac" ]; then
# brew exists with 1 if it's already installed
set +e
brew install $1
set -e
else
if [ -z $DISTRO ]; then
echo
echo "Missing $1 - install it using your distro's package manager or build from source"
_wait
else
if [ $DISTRO == "arch" ]; then
$SUDO_CMD pacman -S $1
elif [ $DISTRO == "Ubuntu" ]; then
$SUDO_CMD apt-get update -qq
$SUDO_CMD apt-get install $1 -y
else
echo
echo "Missing $1 - install it using your distro's package manager or build from source"
_wait
fi
fi
fi
}
download() {
url=$1
filename=$2
curl $url -L -o $filename
}
if [ `id -u` == 0 ]; then
die "Error: running as root - don't use 'sudo' with this script"
fi
if ! command -v unzip >/dev/null 2>&1; then
_install "unzip"
fi
if ! command -v curl >/dev/null 2>&1; then
if [ $OS == "cygwin" ]; then
_cygwin_error "curl"
else
_install curl
fi
fi
echo "Storing all downloaded dependencies in the \"dependencies\" folder"
DEPENDENCIES_FOLDER="dependencies"
mkdir -p $DEPENDENCIES_FOLDER
if ! command -v make >/dev/null 2>&1; then
if [ $OS == "cygwin" ]; then
_cygwin_error "make"
elif [ $OS == "mac" ]; then
die "Missing 'make' - install the Xcode CLI tools"
else
if [ $DISTRO == "arch" ]; then
_install "base-devel"
elif [ $DISTRO == "Ubuntu" ]; then
_install "build-essential"
fi
fi
fi
if [ $DISTRO == "Ubuntu" ] && [ $ARCH == "x86_64" ]; then
_install "libc6-i386"
_install "lib32gcc1"
fi
if ! command -v g++ >/dev/null 2>&1; then
if [ $DISTRO == "Ubuntu" ]; then
_install "g++"
fi
fi
if ! command -v python >/dev/null 2>&1; then
echo "Installing Python..."
_install "python"
fi
if ! command -v pip >/dev/null 2>&1; then
echo "Installing Pip..."
if ! command -v easy_install >/dev/null 2>&1; then
_install "python-setuptools"
fi
if ! command -v easy_install >/dev/null 2>&1; then
die "easy_install not available, can't install pip"
fi
$SUDO_CMD easy_install pip
fi
PIP_SUDO_CMD=
if [ -z $VIRTUAL_ENV ]; then
# Only use sudo if the user doesn't have an active virtualenv
PIP_SUDO_CMD=$SUDO_CMD
fi
$PIP_SUDO_CMD pip install --upgrade setuptools
$PIP_SUDO_CMD pip install --src dependencies --pre -Ur $BOOTSTRAP_DIR/pip-requirements.txt
COMMON_SOURCED=1
fi

View file

@ -0,0 +1 @@
pyserial==2.7

28
script/runtests.sh Executable file
View file

@ -0,0 +1,28 @@
#!/usr/bin/env bash
failures=()
for dir in tests/*/
do
dir=${dir%*/}
example=${dir##*/}
pushd $dir
echo "Compiling $example..."
make_output=`make clean`
make_output=`make`
if [[ $? -ne 0 ]]; then
failures+=("$example")
echo "Example $example failed"
fi
popd
done
for failure in "${failures[@]}"; do
echo "Example $failure failed"
done
if [[ ${#failures[@]} -eq 0 ]]; then
echo "All tests passed."
else
exit 1
fi

View file

@ -1,4 +1,5 @@
BOARD_TAG = uno BOARD_TAG = uno
ARDUINO_LIBS = ARDUINO_LIBS =
include ../TestSuiteCommon.mk
include ../../Arduino.mk include ../../Arduino.mk

View file

@ -1,5 +1,6 @@
BOARD_TAG = uno BOARD_TAG = uno
ARDUINO_LIBS = ARDUINO_LIBS =
include ../TestSuiteCommon.mk
include ../../Arduino.mk include ../../Arduino.mk

View file

@ -1,5 +1,6 @@
BOARD_TAG = mega_pic32 BOARD_TAG = mega_pic32
ARDUINO_LIBS = ARDUINO_LIBS =
include ../TestSuiteCommon.mk
include ../../chipKIT.mk include ../../chipKIT.mk

View file

@ -11,6 +11,7 @@ F_CPU = 8000000L
ISP_PROG = stk500v1 ISP_PROG = stk500v1
AVRDUDE_ISP_BAUDRATE = 19200 AVRDUDE_ISP_BAUDRATE = 19200
include ../TestSuiteCommon.mk
include $(ARDMK_DIR)/Arduino.mk include $(ARDMK_DIR)/Arduino.mk
# !!! Important. You have to use make ispload to upload when using ISP programmer # !!! Important. You have to use make ispload to upload when using ISP programmer

View file

@ -1,4 +1,5 @@
BOARD_TAG = uno BOARD_TAG = uno
ARDUINO_LIBS = ARDUINO_LIBS =
include ../TestSuiteCommon.mk
include ../../Arduino.mk include ../../Arduino.mk

View file

@ -1,4 +1,5 @@
BOARD_TAG = uno BOARD_TAG = uno
ARDUINO_LIBS = ARDUINO_LIBS =
include ../TestSuiteCommon.mk
include ../../Arduino.mk include ../../Arduino.mk

View file

@ -1,4 +1,5 @@
BOARD_TAG = uno BOARD_TAG = uno
ARDUINO_LIBS = LiquidCrystal ARDUINO_LIBS = LiquidCrystal
include ../TestSuiteCommon.mk
include ../../Arduino.mk include ../../Arduino.mk

13
tests/TestSuiteCommon.mk Normal file
View file

@ -0,0 +1,13 @@
ARDMK_DIR=../../
DEPENDENCIES_FOLDER = ../../dependencies
DEPENDENCIES_MPIDE_DIR = $(DEPENDENCIES_FOLDER)/mpide-0023-linux64-20130817-test
ifeq ($(MPIDE_DIR),)
MPIDE_DIR = $(DEPENDENCIES_MPIDE_DIR)
endif
DEPENDENCIES_ARDUINO_DIR = $(DEPENDENCIES_FOLDER)/arduino-1.0.5
ifeq ($(ARDUINO_DIR),)
ARDUINO_DIR = $(DEPENDENCIES_ARDUINO_DIR)
endif

View file

@ -3,4 +3,5 @@
BOARD_TAG = uno BOARD_TAG = uno
ARDUINO_LIBS = Ethernet SPI ARDUINO_LIBS = Ethernet SPI
include ../TestSuiteCommon.mk
include ../../Arduino.mk include ../../Arduino.mk

View file

@ -3,4 +3,5 @@
BOARD_TAG = uno BOARD_TAG = uno
ARDUINO_LIBS = Wire ARDUINO_LIBS = Wire
include ../TestSuiteCommon.mk
include ../../Arduino.mk include ../../Arduino.mk

View file

@ -0,0 +1,5 @@
BOARD_TAG = uno
ARDUINO_LIBS =
include ../TestSuiteCommon.mk
include ../../Arduino.mk