Skip to content

Commit

Permalink
Move generative tests to github from travis
Browse files Browse the repository at this point in the history
  • Loading branch information
mab68 committed Jun 22, 2020
1 parent 98aad1d commit 18d8193
Show file tree
Hide file tree
Showing 60 changed files with 344 additions and 295 deletions.
231 changes: 231 additions & 0 deletions .github/workflows/on-pr.yml
@@ -0,0 +1,231 @@
name: Faucet Tests

on: [push, pull_request]

env:
FAUCET_TEST_IMG: "faucet/tests"
SHARDARGS: "--privileged --sysctl net.ipv6.conf.all.disable_ipv6=0 --ulimit core=99999999999:99999999999 -v /var/local/lib/docker:/var/lib/docker"
FILES_CHANGED: "all"
CODECHECK_PY_VER: 3.6
MATRIX_SHARDS: 12

jobs:

unit-tests:
name: Faucet unit tests
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [3.5, 3.6, 3.7, 3.8]
steps:
- name: Checkout source
uses: actions/checkout@v2
- if: ${{ github.event.before != '0000000000000000000000000000000000000000' }}
name: Get file changes
id: file_changes
uses: trilom/file-changes-action@v1.2.4
with:
output: ' '
- if: ${{ steps.file_changes.outputs.files }}
name: Compare file changes
run: |
FILES_CHANGED="${{ steps.file_changes.outputs.files }}"
PY_FILES_CHANGED=$(echo "${{ steps.file_changes.outputs.files }}" | tr ' ' '\n' | grep -E ".py$" | tr '\n' ' ')
RQ_FILES_CHANGED=$(echo "${{ steps.file_changes.outputs.files }}" | tr ' ' '\n' | grep -E "requirements(.*)txt$" | tr '\n' ' ')
DOC_FILES_CHANGED=$(echo "${{ steps.file_changes.outputs.files }}" | tr ' ' '\n' | grep -E "docs/**" | tr '\n' ' ')
echo "Files changed: ${FILES_CHANGED}"
echo "Python code changed: ${PY_FILES_CHANGED}"
echo "Requirement changes: ${RQ_FILES_CHANGED}"
echo "Documentation changes: ${DOC_FILES_CHANGED}"
echo ::set-env name=FILES_CHANGED::${FILES_CHANGED}
echo ::set-env name=PY_FILES_CHANGED::${PY_FILES_CHANGED}
echo ::set-env name=RQ_FILES_CHANGED::${RQ_FILES_CHANGED}
echo ::set-env name=DOC_FILES_CHANGED::${DOC_FILES_CHANGED}
- name: Set up python-${{ matrix.python-version }}
uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
echo "${{ github.head_ref }}"
echo "${{ github.base_ref }}"
echo "${GITHUB_REF}"
echo "${GITHUB_HEAD_REF}"
echo "${GITHUB_BASE_REF}"
echo "${{ github.event.before }}"
./docker/pip_deps.sh
pip3 install ./
pip3 show faucet
- name: Running unit tests
run: ./tests/run_unit_tests.sh || exit 1
- if: ${{ matrix.python-version == env.CODECHECK_PY_VER }}
name: Upload codecov
uses: codecov/codecov-action@v1.0.7
- if: ${{ env.FILES_CHANGED == 'all' || env.RQ_FILES_CHANGED || env.PY_FILES_CHANGED }}
name: Pytype
run: |
cd ./tests/codecheck || exit 1
if [[ "${{ env.FILES_CHANGED }}" == "all" || ! -z "${{ env.RQ_FILES_CHANGED }}" ]]; then
echo "Running pytype on everything"
./pytype.sh || exit 1
else
echo "Running pytype on PY_FILES_CHANGED"
./pytype.sh ${{ env.PY_FILES_CHANGED }} || exit 1
fi
codecheck:
name: Code check
runs-on: ubuntu-latest
steps:
- name: Checkout source
uses: actions/checkout@v2
with:
fetch-depth: 0
- if: ${{ github.event.before != '0000000000000000000000000000000000000000' }}
name: Get file changes
id: file_changes
uses: trilom/file-changes-action@v1.2.4
with:
output: ' '
- if: ${{ steps.file_changes.outputs.files }}
name: Compare file changes
run: |
FILES_CHANGED="${{ steps.file_changes.outputs.files }}"
PY_FILES_CHANGED=$(echo "${{ steps.file_changes.outputs.files }}" | tr ' ' '\n' | grep -E ".py$" | tr '\n' ' ')
RQ_FILES_CHANGED=$(echo "${{ steps.file_changes.outputs.files }}" | tr ' ' '\n' | grep -E "requirements(.*)txt$" | tr '\n' ' ')
DOC_FILES_CHANGED=$(echo "${{ steps.file_changes.outputs.files }}" | tr ' ' '\n' | grep -E "docs/**" | tr '\n' ' ')
echo "Files changed: ${FILES_CHANGED}"
echo "Python code changed: ${PY_FILES_CHANGED}"
echo "Requirement changes: ${RQ_FILES_CHANGED}"
echo "Documentation changes: ${DOC_FILES_CHANGED}"
echo ::set-env name=FILES_CHANGED::${FILES_CHANGED}
echo ::set-env name=PY_FILES_CHANGED::${PY_FILES_CHANGED}
echo ::set-env name=RQ_FILES_CHANGED::${RQ_FILES_CHANGED}
echo ::set-env name=DOC_FILES_CHANGED::${DOC_FILES_CHANGED}
- name: Set up python-${{ env.CODECHECK_PY_VER }}
uses: actions/setup-python@v2
with:
python-version: ${{ env.CODECHECK_PY_VER }}
- name: Install dependencies
run: |
./docker/pip_deps.sh
- if: ${{ env.DOC_FILES_CHANGED }}
name: Build docs
run: |
cd ./docs || exit 1
sudo apt-get install librsvg2-bin || exit 1
make html || exit 1
rm -rf _build
- if: ${{ env.FILES_CHANGED == 'all' || env.PY_FILES_CHANGED }}
name: Pylint
run: |
cd ./tests/codecheck || exit 1
./pylint.sh ${{ env.PY_FILES_CHANGED }} || exit 1
integration-tests:
name: Faucet integration tests
runs-on: ubuntu-latest
strategy:
matrix:
MATRIX_SHARD: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
steps:
- name: Checkout source
uses: actions/checkout@v2
- if: ${{ github.event.before != '0000000000000000000000000000000000000000' }}
name: Get file changes
id: file_changes
uses: trilom/file-changes-action@v1.2.4
with:
output: ' '
- if: ${{ steps.file_changes.outputs.files }}
name: Compare file changes
run: |
FILES_CHANGED="${{ steps.file_changes.outputs.files }}"
PY_FILES_CHANGED=$(echo "${{ steps.file_changes.outputs.files }}" | tr ' ' '\n' | grep -E ".py$" | tr '\n' ' ')
RQ_FILES_CHANGED=$(echo "${{ steps.file_changes.outputs.files }}" | tr ' ' '\n' | grep -E "requirements(.*)txt$" | tr '\n' ' ')
DOC_FILES_CHANGED=$(echo "${{ steps.file_changes.outputs.files }}" | tr ' ' '\n' | grep -E "docs/**" | tr '\n' ' ')
echo "Files changed: ${FILES_CHANGED}"
echo "Python code changed: ${PY_FILES_CHANGED}"
echo "Requirement changes: ${RQ_FILES_CHANGED}"
echo "Documentation changes: ${DOC_FILES_CHANGED}"
echo ::set-env name=FILES_CHANGED::${FILES_CHANGED}
echo ::set-env name=PY_FILES_CHANGED::${PY_FILES_CHANGED}
echo ::set-env name=RQ_FILES_CHANGED::${RQ_FILES_CHANGED}
echo ::set-env name=DOC_FILES_CHANGED::${DOC_FILES_CHANGED}
- if: ${{ env.FILES_CHANGED == 'all' || env.PY_FILES_CHANGED || env.RQ_FILES_CHANGED }}
name: Shard out tests
run: |
ALLTESTFILES="tests/integration/mininet_tests.py tests/integration/mininet_multidp_tests.py clib/clib_mininet_tests.py"
ALLTESTS=$(grep -E -o "^class (Faucet[a-zA-Z0-9]+Test)" ${ALLTESTFILES} | cut -f2 -d" " | sort)
declare -A sharded
function shard {
work=$1
workers=$2
i=0
for shard in $work ; do
i=$(( i % workers ))
sharded[$i]="${sharded[$i]} $shard"
i=$(( i + 1 ))
done
}
shard "$ALLTESTS" ${{ env.MATRIX_SHARDS }}
FAUCET_TESTS="-din ${sharded[${{ matrix.MATRIX_SHARD }}]}"
echo ::set-env name=FAUCET_TESTS::${FAUCET_TESTS}
- if: ${{ env.FAUCET_TESTS }}
name: Build docker
run: docker build --pull -t ${FAUCET_TEST_IMG} -f Dockerfile.tests . || exit 1
- if: ${{ env.FAUCET_TESTS }}
name: Setup docker
run: |
ulimit -c unlimited
echo '/var/tmp/core.%h.%e.%t' | sudo tee /proc/sys/kernel/core_pattern
sudo modprobe openvswitch
sudo modprobe ebtables
- if: ${{ env.FAUCET_TESTS }}
name: Run docker
run: sudo docker run ${SHARDARGS} -v $HOME/.cache/pip:/var/tmp/pip-cache -e FAUCET_TESTS="${FAUCET_TESTS}" -t ${FAUCET_TEST_IMG} || exit 1
- name: Detect core dumps
run: if [ ls -1 /var/tmp/core* > /dev/null 2>&1 ]; then exit 1; fi

