- meson build_ci --default-library=static --prefix=$PREFIX -Dwerror=true -Dextra_tests=enabled --fatal-meson-warnings
- ninja -C build_ci
- ninja -C build_ci install >/dev/null
- - ${MESON_TEST} --suite unit --suite config --no-suite snowflake
+ - ${MESON_TEST} --suite unit --suite config --suite dnstap --no-suite snowflake
build-asan:
<<: *build
- ninja -C build_ci_asan install >/dev/null
# TODO _leaks: not sure what exactly is wrong in leak detection on config tests
# TODO skip_asan: all three of these disappear locally when using gcc 9.1 (except some leaks)
- - ASAN_OPTIONS=detect_leaks=0 ${MESON_TEST} --suite unit --suite config --no-suite skip_asan --no-suite snowflake
+ - ASAN_OPTIONS=detect_leaks=0 ${MESON_TEST} --suite unit --suite config --suite dnstap --no-suite skip_asan --no-suite snowflake
build:macOS:
<<: *nodep
+++ /dev/null
-# dnstap tests
-GOPATH := $(abspath tests/dnstap)
-DNSTAP_TEST := dnstap-test
-DNSTAP_PATH := $(GOPATH)/src/$(DNSTAP_TEST)
-CONFIG := $(DNSTAP_PATH)/config
-CMD := daemon/kresd
-ZONES := "fake1.localdomain,fake2.localdomain,fake3.localdomain"
-TIMEOUT := 60s
-check-dnstap: daemon
- @echo "Checking dnstap functionality"
- GOPATH=$(GOPATH) go get -u github.com/FiloSottile/gvt
- cd $(DNSTAP_PATH) && $(GOPATH)/bin/gvt restore
- GOPATH=$(GOPATH) go install $(DNSTAP_TEST)
- $(GOPATH)/bin/$(DNSTAP_TEST) -c $(CONFIG) -cmd $(CMD) -q $(ZONES) -t $(TIMEOUT)
-
-clean-dnstap:
- rm -rf $(GOPATH)/{bin,pkg,src/dnstap-test/vendor/github.com,src/github.com}
-
-.PHONY: check-dnstap clean-dnstap
"time"
)
-const (
- kresdWorkDir = "/tmp/"
-)
-
var (
kresdArgs = []string{
- "-f1",
- "-v",
+ "-n",
"-q",
}
)
if err := proto.Unmarshal(b, dt); err != nil {
return name, err
}
+
+ var msg_raw []byte
m := dt.Message
- if *m.Type != dnstap.Message_CLIENT_RESPONSE {
- return name, fmt.Errorf("incorrect message type")
+ if *m.Type == dnstap.Message_CLIENT_QUERY {
+ msg_raw = m.QueryMessage
+ } else if *m.Type == dnstap.Message_CLIENT_RESPONSE {
+ msg_raw = m.ResponseMessage
+ } else {
+ return name, fmt.Errorf("incorrect message type: %v", *m.Type)
}
- if m.ResponseMessage == nil {
+
+ if msg_raw == nil {
return name, fmt.Errorf("no message payload")
}
- if err := dns.IsMsg(m.ResponseMessage); err != nil {
+ if err := dns.IsMsg(msg_raw); err != nil {
return name, err
}
var msg dns.Msg
- if err := msg.Unpack(m.ResponseMessage); err != nil {
+ if err := msg.Unpack(msg_raw); err != nil {
return name, err
}
if len(msg.Question) < 1 {
func runKresd(ctx context.Context, path, configFile string, grace time.Duration) (chan bool, error) {
ch := make(chan bool)
kresdArgs = append(kresdArgs, "-c"+configFile)
- kresdArgs = append(kresdArgs, kresdWorkDir)
// we have 1 object in ExtraFiles with index 0
// child fd will be 3 + i = 3
kresdArgs = append(kresdArgs, "-S3")
func main() {
var (
- unixSocket = flag.String("u", "/tmp/dnstap.sock", "dnstap socket")
- kresdPath = flag.String("cmd", "daemon/kresd", "kresd path")
+ unixSocket = flag.String("u", "dnstap.sock", "dnstap socket")
+ kresdPath = flag.String("cmd", "kresd", "kresd path")
configFile = flag.String("c", "config", "config file")
qnames = flag.String("q", ".", "list of comma separated zones")
grace = flag.String("g", "1s", "Time to wait for daemon start")
log.Printf("Response: %v", resp)
}
- // Check dnstap output
- o := <-output
- if *debug {
- log.Printf("raw dnstap:%v", o)
- }
- dtName, err := qnameFromFrame(o)
- if err != nil {
- log.Printf("%v\n", err)
- os.Exit(1)
- }
- if fqdn != dtName {
- log.Printf("expected %v got %v", fqdn, dtName)
- os.Exit(1) // Test failed
+ for range "QR" { // Checking Query and Response is the same ATM
+ o := <-output
+ if *debug {
+ log.Printf("raw dnstap:%v", o)
+ }
+ dtName, err := qnameFromFrame(o)
+ if err != nil {
+ log.Printf("%v\n", err)
+ os.Exit(1)
+ }
+ if fqdn != dtName {
+ log.Printf("expected %v got %v", fqdn, dtName)
+ os.Exit(1) // Test failed
+ }
+ log.Printf("matched qname: %v", dtName)
}
- log.Printf("matched qname: %v", dtName)
}
cancel() // Send signal to close daemon
}()
--- /dev/null
+#!/bin/bash
+set -e
+KRESD_CMD=$1
+MESON_BUILD_ROOT=$(pwd)
+mkdir -p tests/dnstap
+export GOPATH=$MESON_BUILD_ROOT/tests/dnstap
+cd "$(dirname $0)"
+DNSTAP_TEST=dnstap-test
+
+if [ -z "$GITLAB_CI" ]; then
+ type -P go >/dev/null || exit 77
+ echo "Building the dnstap test and its dependencies..."
+ # some packages may be missing on the system right now
+ go get github.com/{FiloSottile/gvt,cloudflare/dns,dnstap/golang-dnstap}
+else
+ # In CI we've prebuilt dependencies into the default GOPATH.
+ # We're in a scratch container, so we just add the dnstap test inside.
+ export GOPATH=/root/go
+fi
+DTAP=$GOPATH/src/$DNSTAP_TEST
+rm -f $DTAP && ln -s $(realpath ..)/$DNSTAP_TEST $DTAP
+go install $DNSTAP_TEST
+
+
+CONFIG=$(realpath ./config)
+ZONES="fake1.localdomain,fake2.localdomain,fake3.localdomain"
+TIMEOUT=60s
+GRACE=5s
+cd $MESON_BUILD_ROOT/tests/dnstap # don't leave stuff like *.mdb in ./.
+$GOPATH/bin/$DNSTAP_TEST -c $CONFIG -cmd $KRESD_CMD -q $ZONES -t $TIMEOUT -g $GRACE -d
+