289 lines
6.3 KiB
Plaintext
289 lines
6.3 KiB
Plaintext
|
#!/bin/bash
|
||
|
# Copyright 2012 Google, Inc. All rights reserved.
|
||
|
|
||
|
# This script provides a simple way to run benchmarks against previous code and
|
||
|
# keep a log of how benchmarks change over time. When used with the --benchmark
|
||
|
# flag, it runs benchmarks from the current code and from the last commit run
|
||
|
# with --benchmark, then stores the results in the git commit description. We
|
||
|
# rerun the old benchmarks along with the new ones, since there's no guarantee
|
||
|
# that git commits will happen on the same machine, so machine differences could
|
||
|
# cause wildly inaccurate results.
|
||
|
#
|
||
|
# If you're making changes to 'gopacket' which could cause performance changes,
|
||
|
# you may be requested to use this commit script to make sure your changes don't
|
||
|
# have large detrimental effects (or to show off how awesome your performance
|
||
|
# improvements are).
|
||
|
#
|
||
|
# If not run with the --benchmark flag, this script is still very useful... it
|
||
|
# makes sure all the correct go formatting, building, and testing work as
|
||
|
# expected.
|
||
|
|
||
|
function Usage {
|
||
|
cat <<EOF
|
||
|
USAGE: $0 [--benchmark regexp] [--root] [--gen] <git commit flags...>
|
||
|
|
||
|
--benchmark: Run benchmark comparisons against last benchmark'd commit
|
||
|
--root: Run tests that require root priviledges
|
||
|
--gen: Generate code for MACs/ports by pulling down external data
|
||
|
|
||
|
Note, some 'git commit' flags are necessary, if all else fails, pass in -a
|
||
|
EOF
|
||
|
exit 1
|
||
|
}
|
||
|
|
||
|
BENCH=""
|
||
|
GEN=""
|
||
|
ROOT=""
|
||
|
while [ ! -z "$1" ]; do
|
||
|
case "$1" in
|
||
|
"--benchmark")
|
||
|
BENCH="$2"
|
||
|
shift
|
||
|
shift
|
||
|
;;
|
||
|
"--gen")
|
||
|
GEN="yes"
|
||
|
shift
|
||
|
;;
|
||
|
"--root")
|
||
|
ROOT="yes"
|
||
|
shift
|
||
|
;;
|
||
|
"--help")
|
||
|
Usage
|
||
|
;;
|
||
|
"-h")
|
||
|
Usage
|
||
|
;;
|
||
|
"help")
|
||
|
Usage
|
||
|
;;
|
||
|
*)
|
||
|
break
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
function Root {
|
||
|
if [ ! -z "$ROOT" ]; then
|
||
|
local exec="$1"
|
||
|
# Some folks (like me) keep source code in places inaccessible by root (like
|
||
|
# NFS), so to make sure things run smoothly we copy them to a /tmp location.
|
||
|
local tmpfile="$(mktemp -t gopacket_XXXXXXXX)"
|
||
|
echo "Running root test executable $exec as $tmpfile"
|
||
|
cp "$exec" "$tmpfile"
|
||
|
chmod a+x "$tmpfile"
|
||
|
shift
|
||
|
sudo "$tmpfile" "$@"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
if [ "$#" -eq "0" ]; then
|
||
|
Usage
|
||
|
fi
|
||
|
|
||
|
cd $(dirname $0)
|
||
|
|
||
|
# Check for copyright notices.
|
||
|
for filename in $(find ./ -type f -name '*.go'); do
|
||
|
if ! head -n 1 "$filename" | grep -q Copyright; then
|
||
|
echo "File '$filename' may not have copyright notice"
|
||
|
exit 1
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
set -e
|
||
|
set -x
|
||
|
|
||
|
if [ ! -z "$ROOT" ]; then
|
||
|
echo "Running SUDO to get root priviledges for root tests"
|
||
|
sudo echo "have root"
|
||
|
fi
|
||
|
|
||
|
if [ ! -z "$GEN" ]; then
|
||
|
pushd macs
|
||
|
go run gen.go | gofmt > valid_mac_prefixes.go
|
||
|
popd
|
||
|
pushd layers
|
||
|
go run gen.go | gofmt > iana_ports.go
|
||
|
go run gen2.go | gofmt > enums_generated.go
|
||
|
popd
|
||
|
fi
|
||
|
|
||
|
# Make sure everything is formatted, compiles, and tests pass.
|
||
|
go fmt ./...
|
||
|
go test -i ./... 2>/dev/null >/dev/null || true
|
||
|
go test
|
||
|
go build
|
||
|
pushd examples/bytediff
|
||
|
go build
|
||
|
popd
|
||
|
if [ -f /usr/include/pcap.h ]; then
|
||
|
pushd pcap
|
||
|
go test ./...
|
||
|
go build ./...
|
||
|
go build pcap_tester.go
|
||
|
Root pcap_tester --mode=basic
|
||
|
Root pcap_tester --mode=filtered
|
||
|
Root pcap_tester --mode=timestamp || echo "You might not support timestamp sources"
|
||
|
popd
|
||
|
pushd examples/afpacket
|
||
|
go build
|
||
|
popd
|
||
|
pushd examples/pcapdump
|
||
|
go build
|
||
|
popd
|
||
|
pushd examples/arpscan
|
||
|
go build
|
||
|
popd
|
||
|
pushd examples/bidirectional
|
||
|
go build
|
||
|
popd
|
||
|
pushd examples/synscan
|
||
|
go build
|
||
|
popd
|
||
|
pushd examples/httpassembly
|
||
|
go build
|
||
|
popd
|
||
|
pushd examples/statsassembly
|
||
|
go build
|
||
|
popd
|
||
|
fi
|
||
|
pushd macs
|
||
|
go test ./...
|
||
|
gofmt -w gen.go
|
||
|
go build gen.go
|
||
|
popd
|
||
|
pushd tcpassembly
|
||
|
go test ./...
|
||
|
popd
|
||
|
pushd reassembly
|
||
|
go test ./...
|
||
|
popd
|
||
|
pushd layers
|
||
|
gofmt -w gen.go
|
||
|
go build gen.go
|
||
|
go test ./...
|
||
|
popd
|
||
|
pushd pcapgo
|
||
|
go test ./...
|
||
|
go build ./...
|
||
|
popd
|
||
|
if [ -f /usr/include/linux/if_packet.h ]; then
|
||
|
if grep -q TPACKET_V3 /usr/include/linux/if_packet.h; then
|
||
|
pushd afpacket
|
||
|
go build ./...
|
||
|
go test ./...
|
||
|
popd
|
||
|
fi
|
||
|
fi
|
||
|
if [ -f /usr/include/pfring.h ]; then
|
||
|
pushd pfring
|
||
|
go test ./...
|
||
|
go build ./...
|
||
|
popd
|
||
|
pushd examples/pfdump
|
||
|
go build
|
||
|
popd
|
||
|
fi
|
||
|
pushd ip4defrag
|
||
|
go test ./...
|
||
|
popd
|
||
|
pushd defrag
|
||
|
go test ./...
|
||
|
popd
|
||
|
|
||
|
for travis_script in `ls .travis.*.sh`; do
|
||
|
./$travis_script
|
||
|
done
|
||
|
|
||
|
# Run our initial commit
|
||
|
git commit "$@"
|
||
|
|
||
|
if [ -z "$BENCH" ]; then
|
||
|
set +x
|
||
|
echo "We're not benchmarking and we've committed... we're done!"
|
||
|
exit
|
||
|
fi
|
||
|
|
||
|
### If we get here, we want to run benchmarks from current commit, and compare
|
||
|
### then to benchmarks from the last --benchmark commit.
|
||
|
|
||
|
# Get our current branch.
|
||
|
BRANCH="$(git branch | grep '^*' | awk '{print $2}')"
|
||
|
|
||
|
# File we're going to build our commit description in.
|
||
|
COMMIT_FILE="$(mktemp /tmp/tmp.XXXXXXXX)"
|
||
|
|
||
|
# Add the word "BENCH" to the start of the git commit.
|
||
|
echo -n "BENCH " > $COMMIT_FILE
|
||
|
|
||
|
# Get the current description... there must be an easier way.
|
||
|
git log -n 1 | grep '^ ' | sed 's/^ //' >> $COMMIT_FILE
|
||
|
|
||
|
# Get the commit sha for the last benchmark commit
|
||
|
PREV=$(git log -n 1 --grep='BENCHMARK_MARKER_DO_NOT_CHANGE' | head -n 1 | awk '{print $2}')
|
||
|
|
||
|
## Run current benchmarks
|
||
|
|
||
|
cat >> $COMMIT_FILE <<EOF
|
||
|
|
||
|
|
||
|
----------------------------------------------------------
|
||
|
BENCHMARK_MARKER_DO_NOT_CHANGE
|
||
|
----------------------------------------------------------
|
||
|
|
||
|
Go version $(go version)
|
||
|
|
||
|
|
||
|
TEST BENCHMARKS "$BENCH"
|
||
|
EOF
|
||
|
# go seems to have trouble with 'go test --bench=. ./...'
|
||
|
go test --test.bench="$BENCH" 2>&1 | tee -a $COMMIT_FILE
|
||
|
pushd layers
|
||
|
go test --test.bench="$BENCH" 2>&1 | tee -a $COMMIT_FILE
|
||
|
popd
|
||
|
cat >> $COMMIT_FILE <<EOF
|
||
|
|
||
|
|
||
|
PCAP BENCHMARK
|
||
|
EOF
|
||
|
if [ "$BENCH" -eq ".*" ]; then
|
||
|
go run pcap/gopacket_benchmark/*.go 2>&1 | tee -a $COMMIT_FILE
|
||
|
fi
|
||
|
|
||
|
|
||
|
|
||
|
## Reset to last benchmark commit, run benchmarks
|
||
|
|
||
|
git checkout $PREV
|
||
|
|
||
|
cat >> $COMMIT_FILE <<EOF
|
||
|
----------------------------------------------------------
|
||
|
BENCHMARKING AGAINST COMMIT $PREV
|
||
|
----------------------------------------------------------
|
||
|
|
||
|
|
||
|
OLD TEST BENCHMARKS
|
||
|
EOF
|
||
|
# go seems to have trouble with 'go test --bench=. ./...'
|
||
|
go test --test.bench="$BENCH" 2>&1 | tee -a $COMMIT_FILE
|
||
|
pushd layers
|
||
|
go test --test.bench="$BENCH" 2>&1 | tee -a $COMMIT_FILE
|
||
|
popd
|
||
|
cat >> $COMMIT_FILE <<EOF
|
||
|
|
||
|
|
||
|
OLD PCAP BENCHMARK
|
||
|
EOF
|
||
|
if [ "$BENCH" -eq ".*" ]; then
|
||
|
go run pcap/gopacket_benchmark/*.go 2>&1 | tee -a $COMMIT_FILE
|
||
|
fi
|
||
|
|
||
|
|
||
|
|
||
|
## Reset back to the most recent commit, edit the commit message by appending
|
||
|
## benchmark results.
|
||
|
git checkout $BRANCH
|
||
|
git commit --amend -F $COMMIT_FILE
|