sanity-testing:
name: Faucet Sanity Tests
runs-on: ubuntu-latest
steps:
- name: Checkout source
uses: actions/checkout@v2
- if: ${{ github.event.before != '0000000000000000000000000000000000000000' }}
name: Get file changes
id: file_changes
uses: trilom/file-changes-action@v1.2.4
with:
output: ' '
- if: ${{ steps.file_changes.outputs.files }}
name: Compare file changes
run: |
FILES_CHANGED="${{ steps.file_changes.outputs.files }}"
PY_FILES_CHANGED=$(echo "${{ steps.file_changes.outputs.files }}" | tr ' ' '\n' | grep -E ".py$" | tr '\n' ' ')
RQ_FILES_CHANGED=$(echo "${{ steps.file_changes.outputs.files }}" | tr ' ' '\n' | grep -E "requirements(.*)txt$" | tr '\n' ' ')
DOC_FILES_CHANGED=$(echo "${{ steps.file_changes.outputs.files }}" | tr ' ' '\n' | grep -E "docs/**" | tr '\n' ' ')
echo "Files changed: ${FILES_CHANGED}"
echo "Python code changed: ${PY_FILES_CHANGED}"
echo "Requirement changes: ${RQ_FILES_CHANGED}"
echo "Documentation changes: ${DOC_FILES_CHANGED}"
echo ::set-env name=FILES_CHANGED::${FILES_CHANGED}
echo ::set-env name=PY_FILES_CHANGED::${PY_FILES_CHANGED}
echo ::set-env name=RQ_FILES_CHANGED::${RQ_FILES_CHANGED}
echo ::set-env name=DOC_FILES_CHANGED::${DOC_FILES_CHANGED}
- if: ${{ env.FILES_CHANGED == 'all' || env.PY_FILES_CHANGED || env.RQ_FILES_CHANGED }}
name: Setup docker test requirements
run: |
ulimit -c unlimited
echo '/var/tmp/core.%h.%e.%t' | sudo tee /proc/sys/kernel/core_pattern
sudo modprobe openvswitch
sudo modprobe ebtables
- if: ${{ env.FILES_CHANGED == 'all' || env.PY_FILES_CHANGED || env.RQ_FILES_CHANGED }}
name: Build docker
run: docker build --pull -t ${FAUCET_TEST_IMG} -f Dockerfile.tests . || exit 1
- if: ${{ env.FILES_CHANGED == 'all' || env.PY_FILES_CHANGED || env.RQ_FILES_CHANGED }}
name: Run docker
run: sudo docker run ${SHARDARGS} -v $HOME/.cache/pip:/var/tmp/pip-cache -e FAUCET_TESTS="-ni FaucetSanityTest FaucetStackStringOfDPUntaggedTest" -e HWTESTS="1" -t ${FAUCET_TEST_IMG} || exit 1
- name: Detect core dumps
run: if [ ls -1 /var/tmp/core* > /dev/null 2>&1 ]; then exit 1; fi
59 changes: 59 additions & 0 deletions .github/workflows/periodic.yml
@@ -0,0 +1,59 @@
name: Faucet Tests

on:
schedule:
- cron: '* 0 * * *'

env:
FAUCET_TEST_IMG: "faucet/tests"
SHARDARGS: "--privileged --sysctl net.ipv6.conf.all.disable_ipv6=0 --ulimit core=99999999999:99999999999 -v /var/local/lib/docker:/var/lib/docker"
FILES_CHANGED: "all"
CODECHECK_PY_VER: 3.6

jobs:

generative-testing:
name: Faucet Generative Tests
runs-on: ubuntu-latest
strategy:
matrix:
MATRIX_SHARD: [--generative_unit, --generative_integration]
steps:
- name: Checkout source
uses: actions/checkout@v2
- if: ${{ github.event.before != '0000000000000000000000000000000000000000' }}
name: Get file changes
id: file_changes
uses: trilom/file-changes-action@v1.2.4
with:
output: ' '
- if: ${{ steps.file_changes.outputs.files }}
name: Compare file changes
run: |
FILES_CHANGED="${{ steps.file_changes.outputs.files }}"
PY_FILES_CHANGED=$(echo "${{ steps.file_changes.outputs.files }}" | tr ' ' '\n' | grep -E ".py$" | tr '\n' ' ')
RQ_FILES_CHANGED=$(echo "${{ steps.file_changes.outputs.files }}" | tr ' ' '\n' | grep -E "requirements(.*)txt$" | tr '\n' ' ')
DOC_FILES_CHANGED=$(echo "${{ steps.file_changes.outputs.files }}" | tr ' ' '\n' | grep -E "docs/**" | tr '\n' ' ')
echo "Files changed: ${FILES_CHANGED}"
echo "Python code changed: ${PY_FILES_CHANGED}"
echo "Requirement changes: ${RQ_FILES_CHANGED}"
echo "Documentation changes: ${DOC_FILES_CHANGED}"
echo ::set-env name=FILES_CHANGED::${FILES_CHANGED}
echo ::set-env name=PY_FILES_CHANGED::${PY_FILES_CHANGED}
echo ::set-env name=RQ_FILES_CHANGED::${RQ_FILES_CHANGED}
echo ::set-env name=DOC_FILES_CHANGED::${DOC_FILES_CHANGED}
- if: ${{ env.FILES_CHANGED == 'all' || env.PY_FILES_CHANGED || env.RQ_FILES_CHANGED }}
name: Setup docker test requirements
run: |
ulimit -c unlimited
echo '/var/tmp/core.%h.%e.%t' | sudo tee /proc/sys/kernel/core_pattern
sudo modprobe openvswitch
sudo modprobe ebtables
- if: ${{ env.FILES_CHANGED == 'all' || env.PY_FILES_CHANGED || env.RQ_FILES_CHANGED }}
name: Build docker
run: docker build --pull -t ${FAUCET_TEST_IMG} -f Dockerfile.tests . || exit 1
- if: ${{ env.FILES_CHANGED == 'all' || env.PY_FILES_CHANGED || env.RQ_FILES_CHANGED }}
name: Run docker
run: sudo docker run ${SHARDARGS} -v $HOME/.cache/pip:/var/tmp/pip-cache -e FAUCET_TESTS="${{ matrix.MATRIX_SHARD }}" -t ${FAUCET_TEST_IMG} || exit 1
- name: Detect core dumps
run: if [ ls -1 /var/tmp/core* > /dev/null 2>&1 ]; then exit 1; fi
66 changes: 0 additions & 66 deletions .travis.yml
@@ -1,81 +1,15 @@
dist: bionic
sudo: required
addons:
apt:
update: true
packages:
- librsvg2-bin
- parallel
cache:
pip: true
stages:
- test
- name: deploy
if: repo = faucetsdn/faucet AND tag IS present
env:
global:
- FAUCET_TEST_IMG=faucet/tests
- MATRIX_SHARDS=6
script:
- ./travis/runtests.sh
jobs:
include:
- &unit-test
stage: test
language: python
python: 3.5
env:
- MATRIX_SHARD=unittest
- PYTYPE=true
- <<: *unit-test
python: 3.6
env:
- MATRIX_SHARD=unittest
- BUILD_DOCS=true
- CODECOV_UPLOAD=true
- PYLINT=true
- PYTYPE=true
- <<: *unit-test
python: 3.7
env:
- MATRIX_SHARD=unittest
- PYTYPE=true
- <<: *unit-test
python: 3.8
env:
- MATRIX_SHARD=unittest
- PYTYPE=true
- &integration-test
stage: test
env: MATRIX_SHARD=sanity
language: bash
before_install:
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- sudo apt-get update
- sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce
services:
- docker
- <<: *integration-test
env: MATRIX_SHARD=0
- <<: *integration-test
env: MATRIX_SHARD=1
- <<: *integration-test
env: MATRIX_SHARD=2
- <<: *integration-test
env: MATRIX_SHARD=3
- <<: *integration-test
env: MATRIX_SHARD=4
- <<: *integration-test
env: MATRIX_SHARD=5
- <<: *integration-test
env: MATRIX_SHARD=generative-unit
- <<: *integration-test
env: MATRIX_SHARD=generative-integration
- stage: deploy
language: python
python: 3.6
script: skip
deploy:
provider: pypi
on:
Expand Down
2 changes: 1 addition & 1 deletion docker/fuzz_config.sh
Expand Up @@ -14,4 +14,4 @@ if [ -e "$checkfile" ]; then
fi
fi

AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1 AFL_SKIP_CPUFREQ=1 py-afl-fuzz -x "$dictfile" -m 5000 -i "$inputfile" -o "$outputfile" -- /usr/bin/python3 /faucet-src/tests/fuzzer/fuzz_config.py
AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1 AFL_SKIP_CPUFREQ=1 py-afl-fuzz -x "$dictfile" -m 5000 -i "$inputfile" -o "$outputfile" -- /usr/bin/python3 /faucet-src/tests/generative/fuzzer/fuzz_config.py
2 changes: 1 addition & 1 deletion docker/fuzz_packet.sh
Expand Up @@ -14,4 +14,4 @@ if [ -e "$checkfile" ]; then
fi
fi

AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1 AFL_SKIP_CPUFREQ=1 py-afl-fuzz -m 5000 -x "$dictfile" -i "$inputfile" -o "$outputfile" -- /usr/bin/python3 /faucet-src/tests/fuzzer/fuzz_packet.py
AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1 AFL_SKIP_CPUFREQ=1 py-afl-fuzz -m 5000 -x "$dictfile" -i "$inputfile" -o "$outputfile" -- /usr/bin/python3 /faucet-src/tests/generative/fuzzer/fuzz_packet.py
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Expand Up @@ -52,4 +52,4 @@ def main():
if len(sys.argv) == 2:
main()
else:
print('USAGE: python3 display_packet_crash.py <AFL_CRASH_FILE>')
sys.stderr.write('USAGE: python3 display_packet_crash.py <AFL_CRASH_FILE>\n')

0 comments on commit 18d8193

Please sign in to comment.